15.5. 全局向量的词嵌入(GloVe)
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

上下文窗口内的词-词共现可能携带丰富的语义信息。例如,在一个大型语料库中,“solid”(固体)一词比“steam”(蒸汽)一词更可能与“ice”(冰)共现,但“gas”(气体)一词可能比“ice”更频繁地与“steam”共现。此外,这种共现的全局语料库统计数据可以预先计算:这可以带来更高效的训练。为了利用整个语料库中的统计信息进行词嵌入,让我们首先回顾一下 15.1.3节 中的跳元模型,但使用共现计数等全局语料库统计数据来解释它。

15.5.1. 含全局语料库统计的跳元模型

在跳元模型中,用 \(q_{ij}\) 表示给定词 \(w_i\) 时词 \(w_j\) 的条件概率 \(P(w_j\mid w_i)\),我们有

(15.5.1)\[q_{ij}=\frac{\exp(\mathbf{u}_j^\top \mathbf{v}_i)}{ \sum_{k \in \mathcal{V}} \exp(\mathbf{u}_k^\top \mathbf{v}_i)},\]

其中,对于任意索引 \(i\),向量 \(\mathbf{v}_i\)\(\mathbf{u}_i\) 分别表示词 \(w_i\) 作为中心词和上下文词,\(\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}\) 是词表的索引集。

考虑词 \(w_i\),它可能在语料库中出现多次。在整个语料库中,凡是以 \(w_i\) 为中心词的所有上下文词构成一个词索引的*多重集* \(\mathcal{C}_i\),该多重集*允许同一元素的多个实例*。对于任何元素,其实例数称为其*重数*。举例说明,假设词 \(w_i\) 在语料库中出现两次,两个上下文窗口中以 \(w_i\) 为中心词的上下文词的索引是 \(k, j, m, k\)\(k, l, k, j\)。因此,多重集 \(\mathcal{C}_i = \{j, j, k, k, k, k, l, m\}\),其中元素 \(j, k, l, m\) 的重数分别为 2、4、1、1。

现在,我们将多重集 \(\mathcal{C}_i\) 中元素 \(j\) 的重数表示为 \(x_{ij}\)。这是整个语料库中同一上下文窗口内词 \(w_j\)(作为上下文词)和词 \(w_i\)(作为中心词)的全局共现计数。使用这种全局语料库统计数据,跳元模型的损失函数等价于

(15.5.2)\[-\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} x_{ij} \log\,q_{ij}.\]

我们进一步用 \(x_i\) 表示在以 \(w_i\) 为中心词的上下文窗口中所有上下文词的数量,这等价于 \(|\mathcal{C}_i|\)。令 \(p_{ij}\) 为条件概率 \(x_{ij}/x_i\),表示给定中心词 \(w_i\) 时生成上下文词 \(w_j\)(15.5.2) 可以重写为

(15.5.3)\[-\sum_{i\in\mathcal{V}} x_i \sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}.\]

(15.5.3) 中,\(-\sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}\) 计算了全局语料库统计的条件分布 \(p_{ij}\) 和模型预测的条件分布 \(q_{ij}\) 的交叉熵。如上所述,该损失还由 \(x_i\) 加权。最小化 (15.5.3) 中的损失函数将使预测的条件分布接近于全局语料库统计中的条件分布。

尽管交叉熵损失函数常用于衡量概率分布之间的距离,但在这里可能不是一个好的选择。一方面,正如我们在 15.2节 中提到的,正确归一化 \(q_{ij}\) 的成本导致对整个词表的求和,这在计算上可能非常昂贵。另一方面,来自大型语料库的大量罕见事件通常被交叉熵损失赋予了过多的权重。

15.5.2. GloVe 模型

有鉴于此,*GloVe* 模型在平方损失的基础上对跳元模型做了三处改动 (Pennington et al., 2014)

  1. 使用变量 \(p'_{ij}=x_{ij}\)\(q'_{ij}=\exp(\mathbf{u}_j^\top \mathbf{v}_i)\),它们不是概率分布,并对两者取对数,因此平方损失项为 \(\left(\log\,p'_{ij} - \log\,q'_{ij}\right)^2 = \left(\mathbf{u}_j^\top \mathbf{v}_i - \log\,x_{ij}\right)^2\)

  2. 为每个词 \(w_i\) 增加两个标量模型参数:中心词偏置 \(b_i\) 和上下文词偏置 \(c_i\)

  3. 用权重函数 \(h(x_{ij})\) 替换每个损失项的权重,其中 \(h(x)\) 在区间 \([0, 1]\) 内是递增的。

综合起来,训练 GloVe 就是最小化以下损失函数

(15.5.4)\[\sum_{i\in\mathcal{V}} \sum_{j\in\mathcal{V}} h(x_{ij}) \left(\mathbf{u}_j^\top \mathbf{v}_i + b_i + c_j - \log\,x_{ij}\right)^2.\]

对于权重函数,建议选择是:如果 \(x < c\) (例如,\(c = 100\)),则 \(h(x) = (x/c) ^\alpha\) (例如 \(\alpha = 0.75\));否则 \(h(x) = 1\)。在这种情况下,因为 \(h(0)=0\),对于任何 \(x_{ij}=0\) 的平方损失项可以为了计算效率而省略。例如,当使用小批量随机梯度下降进行训练时,在每次迭代中,我们随机抽取一个小批量的*非零* \(x_{ij}\) 来计算梯度并更新模型参数。请注意,这些非零的 \(x_{ij}\) 是预先计算的全局语料库统计数据;因此,该模型被称为 GloVe,即*全局向量*(Global Vectors)。

