Word2Vec、GloVe和FastText,解释说明

计算机如何理解单词

Growtika在Unsplash上的照片

计算机不像我们一样理解单词。它们更喜欢使用数字。因此,为了帮助计算机理解单词及其含义,我们使用了一种称为嵌入的东西。这些嵌入将单词数值地表示为数学向量。

这些嵌入的有趣之处在于,如果我们正确学习它们,具有相似含义的单词将具有相似的数值。换句话说,它们的数值将更接近。这使计算机能够根据它们的数值表示 grasps 不同单词之间的联系和相似之处。

学习单词嵌入的一种主要方法是 Word2Vec。在本文中,我们将深入探讨 Word2Vec 的复杂性并探索其各种架构和变体。

Word2Vec

图1:Word2Vec 架构(来源)

早期,句子是用 n-gram 向量表示的。这些向量旨在通过考虑单词序列来捕捉句子的本质。然而,它们有一些限制。N-gram 向量通常很大且稀疏,使得它们计算上具有挑战性。这产生了一个称为维度灾难的问题。本质上,这意味着在高维空间中,表示单词的向量相距甚远,很难确定哪些单词真正相似。

然后,在2003年,引入了一种神经概率语言模型的突破性进展。这个模型通过使用称为连续密集向量的东西完全改变了我们表示单词的方式。与离散且稀疏的 n-gram 向量不同,这些密集向量提供了连续的表示。即使对这些向量进行微小的更改,也会产生有意义的表示,尽管它们可能不直接对应于特定的英语单词。

在这一令人兴奋的进展的基础上,Word2Vec 框架于2013年出现。它提供了一种将单词含义编码为连续密集向量的强大方法。在 Word2Vec 中,引入了两种主要的架构:连续词袋(CBoW)和 Skip-gram。

这些架构为有效训练模型开辟了大门,这些模型能够生成高质量的单词嵌入。通过利用大量文本数据,Word2Vec在数字世界中使单词生动起来。这使计算机能够理解单词之间的上下文含义和关系,为自然语言处理提供了一种变革性的方法。

连续词袋(CBoW)

图2:CBoW 训练示意图(作者提供的图像)

在这一部分和下一部分中,让我们了解如何使用五个单词的小词汇表(biggest,ever,lie,told 和 the)以及一个示例句子“最大的谎言曾经说过”。我们如何将这个句子传递到 CBoW 架构中?如上图所示,但我们也将描述这个过程。

假设我们将上下文窗口大小设置为2。我们将“the”、“biggest”、“ever”和“told”转换为5×1的 one-hot 向量。

然后将这些向量作为输入传递到模型中,并映射到一个投影层。假设这个投影层的大小为3。每个单词的向量乘以一个5×3的权重矩阵(共享输入),得到四个3×1向量。对这些向量取平均值会得到一个3×1向量。然后,使用另一个3×5的权重矩阵将此向量投影回5×1向量。

这个最终向量代表中间的单词“lie”。通过计算真正的 one-hot 向量和实际输出向量,我们得到一个损失,用于通过反向传播更新网络的权重。

我们通过滑动上下文窗口并将其应用于数千个句子来重复此过程。训练完成后,模型的第一层,维度为5×3(词汇量x投影大小),包含了学习的参数。这些参数被用作查找表,将每个单词映射到其相应的向量表示。

Skip-gram

Figure 3: Skip-gram training illustration (image by author)

在skip-gram模型中,我们使用与连续词袋(CBoW)模型类似的架构。但是,与基于其周围单词预测目标单词的CBoW不同,我们将场景反转,如图3所示。现在,单词“lie”成为输入,我们的目标是预测其上下文单词。名称“skip-gram”反映了这种方法,因为我们预测可能“跳过”几个单词的上下文单词。

为了说明这一点,让我们考虑一些例子:

  • 输入单词“lie”与输出单词“the”配对。
  • 输入单词“lie”与输出单词“biggest”配对。
  • 输入单词“lie”与输出单词“ever”配对。
  • 输入单词“lie”与输出单词“told”配对。

