Continuous Bag-of-Word

Continuous Bag-of-Word(CBOW)顾名思义,即连续词袋模型,即文本以单个词为最小单位,像“support vector machine”词组也会被当做三个独立的词考虑,且是连续词袋,即目标词的前后词也作为因素考虑。

One-word context

模型结构

下图为网络模型例子,词汇表大小为 VV;隐藏层宽度为 NN(即我们想要的词向量维度),各层连接为全连接方式;输入为one-hot编码的向量,即词汇表出现的 VV 个非重复词,一个词 ww 的向量 (x1,x2,,xV)(x_1,x_2,\dots,x_V) 为对应 xwx_w 的位置为 11 ,其他位置都为 00 ;真实的 yy 为文本中输入词的下一个词的one-hot编码的向量。

输入层和隐藏层间的权重可由一个 V×NV\times N 的矩阵 WW 表示。 WW 的每一行是一个 NN 维向量,表示输入层对应的词向量 vwv_w

W=[w11  w12    w1Nw21  w22    w2N      wV1  wV2    wVN]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]

WW 的第 ii 行是 vwTv_w^T ,给定一个词 xk=1x_k=1xk=0x_{k'}=0 对于 kkk'\neq k (即这个词的one-hot向量只有 kk 位置为 11 ),我们可得:

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

其实就是将 WW 的第 kk 行复制给了 hh ,因为 xx 只有在第 kk 位置是 11 (因为输入是one-hot,经过矩阵相乘其实就是把权重 WW 对应行的值传递给下一层)。 vwIv_{w_I} 即是输入词 wIw_I 的向量表示。(这就意味着隐藏层的激活函数是线性的即可,不需要使用ReLU之类的对它们进行非线性变换。比如Multi-word context model中直接把这层的输入进行加权求和传给下层)

隐藏层到输出层的权重可用一个 N×VN\times V 的矩阵 W={wij}W'=\{w'_{ij}\} 表示:

W=[w11  w12    w1Nw21  w22    w2N      wV1  wV2    wVN]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]

基于权重,我们对于每一个词汇表里的词可计算一个分数 uju_j

uj=vwjThu_j=v_{w_j}'^T h (2)

其中 vwjv'_{w_j}WW'jj 列。然后我们用softmax去获得这个词的后验分布,是一个多项式分布:

p(wjwI)=yj=exp(uj)j=1Vexp(uj)p(w_j|w_I)=y_j=\frac{\exp(u_j)}{\sum\limits_{j'=1}^V\exp (u_{j'})} (3)

其中 yjy_j 是输出层第 jj 个单元的输出。结合输入层到隐藏层 h=WTx=W(k,)T:=vwITh=W^Tx=W^T_{(k,\cdot)}:=v^T_{w_I} 和隐藏层到输出层 uj=vwjThu_j=v_{w_j}'^T h 公式代入softmax,我们得到:

p(wjwI)=exp(vwjT)vwIj=1Vexp(vwjTvwI)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})} (4)

这里 vwv_wvwv_w' 是词 ww 的两种表达形式。 vwv_w 源自输入层到隐藏层权重矩阵 WW 的行, vwv_w' 源自隐藏层到输出层权重矩阵 WW' 的列。我们将 vwv_wvwv'_w 分别称为“输入向量”和“输出向量”。

模型目标是最大化 p(wjwI)=exp(vwjT)vwIj=1Vexp(vwjTvwI)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})} ,即模型输入 wIw_I,模型输出wOw_O(表示它的index在输出层为jj^*) 与真实yy(输入词的下一个词的one-hot向量)一致。即 yy 向量第 kk 位为 11,其他为 00 ,我们期望的最佳模型是输出层第 kk 个单元为 11 ,其他为 00 。模型使用反向传播进行训练。

模型训练

1)隐藏层到输出层权重更新

训练目标即最大化 p(wjwI)=exp(vwjT)vwIj=1Vexp(vwjTvwI)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})} , 公式(4)代表的就是给定上下文信息(这里为一个单词 wIw_I )以及其权重矩阵的情况下,预测其实际输出单词(即上下文信息的中心词 wOw_O)的条件概率

