词向量笔记

该笔记整理自 Xin Rong 的《word2vec Parameter Learning Explained》,该Note用精炼的语言和推导讲解了word2vec模型中的参数更新问题。除此之外,该Note讲解循序渐进,从最初的bag-of-word(CBOW)和skip-gram(SG)模型讲起,直到更高级的优化技术。


Continuous Bag-of-Word Model


首先考虑只有单个词输入的CBOW模型,即输入一个词输出一个词的模型,如下图所示(该图取自Xin Rong的Note)

假设输入词是 $V$ 维one-hot向量 $w_{I}$,其中 $x_{k} = 1$,隐藏层是 $N$ 维,层与层之间采用全连接,隐藏层的激活函数为简单的加和线性函数。则输入层到隐藏层的参数可由 $V \times N$ 的矩阵 $W$ 表示,其中 $W$ 的第 $i$ 行为和输出层相关联的 $N$ 维向量 $v_{wi}$。由此有:

$h = W^{T} x = W^{T}_{k,i} := v^{T}_{w_{I}}$

可见 $w_{I}$ 被映射为 $W$ 的第 $K$ 行。

隐藏层到输出层的参数可由 $N \times V$ 的矩阵 ${W}'$ 表示。对于每个单词,根据 ${W}'$ 的第 $j$ 列 ${v}'_{w_{j}}$ 都能计算出一个得分

$u_{j} = {{v}'_{w_{j}}}^{T}h$

然后我们可由softmax分类模型得到这些单词的后验分布

$p(w_{j}|w_{I}) = y_{j} = \frac{exp(u_{j})}{\sum^{V}_{j'=1} exp(u_{j'})}$

其中,$y_{j}$ 为输出层第 $j$ 个单元的输出值。综合上述分析可知

$p(w_{j}|w_{I})=\frac{exp({v'_{w_{j}}}^{T} v_{w_{I}})}{\sum^{V}_{j'=1} exp({v'_{w_{j'}}}^{T} v_{w_{I}})}$

记输出层第 $j$ 个单元所对应的单词为 $w_{o}$,则由反向传播算法可知,我们训练的目的是使上式最大化,即

$max \ p(w_{o}|w_{I}) = max \ y_{j^{\ast}} = max \ log \ y_{j^{\ast}}= u_{j^{\ast}} - log \ \sum^{V}_{j'=1} exp(u_{j'}) := -E$

其中,$E = -log \ p(w_{o}|w_{I})$ 代表损失函数,$j^{\ast}$ 为输出层实际输出所对应的坐标。需要注意的是,该损失函数可以理解为一种两者概率分布的交叉熵的特例。


对于 $E$ 的第 $j$ 个节点的输入值 $u_{j}$ 求导有

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

其中,$t_{j} = \mathbb{1}(j = j^{\ast})$,即当且仅当第 $j$ 个输出单元为真是输出单词时 $t_{j}$ 等于1。$e_{j}$ 为输出层的预测误差。

对于 $E$ 在 $w'_{ij}$ 上求导可获得隐藏层到输出层权重参数的梯度

$\frac{\partial E}{\partial w'_{ij}} = \frac{\partial E}{\partial u_{j}} \cdot \frac{\partial u_{j}}{\partial w'_{ij}} = e_{j} \dot h_{i}$

通过随机梯度下降算法,可得到隐藏层到输出层的权重更新公式

$w^{'(new)}_{ij} = w^{'(old)}_{ij} - \eta \cdot e_{j} \cdot h_{i}$

或者

$v^{'(new)}_{w_{j}} = v^{'(old)}_{w_{j}} - \eta \cdot e_{j} \cdot h, j=1,2,...,V$