我们对训练数据中的所有单词重复此过程。训练完成后,第一层的参数,维度为词汇量x投影大小,捕获了输入单词和它们相应的向量表示之间的关系。这些学习的参数允许我们在skip-gram模型中将输入单词映射到其相应的向量表示。

优点

  1. 简单解决维度灾难问题:Word2Vec提供了一种简单有效的解决方案,用于解决维度灾难问题。通过将单词表示为密集向量,减少了传统方法(如n-gram向量)中的稀疏性和计算复杂性。
  2. 生成矢量,使得意思相近的单词具有更接近的矢量值:Word2Vec的嵌入展示了一种有价值的属性,即具有类似含义的单词由数字值更接近的向量表示。这允许捕获语义关系并执行诸如单词相似性和类比检测等任务。
  3. 各种NLP应用的预训练嵌入:Word2Vec的预训练嵌入广泛可用,并可用于各种自然语言处理(NLP)应用。这些在大型语料库上训练的嵌入提供了一个有价值的资源,可用于情感分析、命名实体识别、机器翻译等任务。
  4. 自我监督的数据增强和训练框架:Word2Vec以自我监督的方式运作,利用现有数据学习单词表示。这使得收集更多数据并训练模型变得容易,因为它不需要广泛标记的数据集。该框架可以应用于大量未标记的文本,增强训练过程。

缺点

  1. 全局信息的保留有限:Word2Vec的嵌入主要集中于捕捉本地上下文信息,可能无法保留单词之间的全局关系。这种限制可能会影响需要更广泛理解文本的任务,例如文档分类或文档级情感分析。
  2. 不太适合形态丰富的语言:形态丰富的语言以复杂的单词形式和词形变化为特征,可能会为Word2Vec带来挑战。由于Word2Vec将每个单词视为原子单元,因此可能难以捕捉这些语言中存在的丰富形态和语义细微差别。
  3. 缺乏广泛的上下文意识:Word2Vec模型在训练期间仅考虑目标单词周围的一小段单词上下文窗口。这种有限的上下文意识可能导致对某些语言现象中单词含义的不完整理解。它可能难以捕捉某些语言现象中存在的长距离依赖和复杂语义关系。

在接下来的章节中,我们将介绍一些单词嵌入架构,以帮助解决这些缺点。

GloVe:全局向量

Word2Vec方法在一定程度上成功地捕捉了本地上下文,但它们没有充分利用语料库中可用的全局上下文。全局上下文是指使用语料库中的多个句子收集信息。这就是GloVe的作用,因为它利用单词-单词共现来学习单词嵌入。

词-词共现矩阵的概念是 Glove 的关键。它是一个矩阵,捕捉语料库中每个单词在上下文中与其他单词出现的次数。矩阵中的每个单元格表示另一个单词上下文中出现一次的计数。

图4:词共现概率比例示例(来源)

Glove 与 Word2Vec 不同的是,它不直接处理共现概率,而是处理共现概率的比率。在图4的情况下,P(k | ice) 表示单词 k 在单词 “ice” 的上下文中出现的概率,P(k | steam) 表示单词 k 在单词 “steam” 的上下文中出现的概率。通过比较 P(k | ice) / P(k | steam) 的比率,我们可以确定单词 k 与 ice 或 steam 的关联性。如果比率远大于1,则表示与 ice 的关联更强。相反,如果比率接近0,则表明与 steam 的关联更强。比率接近1则意味着既没有与 ice 关联,也没有与 steam 关联。

例如,当 k = “solid” 时,概率比率远大于1,表示与 ice 的关联性很强。另一方面,当 k = “gas” 时,概率比率接近0,表明与 steam 的关联性更强。至于单词“water”和“fashion”,它们与 ice 或 steam 都没有明显的关联。

基于概率比率的单词关联性正是我们想要实现的。并且在学习 GloVe 嵌入时可以进行优化。

FastText

