Continuous Bag-of-Word
Continuous Bag-of-Word(CBOW)顾名思义,即连续词袋模型,即文本以单个词为最小单位,像“support vector machine”词组也会被当做三个独立的词考虑,且是连续词袋,即目标词的前后词也作为因素考虑。
One-word context
模型结构
下图为网络模型例子,词汇表大小为 V;隐藏层宽度为 N(即我们想要的词向量维度),各层连接为全连接方式;输入为one-hot编码的向量,即词汇表出现的 V 个非重复词,一个词 w 的向量 (x1,x2,…,xV) 为对应 xw 的位置为 1 ,其他位置都为 0 ;真实的 y 为文本中输入词的下一个词的one-hot编码的向量。

输入层和隐藏层间的权重可由一个 V×N 的矩阵 W 表示。 W 的每一行是一个 N 维向量,表示输入层对应的词向量 vw 。
W=w11 w12 … w1Nw21 w22 … w2N… … … …wV1 wV2 … wVN
W 的第 i 行是 vwT ,给定一个词 xk=1 且 xk′=0 对于 k′=k (即这个词的one-hot向量只有 k 位置为 1 ),我们可得:
h=WTx=W(k,⋅)T:=vwIT (1)
其实就是将 W 的第 k 行复制给了 h ,因为 x 只有在第 k 位置是 1 (因为输入是one-hot,经过矩阵相乘其实就是把权重 W 对应行的值传递给下一层)。 vwI 即是输入词 wI 的向量表示。(这就意味着隐藏层的激活函数是线性的即可,不需要使用ReLU之类的对它们进行非线性变换。比如Multi-word context model中直接把这层的输入进行加权求和传给下层)
隐藏层到输出层的权重可用一个 N×V 的矩阵 W′={wij′} 表示:
W′=w11′ w12′ … w1N′w21′ w22′ … w2N′… … … …wV1′ wV2′ … wVN′
基于权重,我们对于每一个词汇表里的词可计算一个分数 uj:
uj=vwj′Th (2)
其中 vwj′ 是 W′ 第 j 列。然后我们用softmax去获得这个词的后验分布,是一个多项式分布:
p(wj∣wI)=yj=j′=1∑Vexp(uj′)exp(uj) (3)
其中 yj 是输出层第 j 个单元的输出。结合输入层到隐藏层 h=WTx=W(k,⋅)T:=vwIT 和隐藏层到输出层 uj=vwj′Th 公式代入softmax,我们得到:
p(wj∣wI)=j′=1∑Vexp(vwj′′′TvwI)exp(vwj′T)vwI (4)
这里 vw 和 vw′ 是词 w 的两种表达形式。 vw 源自输入层到隐藏层权重矩阵 W 的行, vw′ 源自隐藏层到输出层权重矩阵 W′ 的列。我们将 vw 和 vw′ 分别称为“输入向量”和“输出向量”。
模型目标是最大化 p(wj∣wI)=j′=1∑Vexp(vwj′′′TvwI)exp(vwj′T)vwI ,即模型输入 wI,模型输出wO(表示它的index在输出层为j∗) 与真实y(输入词的下一个词的one-hot向量)一致。即 y 向量第 k 位为 1,其他为 0 ,我们期望的最佳模型是输出层第 k 个单元为 1 ,其他为 0 。模型使用反向传播进行训练。
模型训练
1)隐藏层到输出层权重更新
训练目标即最大化 p(wj∣wI)=j′=1∑Vexp(vwj′′′TvwI)exp(vwj′T)vwI , 公式(4)代表的就是给定上下文信息(这里为一个单词 wI )以及其权重矩阵的情况下,预测其实际输出单词(即上下文信息的中心词 wO)的条件概率
maxp(wO∣wI)=maxyj∗ (5)
=maxlogyj∗ (6)
=uj∗−logj′=1∑Vexp(uj′):=−E (7)
上式给了损失函数的定义,即 E=−logp(wO∣wI) ,我们旨在最小化 E 。 uj∗ 的表示方式由公式(2)而来, j∗ 则为实际输出单词的索引下标。我们注意到该损失函数可以理解为一种特殊情形下的交叉熵计算。
首先我们对损失函数 E 求关于uj 的偏导数,我们可得
∂uj∂E=yj−tj:=ej (8)
上式给出了 ej 的定义,其中 tj 只有在第 j 个单元是所期待的输出词(即真实的 y )时才为 1 ,其他情况下为 0 。这个导偏数其实就是表示在输出层的预测误差 ej 。
我们根据链式法则求出损失函数 E 关于矩阵 W′元素wij′ 的偏导数以获得隐藏层到输出层权重的梯度
∂wij′∂E=∂uj∂E∂wij′∂uj=ej⋅hi (9)
因此,用随机梯度下降法,我们可以得到隐藏层到输出层的权重更新公式:
wij′(new)=wij′(old)−η⋅ej⋅hi (10)
或者 vwj′(new)=vwj′(old)−η⋅ej⋅h for j=1,2,…,V (11)
其中 η>0 是学习率, ej=yj−tj , hi 是隐藏层第 i 个单元; vwj′ 是 wj 的输出向量。这个更新公式其实就表明了我们需要查看词汇表中每一个可能的词,比较网络的输出yj与期望的输出(实际值) tj:
(1)如果 yj>tj,那么就从向量 vwj′ 中减去隐藏向量 h 的一部分(例如 vwI ),这样向量 vwj′
就会与向量 vwI 相差更远。
(2)如果 yj<tj (这种情况只有在 tj=1 时,才会发生,此时 wj=wO),则将隐藏向量 h
的一部分加入 vwO′ ,使得 vwO′ 与 vwI 更接近
(3)如果 yj 与 tj 非常接近,则此时 ej=yj−tj 由于公式(8)非常接近于 0 ,故更新参数基
本没什么变化
2)输入层到隐藏层权重更新
我们继续对损失函数 E 求关于隐藏层 hi 的偏导数,得:
∂hi∂E=j=1∑V∂uj∂E∂hi∂uj=j=1∑Vejwij′:=EHi (12)
其中 hi 为隐藏层第 i 个神经单元的输出; uj 在公式(2)中已经定义,表示输出层第 j 个神经单元的输入; ej=yj−tj 为输出层第 j 个单元的预测误差。因此 EH 应该是一个 N 维度向量,它的每个元素代表的是词汇表中的每个单词的预测误差 ej 与其输出向量 wij′ 在 j=1 到 V 上的乘积之和。
接下来,我们需要求出损失函数 E 关于权重矩阵 W 的偏导数。首先,分解公式(1),我们知道隐藏层激活单元的输出 hi 是输入层 x 与权重的线性组合,即
hi=k=1∑Vxk⋅wki (13)
因此对于权重矩阵 W 的每一个元素,我们求关于 E 的偏导数,得到
∂wki∂E=∂hi∂E∂wki∂hi=EHi⋅xk (14)
因此我们利用张量乘积的方式,便可得到
∂W∂E=x⊗EH=xEHT (15)
我们再次得到了一个 N×V 的矩阵。由于 x 向量只有一个非 0 元素,因此 ∂W∂E 只有一行是 N 维非 0 向量 EHT ,因此矩阵 W 的更新公式为
vwI(new)=vwI(old)−ηEHT (16)
其中 vwI 是矩阵 W 的其中一行,是唯一的上下文单词的“输入向量”,也是矩阵 W唯一的导数非 0 的行向量。除了 vwI 以外,矩阵 W 的其他行向量在参数更新迭代过程中都会保持不变(因为其导数为 0 )
与矩阵 W′ 的更新过程相似,对于公式(16),我们分析如下:
(1)如果过高地估计了某个单词 wj 作为最终输出单词的概率(即: yj>tj ),则上下文单词
wI (context word )的输入向量与单词 wj 的输出向量在更新的过程中会相差越来越大。
(2) 如果相反,某个单词 wj 作为最终输出单词的概率被低估(即: yj<tj ),则单词 wI 的输
入向量与单词 wj 的输出向量在更新过程中会越来越接近。
(3) 如果对于单词 wI 的概率预测是准确的,则对于单词的输入向量在更新过程中几乎保持不变。
因此,上下文单词 wI (context word )的输入向量的更新取决于词汇表中所有单词的预测误差。预测误差越大,则该单词对于上下文单词的输入向量的更新过程影响越大。
Multi-word context
根据字面意思我们就可以看出,基于multi-word context的CBOW模型就是利用多个上下文单词来推测中心单词target word的一种模型。比如下面这段话,我们的上下文大小取值为4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这8个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。