其中,$\eta > 0$ 为学习效率,$e_{j} = y_{j} - t_{j}$,$h_{i}$ 为隐藏层第 $i$ 个单位,$v'_{w_{j}}$ 是 $w_{j}$ 的输出向量。需要注意的是,该更新公式表明我们需要遍历词库中所有的单词,检查 $y_{j}$ 与 $t_{j}$ 的大小关系:若 $y_{j} > t_{j}$,则减少从 $h(i.e. v_{w_{I}})$ 到 $v'_{w_{j}}$ 的占比,使得 $v'_{w_{j}}$ 更远离 $v_{w_{I}}$;若 $y_{j} < t_{j}$(当且仅当 $t_{j} = 1$,即 $w_{j} = w_{O}$),则增大 $h$ 到 $v'_{w_{o}}$ 的值,使得 $v'_{w_{o}}$ 更接近 $v_{w_{I}}$。

另一个需要知道的是,$v_{w}$(输入向量)和$v'_{w}$(输出向量)是单词 $w$ 的两种不同表示。


对于参数矩阵 $W$,有

$\frac{\partial E}{\partial h_{i}} = \sum^{V}_{j=1} \frac{\partial E}{\partial u_{j}} \cdot \frac{\partial u_{j}}{\partial h_{i}} = \sum^{V}_{j=1} e_{j} \cdot w'_{ij}:=EH_{i}$

其中,$h_{i}$ 为隐藏层的第 $i$ 个,$u_{j}$ 为输出层第 $j$ 个单元对应的网络输入,$e_{j} = y_{j} - t_{j}$ 是输出层第 $j$ 个单词的预测误差,$n$ 维向量 $EH$ 为词汇库中所有输出向量的和。又有

$h_{i} = \sum^{V}_{k=1}x_{k} \cdot w_{k_{i}}$

所有对于 $W$ 中的每一个项有

$\frac{\partial E}{\partial w_{k_{i}}} = \frac{\partial E}{\partial h_{i}} \cdot \frac{\partial h_{i}}{\partial w_{k_{i}}} = EH_{i} \cdot x_{k}$

即 $x$ 和 $EH$ 的张量积

$\frac{\partial E}{\partial W} = x \bigotimes EH = xEH^{T}$

其中,$\frac{\partial E}{\partial W}$ 为 $V \times N$ 的矩阵,又 $x$ 只有一项非零,故 $\frac{\partial E}{\partial W}$ 只有一行非零,且该行的值为 $n$ 维向量 $EH^{T}$。所以关于 $W$ 的更新公式为

$v^{(new)}_{w_{I}} = v^{(old)}_{w_{I}} - \eta EH^{T}$

其中,$v_{w_{I}}$ 是 $W$ 中的一行,也是只有一个单词的上下文的输入向量,并且是 $W$ 中唯一导数不为零的那一行,所以其它行将在更新保持不变。

从直觉上来讲,$EH$ 是由预测误差 $e_{j} = y_{j} - t_{j}$ 决定的词汇库中所有单词的输出向量的和,所以也可以理解为每一个输出向量对上下文单词的输入向量的影响。比如,在输出层,单词 $w_{j}$ 作为输出词汇的概率被高估了,即 $y_{j} > t_{j}$,则上下文单词 $w_{I}$ 的输入向量将远离输出向量;相反,如果单词 $w_{j}$ 的输出向量的概率被低估,即 $y_{j} < t_{j}$,则 $w_{I}$ 的输入向量将靠近输出向量;如果 $w_{j}$ 的概率的预测误差较小,则对 $w_{I}$ 的输入向量影响较小。总之,$w_{I}$ 的输入向量的变化由词汇库中所有向量的预测误差决定的,预测误差越大则对上下文单词输入向量的影响越大。


考虑上下文中有多个单词的CBOW模型,如下图(取自Xin Rong的Note)

此时以上下文中所有单词 $w_{1},...,w_{C}$ 向量的平均值作为输入,即

$h = \frac{1}{C}W^{T}(x_{1} + ... + x_{C}) = \frac{1}{C}(v_{w_{1}} + ... + v_{w_{c}})^{T}$

此时损失函数为

