近似训练

本文经授权转载自《动手学深度学习》。全书内容参见 zh.d2l.ai,GitHub项目参见 github.com/d2l-ai/d2l-zh

回忆上一节的内容。跳字模型的核心在于使用softmax运算得到给定中心词wcw_c来生成背景词wow_o的条件概率

P(w_o \mid w_c) = \frac{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}c)}{ \sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}.

该条件概率相应的对数损失

-\log P(w_o \mid w_c) = -\boldsymbol{u}_o^\top \boldsymbol{v}c + \log\left(\sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)\right).

由于softmax运算考虑了背景词可能是词典V\mathcal{V}中的任一词,以上损失包含了词典大小数目的项的累加。在上一节中我们看到,不论是跳字模型还是连续词袋模型,由于条件概率使用了softmax运算,每一步的梯度计算都包含词典大小数目的项的累加。对于含几十万或上百万词的较大词典,每次的梯度计算开销可能过大。为了降低该计算复杂度,本节将介绍两种近似训练方法,即负采样(negative sampling)或层序softmax(hierarchical softmax)。由于跳字模型和连续词袋模型类似,本节仅以跳字模型为例介绍这两种方法。

负采样

负采样修改了原来的目标函数。给定中心词wcw_c的一个背景窗口,我们把背景词wow_o出现在该背景窗口看作一个事件,并将该事件的概率计算为

P(D=1wc,wo)=σ(uovc),P(D=1\mid w_c, w_o) = \sigma(\boldsymbol{u}_o^\top \boldsymbol{v}_c),

其中的σ\sigma函数与sigmoid激活函数的定义相同:

σ(x)=11+exp(x).\sigma(x) = \frac{1}{1+\exp(-x)}.

我们先考虑最大化文本序列中所有该事件的联合概率来训练词向量。具体来说,给定一个长度为TT的文本序列,设时间步tt的词为w(t)w^{(t)}且背景窗口大小为mm,考虑最大化联合概率

t=1Tmjm, j0P(D=1w(t),w(t+j)). \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(D=1\mid w^{(t)}, w^{(t+j)}).

然而,以上模型中包含的事件仅考虑了正类样本。这导致当所有词向量相等且值为无穷大时,以上的联合概率才被最大化为1。很明显,这样的词向量毫无意义。负采样通过采样并添加负类样本使目标函数更有意义。设背景词wow_o出现在中心词wcw_c的一个背景窗口为事件PP,我们根据分布P(w)P(w)采样KK个未出现在该背景窗口中的词,即噪声词。设噪声词wkw_kk=1,,Kk=1, \ldots, K)不出现在中心词wcw_c的该背景窗口为事件NkN_k。假设同时含有正类样本和负类样本的事件P,N1,,NKP, N_1, \ldots, N_K相互独立,负采样将以上需要最大化的仅考虑正类样本的联合概率改写为

t=1Tmjm, j0P(w(t+j)w(t)), \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}),

其中条件概率被近似表示为 P(w(t+j)w(t))=P(D=1w(t),w(t+j))k=1, wkP(w)KP(D=0w(t),wk). P(w^{(t+j)} \mid w^{(t)}) =P(D=1\mid w^{(t)}, w^{(t+j)})\prod_{k=1,\ w_k \sim P(w)}^K P(D=0\mid w^{(t)}, w_k).

设文本序列中时间步tt的词w(t)w^{(t)}在词典中的索引为iti_t,噪声词wkw_k在词典中的索引为hkh_k。有关以上条件概率的对数损失为