模型结构
其隐藏层的输出值的计算过程为:首先将输入的上下文单词(context words)的向量叠加起来并取其平均值,接着与输入层到隐藏层的权重矩阵相乘,作为最终的结果,公式如下:
h=C1WT(x1+x2+⋯xC) (17)
=C1(vw1+vw2+⋯+vwC)T (18)
其中 C 为上下文单词的个数, w1,w2,…,wC 为上下文单词, vw 为单词 w 的输入向量。损失函数为
E=−logp(wO∣wI,1,…,wI,C) (19)
=−uj∗+logj′=1∑Vexp(uj′) (20)
=−vwO′T⋅h+logj′=1∑Vexp(vwj′T⋅h) (21)
网络结构如下:

模型训练
1)隐藏层到输出层权重更新
同样,由隐藏层到输出层的权重更新公式与One-word context模型下的一模一样,即类似于公式(11),我们直接写在下面:
vwj′(new)=vwj′(old)−η⋅ej⋅h for j=1,2,…,V (22)
2)输入层到隐藏层权重更新
由输入层到隐藏层的权重矩阵更新公式与公式(16)类似,只不过现在我们需要对每一个上下文单词 wI,c 都执行如下更新公式:
vwI,c(new)=vwI,c(old)−C1ηEHT for c=1,2,…,C (23)
其中 vwI,c 为context中第 c 个单词的输入向量; η 为正学习速率; EH=∂hi∂E 由公式(12)给出。
Source
Last updated