word2vec详解

没时间,先把论文附在这,有需要的可以看下,看完后是一个很大的提升。后期有空补上

https://arxiv.org/pdf/1411.2738.pdf

https://arxiv.org/pdf/1402.3722.pdf

word2vec Parameter Learning Explained

译文:

Abstract

Mikolov等人的word2vec模型及其应用在近两年引起了极大的关注。通过word2vec模型学习的单词向量表示具有语义意义,在各种NLP任务中都很有用。随着越来越多的研究人员将实验word2vec或类似的技术,我注意到缺乏材料,全面解释字嵌入模型的参数学习过程的细节,这将阻止神经网络非专业人士理解此类模型的工作机制。

本文对word2vec模型的参数更新方程进行了详细的推导和说明,包括原始的连续词袋模型(CBOW)和skip-gram(SG)模型,以及分层softmax和负采样等先进的优化技术。除了数学推导外,还提供了梯度方程的直观解释。

在附录中,综述了神经元网络和反向传播的基础知识。我还创建了一个交互式演示程序wevi,以促进对模型的直观理解。

1 Continuous Bag-of-Word Model

1.1 One-word context

我们从Mikolov等人(2013a)引入的最简单的连续词袋模型(CBOW)开始。我们假设每个上下文只考虑一个单词,这意味着模型将在给定一个上下文单词的情况下预测一个目标单词,这就像一个bigram模型。对于初学神经网络的读者,建议先阅读附录A,快速回顾一下重要的概念和术语,然后再继续学习。

图1显示了简化了上下文定义的网络模型。在我们的设置中,词汇量大小为V,隐藏层大小为N,相邻层上的单元完全连接。输入是一个独热编码向量,这意味着对于给定的输入上下文单词,V个单元\{ x_1, ..., x_V \}中只有一个是1,其他所有单元都是0。

输入层与输出层之间的权值可以用V \times N矩阵W表示。W的每一行是输入层关联词的N维向量表示v_w。形式上,W的第i行是v^T_w。给定上下文(一个单词),假设x_k = 1x_{k'} = 0其中k' \neq k,我们有:

                                                                         h=W^Tx = W^T_{(k,\cdot )} :=v^T_{w_I}                                                    (1)

本质上是把W的第k行复制到h。v_{w_I}是输入词w_I的向量表示。这意味着隐含层单元的激活函数是简单的线性函数(即,直接将其加权的输入和传递给下一层)。

从隐层到输出层,有一个不同的权值矩阵W' = \{ w'_{ij} \},是一个N \times V矩阵。使用这些权重,我们可以计算出词汇表中每个单词的u_j分数,

                                                                                  u_j = v'_{w_j}^Th                                                                    (2)

其中v'_{w_j}是矩阵W'的第j列。然后利用对数线性分类模型softmax得到单词的后验分布,即多项式分布。

                                                                   p(w_j | w_I) = y_j = \frac{exp(u_j)}{\sum^V_{j'=1}exp(u_{j'})}                                               (3)

其中y_j是输出层中j单元的输出。将(1)(2)代入(3)得到:

                                                                     p(w_j|w_I) = \frac{exp(v'^T_{w_j} v^T_{w_I})}{\sum^V_{j'=1} exp(v'^T_{w_{j'}}v^T_{w_I})}                                               (4)

注意v_wv'_w是单词w的两种表示形式,v_w来自于W的行,是输入层→隐藏层权重矩阵,v'_w来自于W'的列,是隐藏层→输出层的权重矩阵。在后续的分析中,我们将v_w称为“输入向量”,将v'_w称为单词w的“输出向量”。

Update equation for hidden→output weights

现在我们来推导这个模型的权值更新方程。虽然实际的计算是不切实际的(解释如下),但我们进行推导是为了在不使用任何技巧的情况下了解这个原始模型。有关反向传播基础知识的回顾,请参见附录A。

