回忆上一节的内容。跳字模型的核心在于使用softmax运算得到给定中心词 w c w_c wc来生成背景词 w o w_o wo的条件概率
P ( w o ∣ w c ) = exp ( u o ⊤ v c ) ∑ i ∈ V exp ( u i ⊤ v c ) . 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)}. P(wo∣wc)=∑i∈Vexp(ui⊤vc)exp(uo⊤vc).
该条件概率相应的对数损失
− log P ( w o ∣ w c ) = − u o ⊤ v c + log ( ∑ i ∈ V exp ( u i ⊤ 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). −logP(wo∣wc)=−uo⊤vc+log(i∈V∑exp(ui⊤vc)).
由于softmax运算考虑了背景词可能是词典 V \mathcal{V} V中的任一词,以上损失包含了词典大小数目的项的累加。在上一节中我们看到,不论是跳字模型还是连续词袋模型,由于条件概率使用了softmax运算,每一步的梯度计算都包含词典大小数目的项的累加。对于含几十万或上百万词的较大词典,每次的梯度计算开销可能过大。为了降低该计算复杂度,本节将介绍两种近似训练方法,即负采样(negative sampling)或层序softmax(hierarchical softmax)。由于跳字模型和连续词袋模型类似,本节仅以跳字模型为例介绍这两种方法。
负采样修改了原来的目标函数。给定中心词 w c w_c wc的一个背景窗口,我们把背景词 w o w_o wo出现在该背景窗口看作一个事件,并将该事件的概率计算为
P ( D = 1 ∣ w c , w o ) = σ ( u o ⊤ v c ) , P(D=1\mid w_c, w_o) = \sigma(\boldsymbol{u}_o^\top \boldsymbol{v}_c), P(D=1∣wc,wo)=σ(uo⊤vc),
其中的 σ \sigma σ函数与sigmoid激活函数的定义相同:
σ ( x ) = 1 1 + exp ( − x ) . \sigma(x) = \frac{1}{1+\exp(-x)}. σ(x)=1+exp(−x)1.
我们先考虑最大化文本序列中所有该事件的联合概率来训练词向量。具体来说,给定一个长度为 T T T的文本序列,设时间步 t t t的词为 w ( t ) w^{(t)} w(t)且背景窗口大小为 m m m,考虑最大化联合概率
∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( D = 1 ∣ w ( 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)}). t=1∏T−m≤j≤m, j=0∏P(D=1∣w(t),w(t+j)).
然而,以上模型中包含的事件仅考虑了正类样本。这导致当所有词向量相等且值为无穷大时,以上的联合概率才被最大化为1。很明显,这样的词向量毫无意义。负采样通过采样并添加负类样本使目标函数更有意义。设背景词 w o w_o wo出现在中心词 w c w_c wc的一个背景窗口为事件 P P P,我们根据分布 P ( w ) P(w) P(w)采样 K K K个未出现在该背景窗口中的词,即噪声词。设噪声词 w k w_k wk( k = 1 , … , K k=1, \ldots, K k=1,…,K)不出现在中心词 w c w_c wc的该背景窗口为事件 N k N_k Nk。假设同时含有正类样本和负类样本的事件 P , N 1 , … , N K P, N_1, \ldots, N_K P,N1,…,NK相互独立,负采样将以上需要最大化的仅考虑正类样本的联合概率改写为
∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( 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)}), t=1∏T−m≤j≤m, j=0∏P(w(t+j)∣w(t)),
其中条件概率被近似表示为
P ( w ( t + j ) ∣ w ( t ) ) = P ( D = 1 ∣ w ( t ) , w ( t + j ) ) ∏ k = 1 , w k ∼ P ( w ) K P ( D = 0 ∣ w ( t ) , w k ) . 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). P(w(t+j)∣w(t))=P(D=1∣w(t),w(t+j))k=1, wk∼P(w)∏KP(D=0∣w(t),wk).
设文本序列中时间步 t t t的词 w ( t ) w^{(t)} w(t)在词典中的索引为 i t i_t it,噪声词 w k w_k wk在词典中的索引为 h k h_k hk。有关以上条件概率的对数损失为
− log P ( w ( t + j ) ∣ w ( t ) ) = − log P ( D = 1 ∣ w ( t ) , w ( t + j ) ) − ∑ k = 1 , w k ∼ P ( w ) K log P ( D = 0 ∣ w ( t ) , w k ) = − log σ ( u i t + j ⊤ v i t ) − ∑ k = 1 , w k ∼ P ( w ) K log ( 1 − σ ( u h k ⊤ v i t ) ) = − log σ ( u i t + j ⊤ v i t ) − ∑ k = 1 , w k ∼ P ( w ) K log σ ( − u h k ⊤ v i t ) . \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} −logP(w(t+j)∣w(t))===−logP(D=1∣w(t),w(t+j))−k=1, wk∼P(w)∑KlogP(D=0∣w(t),wk)−logσ(uit+j⊤vit)−k=1, wk∼P(w)∑Klog(1−σ(uhk⊤vit))−logσ(uit+j⊤vit)−k=1, wk∼P(w)∑Klogσ(−uhk⊤vit).
现在,训练中每一步的梯度计算开销不再与词典大小相关,而与 K K K线性相关。当 K K K取较小的常数时,负采样在每一步的梯度计算开销较小。
层序softmax是另一种近似训练法。它使用了二叉树这一数据结构,树的每个叶结点代表词典 V \mathcal{V} V中的每个词。
假设 L ( w ) L(w) L(w)为从二叉树的根结点到词 w w w的叶结点的路径(包括根结点和叶结点)上的结点数。设 n ( w , j ) n(w,j) n(w,j)为该路径上第 j j j个结点,并设该结点的背景词向量为 u n ( w , j ) \boldsymbol{u}_{n(w,j)} un(w,j)。以图10.3为例, L ( w 3 ) = 4 L(w_3) = 4 L(w3)=4。层序softmax将跳字模型中的条件概率近似表示为
P ( w o ∣ w c ) = ∏ j = 1 L ( w o ) − 1 σ ( [ [ n ( w o , j + 1 ) = leftChild ( n ( w o , j ) ) ] ] ⋅ u n ( w o , j ) ⊤ v c ) , 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), P(wo∣wc)=j=1∏L(wo)−1σ([[n(wo,j+1)=leftChild(n(wo,j))]]⋅un(wo,j)⊤vc),
其中 σ \sigma σ函数与3.8节(多层感知机)中sigmoid激活函数的定义相同, leftChild ( n ) \text{leftChild}(n) leftChild(n)是结点 n n n的左子结点:如果判断 x x x为真, [ [ x ] ] = 1 [\![x]\!] = 1 [[x]]=1;反之 [ [ x ] ] = − 1 [\![x]\!] = -1 [[x]]=−1。
让我们计算图10.3中给定词 w c w_c wc生成词 w 3 w_3 w3的条件概率。我们需要将 w c w_c wc的词向量 v c \boldsymbol{v}_c vc和根结点到 w 3 w_3 w3路径上的非叶结点向量一一求内积。由于在二叉树中由根结点到叶结点 w 3 w_3 w3的路径上需要向左、向右再向左地遍历(图10.3中加粗的路径),我们得到
P ( w 3 ∣ w c ) = σ ( u n ( w 3 , 1 ) ⊤ v c ) ⋅ σ ( − u n ( w 3 , 2 ) ⊤ v c ) ⋅ σ ( u n ( w 3 , 3 ) ⊤ v c ) . 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). P(w3∣wc)=σ(un(w3,1)⊤vc)⋅σ(−un(w3,2)⊤vc)⋅σ(un(w3,3)⊤vc).
由于 σ ( x ) + σ ( − x ) = 1 \sigma(x)+\sigma(-x) = 1 σ(x)+σ(−x)=1,给定中心词 w c w_c wc生成词典 V \mathcal{V} V中任一词的条件概率之和为1这一条件也将满足:
∑ w ∈ V P ( w ∣ w c ) = 1. \sum_{w \in \mathcal{V}} P(w \mid w_c) = 1. w∈V∑P(w∣wc)=1.
此外,由于 L ( w o ) − 1 L(w_o)-1 L(wo)−1的数量级为 O ( log 2 ∣ V ∣ ) \mathcal{O}(\text{log}_2|\mathcal{V}|) O(log2∣V∣),当词典 V \mathcal{V} V很大时,层序softmax在训练中每一步的梯度计算开销相较未使用近似训练时大幅降低。
注:本节与原书完全相同,原书传送门