CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (三)词向量(三)
词向量:引言、SVD 和Word2Vec
关键词:NLP(自然语言处理)、词向量、SVD(奇异值分解)、Skip-gram、CBOW(连续词袋)、负采样、层级Softmax、Word2Vec
本文上一部分请见:[CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (二)词向量(二)_放肆荒原的博客-博客]( "CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (二)词向量(二)_放肆荒原的博客-博客")
4. 基于迭代的方法 Word2vec ( Iteration Based Methods - Word2vec )
4.3 Skip-Gram 模型
另一种方法是创建一个模型,在给定中心词“jumped”的情况下,该模型能够预测或生成周围的词“The”、“cat”、“over”、“the”、“puddle”,这里我们称“jumped”这个词为上下文。 这种类型的模型就是 Skip-Gram 模型。
【注:】 Skip-Gram 模型: 给定中心词预测周围的上下文词
我们看一下 Skip-Gram 模型,与CBOW相比设置大致相同,但交换了 x 和 y,即 CBOW 中的 x 现在是 y,反之亦然。 我们将用 x 表示输入的one-hot向量(即中心词,只有一个)。 输出向量为
。 我们定义
和
与 CBOW 中的相同。
【注:】 Skip-Gram 模型的符号:
•
:来自词汇表
的单词 i
• 
:输入词矩阵
•
:
的第 i 列,词
的输入向量表示
• 
:输出词矩阵
•
:
的第 i 行,词
的输出向量表示

图 2: Skip-Gram 工作原理,及如何学习转换矩阵
我们把模型的工作方式分解为以下 6 个步骤:
1. 生成中心词的one-hot输入向量
。
2. 得到中心词的嵌入词向量 
。
3. 生成得分向量
。
4. 将得分向量转化为概率,
。 注意
是观察每个上下文词的概率。
5. 我们希望生成的概率向量匹配真实概率
,这是一个实际输出的one-hot向量。
与 CBOW 一样,我们需要生成一个目标函数来评估模型。 这里的一个关键区别是我们调用朴素贝叶斯假设来分解概率。 简单地说,这是一个强(朴素)的条件独立假设。 换句话说,给定中心词,所有输出词都是完全独立的。

有了这个目标函数,我们可以计算关于未知参数的梯度,并在每次迭代时通过随机梯度下降更新它们。
注意下面的公式:

其中
是概率向量 _
_和 one-hot 向量
之间的交叉熵。
【注:】
_只计算一个概率向量
。Skip gram平等地对待每个上下文单词:模型计算每个单词出现在上下文中的概率,与它到中心单词的距离无关。 _
4.4 负采样 Negative Sampling
让我们花点时间看看目标函数。 请注意,对 |V| 的求和计算量很大! 我们所做的任何更新或对目标函数的评估都需要 O(|V|) 时间,达到了数百万。 简单的做法是我们可以近似地实现它。
【注:】
由于 softmax 归一化,因为要对所有 |V| 分数求和,CBOW 和 Skip-Gram 的损失函数 J 计算成本很高!
对于每个训练步骤,我们可以只采样几个反例,而不是遍历整个词汇表! 我们从噪声分布 (Pn(w)) 中“采样”,其概率与词汇频率的排序相匹配。 为了增加我们对问题的表述以包含负采样,我们需要做的就是更新:
• 目标函数
• 梯度
• 更新规则
Mikolov等人提出了单词和短语的分布式表示及其组合中的负采样 。 虽然负采样基于 Skip-Gram 模型,但它实际上优化了不同的目标。 考虑一对单词和上下文 (w, c)。 我们用 P(D = 1|w, c) 表示 (w, c) 来自语料库数据的概率。用P(D = 0|w, c) 表示 (w, c)不是来自语料库数据的概率。 然后用 sigmoid 函数对 P(D = 1|w, c) 建模:

【注释】 sigmoid 函数是 softmax 的一维版本,可用于对概率进行建模。

