在做graph embedding的过程中,产生了对w2v几个疑问,索性重新回顾了一下w2v,做此总结。其中忽略了成吨的梯度更新推导,抓住主干,结论即可。
先按时间顺序附上w2v的几篇论文:
2013_Efficient Estimation of Word Representations in Vector Space
2013_Distributed Representations of Words and Phrases and their Compositionality
2014_Negative-Sampling Word-Embedding Method
2016_word2vec Parameter Learning Explained
本文不注重w2v的原因等balabala,主要是对第四篇论文的个人理解 https://arxiv.org/abs/1411.2738,以及之前对w2v的资料整理。
原文21页,内容非常多,先整理出最基本的两部分更新公式的推导。后面的优化方法有很多展开,之后整理好上传。
W2v算法原理推导
CBOW简易版:one-word context
我们通常看到的w2v原理介绍,都是下图样子,其实这是最简单的连续词袋模型(CBOW)的示意图,其中假设上下文只有一个单词(Input),来预测一个目标单词(output),就是一个二元模型,其实这也是传统的神经网络词向量语言模型,也就是下图(但是w2v从输入层到隐层的映射没有加激活函数,而是直接对所有输入词向量求和取平均)。
文章中的符号表示:
v_w: input vector ,是权重矩阵W的一行
v'_w: output vector ,是权重矩阵W‘的一列
$v{wI}$: 输入层唯一单词的input vector
特别注意,v_m和v'_m只是单词w的两种不同表达而已(最终使用前者作为词向量)
至于如何更新参数,直接上结论:
- 在反向传播更新隐层到输出层权重W'时,对于每一个样本,需要遍历词汇表V中所有单词,把输出层矩阵W’的所有N*V个元素都更新一遍,计算量非常大;
2. 在更新输入层到隐层的权重W时,词向量矩阵W只有输入单词那一行的导数非0,其余的行在迭代过程中导数都为0,均保持不变,所以在反向传播时只更新W矩阵的一行,记做v{wI}。w_I表示输入的单词,I表示在W中输入单词那一行,是一个N维词向量。
其中 e_j = y_j - t_j, 表示输出层第j个单词的预测误差(输出层 j节点输出 减去 j节点单词真实label(0或1,当且仅当j节点是目标单词时,值才为1)) 。EH向量是一个N维向量,表示词汇表中所有单词的输出向量和预测误差的加权求和,每一维的计算如下:
输入单词I的N维词向量第i个维度(i = {1,2,...,N})的更新公式如下,x_I = 1:
词向量矩阵的反向传播的更新公式表示,输入单词的N维词向量每个维度的更新,都和输出层的词向量(W‘的每一行)与预测误差的点积结果相关,个人感觉这个点积结果可以理解对该维度的修正。
即,输入单词w_I的词向量更新,取决于它与词汇表V中所有单词的预测误差。
如果对公式有不理解,可以参考文末第二篇参考文献,用一个实际的例子模拟权重更新,博主真是有心了(第二个更新小标题写错了,是输入层-> 隐层权重的更新)。
原始paper中有一段话是这么解释训练词向量的过程:
其实根据更新公式我并没有理解上面这段话,根据公式来说,输入单词的第j个维度更新是和所有词汇表单词的第j个维度的output vector 的预测误差加权和有关,其他单词的预测误差也会影响输入单词的更新。这里存疑,但是这不重要,结论更重要,理解文章的下面一段话意思即可:
在输出层,如果单词作为预测单词的概率被高估(yi > ti),那么输入单词的输入向量(W对应行向量)就会远离的输出向量(W‘的列向量),相反就会靠近。通过多个训练样本(上下文-目标单词)的训练,每个单词的输入和输出向量的相对位置趋于稳定。 (After many iterations, the relative positions of the input and output vectors will eventually stabilize.)
multi-word context(上下文有多个单词)
在one-word CBOW中,h = Wx,直接对输入向量线性加和,而在multi-word CBOW中,输入向量是把窗口中的C个OHE形式的单词向量对位相加取平均再和权重矩阵W相乘。
损失函数:
其他更新方式和one-word基本一致,不是本文重点。
Skip-Gram Model
隐藏层h的定义依然是look up 权重矩阵W中输入单词的那一行。
损失函数变为概率的连乘形式:
注意,在输出层,输出C个多项式分布来替代one-word形式的只输出一个多项式分布。最终结果取这C个多项式分布概率最高的C个单词作为输出,也就是模型预测的结果,即中心词的C个上下文单词。其中每个输出共享同一个W’权重矩阵。
日常在训练skip-gram w2v时,输入的是一个中心词和宽度为k的窗口内上下文单词(假设C个单词w1,w2...,wC),最后进入模型的是(wi, w1), (wi,w2),...,(wi,wC)这样形式,还是(wi,(w1,w2,...,wC))?
——是前者,训练C个多项式分布。只是损失函数不同,要求掌握两种形式的损失函数。
码字不易,觉得有用请点个赞,感谢。
主要参考