在 Transformers 中生成和可视化上下文向量

上下文向量是对单词的一种数值表示,它捕获了单词在特定上下文中的含义。与为每个单词分配单个固定向量的传统词嵌入不同,同一个单词的上下文向量可以根据句子中周围单词的变化而改变。Transformer 是当今生成上下文向量的首选工具。在本教程中,您将探索如何使用 Transformer 模型生成和使用上下文向量。具体来说,您将学习

  • 上下文向量如何捕获上下文信息
  • 如何使用 Transformer 模型提取上下文向量
  • 如何使用上下文向量进行上下文词义消歧
  • 如何可视化 Transformer 模型中的注意力模式

通过我的书籍《Hugging Face Transformers中的NLP》快速启动您的项目。它提供了带有工作代码的自学教程

让我们开始吧!

在 Transformers 中生成和可视化上下文向量
图片来源:Anna Tarazevich。保留部分权利。

概述

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

  • 理解上下文向量
  • 可视化不同层的上下文向量
  • 可视化注意力模式

理解上下文向量

与传统词嵌入(如 Word2Vec 或 GloVe)为每个单词分配一个固定向量(无论上下文如何)不同,Transformer 模型生成动态表示,这些表示取决于周围的单词。

例如,在“我去银行存钱”和“我将坐在河岸边”这两个句子中,“bank”这个词的含义不同。传统的词嵌入会在这两个句子中为“bank”分配相同的向量,但 Transformer 模型会生成不同的上下文向量,根据周围的词捕获不同的含义。

上下文向量的强大之处在于它们捕获了单词在特定上下文中的含义,让您能够处理句子的**含义**而不是单个单词。上下文向量与从查找表中检索的词嵌入不同;相反,您需要一个复杂的模型来生成它们。Transformer 模型通常被使用,因为它们可以产生高质量的上下文向量。

让我们看一个如何从 Transformer 模型生成上下文向量的例子

此代码加载了一个预训练的 BERT 模型和分词器。定义了一个函数 get_context_vectors(),用于从句子中提取上下文向量。该函数接受一个句子,通过模型处理它,并通过设置 output_hidden_states=True 从每个层收集“隐藏状态”。这些隐藏状态来自 Transformer 模型的每个层,由于模型的结构一致,所有层的形状都相同。

通常,Transformer 模型包括一个任务特定的头部(例如,用于预测句子中的下一个单词)。在这里,您不使用头部;相反,您检查作为输入传递给头部的内容。如果头部能够进行有意义的预测,那么输入必须已经包含有关句子的有用信息。

请注意,模型输入是一个标记序列,并且 Transformer 中的每个层都保持相同的序列长度。因此,一旦您找到“bank”一词在每个句子中的位置,您就可以从最后一个隐藏状态中提取相应的向量,并计算这两个向量之间的余弦相似度。

余弦相似度是一个介于 -1 到 1 之间的度量。相似度越低意味着含义差异越大。当您运行代码时,您将看到

这表明“bank”一词在两个句子中确实有很大的不同。

可视化不同层的上下文向量

BERT 等 Transformer 模型具有多个层,每个层捕获文本的不同方面。就像使用卷积神经网络的计算机视觉一样,早期层捕获低级特征(例如,边缘、角点),而后期层捕获高级特征(例如,形状、对象)。在 Transformer 模型中,早期层捕获语法信息(例如,名词是单数还是复数),而后期层捕获语义信息(单词在句子中的含义)。

由于表示在各层之间变化,让我们探讨如何从不同层提取和分析上下文向量

此代码使用与上一个示例相同的模型,流程类似。函数 get_all_layer_vectors() 返回所有层的隐藏状态,格式为 NumPy 数组,而不仅仅是最后一层。

每个隐藏状态都是一个形状为(批次大小、序列长度、隐藏维度)的张量。标记序列由每个层转换,但序列长度保持不变。因此,一旦您在句子中找到目标单词的位置,就可以从每个层中提取其对应的向量。

该代码计算所选单词向量在连续层之间的余弦相似度。运行后,您将看到