图 3:Sigmoid 函数
现在,我们构建了一个新的目标函数,试图最大化一个词和上下文在语料库数据中的概率,如果确实存在的话。如果确实不在语料库数据中,则最大化单词和上下文不在语料库数据中的概率。我们对这两个概率采用简单的最大似然方法。 (这里我们取 θ 作为模型的参数,在我们的例子中是
和
。)

请注意,最大化似然与最小化负对数似然相同:

请注意,D̃是“假”或“负”语料库。 我们会有像“stock boil fish is toy”这样的出现概率很低的不自然句子。 可以通过从词库中随机采样这个负样本来动态生成 D̃。
对于skip-gram,给定中心单词c,我们观察上下文单词 c − m + j 的新目标函数为:

【注:】 比较skip-gram的常规softmax损失:

对于 CBOW,给定上下文向量
,我们观察中心词
的新目标函数是:

【注:】 比较 CBOW 的常规 softmax 损失:

在上述公式中,
是从
中采样的。
那么
是什么? 虽然有很多关于最佳近似的讨论,但似乎效果最好的是提高到 3/4 次方的 Unigram 模型。 为什么是 3/4? 下面的示例可能有助于获得一些直觉:

“Bombastic”被采样的可能性增加了 3 倍,而“is”仅略微上升。
4.5 层级Softmax (Hierarchical Softmax)
Mikolov 等人还提出了层级 softmax 作为普通 softmax 的更有效替代方案。 在实践中,分层 softmax 往往对不常用的词更好,而负采样对常用词和低维向量效果更好。
【注:】
层级 Softmax 使用二叉树,其中叶子是单词。 一个词作为输出词的概率被定义为从词根随机游走到该词叶的概率。 计算成本变为 O(log(|V|)) 而不是 O(|V|)。

图 4:层级 softmax 二叉树
层级 softmax 从根到叶子都有一条独特的路径。 在这个模型中,没有词的输出表示。 相反,图中的每个节点(根和叶除外)都与模型将要学习的向量相关联。
在这个模型中,给定向量
的单词 w 的概率
等于从根开始到 w 对应的叶节点结束的随机游走的概率。 以这种方式计算概率的主要优点是成本仅为 O(log(|V|)),对应于路径的长度。
先给出一些符号,令 L(w) 为从根节点到叶节点 w 的路径的节点数。 例如,图 4 中的 L(w2) 为 3。 n(w, i) 为这条路径上的第 i 个节点,并带有关联向量
。 所以 n(w, 1) 是根,而 n(w, L(w)) 是 w 的父节点。 对于每个内部节点 n,我们任意选择它的一个子节点并将其称为 ch(n)(例如,始终是左节点)。 然后,我们可以计算概率为:

当

σ(·)是sigmoid函数。
公式有点儿复杂,我们仔细地检查一下。
首先,我们根据从根 (n(w, 1)) 到叶子 (w) 的路径形状计算各项的乘积。 如果我们假设 ch(n) 总是 n 的左节点,那么当路径向左时,[n(w, j + 1) = ch(n(w, j))] 返回 1,如果向右则返回 -1 。
用[n(w, j + 1) = ch(n(w, j))] 归一化。 在节点 n 处,如果我们将前往左节点和右节点的概率相加,您可以查
的任何值:

归一化还确保
=1,跟原始 softmax 中一样。最后,我们使用点积比较输入向量
与每个内部节点向量
的相似性。 看个例子,取图 4 中的
,我们必须走两条左边,然后走一条右边才能从根到达
,所以:

为了训练模型,我们的目标仍然是最小化负对数似然
。 但是我们不是更新每个单词的输出向量,而是更新二叉树中从根节点到叶节点的路径中各个节点的向量。
这种方法的速度取决于二叉树的构造方式和词分配给叶节点的方式。 Mikolov等人使用二叉 Huffman 树,它的特点是为频繁词在树中分配更短的路径。
<第一部分完,下一篇我们讨论一下:GloVe、评估和训练[CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理(四)词向量(四)_放肆荒原的博客-博客]( "CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理(四)词向量(四)_放肆荒原的博客-博客")>
