Skip to content

10.5 全局向量的词嵌入 (GloVe)

让我们先回顾一下 word2vec 中的跳字模型。将跳字模型中使用 softmax 运算表达的条件概率 P(wjwi)P(w_j\mid w_i) 记作 qijq_{ij},即

qij=exp(ujvi)kVexp(ukvi),q_{ij}=\frac{\exp(\boldsymbol{u}_j^\top \boldsymbol{v}_i)}{ \sum_{k \in \mathcal{V}} \text{exp}(\boldsymbol{u}_k^\top \boldsymbol{v}_i)},

其中 vi\boldsymbol{v}_iui\boldsymbol{u}_i 分别是索引为 ii 的词 wiw_i 作为中心词和背景词时的向量表示,V={0,1,,V1}\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\} 为词典索引集。

对于词 wiw_i,它在数据集中可能多次出现。我们将每一次以它作为中心词的所有背景词全部汇总并保留重复元素,记作多重集 (multiset)Ci\mathcal{C}_i。一个元素在多重集中的个数称为该元素的重数 (multiplicity)。举例来说,假设词 wiw_i 在数据集中出现 2 次:文本序列中以这 2 个 wiw_i 作为中心词的背景窗口分别包含背景词索引 2,1,5,22,1,5,22,3,2,12,3,2,1。那么多重集 Ci={1,1,2,2,2,2,3,5}\mathcal{C}_i = \{1,1,2,2,2,2,3,5\},其中元素 1 的重数为 2,元素 2 的重数为 4,元素 3 和 5 的重数均为 1。将多重集 Ci\mathcal{C}_i 中元素 jj 的重数记作 xijx_{ij}:它表示了整个数据集中所有以 wiw_i 为中心词的背景窗口中词 wjw_j 的个数。那么,跳字模型的损失函数还可以用另一种方式表达:

iVjVxijlogqij.-\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} x_{ij} \log\,q_{ij}.

我们将数据集中所有以词 wiw_i 为中心词的背景词的数量之和 Ci\left|\mathcal{C}_i\right| 记为 xix_i,并将以 wiw_i 为中心词生成背景词 wjw_j 的条件概率 xij/xix_{ij}/x_i 记作 pijp_{ij}。我们可以进一步改写跳字模型的损失函数为

iVxijVpijlogqij.-\sum_{i\in\mathcal{V}} x_i \sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}.

上式中,jVpijlogqij-\sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij} 计算的是以 wiw_i 为中心词的背景词条件概率分布 pijp_{ij} 和模型预测的条件概率分布 qijq_{ij} 的交叉熵,且损失函数使用所有以词 wiw_i 为中心词的背景词的数量之和来加权。最小化上式中的损失函数会令预测的条件概率分布尽可能接近真实的条件概率分布。

然而,作为常用损失函数的一种,交叉熵损失函数有时并不是好的选择。一方面,正如我们在 10.2 节 (近似训练) 中所提到的,令模型预测 qijq_{ij} 成为合法概率分布的代价是它在分母中基于整个词典的累加项。这很容易带来过大的计算开销。另一方面,词典中往往有大量生僻词,它们在数据集中出现的次数极少。而有关大量生僻词的条件概率分布在交叉熵损失函数中的最终预测往往并不准确。

10.5.1 GloVe 模型

鉴于此,作为在 word2vec 之后提出的词嵌入模型,GloVe 模型采用了平方损失,并基于该损失对跳字模型做了 3 点改动 [1]:

  1. 使用非概率分布的变量 pij=xijp'_{ij}=x_{ij}qij=exp(ujvi)q'_{ij}=\exp(\boldsymbol{u}_j^\top \boldsymbol{v}_i),并对它们取对数。因此,平方损失项是 (logpijlogqij)2=(ujvilogxij)2\left(\log\,p'_{ij} - \log\,q'_{ij}\right)^2 = \left(\boldsymbol{u}_j^\top \boldsymbol{v}_i - \log\,x_{ij}\right)^2
  2. 为每个词 wiw_i 增加两个为标量的模型参数:中心词偏差项 bib_i 和背景词偏差项 cic_i
  3. 将每个损失项的权重替换成函数 h(xij)h(x_{ij})。权重函数 h(x)h(x) 是值域在 [0,1][0,1] 的单调递增函数。

如此一来,GloVe 模型的目标是最小化损失函数

iVjVh(xij)(ujvi+bi+cjlogxij)2.\sum_{i\in\mathcal{V}} \sum_{j\in\mathcal{V}} h(x_{ij}) \left(\boldsymbol{u}_j^\top \boldsymbol{v}_i + b_i + c_j - \log\,x_{ij}\right)^2.

其中权重函数 h(x)h(x) 的一个建议选择是:当 x<cx < c 时 (如 c=100c = 100),令 h(x)=(x/c)αh(x) = (x/c)^\alpha(如 α=0.75\alpha = 0.75),反之令 h(x)=1h(x) = 1。因为 h(0)=0h(0)=0,所以对于 xij=0x_{ij}=0 的平方损失项可以直接忽略。当使用小批量随机梯度下降来训练时,每个时间步我们随机采样小批量非零 xijx_{ij},然后计算梯度来迭代模型参数。这些非零 xijx_{ij} 是预先基于整个数据集计算得到的,包含了数据集的全局统计信息。因此,GloVe 模型的命名取“全局向量”(Global Vectors) 之意。

