Continuous Bag-of-Word(CBOW)顾名思义,即连续词袋模型,即文本以单个词为最小单位,像“support vector machine”词组也会被当做三个独立的词考虑,且是连续词袋,即目标词的前后词也作为因素考虑。
One-word context
模型结构
下图为网络模型例子,词汇表大小为 V V V ;隐藏层宽度为 N N N (即我们想要的词向量维度),各层连接为全连接方式;输入为one-hot编码的向量,即词汇表出现的 V V V 个非重复词,一个词 w w w 的向量 ( x 1 , x 2 , … , x V ) (x_1,x_2,\dots,x_V) ( x 1 , x 2 , … , x V ) 为对应 x w x_w x w 的位置为 1 1 1 ,其他位置都为 0 0 0 ;真实的 y y y 为文本中输入词的下一个词的one-hot编码的向量。
模型训练
1)隐藏层到输出层权重更新
因此,用随机梯度下降法,我们可以得到隐藏层到输出层的权重更新公式:
2)输入层到隐藏层权重更新
因此我们利用张量乘积的方式,便可得到
Multi-word context
根据字面意思我们就可以看出,基于multi-word context的CBOW模型就是利用多个上下文单词来推测中心单词target word的一种模型。比如下面这段话,我们的上下文大小取值为4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这8个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。
模型结构
其隐藏层的输出值的计算过程为:首先将输入的上下文单词(context words)的向量叠加起来并取其平均值,接着与输入层到隐藏层的权重矩阵相乘,作为最终的结果,公式如下:
网络结构如下:
模型训练
1)隐藏层到输出层权重更新
同样,由隐藏层到输出层的权重更新公式与One-word context模型下的一模一样,即类似于公式(11),我们直接写在下面:
2)输入层到隐藏层权重更新
Source
输入层和隐藏层间的权重可由一个 V × N V\times N V × N 的矩阵 W W W 表示。 W W W 的每一行是一个 N N N 维向量,表示输入层对应的词向量 v w v_w v w 。
W = [ w 11 w 12 … w 1 N w 21 w 22 … w 2 N … … … … w V 1 w V 2 … w V N ] W = \left[ \begin{matrix} w_{11} \ \ w_{12} \ \ \dots\ \ w_{1N}\\ w_{21} \ \ w_{22} \ \ \dots\ \ w_{2N}\\ \dots \ \ \dots \ \ \dots\ \ \dots\\ w_{V1} \ \ w_{V2} \ \ \dots\ \ w_{VN}\\ \end{matrix} \right] W = w 11 w 12 … w 1 N w 21 w 22 … w 2 N … … … … w V 1 w V 2 … w V N
W W W 的第 i i i 行是 v w T v_w^T v w T ,给定一个词 x k = 1 x_k=1 x k = 1 且 x k ′ = 0 x_{k'}=0 x k ′ = 0 对于 k ′ ≠ k k'\neq k k ′ = k (即这个词的one-hot向量只有 k k k 位置为 1 1 1 ),我们可得:
h = W T x = W ( k , ⋅ ) T : = v w I T h=W^Tx=W^T_{(k,\cdot)}:=v^T_{w_I} h = W T x = W ( k , ⋅ ) T := v w I T (1)
其实就是将 W W W 的第 k k k 行复制给了 h h h ,因为 x x x 只有在第 k k k 位置是 1 1 1 (因为输入是one-hot,经过矩阵相乘其实就是把权重 W W W 对应行的值传递给下一层)。 v w I v_{w_I} v w I 即是输入词 w I w_I w I 的向量表示。(这就意味着隐藏层的激活函数是线性的即可,不需要使用ReLU之类的对它们进行非线性变换。比如Multi-word context model中直接把这层的输入进行加权求和传给下层)
隐藏层到输出层的权重可用一个 N × V N\times V N × V 的矩阵 W ′ = { w i j ′ } W'=\{w'_{ij}\} W ′ = { w ij ′ } 表示:
W ′ = [ w 11 ′ w 12 ′ … w 1 N ′ w 21 ′ w 22 ′ … w 2 N ′ … … … … w V 1 ′ w V 2 ′ … w V N ′ ] W' = \left[ \begin{matrix} w'_{11} \ \ w'_{12} \ \ \dots\ \ w'_{1N}\\ w'_{21} \ \ w'_{22} \ \ \dots\ \ w'_{2N}\\ \dots \ \ \dots \ \ \dots\ \ \dots\\ w'_{V1} \ \ w'_{V2} \ \ \dots\ \ w'_{VN}\\ \end{matrix} \right] W ′ = w 11 ′ w 12 ′ … w 1 N ′ w 21 ′ w 22 ′ … w 2 N ′ … … … … w V 1 ′ w V 2 ′ … w V N ′
基于权重,我们对于每一个词汇表里的词可计算一个分数 u j u_j u j :
u j = v w j ′ T h u_j=v_{w_j}'^T h u j = v w j ′ T h (2)
其中 v w j ′ v'_{w_j} v w j ′ 是 W ′ W' W ′ 第 j j j 列。然后我们用softmax去获得这个词的后验分布,是一个多项式分布:
p ( w j ∣ w I ) = y j = exp ( u j ) ∑ j ′ = 1 V exp ( u j ′ ) p(w_j|w_I)=y_j=\frac{\exp(u_j)}{\sum\limits_{j'=1}^V\exp (u_{j'})} p ( w j ∣ w I ) = y j = j ′ = 1 ∑ V e x p ( u j ′ ) e x p ( u j ) (3)
其中 y j y_j y j 是输出层第 j j j 个单元的输出。结合输入层到隐藏层 h = W T x = W ( k , ⋅ ) T : = v w I T h=W^Tx=W^T_{(k,\cdot)}:=v^T_{w_I} h = W T x = W ( k , ⋅ ) T := v w I T 和隐藏层到输出层 u j = v w j ′ T h u_j=v_{w_j}'^T h u j = v w j ′ T h 公式代入softmax,我们得到:
p ( w j ∣ w I ) = exp ( v w j ′ T ) v w I ∑ j ′ = 1 V exp ( v w j ′ ′ ′ T v w I ) p(w_j|w_I)=\frac{\exp(v_{w_j}'^T)v_{w_I}}{\sum\limits_{j'=1}^V\exp(v_{w_{j'}'}'^Tv_{w_I})} p ( w j ∣ w I ) = j ′ = 1 ∑ V e x p ( v w j ′ ′ ′ T v w I ) e x p ( v w j ′ T ) v w I (4)
这里 v w v_w v w 和 v w ′ v_w' v w ′ 是词 w w w 的两种表达形式。 v w v_w v w 源自输入层到隐藏层权重矩阵 W W W 的行, v w ′ v_w' v w ′ 源自隐藏层到输出层权重矩阵 W ′ W' W ′ 的列。我们将 v w v_w v w 和 v w ′ v'_w v w ′ 分别称为“输入向量”和“输出向量”。
模型目标是最大化 p ( w j ∣ w I ) = exp ( v w j ′ T ) v w I ∑ j ′ = 1 V exp ( v w j ′ ′ ′ T v w I ) p(w_j|w_I)=\frac{\exp(v_{w_j}'^T)v_{w_I}}{\sum\limits_{j'=1}^V\exp(v_{w_{j'}'}'^Tv_{w_I})} p ( w j ∣ w I ) = j ′ = 1 ∑ V e x p ( v w j ′ ′ ′ T v w I ) e x p ( v w j ′ T ) v w I ,即模型输入 w I w_I w I ,模型输出w O w_O w O (表示它的index在输出层为j ∗ j^* j ∗ ) 与真实y y y (输入词的下一个词的one-hot向量)一致。即 y y y 向量第 k k k 位为 1 1 1 ,其他为 0 0 0 ,我们期望的最佳模型是输出层第 k k k 个单元为 1 1 1 ,其他为 0 0 0 。模型使用反向传播进行训练。
训练目标即最大化 p ( w j ∣ w I ) = exp ( v w j ′ T ) v w I ∑ j ′ = 1 V exp ( v w j ′ ′ ′ T v w I ) p(w_j|w_I)=\frac{\exp(v_{w_j}'^T)v_{w_I}}{\sum\limits_{j'=1}^V\exp(v_{w_{j'}'}'^Tv_{w_I})} p ( w j ∣ w I ) = j ′ = 1 ∑ V e x p ( v w j ′ ′ ′ T v w I ) e x p ( v w j ′ T ) v w I , 公式(4)代表的就是给定上下文信息(这里为一个单词 w I w_I w I )以及其权重矩阵的情况下,预测其实际输出单词(即上下文信息的中心词 w O w_O w O )的条件概率
max p ( w O ∣ w I ) = max y j ∗ \max p(w_O|w_I)=\max y_{j^*} max p ( w O ∣ w I ) = max y j ∗ (5)
= max log y j ∗ =\max \log y_{j^*} = max log y j ∗ (6)
= u j ∗ − log ∑ j ′ = 1 V exp ( u j ′ ) : = − E = u_{j^*}-\log \sum\limits_{j'=1}^V\exp(u_{j'}):= -E = u j ∗ − log j ′ = 1 ∑ V exp ( u j ′ ) := − E (7)
上式给了损失函数的定义,即 E = − log p ( w O ∣ w I ) E = -\log p(w_O|w_I) E = − log p ( w O ∣ w I ) ,我们旨在最小化 E E E 。 u j ∗ u_{j^*} u j ∗ 的表示方式由公式(2)而来, j ∗ j^* j ∗ 则为实际输出单词的索引下标。我们注意到该损失函数可以理解为一种特殊情形下的交叉熵计算。
首先我们对损失函数 E E E 求关于u j u_j u j 的偏导数,我们可得
∂ E ∂ u j = y j − t j : = e j \frac{\partial E}{\partial u_j}=y_j-t_j:=e_j ∂ u j ∂ E = y j − t j := e j (8)
上式给出了 e j e_j e j 的定义,其中 t j t_j t j 只有在第 j j j 个单元是所期待的输出词(即真实的 y y y )时才为 1 1 1 ,其他情况下为 0 0 0 。这个导偏数其实就是表示在输出层的预测误差 e j e_j e j 。
我们根据链式法则求出损失函数 E E E 关于矩阵 W ′ W' W ′ 元素w i j ′ w'_{ij} w ij ′ 的偏导数以获得隐藏层到输出层权重的梯度
∂ E ∂ w i j ′ = ∂ E ∂ u j ∂ u j ∂ w i j ′ = e j ⋅ h i \frac{\partial E}{\partial w'_{ij}}=\frac{\partial E}{\partial u_j}\frac{\partial u_j}{\partial w'_{ij}}=e_j\cdot h_i ∂ w ij ′ ∂ E = ∂ u j ∂ E ∂ w ij ′ ∂ u j = e j ⋅ h i (9)
w i j ′ ( n e w ) = w i j ′ ( o l d ) − η ⋅ e j ⋅ h i w'^{(new)}_{ij}=w'^{(old)}_{ij}-\eta\cdot e_j\cdot h_i w ij ′ ( n e w ) = w ij ′ ( o l d ) − η ⋅ e j ⋅ h i (10)
或者 v w j ′ ( n e w ) = v w j ′ ( o l d ) − η ⋅ e j ⋅ h f o r j = 1 , 2 , … , V v'^{(new)}_{w_j}=v'^{(old)}_{w_j}-\eta\cdot e_j\cdot h\ \ \ \ for\ j=1,2,\dots,V v w j ′ ( n e w ) = v w j ′ ( o l d ) − η ⋅ e j ⋅ h f or j = 1 , 2 , … , V (11)
其中 η > 0 \eta>0 η > 0 是学习率, e j = y j − t j e_j=y_j-t_j e j = y j − t j , h i h_i h i 是隐藏层第 i i i 个单元; v w j ′ v'_{w_j} v w j ′ 是 w j w_j w j 的输出向量。这个更新公式其实就表明了我们需要查看词汇表中每一个可能的词,比较网络的输出y j y_j y j 与期望的输出(实际值) t j t_j t j :
(1)如果 y j > t j y_j>t_j y j > t j ,那么就从向量 v w j ′ v'_{w_j} v w j ′ 中减去隐藏向量 h h h 的一部分(例如 v w I v_{w_I} v w I ),这样向量 v w j ′ v'_{w_j} v w j ′
就会与向量 v w I v_{w_I} v w I 相差更远。
(2)如果 y j < t j y_j<t_j y j < t j (这种情况只有在 t j = 1 t_j=1 t j = 1 时,才会发生,此时 w j = w O w_j=w_O w j = w O ),则将隐藏向量 h h h
的一部分加入 v w O ′ v'_{w_O} v w O ′ ,使得 v w O ′ v'_{w_O} v w O ′ 与 v w I v_{w_I} v w I 更接近
(3)如果 y j y_j y j 与 t j t_j t j 非常接近,则此时 e j = y j − t j e_j = y_j-t_j e j = y j − t j 由于公式(8)非常接近于 0 0 0 ,故更新参数基
我们继续对损失函数 E E E 求关于隐藏层 h i h_i h i 的偏导数,得:
∂ E ∂ h i = ∑ j = 1 V ∂ E ∂ u j ∂ u j ∂ h i = ∑ j = 1 V e j w i j ′ : = E H i \frac{\partial E}{\partial h_i}=\sum\limits_{j=1}^V\frac{\partial E}{\partial u_j}\frac{\partial u_j}{\partial h_i}=\sum\limits_{j=1}^Ve_jw'_{ij}:=EH_i ∂ h i ∂ E = j = 1 ∑ V ∂ u j ∂ E ∂ h i ∂ u j = j = 1 ∑ V e j w ij ′ := E H i (12)
其中 h i h_i h i 为隐藏层第 i i i 个神经单元的输出; u j u_j u j 在公式(2)中已经定义,表示输出层第 j j j 个神经单元的输入; e j = y j − t j e_j = y_j-t_j e j = y j − t j 为输出层第 j j j 个单元的预测误差。因此 E H EH E H 应该是一个 N N N 维度向量,它的每个元素代表的是词汇表中的每个单词的预测误差 e j e_j e j 与其输出向量 w i j ′ w'_{ij} w ij ′ 在 j = 1 j=1 j = 1 到 V V V 上的乘积之和。
接下来,我们需要求出损失函数 E E E 关于权重矩阵 W W W 的偏导数。首先,分解公式(1),我们知道隐藏层激活单元的输出 h i h_i h i 是输入层 x x x 与权重的线性组合,即
h i = ∑ k = 1 V x k ⋅ w k i h_i = \sum\limits_{k=1}^Vx_k\cdot w_{ki} h i = k = 1 ∑ V x k ⋅ w ki (13)
因此对于权重矩阵 W W W 的每一个元素,我们求关于 E E E 的偏导数,得到
∂ E ∂ w k i = ∂ E ∂ h i ∂ h i ∂ w k i = E H i ⋅ x k \frac{\partial E}{\partial w_{ki}}=\frac{\partial E}{\partial h_i}\frac{\partial h_i}{\partial w_{ki}}=EH_i\cdot x_k ∂ w ki ∂ E = ∂ h i ∂ E ∂ w ki ∂ h i = E H i ⋅ x k (14)
∂ E ∂ W = x ⊗ E H = x E H T \frac{\partial E}{\partial W}=x\otimes EH=xEH^T ∂ W ∂ E = x ⊗ E H = x E H T (15)
我们再次得到了一个 N × V N\times V N × V 的矩阵。由于 x x x 向量只有一个非 0 0 0 元素,因此 ∂ E ∂ W \frac{\partial E}{\partial W} ∂ W ∂ E 只有一行是 N N N 维非 0 0 0 向量 E H T EH^T E H T ,因此矩阵 W W W 的更新公式为
v w I ( n e w ) = v w I ( o l d ) − η E H T v^{(new)}_{w_I}=v^{(old)}_{w_I}-\eta EH^T v w I ( n e w ) = v w I ( o l d ) − η E H T (16)
其中 v w I v_{w_I} v w I 是矩阵 W W W 的其中一行,是唯一的上下文单词的“输入向量”,也是矩阵 W W W 唯一的导数非 0 0 0 的行向量。除了 v w I v_{w_I} v w I 以外,矩阵 W W W 的其他行向量在参数更新迭代过程中都会保持不变(因为其导数为 0 0 0 )
与矩阵 W ′ W' W ′ 的更新过程相似,对于公式(16),我们分析如下:
(1)如果过高地估计了某个单词 w j w_j w j 作为最终输出单词的概率(即: y j > t j y_j>t_j y j > t j ),则上下文单词
w I w_I w I (context word )的输入向量与单词 w j w_j w j 的输出向量在更新的过程中会相差越来越大。
(2) 如果相反,某个单词 w j w_j w j 作为最终输出单词的概率被低估(即: y j < t j y_j<t_j y j < t j ),则单词 w I w_I w I 的输
入向量与单词 w j w_j w j 的输出向量在更新过程中会越来越接近。
(3) 如果对于单词 w I w_I w I 的概率预测是准确的,则对于单词的输入向量在更新过程中几乎保持不变。
因此,上下文单词 w I w_I w I (context word )的输入向量的更新取决于词汇表中所有单词的预测误差。预测误差越大,则该单词对于上下文单词的输入向量的更新过程影响越大。
h = 1 C W T ( x 1 + x 2 + ⋯ x C ) h = \frac{1}{C}W^T(x_1+x_2+\cdots x_C) h = C 1 W T ( x 1 + x 2 + ⋯ x C ) (17)
= 1 C ( v w 1 + v w 2 + ⋯ + v w C ) T =\frac{1}{C}(v_{w_1}+v_{w_2}+\cdots+v_{w_C})^T = C 1 ( v w 1 + v w 2 + ⋯ + v w C ) T (18)
其中 C C C 为上下文单词的个数, w 1 , w 2 , … , w C w_1,w_2,\dots,w_C w 1 , w 2 , … , w C 为上下文单词, v w v_w v w 为单词 w w w 的输入向量。损失函数为
E = − log p ( w O ∣ w I , 1 , … , w I , C ) E = -\log p(w_O|w_{I,1},\dots,w_{I,C}) E = − log p ( w O ∣ w I , 1 , … , w I , C ) (19)
= − u j ∗ + log ∑ j ′ = 1 V exp ( u j ′ ) =-u_{j^*}+\log \sum\limits_{j'=1}^V\exp(u_{j'}) = − u j ∗ + log j ′ = 1 ∑ V exp ( u j ′ ) (20)
= − v w O ′ T ⋅ h + log ∑ j ′ = 1 V exp ( v w j ′ T ⋅ h ) = -v_{w_O}'^T\cdot h+\log\sum\limits_{j'=1}^V\exp(v_{w_j}'^T\cdot h) = − v w O ′ T ⋅ h + log j ′ = 1 ∑ V exp ( v w j ′ T ⋅ h ) (21)
v w j ′ ( n e w ) = v w j ′ ( o l d ) − η ⋅ e j ⋅ h f o r j = 1 , 2 , … , V v'^{(new)}_{w_j}=v'^{(old)}_{w_j}-\eta\cdot e_j\cdot h\ \ \ \ for\ j=1,2,\dots,V v w j ′ ( n e w ) = v w j ′ ( o l d ) − η ⋅ e j ⋅ h f or j = 1 , 2 , … , V (22)
由输入层到隐藏层的权重矩阵更新公式与公式(16)类似,只不过现在我们需要对每一个上下文单词 w I , c w_{I,c} w I , c 都执行如下更新公式:
v w I , c ( n e w ) = v w I , c ( o l d ) − 1 C η E H T f o r c = 1 , 2 , … , C v^{(new)}_{w_{I,c}}=v^{(old)}_{w_{I,c}}-\frac{1}{C}\eta EH^T \ \ \ \ for\ c=1,2,\dots,C v w I , c ( n e w ) = v w I , c ( o l d ) − C 1 η E H T f or c = 1 , 2 , … , C (23)
其中 v w I , c v_{w_{I,c}} v w I , c 为context中第 c c c 个单词的输入向量; η \eta η 为正学习速率; E H = ∂ E ∂ h i EH = \frac{\partial E}{\partial h_i} E H = ∂ h i ∂ E 由公式(12)给出。