传统的 Word2Vec 结构除了缺乏利用全局信息外,还不能有效处理形态丰富的语言。

那么,什么是形态丰富的语言呢?在这样的语言中,一个词可以根据其所使用的上下文来改变其形式。让我们以一种叫做“卡纳达语”的南印度语言为例。

在卡纳达语中,“房子”的单词写作“ಮನೆ”(mane)。然而,当我们说“在房子里”时,它变成了“ಮನೆಯಲ್ಲಿ”(maneyalli),当我们说“从房子里”时,它变成了“ಮನೆಯಿಂದ”(maneyinda)。正如您所看到的,只有介词改变了,但翻译出来的单词有不同的形式。在英语中,它们都只是“house”。因此,传统的 Word2Vec 结构会将所有这些变化映射到相同的向量。然而,如果我们要为形态丰富的卡纳达语创建一个 Word2Vec 模型,每个这三种情况都将被分配不同的向量。此外,在卡纳达语中,“房子”这个词可以有很多不同的形式,而不仅仅是这三个例子。由于我们的语料库可能不包含所有这些变化,因此传统的 Word2Vec 训练可能无法捕捉到所有不同的单词表示。

为了解决这个问题,FastText 在生成单词向量时考虑子词信息。FastText 不将每个单词作为一个整体,而是将单词拆分为从三元组到六元组的字符组合。然后将这些 n-gram 映射到向量,随后将它们聚合以表示整个单词。这些聚合向量随后被馈送到skip-gram 结构中。

这种方法允许识别语言中不同单词形式之间的共同特征。即使我们在语料库中没有看到每个单词的每一个形式,学习到的向量也可以捕捉到这些形式之间的共性和相似之处。形态丰富的语言,如阿拉伯语、土耳其语、芬兰语和各种印度语言,可以从 FastText 生成考虑不同形式和变化的单词向量的能力中受益。

上下文感知性

图5:ELMo 和 BERT(来源)

尽管具有优势,上述的word2vec架构存在一定的局限性:无论单词出现在何种上下文中,它们生成相同的向量表示。

为了说明这一点,我们来看下面两个句子:

  1. “那个脱口秀女皇很厉害。”
  2. “她手牌里有A和Q,是个完美的牌。”

在这些句子中,“queen”这个词有不同的含义。然而,在word2vec架构中,“queen”的向量在两种情况下都是相同的。这并不理想,因为我们希望单词向量能够根据上下文捕捉和表示不同的含义。

为了解决这个问题,引入了更先进的架构,如LSTM单元。这些架构旨在将上下文信息融入到单词表示中。随着时间的推移,基于transformer的模型如BERT和GPT出现,导致了我们今天看到的大规模语言模型的发展。这些模型擅长考虑上下文并生成对周围单词和句子敏感的单词表示。

通过考虑上下文,这些高级架构使得能够创建更细致和有意义的单词向量,确保同一个单词可以具有不同的向量表示,具体取决于其特定上下文。

结论

总之,本博客文章提供了有关word2vec架构及其使用连续稠密向量来表示单词的能力的见解。随后的实现,如GloVe利用了全局上下文,而FastText使得对形态丰富的语言(如阿拉伯语、芬兰语和各种印度语言)的向量学习更加高效。然而,这些方法中的一个共同缺点是,它们在推理期间将相同的向量分配给单词,而不考虑其上下文,这可能会阻碍多义词的准确表示。

为了解决这个限制,自然语言处理的后续进展引入了LSTM单元和transformer架构,这些架构擅长捕捉特定的上下文,并成为现代大语言模型的基础。这些模型有能力理解和生成基于周围上下文而变化的单词表示,适应不同情境下单词的细微含义。

然而,需要承认的是,word2vec框架仍然具有重要意义,因为它继续为自然语言处理领域的许多应用程序提供动力。尽管上下文的变化可能会带来挑战,但其简单性和生成有意义的单词嵌入的能力已被证明是有价值的。

更多关于语言模型的信息,请查看此YouTube播放列表。

祝学习愉快!