Press "Enter" to skip to content

揭示内部运作:深入探究BERT的注意力机制

介绍

BERT,全称为双向编码器表示来自转换器,是一种利用转换器模型和无监督预训练进行自然语言处理的系统。BERT通过两个无监督任务进行预训练:掩码语言建模和句子预测。这使得BERT能够根据具体任务进行定制化,而无需从头开始。本文将介绍BERT的注意力机制及其工作原理。

也可阅读:什么是BERT?点击这里!

学习目标

  • 理解BERT中的注意力机制
  • BERT中如何进行标记化?
  • BERT中如何计算注意力权重?
  • BERT模型的Python实现

该文章是数据科学博文马拉松的一部分。

BERT中的注意力机制

让我们从最简单的角度开始理解什么是注意力。注意力是模型试图在句子中对那些更重要的输入特征加重权重的一种方式之一。

让我们通过以下示例来理解注意力机制的基本工作原理。

示例1

部分单词比其他单词更受关注

在上面的句子中,BERT模型可能更倾向于给单词“cat”和动词“jumped”赋予更多权重,而不是“bag”,因为了解它们对于预测下一个单词“fell”的过程更加重要。

示例2

考虑以下句子:

部分单词比其他单词更受关注

为了预测单词“spaghetti”,注意力机制会更加关注动词“eating”,而不是“bland”这个副词。

示例3

同样地,在像下面这样的翻译任务中:

输入句子:How was your day

目标句子:Comment se passe ta journée

Source : https://blog.floydhub.com/attention-mechanism/

对于输出短语中的每个单词,注意力机制将映射重要且相关的输入句子单词,并给这些输入单词赋予较大的权重。在上面的图片中,可以注意到法语单词“Comment”将最高的权重(由深蓝色表示)分配给了单词“How”,对于单词“journee”,输入单词“day”获得了最高的权重。这就是注意力机制通过给更重要的单词分配更大的权重来提高输出准确性的方式。

接下来的部分将解释模型是如何给不同的输入单词分配不同的权重。

复合表示的注意力权重

BERT使用注意力权重来处理序列。考虑一个由三个向量组成的序列X,每个向量都有四个元素。注意力函数将X转换为具有相同长度的新序列Y。每个Y向量是X向量的加权平均值,权重称为注意力权重。这些权重应用于X的词嵌入,产生Y中的复合嵌入。

揭示内部运作:深入探究BERT的注意力机制 四海 第4张

在Y中计算每个向量依赖于分配给x1、x2和x3的不同注意力权重,这取决于生成Y中相应向量所需的每个输入特征的注意力。从数学上讲,它看起来像这样:

揭示内部运作:深入探究BERT的注意力机制 四海 第5张

在上面的方程中,0.4、0.3和0.2是分配给x1、x2和x3以计算复合嵌入y1、y2和y3的不同注意力权重。可以看到,分配给x1、x2和x3以计算复合嵌入的注意力权重与y1、y2和y3完全不同。

注意力对于理解句子的上下文至关重要,因为它使模型能够理解不同单词之间的关系,除了理解各个单词的意思。例如,当一个语言模型试图预测以下句子中的下一个单词时:

“这只不安的猫是___”

模型应该理解不安猫的整体概念,以及单独理解不安或猫的概念;例如,不安的猫经常跳跃,所以在句子中,“跳”可能是一个合适的下一个单词。

用于获取注意力权重的键和查询向量

到目前为止,我们知道注意力权重通过加权平均计算输入词汇的组合表示来帮助我们。然而,接下来的问题是这些注意力权重从哪里来。注意力权重实际上来自名为键和查询向量的两个向量。

BERT使用一个函数来测量单词对之间的注意力,该函数根据它们之间的关系为每个单词对分配一个分数。它使用查询向量和键向量作为单词嵌入来评估它们的兼容性。兼容性分数通过取一个词的查询向量和另一个词的键向量的点积来计算。例如,它使用“跳跃”的查询向量(q1)和“猫”的键向量(k2)的点积来计算“跳跃”和“猫”之间的分数 – q1*k2。

揭示内部运作:深入探究BERT的注意力机制 四海 第6张

为了将兼容性分数转换为有效的注意力权重,它们需要被标准化。BERT通过将softmax函数应用于这些分数来实现这一点,确保它们是正数且总和为一。得到的值就是每个单词的最终注意力权重。值得注意的是,键和查询向量是根据前一层的输出动态计算的,这使得BERT能够根据特定的上下文调整其注意力机制。

BERT中的注意力头

