语言模型中的词嵌入

自然语言处理(NLP)长期以来一直是计算机科学的基础领域。然而,随着词嵌入的引入,其发展轨迹发生了巨大变化。在词嵌入出现之前,NLP主要依赖于将词视为离散符号的基于规则的方法。通过词嵌入,计算机获得了通过向量空间表示理解语言的能力。在本文中,您将了解到:

  • 词嵌入如何将词转换为密集向量
  • 如何使用预训练词嵌入
  • 如何训练自己的词嵌入
  • 词嵌入在现代语言模型中的应用

让我们开始吧!

语言模型中的词嵌入
图片来源:Satoshi Hirayama。保留部分权利。

概述

这篇博文分为三部分;它们是:

  • 理解词嵌入
  • 使用预训练词嵌入
  • 使用Gensim训练Word2Vec
  • 使用PyTorch训练Word2Vec
  • Transformer模型中的嵌入

理解词嵌入

词嵌入将词表示为连续空间中的密集向量,其中语义相似的词彼此靠近。核心原则是,出现在相似上下文中的词应该具有相似的向量表示。这个概念通过Word2Vec、GloVe、FastText和ELMo等模型得到了普及。

词嵌入模型通常使用无监督学习进行训练,因为每个词的理想向量表示是未知的(否则,我们可以直接使用它)。目标是学习训练语料库中的词共现模式。

Word2Vec,由论文《向量空间中词表示的有效估计》引入,开创了这种方法。它使用神经网络根据局部上下文预测词,并有两种变体:

  1. 连续词袋(CBOW):给定上下文预测目标词
  2. Skip-gram:给定目标词预测上下文词

Skip-gram通常在较小数据集和稀有词上表现更好,而CBOW对较大数据集更快更有效。Word2Vec通过展示嵌入向量可以满足“king – man + woman ≈ queen”等方程,证明了计算机可以理解词之间的语义关系。

GloVe(全局词向量)采用不同的方法。它不使用神经网络,而是构建并分解一个词共现矩阵以获得嵌入。GloVe结合了以下优点:

  • 全局矩阵分解方法(如潜在语义分析)
  • 局部上下文窗口方法(如Word2Vec)

生成的嵌入捕获了词之间的语义和句法关系,并且在需要更广泛语义理解的任务上通常优于Word2Vec。

FastText在Word2Vec的基础上进行了改进,它学习字符n-gram而不是整个词的向量。这种方法捕获子词信息,解决了词汇表外(OOT)问题,并为形态丰富的语言提供了更好的性能。

ELMo是一个更近期的模型,它使用深度双向LSTM生成上下文相关的词向量。与以前的模型不同,ELMo的词向量不是固定的,而是根据上下文而变化。虽然在大型语言模型出现后,ELMo如今使用较少,但其核心思想——词义应依赖于上下文——构成了所有现代语言模型的基础。

使用预训练词嵌入

您可以轻松使用流行库中预训练的词嵌入。以下是使用`gensim`库和GloVe嵌入的示例:

要运行此代码,您需要从https://nlp.stanford.edu/projects/glove/下载GloVe嵌入,并从zip文件`glove.6B.zip`中提取`glove.6B.50d.txt`文件。该文件包含来自60亿词训练语料库的400,000个词的训练向量。

运行此代码时,您将看到以下输出:

第一个输出显示,在此嵌入模型下,“king”与“prince”最相似。第二个输出显示,“queen”是“king + woman – man”最接近的词。

使用Gensim训练Word2Vec

Gensim提供了一个简单的接口来训练您自己的Word2Vec模型。以下是操作方法:

运行此代码不会得到一个好的模型。要获得有用的嵌入,您需要一个大型语料库进行训练。您可能不想扩展Python列表`sentences`,而是重写代码以从磁盘上的某些文件中读取。

假设您已经这样做了,gensim将训练一个Word2Vec模型并将其保存到文件`word2vec.model`中。一旦训练完成,您可以将其加载回来并用它来获取词的向量,如上面代码所示。

使用PyTorch训练Word2Vec

您也可以使用PyTorch从头开始实现Word2Vec。这是一个基本实现:

这段代码将训练一个Word2Vec的“skip-gram”模型。在这个模型中,训练数据是文本语料库中的一个词窗口。您应该做一些预处理来清理词汇表,例如,去除标点符号并将所有词转换为小写。请注意变量`context`和`target`是如何使用的。在一个窗口中,例如上面例子中的“the quick brown fox jumps”,模型将以中心词作为输入,并被要求预测同一窗口中的任何其他词。训练的损失函数是交叉熵损失。

这个例子可能不会给您一个好的模型,因为您需要更大的语料库和更多的训练轮次。然而,请注意模型有一个嵌入层和一个线性层。使用`nn.Embedding`创建的嵌入层将是您感兴趣的词嵌入矩阵。

此外,请注意嵌入层只是一个数值矩阵。您需要一个查找表,例如上面代码中的`vocab_to_idx`,将词转换为索引,然后使用该索引获取嵌入向量。查找表应该与模型一起保存,因为如果您无法将词转换为正确的索引,您将无法使用它。

Transformer模型中的嵌入

从上面的例子中,您了解到词嵌入可以被训练,并且您可以为此目的创建一个`nn.Embedding`层。事实上,大多数现代语言模型都使用这种方法。让我们以BERT模型为例。

运行此代码时,您将看到:

BERT模型很复杂,包含许多组件。词嵌入层名为`word_embeddings`。创建模型后,您可以使用`model.embeddings.word_embeddings`来引用它。从其参数可以看出,它有30522个词汇,每个向量的维度为768。第二个打印语句将转储嵌入矩阵。您应该期望矩阵的形状为`(30522, 768)`。

在上一篇文章中,您了解到语言模型需要一个分词器来将输入文本拆分为标记。分词器还会为每个标记分配一个标记ID。这个标记ID是嵌入矩阵的行索引。当您将输入文本馈送给此模型时,您应该馈送一个标记ID序列。通常,嵌入层是模型的第一个层。它将通过将每个标记ID替换为嵌入矩阵中对应的行,将标记ID序列转换为嵌入向量序列。

进一步阅读

以下是一些关于该主题的进一步阅读材料:

总结

在本文中,您学习了词嵌入及其应用。特别是,您了解到:

  • 词嵌入将词表示为连续空间中的密集向量,语义相似的词彼此靠近。
  • 预训练词嵌入可通过流行的库轻松获取。
  • 您可以使用Gensim或PyTorch训练自定义词嵌入。
  • 现代Transformer模型通过`nn.Embedding`层利用学习到的嵌入。
  • 嵌入对于捕捉词之间的语义关系至关重要。

暂无评论。

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。