word2vec算法原理公式推导

                                  word2vec参数学习解释

                                                        摘 要

    近两年来由Mikolov等人提出的word2vec模型和应用引起了社会的极大的关注。使用word2vec模型学习的单词的向量表示已经被证明能够携带语义信息,且在各种NLP任务中都是有用的。越来越多的研究人员希望尝试使用word2vec,但我注意到对于word2vec参数学习过程目前还缺乏一个全面解释的资料,因此限制了许多神经网络方面了解不深的人去理解word2vec的工作原理。

    本文提供了word2vec模型的参数更新方程的详细推导和解释,包括原始的连续词袋(CBOW)模型和skip-gram模型,以及一些高级技巧--分层的soft-max和负抽样。在附录中,回顾了神经元网络模型和反向传播的基础知识

1 连续词袋(CBOW)模型

1.1 One-word context  (只考虑目标单词前面一个单词的情况

    我们从Mikolov等人最简单版本的连续词袋模型(CBOW)开始介绍。连续词袋模型做出这样的假设一个单词出现的可能性与其上下文的单词组成有关,这意味着对于CBOW模型我们可以通过给定的上下文单词环境来预测一个目标单词,就像一个二元模型。

    图一为简化的通过上下文来定义词向量的网络模型,我们设置词汇量的大小为V,隐藏层的大小为N,相邻层上的节点完全连接。输入向量是一个one-hot编码的向量,对于给定的输入上下文单词,one-hot编码中每个单词的向量表示为\begin{Bmatrix} x_{1},x_{1},...x_{v} \end{Bmatrix},其中只有一个节点x_{k}为1,而所有其他节点为0。

    输入层和输出层之间的权重可以由V\cdot N的矩阵W表示。

                                                                     \large W=\bigl(\begin{smallmatrix} w_{11} &w_{12} &... &w_{1n} \\ w_{21} &w_{22} &... &w_{2n} \\ .... & ...& ... & ...\\ w_{v1}& w_{v2} &... &w_{vn} \end{smallmatrix}\bigr)

其中W矩阵的每一行代表的是一个与输入层相关的单词的N维向量表示形式 V_{w}。那么假设我们给定了一个输入单词,其单词向量的第k个元素X_{k}=1,其余X_{k'}=0(k'\not\equiv k),则有:

                                                                    \large h=x^{T}W=W_{(k,\cdot )}x_{k}=V_{w_{I}}^{T}                                                          (1)

     h向量完全是由W矩阵第k行计算出来的 (因为除X_{k}=1外,其余X_{k'}都为0),V_{w_{I}}是输入字w_{I}的向量表示。

     分析完输入层到隐藏层之后,我们再看隐藏层到输出层,有一个新的的权重矩阵W^{'}=w_{ij}^{'},它也是一个V\cdot N矩阵。使用这些权重w_{ij}^{'},我们可以计算词汇表中每个单词的分数u_{j}

                                                                       \large u_{j}=v_{wj}^{'}^{T}\cdot h                                                                               (2)

其中v_{wj}^{'}是矩阵W^{'}的第j列,然后我们使用一个满足多项式分布的对数线性分类模型soft-max来获取单词的后验概率。

                                                               \large p(w_{j} |w_{I} ) = y_{j}=\frac{e^{u_{j}}}{\sum_{j^{'}=1}^{V} e^{u_{j^{'}}}}                                                         (3)

其中\large y_{j}是输出层中\large j节点的输出,我们将式子(1)和(2)代入式子(3),得到:

                                                              \large p(w_{j} |w_{I} ) = y_{j}=\frac{e^{{V_{w_{O}}^{'}}^{T}V_{w_{I}}}}{\sum_{j^{'}=1}^{V} e^{{V_{w_{j}^{'}}^{'}}^{T}V_{w_{I}}}}                                                  (4)

    注意\large v_{w}\large v_{w}^{'}是单词\large w的两种表示方式,\large v_{w}是矩阵W的一行,是由输入层→隐藏层的权值矩阵。\large v_{w}^{'}是矩阵W^{'}的一列,是由隐藏层→输出层的权值矩阵。在之后的分析中,我们默认将\large v_{w}称为单词w的“input vector”,将\large v_{w}^{'}称为单词w的“output vector”。

更新隐藏层→输出层权重的等式

       现在我们开始推到CBOW模型的权值更新方程。虽然实际的计算方式有点不切实际(之后解释),但是这不妨碍我们推到这个方程来增加我们对这个原始模型的理解。推到过程需要一些神经网络的知识基础:有关反向传播基础知识的综述,请参阅附录A。

     由上一阶段的描述可知,现在训练的目标(这节只针对一个单词)就是求公式(4)的最大值。其意在当我们给定了上下文信息以及其权值矩阵的情况下,在词汇表中计算每个词成为中心单词的概率,从而预测目标单词。

                                                                    \large \\max(P(w_{0}|w_{I}))\\=max(y_{j*})\\=log(max(y_{j*}))\\=u_{j*}-log(\sum_{j^{'}=1}^{V}e^{u_{j^{'}}} ):=-E

     这里我们设置一个\large E=-P(w_{0}|w_{I})为我们的损失函数(一个最小化的目标),\large j*是目标单词在输出层的索引。可以发现,对于这个损失函数的计算,我们可以将其理解为一种特殊情况下对2个概率分布的交叉熵测量。

    现在我们来推到一下隐藏层到输出层之前的权重更新方程,首选我们对损失函数\large E=-P(w_{0}|w_{I})求关于\large u_{j}的偏导,这样得:

                                                                       \large \frac{\partial E}{\partial u_{j}}=y_{j}-t_{j}:=e_{j}

    其中\large t_{j}=1(j=j*)|0(j\neq j*),即当且仅当输出层的第\large j个单词为目标单词时,\large t_{j}的值为1,其余情况都为0。可以看出这个导数实质上是输出层的预测误差\large e_{j}

接下来我们通过链式法则来求出损失函数在\large w_{ij}^{'}上的偏导, 并通过此来计算隐藏层到输出层的梯度。 

                                                                     \large \frac{\partial E}{\partial w_{ij}^{'}}=\frac{\partial E}{\partial u_{j}}\cdot \frac{\partial u_{j}}{\partial w_{ij}^{'}}=e_{j}\cdot h_{i}

之后我们使用随机梯度下降方法,得到最终的隐藏层→输出层的权重更新方程

                                                                   \large w_{ij}^{'}:= w_{ij}^{'}-\eta \cdot e_{j}\cdot h_{i}

或者说:

                                                                    \large \\V_{w_{j}}^{'}:= V_{w_{j}}^{'}-\eta \cdot e_{j}\cdot h       \large j=1,2...V

其中\large \eta为梯度下降算法的学习率(\large \eta > 0) ,\large e_{j}=y_{j}-t_{j},其中\large h_{i}是隐藏层的第\large i个神经元,\large V_{w_{j}}^{'}是输出单词\large w_{j}的向量表示。可以看出,通过对比输出的可能性\large y_{j}和期望的输出\large t_{j}(取值只能为0或者1)来更新权重意味着我们需要遍历词汇表中所有单词。

这个过程中:

    当 \large y_{i}>t_{j}('高估')的时候,\large e_{j}>0,那么会从\large V_{w_{0}}^{'}上减去隐藏向量\large h的一部分,这样向量\large V_{w_{0}}^{'}就与向量\large V_{w_{I}}相差更远;

    当 \large y_{i}<t_{j}('低估')的时候,\large e_{j}<0,那么会从\large V_{w_{0}}^{'}上加上隐藏向量\large h的一部分,这样向量\large V_{w_{0}}^{'}就与向量\large V_{w_{I}}相差更近;

    当 \large y_{i}\cong t_{j}('相近')的时候,\large e_{j}\cong 0,那么会从\large V_{w_{0}}^{'}的值在更新过程基本不会发生变化;

更新隐藏层→输出层权重的等式

     在介绍完hidden→output的权重矩阵\large W^{'}更新公式之后,我们接着介绍input→hidden的权重矩阵\large W的更新过程。在上面小节中我们解释了损失函数\large E,现在我们对\large E\large h_{i}上求偏导:

                                                    \large \frac{\partial E}{\partial h_{i}}=\sum_{j=1}^{v}\frac{\partial E}{\partial u_{j}}\cdot \frac{\partial u_{j}}{\partial h_{i}}=\sum_{j=1}^{v}e_{j}\cdot w_{ij}^{'}:=EH_{i}                                                            (12)

其中\large h_{i}为隐藏层上第\large i个神经元的输出;\large u_{j}=v_{wj}^{'}^{T}\cdot h,表示输出层第j个神经单元的输入;\large e_{j}=y_{j}-t_{j}为输出层第j个单词的预测误差。所以我们设定一个\large N维的向量\large EH,它的每一个元素代表的是词汇表中的每个单词的预测误差\large e_{j}与词汇表中每个输出单词的向量的乘积之和。

    接下来,我们需要求出损失函数\large E关于权重矩阵\large W的偏导数。首先,我们知道隐藏层激活单元的输出\large h_{i}是输入层的值\large x_{k}与其权重\large w_{kI}的线性组合,由此分解式子(1)我们可以得到:

                                                       \large h=x^{T}W=W_{(k,\cdot )}x_{k}=V_{w_{I}}^{T}

                                                      \large h_{i}=\sum _{k=1}^{V}x_{k}\cdot w_{kI}                                                                                                       (13)

    对于权重矩阵\large W的每一个元素\large w_{kI},通过式(12)和式(13),我们可以求得其在损失函数\large E上的偏导:

                                                       \large \frac{\partial E}{\partial w_{ki}}=\frac{\partial E}{\partial h_{i}}\cdot \frac{\partial h_{i}}{\partial w_{ki}}=EH_{i}\cdot x_{k}                                                                          (14)

     以线性代数的角度来说:

                                                         \large \frac{\partial E}{\partial W}=x \cdot EH=x*EH^{T}                                                                                (15)

    通过式(15)我们得到一个\large V\times N的矩阵,由于\large x只有一个非零值(one-hot),所以\large \frac{\partial E}{\partial W}的结果也只有一行是非零的,非零N维向量就是那一行\large EH的值,由此我们得到权重矩阵\large W的更新方程:

                                                         \large v_{wI}:=v_{wI}-\eta \cdot EH

     其中\large v_{wI}是矩阵\large W中输入单词\large w_{I}(即one-hot编码中非零的哪行对应的单词)的输入向量。我们不用去关心除\large v_{wI}外的其他行向量,因为其\large x_{k}的值为0,由式(14)可以看出其偏导\large \frac{\partial E}{\partial w_{kI}}也为0。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章