导读
word2vec主要实现方法是Skip-gram和CBOW,CBOW的目标是根据上下文来预测当前词的概率,且上下文所有的词对当前词出现概率的影响的权重是一样的,因此叫做continuous bag-of-words模型。如在袋子中取词,去取出数量足够的词就可以了,与取出词的先后顺序无关。Skip-gram刚好相反,其是根据当前词来预测上下文概率的。在实际应用中算法并无高下之分,主要根据呈现的效果来进行算法选择。这里介绍Skip-gram,并通过例子来理解Skip-gram是如何实现预测上下文,并如何训练得到词向量。
Skip-gram 模型
skip-gram模型是根据中心词预测上下文m个词的算法,m是用户自己定义的预测窗口大小,比如一句话“I love natural language processing”,假设词典库就是{“I”,“ love”,“ natural”,“ language”,“ processing”},这些词事先都用one-hot编码。中心词为“natural”作为输入,给定窗口2,那么就要通过Skip-gram 模型预测出上下文为“I”,“love”,“language”,“processing”。skip-gram需要做的就是使得概率P({“I”,“ love”,“ language”,“ processing”|“ natural”)最大。由于词语词之间相互独立,所以可以将概率公式转化为:P(“I"∣“natural")⋅P(“love"∣“natural")⋅P(“language"∣“natural")⋅P(“processing"∣“natural")用下面两个图表示表示如下:下图是skip-gram的神经网络结构,隐含层没有使用任何激活函数,隐藏层到输出层进行全连接,然后是一个softmax,输出概率。过程比较简单,一个Forward Propagation,一个Backward Propagation。完成参数的更新。看到这里可能会觉得云里雾里的,举个例子来看看skip-gram是如何预测上下文和实现word2vec的。
skip-gram预测上下文
skip-gram预测主要围绕下面这个图进行:1.one-hot编码:one-hot编码是一个(V * V)的矩阵,其中V代表字典库的大小。假设字典库就是{“I”,“ love”,“ natural”,“ language”,“ processing”},对应的one-hot编码如下:
2.中心词向量矩阵W中心词向量矩阵也叫输入层到隐含层的权重矩阵W(d*V)。由于one-hot编码的稀疏性以及无法计算词与词之间的相似性等缺点,所以我们希望通过一个稠密的向量来表示词语,即将词语映射到低维的向量表示,我们把这种映射叫做词嵌入(word embedding)。那么如何做到embedding呢?如果我们现在把一个词典库的10000个单词(V=10000)分别用300个特征(d=300)来表示的话,那么隐含层就有300个神经元,看下面的图片,左右两张图分别从不同角度代表了输入层-隐层的权重矩阵。左图中每一列代表一个10000维的词向量和隐层单个神经元连接的权重向量。从右边的图来看,每一行实际上代表了每个单词的词向量。
用刚刚的例子解释一下,将每个词的one-hot编码向量乘以一个学习好的低维的共享矩阵W(V *d)。比如要把例子5维向量(这里V=5)表示的词语映射到3维向量(d=3),假设学习好的W为:中心词“nature”one-hot编码的向量和共享矩阵相乘就得到它的词向量,用Vc表示,对向量进行归一化得到Vc=(0.46 0.15 0.39):3.上下文向量矩阵类似词典中心词向量矩阵,但这里的词向量中d个维度储存的抽象信息,是作为上下文的词而言,它与中心词之间的对应关系信息,对于词典中的每一个词都对应一个上下文向量矩阵。比如nature的上下文你向量矩阵是W’,(3 12 8),(13 11 26),(20 32 23),(8 22 12)分别是“I”,“ love”,“ language”,“ processing”相对“ natural”的上下文向量。将中心词(nature)的词向量和学习好的权重矩阵的其他词做内积,此时会得到每个词的计算结果:为了方便计算,再将结果进行归一化得到
4.softmax
输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),是词典中每个词成为当前指定中心词的上下文的概率,这些所有输出层神经元结点的概率之和为1。计算方法为:
这个例子的softmax计算结果如下,有些地方分母会是包括中心词的五个数相加,但这样并不会影响结果:“I”是“nature”的上下文的概率为0.226,以此类推,选择4个(2*2)softmax最大的词作为当前中心词的上下文,因为这个例子词典库就5个词语,所以剩下4个都作为natural的上下文。
BP算法
上面的例子是在已经学习好了中心词向量矩阵和上下文向量矩阵完成的,那么在这之前就要训练模型学习这两个矩阵,训练的过程就是一个BP算法。在学习的过程是一个监督学习,对于一个中心词我们是有明确的上下文的,我们期望窗口内的词的输出概率最大。在此之前我们学习另一种目标函数的表示方法。对于一个句子:S=(w1 w2 w3 w4 w5 w6).有六个单词分别问w1~w6,我们用P(D=1|wi,wj;θ)表示wi,wj作为上下文的概率,其中θ为模型参数,后文会接着解释模型参数。如果wi,wj作为上下文,我们就希望下面这个概率公式越大越好,其中概率公式表示是条件概率的逻辑回归表示,其中u和v分别代表中心词向量和上下文向量:
那么目标函数就是要最大化下面这个函数,其中w是文章T中的词,c是中心词w对应的所有上下文单词:对于刚刚说的要学习中心词向量矩阵W和上下文向量矩阵W’就是要更新目标函数的 ,这两个参数也正是上面提到的模型参数θ。将目标函数用L(θ)表示,用梯度下降法分别计算这两个参数的梯度:然后更新:
接着更新两个向量矩阵即可。每一次迭代都把词典库中的所有词学习完,并更新两个矩阵,当达到最大迭代次数时,也就完成了word2vec的工作了。中心词向量矩阵跟one-hot编码是有关系的,只要将one-hot编码和W相乘就是我们要查的那个单词的word embedding了,这个也叫查表(Lookup table)。通常语义比较相近的词出现在上下文的概率是比较大的,word2vec模型会把两个语义相近的词的word embedding训练的比较接近。
参考和引用[1] Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.[2]《Python自然语言处理实战》涂铭、刘详、刘树春 著
记得备注呦