介绍词向量word2evc概念,及CBOW和Skip-gram的算法实现( 三 )


$$????????????????????????????({Oi})=frac{exp({Oi})}{sumjexp({Oj})}$$
如图6所示 , Skip-gram是一个具有3层结构的神经网络 , 分别是:
介绍词向量word2evc概念,及CBOW和Skip-gram的算法实现
文章图片
InputLayer(输入层):接收一个one-hot张量$VinR^{1timestext{vocab_size}}$作为网络的输入 , 里面存储着当前句子中心词的one-hot表示 。 HiddenLayer(隐藏层):将张量$V$乘以一个wordembedding张量$W_1inR^{text{vocab_size}timestext{embed_size}}$ , 并把结果作为隐藏层的输出 , 得到一个形状为$R^{1timestext{embed_size}}$的张量 , 里面存储着当前句子中心词的词向量 。 OutputLayer(输出层):将隐藏层的结果乘以另一个wordembedding张量$W_2inR^{text{embed_size}timestext{vocab_size}}$ , 得到一个形状为$R^{1timestext{vocab_size}}$的张量 。 这个张量经过softmax变换后 , 就得到了使用当前中心词对上下文的预测结果 。 根据这个softmax的结果 , 我们就可以去训练词向量模型 。
在实际操作中 , 使用一个滑动窗口(一般情况下 , 长度是奇数) , 从左到右开始扫描当前句子 。 每个扫描出来的片段被当成一个小句子 , 每个小句子中间的词被认为是中心词 , 其余的词被认为是这个中心词的上下文 。
2.1.1Skip-gram的理想实现
使用神经网络实现Skip-gram中 , 模型接收的输入应该有2个不同的tensor:代表中心词的tensor:假设我们称之为centerwords$V$ , 一般来说 , 这个tensor是一个形状为[batchsize,vocab_size]的one-hottensor , 表示在一个mini-batch中 , 每个中心词的ID , 对应位置为1 , 其余为0 。 代表目标词的tensor:目标词是指需要推理出来的上下文词 , 假设我们称之为targetwords$T$ , 一般来说 , 这个tensor是一个形状为[batchsize,1]的整型tensor , 这个tensor中的每个元素是一个[0,vocab_size-1]的值 , 代表目标词的ID 。
在理想情况下 , 我们可以使用一个简单的方式实现skip-gram 。 即把需要推理的每个目标词都当成一个标签 , 把skip-gram当成一个大规模分类任务进行网络构建 , 过程如下:声明一个形状为[vocabsize,embeddingsize]的张量 , 作为需要学习的词向量 , 记为$W0$ 。 对于给定的输入$V$ , 使用向量乘法 , 将$V$乘以$W0$ , 这样就得到了一个形状为[batchsize,embeddingsize]的张量 , 记为$H=V×W_0$ 。 这个张量$H$就可以看成是经过词向量查表后的结果 。 声明另外一个需要学习的参数$W1$ , 这个参数的形状为[embeddingsize,vocabsize] 。 将上一步得到的$H$去乘以$W1$ , 得到一个新的tensor$O=H×W1$ , 此时的$O$是一个形状为[batchsize,vocab_size]的tensor , 表示当前这个mini-batch中的每个中心词预测出的目标词的概率 。 使用softmax函数对mini-batch中每个中心词的预测结果做归一化 , 即可完成网络构建 。
2.1.2Skip-gram的实际实现
然而在实际情况中 , vocabsize通常很大(几十万甚至几百万) , 导致$W0$和$W1$也会非常大 。 对于$W0$而言 , 所参与的矩阵运算并不是通过一个矩阵乘法实现 , 而是通过指定ID , 对参数$W0$进行访存的方式获取 。 然而对$W1$而言 , 仍要处理一个非常大的矩阵运算(计算过程非常缓慢 , 需要消耗大量的内存/显存) 。 为了缓解这个问题 , 通常采取负采样(negativesampling)的方式来近似模拟多分类任务 。 此时新定义的$W0$和$W1$均为形状为[vocabsize,embedding_size]的张量 。
假设有一个中心词$c$和一个上下文词正样本$tp$ 。 在Skip-gram的理想实现里 , 需要最大化使用$c$推理$tp$的概率 。 在使用softmax学习时 , 需要最大化$t_p$的推理概率 , 同时最小化其他词表中词的推理概率 。 之所以计算缓慢 , 是因为需要对词表中的所有词都计算一遍 。 然而我们还可以使用另一种方法 , 就是随机从词表中选择几个代表词 , 通过最小化这几个代表词的概率 , 去近似最小化整体的预测概率 。