近似训练 :label: 回想一下我们在 :numref: 中的讨论。跳元模型的主要思想是使用softmax运算来计算基于给定的中心词$wc$生成上下文字$wo$的条件概率(如 :eqref: ),对应的对数损失在 :eqref: 给出。 由于softmax操作的性质,上下文词可以是词表$\mathcal{V}$中的任意项, :eqref: 包含与整个词表大小一样多的项的求和。因此, :eqref: 中跳元模型的梯度计算和 :eqref: 中的连续词袋模型的梯度计算都包含求和。不幸的是,在一个词典上(通常有几十万或数百万个单词)求和的梯度的计算成本是巨大的! 为了降低上述计算复杂度,本节将介绍两种近似训练方法:负采样和分层softmax。
🏷sec_approx_train
回想一下我们在 :numref:sec_word2vec中的讨论。跳元模型的主要思想是使用softmax运算来计算基于给定的中心词w_c生成上下文字w_o的条件概率(如 :eqref:eq_skip-gram-softmax),对应的对数损失在 :eqref:eq_skip-gram-log给出。
由于softmax操作的性质,上下文词可以是词表\mathcal{V}中的任意项, :eqref:eq_skip-gram-log包含与整个词表大小一样多的项的求和。因此, :eqref:eq_skip-gram-grad中跳元模型的梯度计算和 :eqref:eq_cbow-gradient中的连续词袋模型的梯度计算都包含求和。不幸的是,在一个词典上(通常有几十万或数百万个单词)求和的梯度的计算成本是巨大的!
为了降低上述计算复杂度,本节将介绍两种近似训练方法:负采样和分层softmax。
由于跳元模型和连续词袋模型的相似性,我们将以跳元模型为例来描述这两种近似训练方法。
🏷subsec_negative-sampling
负采样修改了原目标函数。给定中心词w_c的上下文窗口,任意上下文词w_o来自该上下文窗口的被认为是由下式建模概率的事件:
其中\sigma使用了sigmoid激活函数的定义:
:eqlabel:eq_sigma-f
让我们从最大化文本序列中所有这些事件的联合概率开始训练词嵌入。具体而言,给定长度为T的文本序列,以w^{(t)}表示时间步t的词,并使上下文窗口为m,考虑最大化联合概率:
:eqlabel:eq-negative-sample-pos
然而, :eqref:eq-negative-sample-pos只考虑那些正样本的事件。仅当所有词向量都等于无穷大时, :eqref:eq-negative-sample-pos中的联合概率才最大化为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的这些事件是相互独立的。负采样将 :eqref:eq-negative-sample-pos中的联合概率(仅涉及正例)重写为
通过事件S, N_1, \ldots, N_K近似条件概率:
:eqlabel:eq-negative-sample-conditional-prob
分别用i_t和h_k表示词w^{(t)}和噪声词w_k在文本序列的时间步t处的索引。 :eqref:eq-negative-sample-conditional-prob中关于条件概率的对数损失为:
我们可以看到,现在每个训练步的梯度计算成本与词表大小无关,而是线性依赖于K。当将超参数K设置为较小的值时,在负采样的每个训练步处的梯度的计算成本较小。
作为另一种近似训练方法,层序Softmax(hierarchical softmax)使用二叉树( :numref:fig_hi_softmax中说明的数据结构),其中树的每个叶节点表示词表\mathcal{V}中的一个词。
🏷fig_hi_softmax
用L(w)表示二叉树中表示字w的从根节点到叶节点的路径上的节点数(包括两端)。设n(w,j)为该路径上的j^\mathrm{th}节点,其上下文字向量为\mathbf{u}_{n(w, j)}。例如, :numref:fig_hi_softmax中的L(w_3) = 4。分层softmax将 :eqref:eq_skip-gram-softmax中的条件概率近似为
其中函数\sigma在 :eqref:eq_sigma-f中定义,\text{leftChild}(n)是节点n的左子节点:如果x为真,[\![x]\!] = 1;否则[\![x]\!] = -1。
为了说明,让我们计算 :numref:fig_hi_softmax中给定词w_c生成词w_3的条件概率。这需要w_c的词向量\mathbf{v}_c和从根到w_3的路径( :numref:fig_hi_softmax中加粗的路径)上的非叶节点向量之间的点积,该路径依次向左、向右和向左遍历:
由\sigma(x)+\sigma(-x) = 1,它认为基于任意词w_c生成词表\mathcal{V}中所有词的条件概率总和为1:
:eqlabel:eq_hi-softmax-sum-one
幸运的是,由于二叉树结构,L(w_o)-1大约与\mathcal{O}(\text{log}_2|\mathcal{V}|)是一个数量级。当词表大小\mathcal{V}很大时,与没有近似训练的相比,使用分层softmax的每个训练步的计算代价显著降低。
eq_hi-softmax-sum-one是否有效。