15.2. 近似训练
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

回想我们在15.1节中的讨论。skip-gram模型的主要思想是使用softmax操作来计算给定中心词\(w_c\)时生成上下文词\(w_o\)的条件概率,如(15.1.4)所示,其对应的对数损失是(15.1.7)的相反数。

由于softmax操作的性质,因为上下文词可以是词典\(\mathcal{V}\)中的任何一个词,(15.1.7)的相反数包含了与整个词汇表大小(通常有数十万或数百万个词)一样多的项的总和。因此,(15.1.8)中skip-gram模型的梯度计算和(15.1.15)中连续词袋模型的梯度计算都包含求和。不幸的是,对一个大型词典(通常有数十万或数百万个词)求和的这些梯度的计算成本是巨大的!

为了降低上述计算复杂度,本节将介绍两种近似训练方法:负采样分层softmax。由于skip-gram模型和连续词袋模型之间的相似性,我们将仅以skip-gram模型为例来描述这两种近似训练方法。

15.2.1. 负采样

负采样修改了原始目标函数。给定中心词\(w_c\)的上下文窗口,任何(上下文)词\(w_o\)来自此上下文窗口的事实被视为一个事件,其概率模型为

(15.2.1)\[P(D=1\mid w_c, w_o) = \sigma(\mathbf{u}_o^\top \mathbf{v}_c),\]

其中\(\sigma\)使用sigmoid激活函数的定义

(15.2.2)\[\sigma(x) = \frac{1}{1+\exp(-x)}.\]

我们首先通过最大化文本序列中所有此类事件的联合概率来训练词嵌入。具体来说,给定一个长度为\(T\)的文本序列,用\(w^{(t)}\)表示时间步\(t\)的词,并设上下文窗口大小为\(m\),考虑最大化联合概率

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

然而,(15.2.3)只考虑了涉及正例的事件。结果,(15.2.3)中的联合概率只有在所有词向量都等于无穷大时才最大化为1。当然,这样的结果是毫无意义的。为了使目标函数更有意义,负采样添加了从预定义分布中采样的负例。

\(S\)表示上下文词\(w_o\)来自中心词\(w_c\)的上下文窗口的事件。对于这个涉及\(w_o\)的事件,从预定义的分布\(P(w)\)中采样\(K\)个不属于此上下文窗口的噪声词。用\(N_k\)表示噪声词\(w_k\)\(k=1, \ldots, K\))不来自\(w_c\)的上下文窗口的事件。假设这些涉及正例和负例的事件\(S, N_1, \ldots, N_K\)是相互独立的。负采样将(15.2.3)中的联合概率(仅涉及正例)重写为

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

其中条件概率通过事件\(S, N_1, \ldots, N_K\)近似

(15.2.5)\[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).\]

\(i_t\)\(h_k\)分别表示文本序列中时间步\(t\)的词\(w^{(t)}\)和噪声词\(w_k\)的索引。关于(15.2.5)中条件概率的对数损失是

(15.2.6)\[\begin{split}\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(\mathbf{u}_{i_{t+j}}^\top \mathbf{v}_{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\left(1-\sigma\left(\mathbf{u}_{h_k}^\top \mathbf{v}_{i_t}\right)\right)\\ =&- \log\, \sigma\left(\mathbf{u}_{i_{t+j}}^\top \mathbf{v}_{i_t}\right) - \sum_{k=1,\ w_k \sim P(w)}^K \log\sigma\left(-\mathbf{u}_{h_k}^\top \mathbf{v}_{i_t}\right). \end{aligned}\end{split}\]

我们可以看到,现在每个训练步骤的梯度计算成本与词典大小无关,而是与\(K\)线性相关。当将超参数\(K\)设置为较小值时,使用负采样的每个训练步骤的梯度计算成本较小。

15.2.2. 分层Softmax

作为一种替代的近似训练方法,分层softmax使用二叉树,一种数据结构,如图 15.2.1所示,其中树的每个叶节点代表词典\(\mathcal{V}\)中的一个词。

../_images/hi-softmax.svg

图 15.2.1 分层softmax用于近似训练,其中树的每个叶节点代表词典中的一个词。

\(L(w)\)表示从根节点到表示词\(w\)的叶节点路径上的节点数(包括两端)。令\(n(w,j)\)为该路径上的第\(j^\textrm{th}\)个节点,其上下文词向量为\(\mathbf{u}_{n(w, j)}\)。例如,在图 15.2.1中,\(L(w_3) = 4\)。分层softmax近似(15.1.4)中的条件概率为

(15.2.7)\[P(w_o \mid w_c) = \prod_{j=1}^{L(w_o)-1} \sigma\left( [\![ n(w_o, j+1) = \textrm{leftChild}(n(w_o, j)) ]\!] \cdot \mathbf{u}_{n(w_o, j)}^\top \mathbf{v}_c\right),\]

其中函数\(\sigma\)(15.2.2)中定义,\(\textrm{leftChild}(n)\)是节点\(n\)的左子节点:如果\(x\)为真,\([\![x]\!] = 1\);否则\([\![x]\!] = -1\)

为了说明,我们计算在图 15.2.1中给定词\(w_c\)生成词\(w_3\)的条件概率。这需要词\(w_c\)的词向量\(\mathbf{v}_c\)与从根到\(w_3\)的路径(图 15.2.1中加粗的路径)上的非叶节点向量进行点积,该路径先左,再右,然后左

(15.2.8)\[P(w_3 \mid w_c) = \sigma(\mathbf{u}_{n(w_3, 1)}^\top \mathbf{v}_c) \cdot \sigma(-\mathbf{u}_{n(w_3, 2)}^\top \mathbf{v}_c) \cdot \sigma(\mathbf{u}_{n(w_3, 3)}^\top \mathbf{v}_c).\]

由于\(\sigma(x)+\sigma(-x) = 1\),因此所有词典\(\mathcal{V}\)中的词基于任何词\(w_c\)生成的条件概率之和为一,即

(15.2.9)\[\sum_{w \in \mathcal{V}} P(w \mid w_c) = 1.\]

幸运的是,由于二叉树结构,\(L(w_o)-1\)的数量级为\(\mathcal{O}(\textrm{log}_2|\mathcal{V}|)\),因此当词典大小\(\mathcal{V}\)巨大时,使用分层softmax的每个训练步骤的计算成本比没有近似训练的计算成本大大降低。

15.2.3. 小结

  • 负采样通过考虑涉及正例和负例的相互独立事件来构建损失函数。训练的计算成本在每个步骤中线性依赖于噪声词的数量。

  • 分层softmax使用二叉树中从根节点到叶节点的路径来构建损失函数。训练的计算成本在每个步骤中依赖于词典大小的对数。

15.2.4. 练习

  1. 在负采样中,我们如何采样噪声词?

  2. 验证(15.2.9)成立。

  3. 如何分别使用负采样和分层softmax训练连续词袋模型?

讨论