以及由此产生的层间余弦相似度图

显示上下文向量在模型层之间如何变化的图

您会注意到单词的表示在早期层变化显著,但随后趋于稳定。这支持了早期层处理语法特征,而后期层细化语义含义的观点。

上下文词义消歧

上下文向量最强大的应用之一是词义消歧:确定在给定上下文中使用了单词的哪种含义。这有助于识别一个单词可以有多少种不同的含义。让我们使用上下文向量实现一个简单的词义消歧系统

在此示例中,您定义了一个函数 disambiguate_word(),它接受一个目标单词和一个包含该单词的句子列表。该函数使用 get_context_vectors() 将每个句子转换为上下文向量,并提取与目标单词对应的向量。

收集到同一单词的所有上下文向量后,您计算每对向量之间的余弦相似度并执行聚类以对相似的向量进行分组。这里使用的聚类算法是基于阈值的基本算法。您可以通过使用更复杂的方法(如 scikit-learn 库中提供的 K-means 或层次聚类)或合并附加特征来改进它。

聚类结果已打印。如果您运行代码,您将看到

虽然输出没有明确标注含义,但您可以观察到“bank”一词的不同含义:作为金融机构、河流的岸边,或作为动词意为支持或免于毁灭。这表明上下文向量如何用于词义消歧。

这表明“bank”一词在这些句子中确实有不同的表示。

可视化注意力模式

理解 Transformer 模型如何处理文本的另一种方法是可视化它们的注意力模式。注意力机制允许 Transformer 在生成上下文向量时权衡不同单词的重要性。换句话说,注意力权重显示了每个单词对句子中其他单词的“关注”程度。

让我们实现一个可视化注意力的工具

当您运行此代码时,将生成两个热图

一个头的注意力权重

一个层的平均注意力权重

第一个热图显示了特定层和头的注意力权重。x 轴表示“键”标记,y 轴表示“查询”标记。颜色越亮表示注意力越强。

第二个热图显示了一层中所有头的平均注意力权重。

注意力数据是通过在调用模型时设置 output_attentions=True 获取的。每个头部都会生成一个注意力权重的方阵,这是每个 Transformer 层的副产品,不会从一个层传递到另一个层。矩阵中的每个元素表示从一个标记到另一个标记的注意力。权重越低,查询标记对键标记的关注越少。

注意力权重不对称,因为查询和键标记扮演着不同的角色。查询标记是被处理的标记,键标记是被引用的标记。在第一个热图中,例如,“of”可能强烈关注“the”、“united”和“states”——但不一定是反向的。有趣的是,“the”也可能强烈关注“of”,表明在某些情况下存在双向注意力。

虽然模型为何以这种方式关注并不总是显而易见的,特别是由于不同的头部可能专注于不同的角色,但仔细检查可以揭示模式。一些头部可能专注于语法,另一些专注于语义或命名实体。如果您可视化不同的层或头部,热图可能看起来完全不同。

在第二个热图中,注意力在所有头部上平均,提供了单词在句子中如何相互关联的概览。两个单词之间的注意力越强,它们建模的关系就越强。

这些可视化提供了对模型如何解释和处理文本的见解。

进一步阅读

下面是一些您可能会觉得有用的进一步阅读资料

总结

在这篇文章中,您学习了如何使用 Transformer 模型生成和可视化上下文向量。具体来说,您探索了

  • 上下文向量如何捕获上下文信息
  • 如何使用 Transformer 模型提取上下文向量
  • 如何使用上下文向量进行上下文词义消歧
  • 如何可视化 Transformer 模型中的注意力模式

想在您的NLP项目中使用强大的语言模型吗?

NLP with Hugging Face Transformers

在您自己的机器上运行最先进的模型

...只需几行Python代码

在我的新电子书中探索如何实现
使用 Hugging Face Transformers 进行自然语言处理

它涵盖了在以下任务上的实践示例实际用例文本分类、摘要、翻译、问答等等...

最终将高级NLP带入
您自己的项目

没有理论。只有实用的工作代码。

查看内容

暂无评论。

发表评论

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