\begin{aligned} -\log P(w^{(t+j)} \mid w^{(t)}) =& -\log P(D=1\mid w^{(t)}, w^{(t+j)}) - \sum_{k=1,\ w_k \sim P(w)}^K \log P(D=0\mid w^{(t)}, w_k)\ =&- \log, \sigma\left(\boldsymbol{u}{i{t+j}}^\top \boldsymbol{v}{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\left(1-\sigma\left(\boldsymbol{u}_{h_k}^\top \boldsymbol{v}_{i_t}\right)\right)\ =&- \log, \sigma\left(\boldsymbol{u}_{i{t+j}}^\top \boldsymbol{v}_{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\sigma\left(-\boldsymbol{u}_{h_k}^\top \boldsymbol{v}_{i_t}\right). \end{aligned}

现在,训练中每一步的梯度计算开销不再与词典大小相关,而与KK线性相关。当KK取较小的常数时,负采样在每一步的梯度计算开销较小。

层序softmax

层序softmax是另一种近似训练法。它使用了二叉树这一数据结构,树的每个叶结点代表词典V\mathcal{V}中的每个词。

层序softmax。二叉树的每个叶结点代表着词典的每个词

假设L(w)L(w)为从二叉树的根结点到词ww的叶结点的路径(包括根结点和叶结点)上的结点数。设n(w,j)n(w,j)为该路径上第jj个结点,并设该结点的背景词向量为un(w,j)\boldsymbol{u}_{n(w,j)}。以图10.3为例,L(w3)=4L(w_3) = 4。层序softmax将跳字模型中的条件概率近似表示为

P(wowc)=j=1L(wo)1σ([![n(wo,j+1)=leftChild(n(wo,j))]!]un(wo,j)vc),P(w_o \mid w_c) = \prod_{j=1}^{L(w_o)-1} \sigma\left( [![ n(w_o, j+1) = \text{leftChild}(n(w_o,j)) ]!] \cdot \boldsymbol{u}_{n(w_o,j)}^\top \boldsymbol{v}_c\right),

其中σ\sigma函数与“多层感知机”一节中sigmoid激活函数的定义相同,leftChild(n)\text{leftChild}(n)是结点nn的左子结点:如果判断xx为真,[![x]!]=1[![x]!] = 1;反之[![x]!]=1[![x]!] = -1。 让我们计算图10.3中给定词wcw_c生成词w3w_3的条件概率。我们需要将wcw_c的词向量vc\boldsymbol{v}_c和根结点到w3w_3路径上的非叶结点向量一一求内积。由于在二叉树中由根结点到叶结点w3w_3的路径上需要向左、向右再向左地遍历(图10.3中加粗的路径),我们得到

P(w_3 \mid w_c) = \sigma(\boldsymbol{u}{n(w_3,1)}^\top \boldsymbol{v}_c) \cdot \sigma(-\boldsymbol{u}{n(w_3,2)}^\top \boldsymbol{v}c) \cdot \sigma(\boldsymbol{u}{n(w_3,3)}^\top \boldsymbol{v}_c).

由于σ(x)+σ(x)=1\sigma(x)+\sigma(-x) = 1,给定中心词wcw_c生成词典V\mathcal{V}中任一词的条件概率之和为1这一条件也将满足:

wVP(wwc)=1.\sum_{w \in \mathcal{V}} P(w \mid w_c) = 1.

此外,由于L(wo)1L(w_o)-1的数量级为O(log2V)\mathcal{O}(\text{log}_2|\mathcal{V}|),当词典V\mathcal{V}很大时,层序softmax在训练中每一步的梯度计算开销相较未使用近似训练时大幅降低。

小结

  • 负采样通过考虑同时含有正类样本和负类样本的相互独立事件来构造损失函数。其训练中每一步的梯度计算开销与采样的噪声词的个数线性相关。
  • 层序softmax使用了二叉树,并根据根结点到叶结点的路径来构造损失函数。其训练中每一步的梯度计算开销与词典大小的对数相关。

练习

  • 在阅读下一节之前,你觉得在负采样中应如何采样噪声词?
  • 本节中最后一个公式为什么成立?
  • 如何将负采样或层序softmax用于训练连续词袋模型?

扫码直达讨论区