BERT学习多个注意力机制,即注意力头。这些注意力头同时一起工作。拥有多个注意力头使BERT比只有一个注意力头更好地理解单词之间的关系。

BERT将其查询、键和值参数分成N份。这N对参数分别通过单独的注意力头进行计算。然后将这些对的结果合并起来生成最终的注意力分数。这就是它被称为“多头注意力”的原因,为BERT提供了捕捉每个单词的多个关系和细微差别的增强能力。

多头注意力

BERT 还堆叠了多个注意力层。每个层都将前一层的输出作为注意力的对象。通过多次操作,BERT 在模型更深层次上可以创建非常详细的表示。

根据具体的 BERT 模型,注意力层可以有 12 层或 24 层,每层可以有 12 或 16 个注意力头。这意味着单个 BERT 模型最多可以有 384 种不同的注意机制,因为权重不在层之间共享。

BERT 模型的 Python 实现

步骤 1. 导入必要的库

我们需要导入 ‘torch’ python 库以便使用 PyTorch。我们还需要从 transformers 库中导入 BertTokenizer 和 BertForSequenceClassification。Tokenizer 库有助于对文本进行分词,而 BertForSequenceClassification 是用于文本分类的。

import torchfrom transformers import BertTokenizer, BertForSequenceClassification

步骤 2. 加载预训练的 BERT 模型和分词器

在这一步中,我们加载“bert-base-uncased”预训练模型,并将其输入 BertForSequenceClassification 的 from_pretrained 方法中。由于我们只想进行简单的情感分类,所以将 num_labels 设置为 2,表示“正面”和“负面”类别。

model_name = 'bert-base-uncased'tokenizer = BertTokenizer.from_pretrained(model_name)model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)

步骤 3. 如果可用,将设备设置为 GPU

这一步仅用于将设备切换到 GPU(如果可用),否则保持在 CPU 上。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)#import csv

步骤 4. 定义输入文本并进行分词

在这一步中,我们定义要进行分类的输入文本。我们还定义了分词器对象,该对象负责将文本转换为一系列标记,这些标记是机器学习模型可以理解的基本信息单位。’max_length’ 参数设置了分词序列的最大长度。如果分词序列超过此长度,系统将将其截断。’padding’ 参数表示如果分词序列较短,则会用零填充以达到最大长度。’truncation’ 参数指示如果分词序列超过最大长度是否要截断。

由于这个参数设置为 True,如果需要的话,序列将被截断。’return_tensors’ 参数指定返回分词序列的格式。在这种情况下,函数将序列作为 PyTorch 张量返回。然后将生成的标记的 ‘input_ids’ 和 ‘attention_mask’ 移动到指定的设备上。注意力掩码如前所述,是一个二进制张量,指示为特定预测任务的哪些部分输入序列需要更多关注。

text = "我真的不喜欢这部电影。它太棒了!"# 对输入文本进行分词tokens = tokenizer.encode_plus(    text,    max_length=128,    padding='max_length',    truncation=True,    return_tensors='pt')# 将输入张量移动到设备上input_ids = tokens['input_ids'].to(device)attention_mask = tokens['attention_mask'].to(device)#import csv

步骤 5. 执行情感预测

在下一步中,模型将为给定的 input_ids 和 attention_mask 生成预测。

with torch.no_grad():    outputs = model(input_ids, attention_mask)predicted_label = torch.argmax(outputs.logits, dim=1).item()sentiment = '正面' if predicted_label == 1 else '负面'print(f"输入文本的情感是{sentiment}。")#import csv

输出

输入文本的情感是正面。

结论

本文介绍了 BERT 中的注意力机制,强调了它在理解句子上下文和单词关系中的重要性。我们探讨了注意力权重,通过加权平均值为输入单词提供综合表示。计算这些权重涉及到关键词和查询向量。BERT 通过取这些向量的点积来确定两个单词之间的兼容性分数。这个过程被称为 “heads” ,是 BERT 关注单词的方法。多个注意力 heads 增强了 BERT 对单词关系的理解。最后,我们研究了预训练 BERT 模型的 Python 实现。

核心要点

  • BERT基于两项关键的自然语言处理(NLP)技术的进展:Transformer架构和无监督预训练。
  • 它使用“注意力”来优先处理句子中的相关输入特征,有助于理解单词之间的关系和上下文。
  • 注意力权重计算输入的加权平均值,用于生成综合表示。通过使用多个注意力头和层,BERT能够聚焦于上一层的输出,从而创建详细的单词表示。

常见问题

本文中显示的媒体不是Analytics Vidhya所有,仅基于作者的判断使用。

Leave a Reply

Your email address will not be published. Required fields are marked *