给定上下文单词相关的权重,训练目标(对于一个训练样本)是最大化(4)中观察实际输出单词w_O的条件概率。

                            max \ p(w_O | w_I) = max \ y_{j^*} = max \ log \ y_{j^*}= u_{j^*} - log\sum^V_{j'=1}exp(u_{j'}) := -E              (5)(6)(7)

其中E=-log \ p(w_O | w_I)是我们的损失函数(我们想要最小化E),j^*是输出层中实际输出单词的索引。注意,这个损失函数可以理解为两个概率分布之间交叉熵测量的一个特例。

现在让我们推导隐藏层和输出层之间的权值的更新方程。求E对第j个单元的净输入u_j的导数,得到

                                                                        \frac{\partial E}{\partial u_j}=y_j - t_j: = e_j                                                              (8)

其中t_j = 1(j=j^*),即,仅当第j个单元为实际输出字时,t_j为1,其余t_j=0。注意,这个导数只是输出层的预测误差e_j

接下来我们对w'_{ij}求导,得到隐藏的→输出权值的梯度。(这里为什么只对u_j计算中间导数?请看下表,从表中我们知道,只有计算u_j的时候用到了w'_{ij}

u_1w'_{11}w_{I1}+w'_{21}w_{I2}+w'_{31}w_{I3}+...+w'_{N1}w_{IN}
u_2w'_{12}w_{I1}+w'_{22}w_{I2}+w'_{32}w_{I3}+...+w'_{N2}w_{IN}
u_jw'_{1j}w_{I1}+w'_{2j}w_{I2}+w'_{3j}w_{I3}+...+w'_{Nj}w_{IN}

                                                                 \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                                                       (9)

因此,利用随机梯度下降法,得到隐含层→输出权值的权值更新方程:

                                                           w'_{ij}^{(new)} = w'_{ij}^{(old)} - \eta \cdot e_j \cdot h_i                                                          (10)

或者 

                                                      v'_{w_j}^{(new)} = v'_{w_j}^{(old)} - \eta \cdot e_j \cdot h \ \ \ for j=1,2,...,V                              (11)

其中\eta > 0是学习率,e_j = y_j - t_jh_i是隐藏层的第i个单元;v'_{w_j}w_j的输出向量。注意,这个更新方程意味着我们必须通过所有可能的单词词汇表,检查它的输出概率y_j,将y_j其预期输出t_j作比较。如果y_j > t_j (“高估”),然后我们从v'_{w_j}中减去一部分隐藏向h(即v_{w_j}),使v'_{w_j}距离v_{w_j}更远;如果y_j < t_j(“低估”,只有当t_j = 1,即w_j= w_O时才成立),我们在v'_{w_O}上加一些h,从而使v'_{w_{O}}更接近v_{w_I}。如果y_i非常接近t_j,那么根据更新方程,权值变化很小。再次注意,v_w(输入向量)和v'_w(输出向量)是单词w的两种不同的向量表示。

Update equation for input→hidden weights

在得到了W'的更新方程后,我们现在将目标转向W。我们求E对隐含层的输出的导数,得到(h_i=w_{Ii},从上表中可以看到所有的u_j中均包含w_{Ii},因此需要对多个u_j分别求导累加)

                                                     \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)

其中h_i为隐含层第i个单元的输出;u_j在式(2)中定义,为输出层第j个单元的净输入;e_j = y_j - t_j是输出层第j个字的预测误差。EH是一个N-dim向量,是词汇表中所有单词的输出向量之和,由预测误差加权得到。

接下来我们要求Ew的倒数。首先,要记住隐含层对输入层的值进行线性计算。将式(1)中的向量符号展开得到

                                                                                        h_i = \sum_{k=1}^V x_k \cdot w_{ki}                                                (13)

现在我们可以求EW中的每个元素求导,得到

                                                                          \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)