maxp(wOwI)=maxyj\max p(w_O|w_I)=\max y_{j^*} (5)

=maxlogyj=\max \log y_{j^*} (6)

=ujlogj=1Vexp(uj):=E= u_{j^*}-\log \sum\limits_{j'=1}^V\exp(u_{j'}):= -E (7)

上式给了损失函数的定义,即 E=logp(wOwI)E = -\log p(w_O|w_I) ,我们旨在最小化 EEuju_{j^*} 的表示方式由公式(2)而来, jj^* 则为实际输出单词的索引下标。我们注意到该损失函数可以理解为一种特殊情形下的交叉熵计算。

首先我们对损失函数 EE 求关于uju_j 的偏导数,我们可得

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

上式给出了 eje_j 的定义,其中 tjt_j 只有在第 jj 个单元是所期待的输出词(即真实的 yy )时才为 11 ,其他情况下为 00 。这个导偏数其实就是表示在输出层的预测误差 eje_j

我们根据链式法则求出损失函数 EE 关于矩阵 WW'元素wijw'_{ij} 的偏导数以获得隐藏层到输出层权重的梯度

Ewij=Eujujwij=ejhi\frac{\partial E}{\partial w'_{ij}}=\frac{\partial E}{\partial u_j}\frac{\partial u_j}{\partial w'_{ij}}=e_j\cdot h_i (9)

因此,用随机梯度下降法,我们可以得到隐藏层到输出层的权重更新公式:

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

或者 vwj(new)=vwj(old)ηejh    for j=1,2,,Vv'^{(new)}_{w_j}=v'^{(old)}_{w_j}-\eta\cdot e_j\cdot h\ \ \ \ for\ j=1,2,\dots,V (11)

其中 η>0\eta>0 是学习率, ej=yjtje_j=y_j-t_jhih_i 是隐藏层第 ii 个单元; vwjv'_{w_j}wjw_j 的输出向量。这个更新公式其实就表明了我们需要查看词汇表中每一个可能的词,比较网络的输出yjy_j与期望的输出(实际值) tjt_j

  • (1)如果 yj>tjy_j>t_j,那么就从向量 vwjv'_{w_j} 中减去隐藏向量 hh 的一部分(例如 vwIv_{w_I} ),这样向量 vwjv'_{w_j}

  • 就会与向量 vwIv_{w_I} 相差更远。

  • (2)如果 yj<tjy_j<t_j (这种情况只有在 tj=1t_j=1 时,才会发生,此时 wj=wOw_j=w_O),则将隐藏向量 hh

  • 的一部分加入 vwOv'_{w_O} ,使得 vwOv'_{w_O}vwIv_{w_I} 更接近

  • (3)如果 yjy_jtjt_j 非常接近,则此时 ej=yjtje_j = y_j-t_j 由于公式(8)非常接近于 00 ,故更新参数基

  • 本没什么变化

2)输入层到隐藏层权重更新

我们继续对损失函数 EE 求关于隐藏层 hih_i 的偏导数,得:

Ehi=j=1VEujujhi=j=1Vejwij:=EHi\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 (12)

其中 hih_i 为隐藏层第 ii 个神经单元的输出; uju_j 在公式(2)中已经定义,表示输出层第 jj 个神经单元的输入; ej=yjtje_j = y_j-t_j 为输出层第 jj 个单元的预测误差。因此 EHEH 应该是一个 NN 维度向量,它的每个元素代表的是词汇表中的每个单词的预测误差 eje_j 与其输出向量 wijw'_{ij}j=1j=1VV 上的乘积之和。

接下来,我们需要求出损失函数 EE 关于权重矩阵 WW 的偏导数。首先,分解公式(1),我们知道隐藏层激活单元的输出 hih_i 是输入层 xx 与权重的线性组合,即

hi=k=1Vxkwkih_i = \sum\limits_{k=1}^Vx_k\cdot w_{ki} (13)

因此对于权重矩阵 WW 的每一个元素,我们求关于 EE 的偏导数,得到

Ewki=Ehihiwki=EHixk\frac{\partial E}{\partial w_{ki}}=\frac{\partial E}{\partial h_i}\frac{\partial h_i}{\partial w_{ki}}=EH_i\cdot x_k (14)

