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 )
我们来试试一种新方法,不需要计算,也不需要存储某个巨大数据集(可能是数十亿个句子)的全局信息,我们可以尝试创建一个模型,能够一次学习一个迭代,并最终能根据上下文对单词的概率进行编码。
这个模型的参数是词向量,在每次训练的迭代中运行模型并评估错误,同时遵循一个更新规则,该规则可以惩罚导致错误的模型参数。这个想法是一个可以追溯到 1986 年的古老的想法。我们称这种方法为“反向传播”偏差(参见 [Rumelhart et al., 1988])。模型和任务越简单,训练速度就越快。
前人们测试了几种方法。 如[Collobert et al., 2011] 中设计的 NLP 模型,其第一步是转换向量中的每个单词。 对于每项特定任务(如命名实体识别、词性标注等),不仅训练模型的参数,还训练了向量并获得了出色的性能,同时还计算出了不错的词向量!可以参考一下其他读物: [Bengio et al., 2003]。
在斯坦福CS224N课程中,会介绍 [Mikolov et al., 2013] 中的word2vec,这是一种更简单点概率方法。另外Word2vec 也是一个软件包,实际上包括:
- 2种算法:连续词袋(CBOW)和 skip-gram。 CBOW 旨在根据词向量从周围的上下文中预测中心词。 Skip-gram 做相反的事情,从中心词预测上下文词的分布(概率)。
- 2 种训练方法:负采样和分层 softmax。 负采样通过对负样本进行采样来定义目标,而分层 softmax 使用高效的树结构定义目标来计算所有词汇的概率。
【注释】
Word2vec 的概述,可以在此处找到注释图:1.1. Word2Vec | Myndbook
word2vec 模型的详细总结也可以在这里找到 [Rong, 2014]
基于迭代的方法一次捕获一个单词的共现,而不是像 SVD 方法那样直接捕获所有共现计数。
词的上下文:一个词的上下文是 m 个围绕词的集合。 例如,句子“The quick brown fox jumped over the lazy dog”中单词“fox”在m = 2时的上下文是{“quick”,“brown”,“jumped”,“over”}。
该模型(Word2vec)依赖于语言学中一个非常重要的假设,分布相似性,即相似的词具有相似的上下文。
4.1 Language Models (Unigrams, Bigrams, etc.)
首先,我们需要创建这样一个模型,为一系列标记分配概率。 先看一个例子:
"The cat jumped over the puddle."
好的语言模型会给这个句子较高的概率,因为这是一个在句法和语义上都完全有效的句子。同样,“stock boil fish is toy”这句话的概率应该很低,因为它毫无意义。在数学上,我们可以在任何给定的 n 个单词序列上调用这个概率:

我们可以采用一元语言模型方法,并假设所有单词的共现都是完全独立的来分解这个概率:

Unigram Model
然而,这有点可笑,因为我们知道下一个单词出现的可能性高度取决于前面的单词序列。 而那个沙雕句子示例用上面这个模型可能得分很高。 所以也许我们应该让序列的概率取决于序列中一个词和它旁边的词成对的概率,我们称其为二元模型,其表示为:

Bigram Model
这当然也有点幼稚,因为我们只关注相邻单词对,而不是评估整个句子。但我们很快会看到,这种表示法,其实已经让我们走得很远。 注意,在大小为 1 的上下文的 Word-Word 矩阵中,我们基本上可以学习这些成对概率了,但同样,这将需要对海量数据集的全局信息进行计算和存储。
接下来让我们来观察一些常见的模型。
4.2 连续词袋模型 Continuous Bag of Words Model (CBOW)
一种方法是将 {"The", "cat", 'over", "the', "puddle"} 当作上下文,并从这些上下文单词中预测或生成中心词“jumped”。 这种类型的模型我们称之为连续词袋 (CBOW) 模型。
【注释】
CBOW 模型:
从周围的上下文中预测中心词
对于每个单词,我们要学习 2 个向量
- v:(输入向量)当词是上下文时
- u:(输出向量)当词是中心词时
我们详细讨论一下这个 CBOW 模型。 首先,设置已知参数:模型中的已知参数是句子,确切的说是上下文,由One-hot词向量表达,并用
表示。 CBOW 模型中输出用
表示,因为只有一个输出,所以简化为y,同样,这是一个One-hot向量表达的已知中心词。 接下来我们定义模型中的未知部分。
我们创建两个矩阵,
和
。其中 n 是任意大小,定义了嵌入空间的大小。
是输入词矩阵,当词
是模型的输入时,
的第 i 列是词
的 n 维嵌入向量。 我们将这个 n × 1 向量表示为
。类似地,当模型输出时,
表示输出词矩阵,
的第 j 行是词
的 n 维嵌入向量,
的这一行表示为
。要特别注意的是,我们实际上确实为每个词
学习了两个向量(即输入词向量
和输出词向量
)。
【注释】
CBOW 模型的符号:
•
:来自词汇表
的单词 i
•
:输入词矩阵
•
:
的第 i 列,词
的输入向量表示
•
:输出词矩阵
•
:
的第 i 行,词
的输出向量表示
我们把该模型的工作方式分解在了以下步骤中:
1. 我们为大小为 m 的输入上下文生成我们one-hot词向量:

2. 我们得到上下文的嵌入词向量 :


3. 平均这些向量得到

4. 生成得分向量
。 由于相似向量的点积比较高,它会将相似的词推得更近,以得到高分。
5. 将得分转化为概率
【注释】
softmax 是一个我们会经常使用的运算。 它将向量转换为第 i 个部分为
的向量。
- 取幂以得到正数结果
- 除以
将向量
归一化以给出概率
6. 我们希望生成的概率
与真实概率
相匹配,这也恰好是实际单词的one-hot向量。

图1:上图展示了CBOW是如何工作的,以及如何学习转换矩阵
我们已经了解了有了 _
_和
,模型是如何工作的。那么怎么学习这两个矩阵呢?我们需要创建一个目标 函数。 很多时候,当我们试图从某些真实概率中学习概率时,我们会寻求用信息论来度量两个分布之间的距离。 这里,我们选择使用非常流行的距离/损失度量方法,cross entropy 即交叉熵
。
直观上,在离散情况下使用交叉熵可从损失函数的公式中得出:

我们手头的情况 y 是一个one-hot向量。因此,我们知道上述损失可简化为:

【注释】
_
当
时最小。 然后,如果我们找到一个
,使得 _
接近最小值,我们就有
。 这意味着模型预测中心词非常好!
设 c 是正确词的 one-hot 向量为 1 时的索引。先考虑预测是完美的时候的情况,这时
= 1,可以计算出损失
= −1 log (1) = 0。因此,对于很完美的预测,我们不会面临惩罚或损失。
现在考虑相反的情况,假设预测极其糟糕,这时
= 0.01。 和上面一样,我们可以计算出损失为
= −1 log(0.01) ≈ 4.605。 我们看到,对于概率分布,交叉熵为我们提供了一个很好的距离度量。 因此,我们将优化目标公式定为:

我们使用随机梯度下降来更新所有相关的词向量
和
。
【注释】
为了学习向量(矩阵
和
),CBOW 定义了一个成本来衡量它在预测中心词方面的效果。 得益于随机梯度下降,我们可以通过更新矩阵
和
来优化此成本。
<下一节:[CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (三)词向量(三)_放肆荒原的博客-博客]( "CS224n: Natural Language Processing with Deep Learning 笔记、文献及知识点整理 (三)词向量(三)_放肆荒原的博客-博客")>