$E = -log \ p(w_{O}|w_{I,1},...,w_{I,C}) = -u_{j^{\ast}} + log \sum^{V}_{j'=1}exp(u_{j'}) = -{v'_{wO}}^{T} \cdot h + log \sum^{V}_{j'=1}exp({v'_{w_{j}}}^{T} \cdot h)$

与上下文只有一个单词的模型对比可以发现,其损失函数中仅 $h$ 的定义不同。同样,隐藏层到输出层的权重更新公式为

$v^{'(new)}_{w_{j}} = v^{'(old)}_{w_{j}} - \eta \cdot e_{j} \cdot h, j=1,...,V$

需要注意的是,对于每个训练实例,都需要将上述更新公式运用到隐藏层到输出层的参数矩阵的每一个元素。对于输入层到隐藏层,其参数的更新公式同理可知为

$v^{(new)}_{w_{I,c}} = v^{(old)}_{w_{I,c}} - \frac{1}{C} \cdot \eta \cdot EH^{T},c=1,...,C$

其中,$v_{w_{I,c}}$ 为上下文中第 $c$ 个单词的输入向量。


Skip-Gram Model


与Bag-of-Word Model相反,Skip-Gram Model 中目标单词位于输入层,而上下文位于输出层,如下图(取自Xin Rong的Note)

易知对于输入层到隐藏层,有

$h = W^{T}_{k,\cdot}:=v^{T}_{w_{I}}$

而对于输出层而言,不再是输出一个多项式分布,而是 $C$ 个多项式分布。其中,每一个输出均由同一个隐藏层到输出层参数矩阵计算出来,如下式

$p(w_{c,j} = w_{O,c}|w_{I}) = y_{c,j} = \frac{exp(u_{c,j})}{\sum^{V}_{j'=1}exp(u_{j'})}$

其中,$w_{c,j}$ 为输出层第 $c$ 组词列表中的第 $j$ 个单词,$w_{O,c}$ 为实际输出上下文词列表中第 $c$ 个单词;$y_{c,j}$ 为输出层第 $c$ 组词列表第 $j$ 个单元的输出;$u_{c,j}$ 为输出层第 $c$ 组词列表第 $j$ 个单元对应的节点输入值。由于输出层每组词列表共享同一参数,因此有

$u_{c,j}=u_{j}={v'_{w_{j}}}^{T} \cdot h,c=1,...,C$

其中,$v'_{w_{j}}$ 词汇库中第 $j$ 个单词的输出向量,$w_{j},v'_{w_{j}}$ 取自 $W'$ 的一列。其损失函数为

$E = -log \ p(w_{O,1},...,w_{O,C}|w_{I})= -log\prod^{C}_{c=1}\frac{exp(u_{c,j^{\ast}_{c}})}{\sum^{V}_{j'=1}exp(u_{j'})}=-\sum^{C}_{c=1}u_{j^{\ast}_{c}} + C \cdot log\sum^{V}_{j'=1}exp(u_{j'})$

其中,$j^{\ast}_{c}$ 是实际输出的上下文单词在词库中所对应的索引。对 $E$ 求导可得

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

为了命名方便,定义 $V$ 维向量 $EI=\{EI_{1},...,EI_{V}\}$ 代表上下文中所有单词预测误差的总和,其中 $EI_{j}=\sum^{C}_{c=1}e_{c,j}$。

故 $E$ 对于 $W'$ 的偏导为

$\frac{\partial E}{\partial w'_{ij}}=\sum^{C}_{c=1}\frac{\partial E}{\partial u_{c,j}} \cdot \frac{\partial u_{c,j}}{\partial w'_{ij}}=EI_{j} \cdot h_{i}$

所以隐藏层到输出层的参数矩阵 $W'$ 的更新公式是

$w^{'(new)}_{ij}=w^{'(old)}_{ij}-\eta \cdot EI_{j} \cdot h_{i}$

$v^{'(new)}_{w_{j}}=v^{'(old)}_{w_{j}} - \eta \cdot EI_{j} \cdot h, j=1,...,V$

对于输出层到隐藏层的参数矩阵,有

$v^{(new)}_{w_{I}}=v^{(old)}_{w_{I}} - \eta \cdot EH^{T}$

其中,$EH$ 是一个 $N$ 维向量,且有 $EH_{i}=\sum^{V}_{j=1}EI_{j} \cdot w'_{ij}$

xiehao

Read more posts by this author.