图学习参考资料 词向量word2vec( 三 )

在实际操作中,使用一个滑动窗口(一般情况下,长度是奇数),从左到右开始扫描当前句子 。每个扫描出来的片段被当成一个小句子,每个小句子中间的词被认为是中心词,其余的词被认为是这个中心词的上下文 。
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 。
在理想情况下 , 我们可以使用一个简单的方式实现skip-gram 。即把需要推理的每个目标词都当成一个标签,把skip-gram当成一个大规模分类任务进行网络构建,过程如下:
  1. 声明一个形状为[vocab_size, embedding_size]的张量,作为需要学习的词向量,记为$W_0$ 。对于给定的输入$V$,使用向量乘法,将$V$乘以$W_0$,这样就得到了一个形状为[batch_size, embedding_size]的张量,记为$H=V×W_0$ 。这个张量$H$就可以看成是经过词向量查表后的结果 。
  2. 声明另外一个需要学习的参数$W_1$,这个参数的形状为[embedding_size, vocab_size] 。将上一步得到的$H$去乘以$W_1$,得到一个新的tensor $O=H×W_1$,此时的$O$是一个形状为[batch_size, vocab_size]的tensor,表示当前这个mini-batch中的每个中心词预测出的目标词的概率 。
  3. 使用softmax函数对mini-batch中每个中心词的预测结果做归一化,即可完成网络构建 。
2.1.2 Skip-gram的实际实现然而在实际情况中,vocab_size通常很大(几十万甚至几百万) , 导致$W_0$和$W_1$也会非常大 。对于$W_0$而言 , 所参与的矩阵运算并不是通过一个矩阵乘法实现,而是通过指定ID,对参数$W_0$进行访存的方式获取 。然而对$W_1$而言,仍要处理一个非常大的矩阵运算(计算过程非常缓慢,需要消耗大量的内存/显存) 。为了缓解这个问题 , 通常采取负采样(negative_sampling)的方式来近似模拟多分类任务 。此时新定义的$W_0$和$W_1$均为形状为[vocab_size, embedding_size]的张量 。
假设有一个中心词$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:正样本) 。
模型训练过程如下:
  1. 用$V$去查询$W_0$,用$T$去查询$W_1$,分别得到两个形状为[batch_size, embedding_size]的tensor , 记为$H_1$和$H_2$ 。
  2. 点乘这两个tensor,最终得到一个形状为[batch_size]的tensor$O = [O_i = \sum_j H_0[i,j] × H_1[i,j]]_{i=1}^{batch_size}$ 。
  3. 使用sigmoid函数作用在$O$上,将上述点乘的结果归一化为一个0-1的概率值 , 作为预测概率 , 根据标签信息$L$训练这个模型即可 。

    推荐阅读