15.1. 词嵌入 (word2vec)¶ 在 SageMaker Studio Lab 中打开 Notebook
自然语言是一个用来表达含义的复杂系统,在这个系统中,词是意义的基本单位。顾名思义,*词向量*是用于表示词的向量,也可被认为是词的特征向量或表示。将词映射到实数向量的技术称为*词嵌入*。近年来,词嵌入已逐渐成为自然语言处理的基础知识。
15.1.1. 独热向量是一个糟糕的选择¶
在 第 9.5 节中,我们使用独热向量来表示词(字符就是词)。假设词典中不同词的数量(词典大小)为 \(N\),每个词对应一个从 \(0\) 到 \(N-1\) 的不同整数(索引)。为了得到索引为 \(i\) 的任意词的独热向量表示,我们创建了一个长度为 \(N\) 的全0向量,并将位置 \(i\) 的元素设置为1。这样,每个词都被表示为一个长度为 \(N\) 的向量,可以直接被神经网络使用。
虽然独热词向量很容易构建,但它们通常不是一个好的选择。一个主要原因是独热词向量不能准确地表达不同词之间的相似性,比如我们经常使用的*余弦相似度*。对于向量 \(\mathbf{x}, \mathbf{y} \in \mathbb{R}^d\),它们的余弦相似度是它们之间夹角的余弦
由于任何两个不同词的独热向量之间的余弦相似度为0,所以独热向量无法编码词之间的相似性。
15.1.2. 自监督的word2vec¶
为了解决上述问题,人们提出了word2vec工具。它将每个词映射到一个固定长度的向量,这些向量能更好地表达不同词之间的相似性和类比关系。word2vec工具包含两个模型,即*跳元模型*(skip-gram) (Mikolov et al., 2013) 和*连续词袋*(CBOW) (Mikolov et al., 2013)。对于有意义的表示,它们的训练依赖于可以被看作是使用语料库中某些词的周围词来预测这些词的条件概率。由于监督来自数据本身而没有标签,因此跳元模型和连续词袋都是自监督模型。
接下来,我们将介绍这两种模型及其训练方法。
15.1.3. 跳元模型¶
跳元模型(skip-gram)假设一个词可以用来在其文本序列的周围生成词。以文本序列“the”、“man”、“loves”、“his”、“son”为例。我们选择“loves”作为*中心词*,并将上下文窗口大小设置为2。如图 15.1.1所示,给定中心词“loves”,跳元模型考虑了生成*上下文词*“the”、“man”、“his”和“son”的条件概率,这些词与中心词的距离不超过2个词:
假设上下文词是在给定中心词的情况下独立生成的(即条件独立性)。在这种情况下,上述条件概率可以重写为
图 15.1.1 跳元模型考虑了给定一个中心词,生成其周围上下文词的条件概率。¶
在跳元模型中,每个词都有两个 \(d\)维向量表示,用于计算条件概率。更具体地说,对于词典中索引为 \(i\) 的任何词,我们分别用 \(\mathbf{v}_i\in\mathbb{R}^d\) 和 \(\mathbf{u}_i\in\mathbb{R}^d\) 表示它用作*中心*词和*上下文*词时的两个向量。给定中心词 \(w_c\)(在词典中索引为 \(c\)),生成任何上下文词 \(w_o\)(在词典中索引为 \(o\))的条件概率可以通过对向量点积进行softmax操作来建模:
其中词汇表索引集 \(\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}\)。给定一个长度为 \(T\) 的文本序列,其中时间步 \(t\) 的词表示为 \(w^{(t)}\)。假设在给定任何中心词的情况下,上下文词是独立生成的。对于上下文窗口大小 \(m\),跳元模型的似然函数是在给定任何中心词的情况下生成所有上下文词的概率:
其中任何小于 \(1\) 或大于 \(T\) 的时间步都可以省略。
15.1.3.1. 训练¶
跳元模型的参数是词汇表中每个词的中心词向量和上下文词向量。在训练中,我们通过最大化似然函数(即最大似然估计)来学习模型参数。这等价于最小化以下损失函数:
当使用随机梯度下降来最小化损失时,在每次迭代中,我们可以随机抽样一个较短的子序列来计算该子序列的(随机)梯度,以更新模型参数。为了计算这个(随机)梯度,我们需要得到对数条件概率关于中心词向量和上下文词向量的梯度。通常,根据 (15.1.4),涉及任何中心词 \(w_c\) 和上下文词 \(w_o\) 对的对数条件概率是:
通过微分,我们可以得到它关于中心词向量 \(\mathbf{v}_c\) 的梯度:
请注意,(15.1.8) 中的计算需要词典中所有词以 \(w_c\) 为中心词的条件概率。其他词向量的梯度可以以相同的方式获得。
训练后,对于词典中索引为 \(i\) 的任何词,我们都得到了它的两个词向量 \(\mathbf{v}_i\)(作为中心词)和 \(\mathbf{u}_i\)(作为上下文词)。在自然语言处理应用中,跳元模型的中心词向量通常用作词的表示。
15.1.4. 连续词袋(CBOW)模型¶
连续词袋(CBOW)模型与跳元模型类似。与跳元模型的主要区别在于,连续词袋模型假设一个中心词是根据其在文本序列中的周围上下文词生成的。例如,在同一个文本序列“the”、“man”、“loves”、“his”和“son”中,以“loves”为中心词,上下文窗口大小为2,连续词袋模型考虑了基于上下文词“the”、“man”、“his”和“son”生成中心词“loves”的条件概率(如图 15.1.2所示),即:
图 15.1.2 连续词袋模型考虑了给定其周围上下文词,生成中心词的条件概率。¶
由于连续词袋模型中有多个上下文词,这些上下文词向量在计算条件概率时被平均。具体来说,对于词典中索引为 \(i\) 的任何词,我们分别用 \(\mathbf{v}_i\in\mathbb{R}^d\) 和 \(\mathbf{u}_i\in\mathbb{R}^d\) 表示它用作*上下文*词和*中心*词时的两个向量(含义与跳元模型中相反)。给定其周围上下文词 \(w_{o_1}, \ldots, w_{o_{2m}}\)(在词典中索引为 \(o_1, \ldots, o_{2m}\)),生成任何中心词 \(w_c\)(在词典中索引为 \(c\))的条件概率可以建模为
为简便起见,令 \(\mathcal{W}_o= \{w_{o_1}, \ldots, w_{o_{2m}}\}\) 和 \(\bar{\mathbf{v}}_o = \left(\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}} \right)/(2m)\)。那么 (15.1.10)可以简化为
给定一个长度为 \(T\) 的文本序列,其中时间步 \(t\) 的词表示为 \(w^{(t)}\)。对于上下文窗口大小 \(m\),连续词袋模型的似然函数是在给定其上下文词的情况下生成所有中心词的概率:
15.1.4.1. 训练¶
训练连续词袋模型与训练跳元模型几乎相同。连续词袋模型的最大似然估计等价于最小化以下损失函数:
注意
通过微分,我们可以得到它关于任何上下文词向量 \(\mathbf{v}_{o_i}\) (\(i = 1, \ldots, 2m\)) 的梯度:
其他词向量的梯度可以以相同的方式获得。与跳元模型不同,连续词袋模型通常使用上下文词向量作为词的表示。
15.1.5. 小结¶
词向量是用于表示词的向量,也可被认为是词的特征向量或表示。将词映射到实数向量的技术称为词嵌入。
word2vec工具包含跳元模型和连续词袋模型。
跳元模型假设一个词可以用来在其文本序列的周围生成词;而连续词袋模型假设一个中心词是根据其周围的上下文词生成的。
15.1.6. 练习¶
计算每个梯度的计算复杂度是多少?如果词典规模巨大,可能会出现什么问题?
英语中的一些固定短语由多个词组成,例如“new york”。如何训练它们的词向量?提示:参见word2vec论文的第4节 (Mikolov et al., 2013)。
让我们以跳元模型为例来反思word2vec的设计。跳元模型中两个词向量的点积与余弦相似度之间有什么关系?对于一对语义相似的词,为什么它们的词向量(由跳元模型训练)的余弦相似度可能很高?