因此我们利用张量乘积的方式,便可得到

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

我们再次得到了一个 N×VN\times V 的矩阵。由于 xx 向量只有一个非 00 元素,因此 EW\frac{\partial E}{\partial W} 只有一行是 NN 维非 00 向量 EHTEH^T ,因此矩阵 WW 的更新公式为

vwI(new)=vwI(old)ηEHTv^{(new)}_{w_I}=v^{(old)}_{w_I}-\eta EH^T (16)

其中 vwIv_{w_I} 是矩阵 WW 的其中一行,是唯一的上下文单词的“输入向量”,也是矩阵 WW唯一的导数非 00 的行向量。除了 vwIv_{w_I} 以外,矩阵 WW 的其他行向量在参数更新迭代过程中都会保持不变(因为其导数为 00 )

与矩阵 WW' 的更新过程相似,对于公式(16),我们分析如下:

  • (1)如果过高地估计了某个单词 wjw_j 作为最终输出单词的概率(即: yj>tjy_j>t_j ),则上下文单词

  • wIw_I (context word )的输入向量与单词 wjw_j 的输出向量在更新的过程中会相差越来越大。

  • (2) 如果相反,某个单词 wjw_j 作为最终输出单词的概率被低估(即: yj<tjy_j<t_j ),则单词 wIw_I 的输

  • 入向量与单词 wjw_j 的输出向量在更新过程中会越来越接近。

  • (3) 如果对于单词 wIw_I 的概率预测是准确的,则对于单词的输入向量在更新过程中几乎保持不变。

因此,上下文单词 wIw_I (context word )的输入向量的更新取决于词汇表中所有单词的预测误差。预测误差越大,则该单词对于上下文单词的输入向量的更新过程影响越大。

Multi-word context

根据字面意思我们就可以看出,基于multi-word context的CBOW模型就是利用多个上下文单词来推测中心单词target word的一种模型。比如下面这段话,我们的上下文大小取值为4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这8个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。

模型结构

其隐藏层的输出值的计算过程为:首先将输入的上下文单词(context words)的向量叠加起来并取其平均值,接着与输入层到隐藏层的权重矩阵相乘,作为最终的结果,公式如下:

h=1CWT(x1+x2+xC)h = \frac{1}{C}W^T(x_1+x_2+\cdots x_C) (17)

=1C(vw1+vw2++vwC)T=\frac{1}{C}(v_{w_1}+v_{w_2}+\cdots+v_{w_C})^T (18)

其中 CC 为上下文单词的个数, w1,w2,,wCw_1,w_2,\dots,w_C 为上下文单词, vwv_w 为单词 ww 的输入向量。损失函数为

E=logp(wOwI,1,,wI,C)E = -\log p(w_O|w_{I,1},\dots,w_{I,C}) (19)

=uj+logj=1Vexp(uj)=-u_{j^*}+\log \sum\limits_{j'=1}^V\exp(u_{j'}) (20)

=vwOTh+logj=1Vexp(vwjTh)= -v_{w_O}'^T\cdot h+\log\sum\limits_{j'=1}^V\exp(v_{w_j}'^T\cdot h) (21)

网络结构如下:

模型训练

1)隐藏层到输出层权重更新

同样,由隐藏层到输出层的权重更新公式与One-word context模型下的一模一样,即类似于公式(11),我们直接写在下面:

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

2)输入层到隐藏层权重更新

由输入层到隐藏层的权重矩阵更新公式与公式(16)类似,只不过现在我们需要对每一个上下文单词 wI,cw_{I,c} 都执行如下更新公式:

vwI,c(new)=vwI,c(old)1CηEHT    for c=1,2,,Cv^{(new)}_{w_{I,c}}=v^{(old)}_{w_{I,c}}-\frac{1}{C}\eta EH^T \ \ \ \ for\ c=1,2,\dots,C (23)

其中 vwI,cv_{w_{I,c}} 为context中第 cc 个单词的输入向量; η\eta 为正学习速率; EH=EhiEH = \frac{\partial E}{\partial h_i} 由公式(12)给出。

Source

Last updated