词嵌入进阶

  • 虽然 Word2Vec 已经能够成功地将离散的单词转换为连续的词向量,并能一定程度上地保存词与词之间的近似关系,但 Word2Vec 模型仍不是完美的,它还可以被进一步地改进:
  1. 子词嵌入(subword embedding):FastText 以固定大小的 n-gram 形式将单词更细致地表示为了子词的集合,而 BPE (byte pair encoding) 算法则能根据语料库的统计信息,自动且动态地生成高频子词的集合;
  2. GloVe 全局向量的词嵌入: 通过等价转换 Word2Vec 模型的条件概率公式,我们可以得到一个全局的损失函数表达,并在此基础上进一步优化模型。
  • 实际中,我们常常在大规模的语料上训练这些词嵌入模型,并将预训练得到的词向量应用到下游的自然语言处理任务中。

    GloVe 全局向量的词嵌入

    Word2Vec等价变换

  • 先简单回顾以下 Word2Vec 的损失函数(以 Skip-Gram 模型为例,不考虑负采样近似):

词嵌入进阶 - 图1

  • 其中

词嵌入进阶 - 图2
是 wi 为中心词,wj 为背景词时 Skip-Gram 模型所假设的条件概率计算公式,我们将其简写为 qij。

  • 注意到此时我们的损失函数中包含两个求和符号,它们分别枚举了语料库中的每个中心词和其对应的每个背景词。
  • 实际上我们还可以采用另一种计数方式,那就是直接枚举每个词分别作为中心词和背景词的情况:

词嵌入进阶 - 图3

  • 其中 xij 表示整个数据集中 wj 作为 wi 的背景词的次数总和。
    • 我们还可以将该式进一步地改写为交叉熵 (cross-entropy) 的形式如下:

词嵌入进阶 - 图4

  • 其中 xi 是 wi 的背景词窗大小总和,pij=xij/xi 是 wj 在 wi 的背景词窗中所占的比例。
    • 从这里可以看出,我们的词嵌入方法实际上就是想让模型学出 wj 有多大概率是 wi 的背景词,而真实的标签则是语料库上的统计数据。同时,语料库中的每个词根据 xi 的不同,在损失函数中所占的比重也不同。

      Glove模型

  • 在 Word2Vec 之后提出的 GloVe 模型,则是在之前的基础上做出了以下几点改动:
  1. 使用非概率分布的变量 pij′=xij 和 q′ij=exp⁡(uj⊤vi),并对它们取对数;
  2. 为每个词 wi 增加两个标量模型参数:中心词偏差项 bi 和背景词偏差项 ci,松弛了概率定义中的规范性;
  3. 将每个损失项的权重 xi 替换成函数 h(xij),权重函数 h(x) 是值域在 [0,1] 上的单调递增函数,松弛了中心词重要性与 xi 线性相关的隐含假设;
  4. 用平方损失函数替代了交叉熵损失函数。

综上,我们获得了 GloVe 模型的损失函数表达式:
词嵌入进阶 - 图5

  • 由于这些非零 xij 是预先基于整个数据集计算得到的,包含了数据集的全局统计信息,因此 GloVe 模型的命名取“全局向量”(Global Vectors)之意。

    载入预训练的 GloVe 向量

  • GloVe 官方 提供了多种规格的预训练词向量,语料库分别采用了维基百科、CommonCrawl和推特等,语料库中词语总数也涵盖了从60亿到8,400亿的不同规模,同时还提供了多种词向量维度供下游模型使用。

  • [torchtext.vocab](https://torchtext.readthedocs.io/en/latest/vocab.html) 中已经支持了 GloVe, FastText, CharNGram 等常用的预训练词向量,我们可以通过声明 torchtext.vocab.GloVe 类的实例来加载预训练好的 GloVe 词向量。

    求近义词和类比词

    求近义词

    由于词向量空间中的余弦相似性可以衡量词语含义的相似性,我们可以通过寻找空间中的 k 近邻,来查询单词的近义词。

    求类比词

    对于类比关系中的4个词“a 之于 b 相当于 c 之于 d”,给定前3个词 a,b,c 求 d。
    求类比词的思路是,搜索与 vec(c)+vec(b)−vec(a) 的结果向量最相似的词向量,其中 vec(w) 为 w 的词向量。