这等价于xEH的张量积,即:

                                                                                  \frac{\partial E}{\partial W} = x \otimes EH = xEH^T                                       (15)

由此得到一个V \times N矩阵。因为x只有一个分量是不零的,所以\frac{\partial E}{\partial W}只有一行是不为零的,而这一行的值是EH^T,一个N-dim向量。得到了W的更新方程

                                                                                    v_{w_I}^{(new)} = v_{w_I}^{(old)} - \eta EH^T                                        (16)

其中v_{w_I}W的一行,是唯一上下文单词的“输入向量”,也是W中唯一导数非零的行。所有W的其他行在这个迭代之后都保持不变,因为它们的导数是零。

直观上,由于向量EH是词汇表中所有单词的输出向量之和,由预测误差e_j = y_j - t_j加权得到,因此(16)可以理解为将词汇表中每个输出向量的一部分加入上下文单词的输入向量。如果在输出层,一个单词w_j作为输出单词的概率被高估(y_j > t_j),那么上下文单词w_I的输入向量将趋向于远离w_j的输出向量;反之,如果低估w_j作为输出字的概率(y_j < t_j),则输入向量w_I将趋向于更接近w_j的输出向量;如果对w_j的概率进行较为准确的预测,则对w_I输入向量的移动影响不大。w_I输入向量的移动由词汇中所有向量的预测误差决定;预测误差越大,单词对上下文单词输入向量的移动影响越大。

当我们通过训练语料库生成的上下文-目标词对迭代地更新模型参数时,对向量的影响将会累积。我们可以想象一个单词w的输出向量是由w的共现邻居的输入向量来来回回地“拖动”的,就好像w的向量与其邻居的向量之间有物理字符串一样。同样,一个输入向量也可以被认为是由许多输出向量拖拽的。这种解释可以让我们想起重力,或者力指向的图形布局。每个虚拟字符串的平衡长度与相关词对之间的共流强度以及学习速度有关。经过多次迭代,输入和输出向量的相对位置最终会趋于稳定。

1.2 Multi-word context

图2显示了具有多单词上下文设置的CBOW模型。在计算隐含层输出时,CBOW模型没有直接复制输入上下文单词的输入向量,而是取输入上下文单词向量的平均值,并使用输入→隐藏权重矩阵和平均向量的乘积作为输出。

                                       h = \frac{1}{C} W^T (x_1 + x_2 + ... + x_C) = \frac{1}{C}(v_{w_1} + v_{w_2} + ... + v_{w_C})^T                       (17)(18)

其中C为上下文单词数,w_1,...,w_C为上下文单词,v_w为单词w的输入向量,损失函数为

                                                               E= -log \ p(w_O | w_{I,1},...,w_{I,C}) \\ = -u_{j^*} + log \sum_{j'=1}^V exp(u_{j'}) \\ =-v'_{w_O}^T \cdot h + log \sum_{j'=1}^V exp(v'_{w_j}^T \cdot h)                                     (19)(20)(21)

 

这与单词上下文模型的目标(7)相同,只是h不同,定义为(18)而不是(1)。

隐式→输出权重的更新方程与单词上下文模型(11)相同。我们复制到这里:

                                                     v'_{w_j}^{(new)}= v'_{w_j}^{(old)}- \eta \cdot e_j \cdot h \ \ \ \ for \ j=1,2,..,V                               (22)

注意,我们需要将此应用于每个训练实例的隐藏→输出权矩阵的每个元素。

输入→隐权值的更新方程与式(16)相似,只是现在我们需要对上下文中每个单词w_{I,c}应用如下方程:

                                                      v_{w_{I,c}}^{(new)} = v_{w_{I,c}}^{(old)} - \frac{1}{C} \cdot \eta \cdot EH^T \ \ \ for \ c = 1, 2, ..., C                              (23)

其中v_{w_{I,c}}为输入上下文中第c个单词的输入向量;\eta是一个积极的学习速率;EH=\frac{\partial E}{\partial h_i}是(12)对这个更新方程的直观理解与(16)相同。

2 Skip-Gram Model

Mikolov等人(2013a,b)介绍了skip-gram模型。图3显示了skip-gram模型。它与CBOW模型相反。目标单词现在位于输入层,上下文单词位于输出层。

我们仍然使用v_{wI}表示唯一单词的输入向量的输入层,因此我们有相同的隐层输出h的定义在(1),这意味着h是简单地复制(置换)一行输入→隐藏的权重矩阵W,与输入w_I相关。我们将h的定义复制如下:

                                                                                      h=W_{(k, \cdot)}^T :=v_{w_I}^T                                                      (24)

在输出层,不是输出一个多项式分布,而是输出C多项式分布。每个输出使用相同的隐藏→输出矩阵计算:

                                                                  p(w_{c,j}=w_{O,c} | w_I) = y_{c,j}=\frac{exp(u_{c,j})}{\sum_{j'=1}^V exp(u_{j'})}                               (25)

