在实际操作中,使用一个滑动窗口(一般情况下,长度是奇数),从左到右开始扫描当前句子 。每个扫描出来的片段被当成一个小句子,每个小句子中间的词被认为是中心词,其余的词被认为是这个中心词的上下文 。
2.1.1 Skip-gram的理想实现使用神经网络实现Skip-gram中,模型接收的输入应该有2个不同的tensor:
- 代表中心词的tensor:假设我们称之为center_words $V$ , 一般来说 , 这个tensor是一个形状为[batch_size, vocab_size]的one-hot tensor,表示在一个mini-batch中,每个中心词的ID,对应位置为1 , 其余为0 。
- 代表目标词的tensor:目标词是指需要推理出来的上下文词,假设我们称之为target_words $T$ , 一般来说 , 这个tensor是一个形状为[batch_size, 1]的整型tensor , 这个tensor中的每个元素是一个[0, vocab_size-1]的值,代表目标词的ID 。
- 声明一个形状为[vocab_size, embedding_size]的张量,作为需要学习的词向量,记为$W_0$ 。对于给定的输入$V$,使用向量乘法,将$V$乘以$W_0$,这样就得到了一个形状为[batch_size, embedding_size]的张量,记为$H=V×W_0$ 。这个张量$H$就可以看成是经过词向量查表后的结果 。
- 声明另外一个需要学习的参数$W_1$,这个参数的形状为[embedding_size, vocab_size] 。将上一步得到的$H$去乘以$W_1$,得到一个新的tensor $O=H×W_1$,此时的$O$是一个形状为[batch_size, vocab_size]的tensor,表示当前这个mini-batch中的每个中心词预测出的目标词的概率 。
- 使用softmax函数对mini-batch中每个中心词的预测结果做归一化,即可完成网络构建 。
假设有一个中心词$c$和一个上下文词正样本$t_p$ 。在Skip-gram的理想实现里,需要最大化使用$c$推理$t_p$的概率 。在使用softmax学习时,需要最大化$t_p$的推理概率,同时最小化其他词表中词的推理概率 。之所以计算缓慢,是因为需要对词表中的所有词都计算一遍 。然而我们还可以使用另一种方法,就是随机从词表中选择几个代表词,通过最小化这几个代表词的概率,去近似最小化整体的预测概率 。比如,先指定一个中心词(如“人工”)和一个目标词正样本(如“智能”),再随机在词表中采样几个目标词负样本(如“日本” , “喝茶”等) 。有了这些内容,我们的skip-gram模型就变成了一个二分类任务 。对于目标词正样本,我们需要最大化它的预测概率;对于目标词负样本,我们需要最小化它的预测概率 。通过这种方式 , 我们就可以完成计算加速 。上述做法 , 我们称之为负采样 。
在实现的过程中,通常会让模型接收3个tensor输入:
- 代表中心词的tensor:假设我们称之为center_words $V$ , 一般来说,这个tensor是一个形状为[batch_size, vocab_size]的one-hot tensor,表示在一个mini-batch中每个中心词具体的ID 。
- 代表目标词的tensor:假设我们称之为target_words $T$,一般来说,这个tensor同样是一个形状为[batch_size, vocab_size]的one-hot tensor,表示在一个mini-batch中每个目标词具体的ID 。
- 代表目标词标签的tensor:假设我们称之为labels $L$,一般来说,这个tensor是一个形状为[batch_size, 1]的tensor , 每个元素不是0就是1(0:负样本,1:正样本) 。
- 用$V$去查询$W_0$,用$T$去查询$W_1$,分别得到两个形状为[batch_size, embedding_size]的tensor , 记为$H_1$和$H_2$ 。
- 点乘这两个tensor,最终得到一个形状为[batch_size]的tensor$O = [O_i = \sum_j H_0[i,j] × H_1[i,j]]_{i=1}^{batch_size}$ 。
- 使用sigmoid函数作用在$O$上,将上述点乘的结果归一化为一个0-1的概率值 , 作为预测概率 , 根据标签信息$L$训练这个模型即可 。
推荐阅读
- 超人怎么死的(超人怎么复活)
- 米游社上传图片水印怎么关
- 苹果se3参数与图片_苹果se3参数详细配置
- 双叶h-单叶双曲面与双叶双曲面的图像区别
- dc超人咋死的
- 许褚怎么牺牲的(三国名将许褚之死)
- CSS处理器-Less/Scss
- JUC学习笔记——进程与线程
- 红警尤里怎么玩(红警2共和国之辉尤里怎么玩)
- 斗地主怎么玩(斗地主怎么记牌最轻松)