datetime:2025/01/06 18:41
author:nzb

本项目源于《动手学深度学习》,添加了一些自己的学习笔记,方便搜索查阅。正版GitHub地址:https://github.com/d2l-ai/d2l-zh

近似训练

回想一下我们在上一章《词嵌入(word2vec)》中的讨论。跳元模型的主要思想是使用softmax运算来计算基于给定的中心词生成上下文字的条件概率(如 (14.1.4)),对应的对数损失在 (14.1.7)给出。

由于softmax操作的性质,上下文词可以是词表中的任意项, (14.1.7)包含与整个词表大小一样多的项的求和。因此, (14.1.8)中跳元模型的梯度计算和 (14.1.15)中的连续词袋模型的梯度计算都包含求和。不幸的是,在一个词典上(通常有几十万或数百万个单词)求和的梯度的计算成本是巨大的!

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

负采样

负采样修改了原目标函数。给定中心词的上下文窗口,任意上下文词来自该上下文窗口的被认为是由下式建模概率的事件:

其中使用了sigmoid激活函数的定义:

让我们从最大化文本序列中所有这些事件的联合概率开始训练词嵌入。具体而言,给定长度为的文本序列,以表示时间步的词,并使上下文窗口为,考虑最大化联合概率:

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

表示上下文词来自中心词的上下文窗口的事件。对于这个涉及的事件,从预定义分布中采样个不是来自这个上下文窗口噪声词。用表示噪声词)不是来自的上下文窗口的事件。假设正例和负例的这些事件是相互独立的。负采样将 (14.2.3)中的联合概率(仅涉及正例)重写为

通过事件近似条件概率:

分别用表示词和噪声词在文本序列的时间步处的索引。 (14.2.5)中关于条件概率的对数损失为:

我们可以看到,现在每个训练步的梯度计算成本与词表大小无关,而是线性依赖于。当将超参数设置为较小的值时,在负采样的每个训练步处的梯度的计算成本较小。

层序Softmax

作为另一种近似训练方法,层序Softmax(hierarchical softmax)使用二叉树( 图14.2.1 中说明的数据结构),其中树的每个叶节点表示词表中的一个词。

用于近似训练的分层softmax,其中树的每个叶节点表示词表中的一个词 图14.2.1 用于近似训练的分层softmax,其中树的每个叶节点表示词表中的一个词

表示二叉树中表示字的从根节点到叶节点的路径上的节点数(包括两端)。设为该路径上的节点,其上下文字向量为。例如, 图14.2.1 中的。分层softmax将 (14.1.4)中的条件概率近似为

其中函数在 (14.2.2)中定义,是节点的左子节点:如果为真,;否则

为了说明,让我们计算图14.2.1 中给定词生成词的条件概率。这需要的词向量和从根到的路径(图14.2.1 中加粗的路径)上的非叶节点向量之间的点积,该路径依次向左、向右和向左遍历:

,它认为基于任意词生成词表中所有词的条件概率总和为1:

幸运的是,由于二叉树结构,大约与是一个数量级。当词表大小很大时,与没有近似训练的相比,使用分层softmax的每个训练步的计算代价显著降低。

小结

  • 负采样通过考虑相互独立的事件来构造损失函数,这些事件同时涉及正例和负例。训练的计算量与每一步的噪声词数成线性关系。
  • 分层softmax使用二叉树中从根节点到叶节点的路径构造损失函数。训练的计算成本取决于词表大小的对数。

练习

  1. 如何在负采样中对噪声词进行采样?
  2. 验证(14.2.9)是否有效。
  3. 如何分别使用负采样和分层softmax训练连续词袋模型?

results matching ""

    No results matching ""