式中w_{c,j}为输出层第c个面板上的第j个单词;w_{O,c}是输出上下文单词中的实际第c个单词;w_I是唯一的输入单词;y_{c,j}为输出层第c个面板上第j个单元的输出;u_{c,j}是输出层第c个面板上第j个单元的净输入。因为输出层面板共享相同的权重,因此

                                                                  u_{c,j}=u_j=v'_{w_j}^T \cdot h, \ \ \ for \ c=1,2,..., C                                 (26)

其中v'_{w_j}为词汇表中第j个单词w_j的输出向量,v'_{w_j}是隐藏→输出权矩阵W'的一列。

参数更新方程的推导与单词上下文模型没有太大区别。损失函数改为

                                                                   E= -log \ p(w_{O, 1}, w_{O,2},...,w_{O,C} | w_I) \\ =-log \ p(w_{O,1}|w_I)p(w_{O,2}|w_I)p(w_{O,3}|w_I)...p(w_{O,C}|w_I) \\ = -log \ \prod_{c=1}^C \frac{exp(u_{c,j^*_c})}{\sum_{j'=1}^V exp(u_{j'})} \\ = - \sum_{c=1}^C u_{j^*_c} + C \cdot log \ \sum_{j'=1}^V exp(u_{j'})                              (27)(28)(29)

其中j^*_c是词汇表中实际的第c个输出上下文单词的索引。

对输出层各面板上各单元的净输入E求导,得到u_{c,j}

                                                                             \frac{\partial E}{\partial u_{c,j}} = y_{c,j} - t_{c,j} := e_{c,j}                                                     (30)

单位上的预测误差是多少,与式(8)相同。为了表示简单,我们定义了一个V维向量EI = \{ EI_1,...,EI_V \},作为所有预测误差的和:

                                                                                     EI_j = \sum_{c=1}^C e_{c,j}                                                               (31)

然后求E对隐式→输出矩阵W'的导数,得到

                                                                      \frac{\partial E}{\partial w'_{ij}} = \sum_{c=1}^C \frac{\partial E}{\partial u_{c,j}} \cdot \frac{\partial u_{c,j}}{\partial w'_{ij}} = EI_j \cdot h_i                                            (32)

由此得到隐式→输出矩阵W'的更新方程:

                                                                       w'_{ij}^{(new)} = w'_{ij}^{(old)} - \eta \cdot EI_j \cdot h_i                                                 (33)

或者

                                                  v'_{w_j}^{(new)} = v'_{w_j}^{(old)} - \eta \cdot EI_j \cdot h \ \ \ for j = 1, 2, ..., V                                      (34)

对这个更新方程的直观理解与(11)相同,只是预测错误是对输出层中的所有上下文单词求和。注意,我们需要对每个训练实例的隐藏→输出矩阵的每个元素应用这个更新方程。