需要强调的是,如果词 wiw_i 出现在词 wjw_j 的背景窗口里,那么词 wjw_j 也会出现在词 wiw_i 的背景窗口里。也就是说,xij=xjix_{ij}=x_{ji}。不同于 word2vec 中拟合的是非对称的条件概率 pijp_{ij},GloVe 模型拟合的是对称的 logxij\log\, x_{ij}。因此,任意词的中心词向量和背景词向量在 GloVe 模型中是等价的。但由于初始化值的不同,同一个词最终学习到的两组词向量可能不同。当学习得到所有词向量以后,GloVe 模型使用中心词向量与背景词向量之和作为该词的最终词向量。

10.5.2 从条件概率比值理解 GloVe 模型

我们还可以从另外一个角度来理解 GloVe 模型。沿用本节前面的符号,P(wjwi)P(w_j \mid w_i) 表示数据集中以 wiw_i 为中心词生成背景词 wjw_j 的条件概率,并记作 pijp_{ij}。作为源于某大型语料库的真实例子,以下列举了两组分别以“ice”(冰) 和“steam”(蒸汽) 为中心词的条件概率以及它们之间的比值 [1]:

wkw_k=“solid”“gas”“water”“fashion”
p1=P(wkp_1=P(w_k\mid “ice” ))0.000190.0000660.0030.000017
p2=P(wkp_2=P(w_k\mid “steam” ))0.0000220.000780.00220.000018
p1/p2p_1/p_28.90.0851.360.96

我们可以观察到以下现象。

  • 对于与“ice”相关而与“steam”不相关的词 wkw_k,如 wk=w_k=“solid”(固体),我们期望条件概率比值较大,如上表最后一行中的值 8.9;
  • 对于与“ice”不相关而与“steam”相关的词 wkw_k,如 wk=w_k=“gas”(气体),我们期望条件概率比值较小,如上表最后一行中的值 0.085;
  • 对于与“ice”和“steam”都相关的词 wkw_k,如 wk=w_k=“water”(水),我们期望条件概率比值接近 1,如上表最后一行中的值 1.36;
  • 对于与“ice”和“steam”都不相关的词 wkw_k,如 wk=w_k=“fashion”(时尚),我们期望条件概率比值接近 1,如上表最后一行中的值 0.96。

由此可见,条件概率比值能比较直观地表达词与词之间的关系。我们可以构造一个词向量函数使它能有效拟合条件概率比值。我们知道,任意一个这样的比值需要 3 个词 wiw_iwjw_jwkw_k。以 wiw_i 作为中心词的条件概率比值为 pij/pik{p_{ij}}/{p_{ik}}。我们可以找一个函数,它使用词向量来拟合这个条件概率比值

f(uj,uk,vi)pijpik.f(\boldsymbol{u}_j, \boldsymbol{u}_k, {\boldsymbol{v}}_i) \approx \frac{p_{ij}}{p_{ik}}.

这里函数 ff 可能的设计并不唯一,我们只需考虑一种较为合理的可能性。注意到条件概率比值是一个标量,我们可以将 ff 限制为一个标量函数:f(uj,uk,vi)=f((ujuk)vi)f(\boldsymbol{u}_j, \boldsymbol{u}_k, {\boldsymbol{v}}_i) = f\left((\boldsymbol{u}_j - \boldsymbol{u}_k)^\top {\boldsymbol{v}}_i\right)。交换索引 jjkk 后可以看到函数 ff 应该满足 f(x)f(x)=1f(x)f(-x)=1,因此一种可能是 f(x)=exp(x)f(x)=\exp(x),于是

f(uj,uk,vi)=exp(ujvi)exp(ukvi)pijpik.f (\boldsymbol{u}_j, \boldsymbol{u}_k, {\boldsymbol{v}}_i) = \frac{\exp\left(\boldsymbol{u}_j^\top {\boldsymbol{v}}_i\right)}{\exp\left(\boldsymbol{u}_k^\top {\boldsymbol{v}}_i\right)} \approx \frac{p_{ij}}{p_{ik}}.

满足最右边约等号的一种可能是 exp(ujvi)αpij\exp\left(\boldsymbol{u}_j^\top {\boldsymbol{v}}_i\right) \approx \alpha p_{ij},这里 α\alpha 是一个常数。考虑到 pij=xij/xip_{ij}=x_{ij}/x_i,取对数后 ujvilogα+logxijlogxi\boldsymbol{u}_j^\top {\boldsymbol{v}}_i \approx \log\,\alpha + \log\,x_{ij} - \log\,x_i。我们使用额外的偏差项来拟合 logα+logxi- \log\,\alpha + \log\,x_i,例如,中心词偏差项 bib_i 和背景词偏差项 cjc_j

ujvi+bi+cjlog(xij).\boldsymbol{u}_j^\top \boldsymbol{v}_i + b_i + c_j \approx \log(x_{ij}).

对上式左右两边取平方误差并加权,我们可以得到 GloVe 模型的损失函数。

小结

  • 在有些情况下,交叉熵损失函数有劣势。GloVe 模型采用了平方损失,并通过词向量拟合预先基于整个数据集计算得到的全局统计信息。
  • 任意词的中心词向量和背景词向量在 GloVe 模型中是等价的。

参考文献

[1] Pennington, J., Socher, R., & Manning, C. (2014). Glove: Global vectors for word representation. In Proceedings of the 2014 conference on empirical methods in natural language processing (EMNLP) (pp. 1532-1543).


注:本节与原书完全相同,原书传送门