需要强调的是,如果词 \(w_i\) 出现在词 \(w_j\) 的上下文窗口中,那么*反之亦然*。因此,\(x_{ij}=x_{ji}\)。与拟合不对称条件概率 \(p_{ij}\) 的 word2vec 不同,GloVe 拟合的是对称的 \(\log \, x_{ij}\)。因此,在 GloVe 模型中,任何词的中心词向量和上下文词向量在数学上是等价的。然而在实践中,由于初始化值不同,同一个词在训练后这两个向量中仍可能得到不同的值:GloVe 将它们相加作为输出向量。

15.5.3. 从共现概率比率解释 GloVe

我们也可以从另一个角度来解释 GloVe 模型。使用 15.5.1节 中的相同表示法,令 \(p_{ij} \stackrel{\textrm{def}}{=} P(w_j \mid w_i)\) 为在语料库中给定中心词 \(w_i\) 时生成上下文词 \(w_j\) 的条件概率。tab_glove 列出了一些基于大型语料库统计数据得出的给定词“ice”和“steam”的共现概率及其比率。

:来自大型语料库的词-词共现概率及其比率 (改编自 Pennington et al. (2014) 的表1)

表 15.5.1 label:tab_glove

\(w_k\)=

solid

gas

water

fashion

\(p_1=P(w_k\mid \textrm{ice})\)

0.00019

0.000066

0.003

0.000017

\(p_2=P(w_k\mid\textrm{steam})\)

0.000022

0.00078

0.0022

0.000018

\(p_1/p_2\)

8.9

0.085

1.36

0.96

我们可以从 tab_glove 中观察到以下几点

  • 对于一个与“ice”相关但与“steam”无关的词 \(w_k\),例如 \(w_k=\textrm{solid}\)(固体),我们期望共现概率的比率较大,例如 8.9。

  • 对于一个与“steam”相关但与“ice”无关的词 \(w_k\),例如 \(w_k=\textrm{gas}\)(气体),我们期望共现概率的比率较小,例如 0.085。

  • 对于一个既与“ice”又与“steam”相关的词 \(w_k\),例如 \(w_k=\textrm{water}\)(水),我们期望共现概率的比率接近 1,例如 1.36。

  • 对于一个既与“ice”无关也与“steam”无关的词 \(w_k\),例如 \(w_k=\textrm{fashion}\)(时尚),我们期望共现概率的比率接近 1,例如 0.96。

可以看出,共现概率的比率可以直观地表达词与词之间的关系。因此,我们可以设计一个三个词向量的函数来拟合这个比率。对于以 \(w_i\) 为中心词、\(w_j\)\(w_k\) 为上下文词的共现概率比率 \({p_{ij}}/{p_{ik}}\),我们希望用某个函数 \(f\) 来拟合这个比率

(15.5.5)\[f(\mathbf{u}_j, \mathbf{u}_k, {\mathbf{v}}_i) \approx \frac{p_{ij}}{p_{ik}}.\]

\(f\) 的许多可能的设计中,我们只在下面选择一个合理的选择。由于共现概率的比率是一个标量,我们要求 \(f\) 是一个标量函数,例如 \(f(\mathbf{u}_j, \mathbf{u}_k, {\mathbf{v}}_i) = f\left((\mathbf{u}_j - \mathbf{u}_k)^\top {\mathbf{v}}_i\right)\)。在 (15.5.5) 中交换词索引 \(j\)\(k\),必须满足 \(f(x)f(-x)=1\),所以一种可能是 \(f(x)=\exp(x)\),即,

(15.5.6)\[f(\mathbf{u}_j, \mathbf{u}_k, {\mathbf{v}}_i) = \frac{\exp\left(\mathbf{u}_j^\top {\mathbf{v}}_i\right)}{\exp\left(\mathbf{u}_k^\top {\mathbf{v}}_i\right)} \approx \frac{p_{ij}}{p_{ik}}.\]

现在让我们选择 \(\exp\left(\mathbf{u}_j^\top {\mathbf{v}}_i\right) \approx \alpha p_{ij}\),其中 \(\alpha\) 是一个常数。由于 \(p_{ij}=x_{ij}/x_i\),在两边取对数后我们得到 \(\mathbf{u}_j^\top {\mathbf{v}}_i \approx \log\,\alpha + \log\,x_{ij} - \log\,x_i\)。我们可以使用额外的偏置项来拟合 \(- \log\, \alpha + \log\, x_i\),例如中心词偏置 \(b_i\) 和上下文词偏置 \(c_j\)

(15.5.7)\[\mathbf{u}_j^\top \mathbf{v}_i + b_i + c_j \approx \log\, x_{ij}.\]

通过对 (15.5.7) 的平方误差进行加权测量,我们得到了 (15.5.4) 中的 GloVe 损失函数。

15.5.4. 小结

  • 跳元模型可以用全局语料库统计数据(如词-词共现计数)来解释。

  • 交叉熵损失在衡量两个概率分布的差异方面可能不是一个好的选择,特别是对于大型语料库。GloVe 使用平方损失来拟合预先计算的全局语料库统计数据。

  • 在 GloVe 中,任何词的中心词向量和上下文词向量在数学上是等价的。

  • GloVe 可以从词-词共现概率的比率来解释。

15.5.5. 练习

  1. 如果词 \(w_i\)\(w_j\) 在同一上下文窗口中共同出现,我们如何利用它们在文本序列中的距离来重新设计计算条件概率 \(p_{ij}\) 的方法?提示:请参阅 GloVe 论文 (Pennington et al., 2014) 的第 4.2 节。

  2. 对于任何词,其中心词偏置和上下文词偏置在 GloVe 中在数学上是等价的吗?为什么?

讨论