输入→隐藏矩阵的更新方程推导式与式(12)~(16)相同,但考虑到预测误差e_jEI_j代替。我们直接给出更新方程:

                                                                                  v_{w_I}^{(new)} = v_{w_I}^{(old)} - \eta \cdot EH^T                                                  (35)

其中EH是一个N-dim向量,每个分量都定义为

                                                                                    EH_i = \sum_{j=1}^V EI_j \cdot w'_{ij}                                                        (36)

(35)的直观理解与(16)相同。

3 Optimizing Computational Efficiency

到目前为止,我们讨论的模型(“bigram”模型、CBOW和skip-gram)都是原始形式,没有使用任何效率优化技巧。

对于所有这些模型,每个单词在词汇表中都存在两个向量表示:输入向量v_w和输出向量v'_w。但是学习输出向量是非常昂贵的。从更新方程(22)和(33),我们可以发现,为了更新v'_w,对于每个训练实例,我们必须遍历每个字w_j词汇表,计算网络输入u_j,概率预测值y_j(对于skip-gram为y_{c,j}),其预测误差e_j(对于skip-gram为EI_j),最后使用他们的预测误差更新输出向量v'_j

为每个训练实例的所有单词进行这样的计算非常昂贵,这使得扩展到大型词汇表或大型训练语料库是不切实际的。要解决这个问题,直觉是限制每个训练实例必须更新的输出向量的数量。实现这一目标的一种优雅的方法是分级softmax;另一种方法是通过抽样,这将在下一节中讨论。

这两种技巧都只优化输出向量更新的计算。在我们的推导中,我们关心三个值:(1)E,新的目标函数;(2)\frac{\partial E}{\partial v'_w},新的输出向量更新方程;(3)\frac{\partial E}{\partial h},是为更新输入向量而反向传播的预测误差的加权和。

3.1 Hierarchical Softmax

层次softmax是计算softmax的一种有效方法(Morin and Bengio, 2005;Mnih和Hinton, 2009)。该模型使用二叉树表示词汇表中的所有单词。这V个词必须是树的叶节点。可以证明有V - 1个内单位。对于每个叶节点,都存在从根节点到叶节点的唯一路径,这条路径用来估计由叶节点表示的单词的概率。有关示例树,请参见图4。

在层次softmax模型中,没有词的输出向量表示。相反,每一个V - 1内部单位都有一个输出向量v'_{n(w,j)}。一个单词作为输出单词的概率定义为

                                          p(w=w_O) = \prod_{j=1}^{L(w)-1} \sigma ([n(w,j + 1) = ch(n(w,j))] \cdot v'_{n(w,j)}^T h)                              (37)

其中ch(n)为节点n的左子式;v'_{n(w,j)}是内节点n(w,j)的向量表示(“输出向量”);h为隐含层的输出值(在skip-gram模型中h=v_{w_I};在CBOW中h=\frac{1}{C} \sum_{c=1}^C v_{w_c});[x]定义为的特殊函数

                                                                             [x] =\left\{\begin{matrix} 1 & if \ x \ is \ true\\ -1 & otherwise \end{matrix}\right.                                                         (38)

让我们通过一个例子直观地理解这个方程。看图4,假设我们要计算w_2作为输出字的概率。我们把这个概率定义为从根结点到叶结点的随机游走的概率。在每个内部节点(包括根单元),我们需要分配向左和向右移动的概率。我们定义内节点n向左的概率是

                                                                              p(n, left) = \sigma(v'_n^T \cdot h)                                                            (39)

它由内部节点的向量表示和隐含层的输出值(由输入单词的向量表示确定)决定。显然,在单位n处的概率是

                                                             p(n, right) = 1 - \sigma(v'_n^T \cdot h) = \sigma(-v'_n^T \cdot h)                                          (40)

按照图4中从根到w_2的路径,我们可以计算w_2作为输出字的概率为

                                         p(w_2 = w_O) = p(n(w_2,1), left) \cdot p(n(w_2,2), left) \cdot p(n(w_2, 3), right) \\ = \sigma(v'^T_{n(w_2, 1)}h) \cdot \sigma(v'^T_{n(w_2, 2)}h) \cdot \sigma(-v'^T_{n(w_2, 3)}h)           (41)(42)

这正是由(37)给出的。这应该不难证实

                                                                                       \sum_{i=1}^V p(w_i = w_O) = 1                                                           (43)

使分层softmax在所有词之间成为一个定义良好的多项分布。

现在让我们推导出内部单位向量表示的参数更新方程。为了简单起见,我们首先查看一个单词上下文模型。将更新方程扩展到CBOW和跳跃图模型是很容易的。

为了表示法的简单性,我们在不引入歧义的情况下定义了以下缩写:

                                                                    [\cdot] :=[n(w, j+1)=ch(n(w,j))]                                                        (44)

                                                                                      v'_j: = v'_{n_{w,j}}                                                                            (45)

对于训练实例,损失函数定义为

                                                   E=-log \ p(w=w_O|w_I)=-\sum_{j=1}^{L(w)-1}log \ \sigma([\cdot] v'_j^Th)                                          (46)

我们求E对v'_j h的导,得到

                                                            \frac{\partial E}{\partial v'_j h}=(\sigma ([\cdot ] v'^T_j h) - 1)[\cdot] \\ =\left\{\begin{matrix} \sigma(v'^T_j h) - 1 & ([\cdot]=1) \\ \sigma(v'^T_j h) & ([\cdot]=-1) \end{matrix}\right. \\ =\sigma(v'^T_j h) - t_j                                                                 (47)(48)(49)

其中[\cdot]=1t_j=1,否则t_j=0

接下来我们求E关于内单位n(w, j)的向量表示求导,得到

                                                      \frac{\partial E}{\partial v'_j} = \frac{\partial E}{\partial v'_j h} \cdot \frac{\partial v'_j h}{\partial v'_j} = (\sigma(v'^T_j h) - t_j) \cdot h                                                             (50)

得到如下更新方程:

                                                         v'_j^{(new)} = v'_j^{(old)} - \eta(\sigma(v'^T_j h) - t_j) \cdot h                                                               (51)

应用于j=1, 2, ..., L(w)-1。我们可以理解\sigma(v'^T_j h) - t_j是内节点n(w, j)的预测误差。每个内部节点的“任务”是预测从左子节点还是从右子节点随机漫步。t_j = 1表示地面真相是跟随左子节点;t_j = 0表示它应该跟随正确的子元素。\sigma(v'^T_j h)是预测结果。对于一个训练实例,如果内部节点的预测非常接近地面真实值,则其向量表示v'_j的运动很小;否则v'_j将向适当的方向移动(离h更近或更远),以减少该实例的预测误差。该更新方程既可用于CBOW模型,也可用于skip-gram模型。当用于skip-gram模型时,我们需要对输出上下文中的每个C单词重复这个更新过程。

为了将误差反向传播,学习输入→隐含权值,我们对隐含层的输出E求导,得到

                                                                    \frac{\partial E}{\partial h} = \sum_{j=1}^{L(w)-1} \frac{\partial E}{\partial v'_j h} \cdot \frac{\partial v'_j h}{\partial h} \\ = \sum_{j=1}^{L(w)-1} (\sigma(v'^T_j h) - t_j) \cdot v'_j \\ := EH                                                            (52)(53)(54)

可以直接代入(23)得到CBOW输入向量的更新方程。对于skip-gram模型,我们需要计算skip-gram上下文中每个单词的EH值,并将EH值的和代入(35),得到输入向量的更新方程。

从更新方程可以看出,每个训练实例每个上下文单词的计算复杂度从O(V)降低到O(log(V)),速度有了很大的提高。我们仍然有大致相同数量的参数(内部单位的V - 1向量与原始单词的V输出向量相比)。

3.2 Negative Sampling

负抽样的思想比分层softmax更直接:为了解决每次迭代需要更新的输出向量太多的问题,我们只更新它们的一个样本。

显然输出词(即ground truth,或positive sample)应该保存在我们的sample中并得到更新,我们需要将一些单词作为negative sample进行抽样(因此称为“negative sampling”)。采样过程需要一个概率分布,可以任意选择。我们称这个分布为噪声分布,用P_n(w)表示。一个人可以根据经验确定一个好的分布。

在word2vec中,作者认为以下简化的训练目标能够生成高质量的单词嵌入,而不是使用一种产生良好定义的后验多项分布的负抽样形式:

                                                      E= -log \ (\sigma(p(w_O|w_I)) \prod_{w_j \in W_{neg}} \sigma(1-p(w_j|w_I) ) \\= -log \ \sigma(p(w_O|w_I)) - \sum_{w_j \in W_{neg}} log \ \sigma(1-p(w_j|w_I) \\ =-log \ \sigma(v'^T_{w_O} h) - \sum_{w_j \in W_{neg}} \ log \sigma(-v'^T_{w_j}h)                                               (55)

其中w_O为输出字(即,为正样本),v'_{w_O}为输出向量;h为隐含层的输出值:CBOW模型h=\frac{1}{C} \sum_{c=1}^C v_{v_{w_c}}, skip-gram模型h=v_{w_I}W_{neg} = \{ w_j | j=1,...,K \}是基于P_n(w)采样的一组单词,即负样本。

为了得到负采样下单词向量的更新方程,我们首先对输出单元w_j的净输入E求导:

                                            \frac{\partial E}{\partial v'^T_{w_j} h} =\left\{\begin{matrix} \sigma(v'^T_{w_j} h) -1 & if \ w_j=w_O \\ \sigma(v'^T_{w_j} h) & if \ w_j \in W_{neg} \end{matrix}\right. =\sigma(v'^T_{w_j} h) - t_j                         (56)(57)

其中t_jw_j的“label”。当w_j为正样本时,t = 1;否则t = 0。接下来我们求Ew_j输出向量求导,

                                                        \frac{\partial E}{\partial v'_{w_j}} = \frac{\partial E}{\partial v'^T_{w_j} h} \cdot \frac{\partial v'^T_{w_j} h}{\partial v'_{w_j}} = (\sigma(v'^T_{w_j}h) - t_j)h                                                (58)

其输出向量的更新方程为:

                                                        v'_{w_j}^{(new)} = v'_{w_j}^{(old)} - \eta(\sigma(v'^T_{w_j} h) - t_j) h                                                     (59)

它只需要应用于w_j \in \{ w_O \} \cup W_{neg},而不是词汇表中的每个单词。这说明了为什么我们可以在每次迭代中节省大量的计算工作。

对上述更新方程的直观理解应与式(11)相同。该方程既适用于CBOW模型,也适用于跳跃图模型。对于跳跃图模型,我们将此方程一次应用于一个上下文单词。

为了将误差反向传播到隐层,从而更新单词的输入向量,我们需要对E对隐层的输出求导,得到

                                                       \frac{\partial E}{\partial h} = \sum_{w_j \in \{ w_O \} \cup W_{neg}} \frac{\partial E}{\partial v'^T_{w_j} h} \cdot \frac{\partial v'^T_{w_j} h}{\partial h} \\ = \sum_{w_j \in \{ w_O \} \cup W_{neg}} (\sigma(v'^T_{w_j} h) - t_j) v'_{w_j} :=EH                                               (60)(61)

将EH代入(23)得到CBOW模型输入向量的更新方程。对于skip-gram模型,我们需要计算skip-gram上下文中每个单词的EH值,并将EH值的和代入(35),得到输入向量的更新方程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值