【NLP】第 3 章 :BERT

在本章中,您将学习由 Google 开发的 Transformer 架构的实现之一,称为 BERT。

Google AI Language 的研究人员最近所做的工作导致发表了一篇名为“BERT(来自变形金刚的双向编码器表示)”的论文。

BERT取得的最重要的技术进步是将流行的注意力模型Transformer的双向训练 应用于语言建模。根据语言模型的研究结果,与仅在一个方向上训练的模型相比,同时在两个方向上训练的语言模型能够更好地了解语言的流动和上下文。研究人员在出版物中描述了一种他们称之为掩码语言建模 (MLM) 的独特训练方法。 这种方法可以实现模型的双向训练,这在以前是很难做到的。

BERT 还允许我们进行迁移学习 ,这使得预训练的 BERT 模型可以用于各种自然语言应用。

根据模型架构的规模,BERT 有两种不同的预训练版本,分别如下。

BERT-Base 总共有1.1亿个参数,12个注意力头,768个隐藏节点,12层。

BERT-Large 的特点是有 24 层、1024 个隐藏节点、16 个注意力头和 3.4 亿个参数值。

BERT的工作原理

BERT 基于transformer 架构 ,它在内部使用第2章中讨论的注意力机制。BERT 的美妙之处在于理解句子中的上下文并表示单词,同时考虑上下文。这意味着像bank这样的词在金融语境中使用时与在河岸中使用同一个词bank时具有不同的表示。BERT只使用了transformer架构的encoder机制,主要用于创建更好的word representation,然后可以用于更多的下游应用。第2章介绍了变压器的详细工作原理。

Transformer 编码器的输入是一个单词句子,BERT 的架构使其可以双向读取以捕获单词中的上下文,这意味着单词既出现在焦点单词之前,也出现在句子的后面。这克服了发生在LSTM 类型架构 中的顺序读取(虽然双向 LSTM 是可能的,但它们很复杂并且仍然具有顺序处理)。

在训练语言模型 的过程中,必须克服的挑战之一是确定预测目标。大量模型提供关于序列中后续词的预测(例如,“太阳正在下沉 ___”),这是一种定向方法,从本质上限制了上下文学习。BERT 采用两种不同的训练策略来克服这一障碍。

掩码语言模型 (MLM)

为BERT 提供一个句子,然后优化其中包含的权重以在另一侧产生相同的句子,这就是 MLM 的构成。因此,我们给 BERT 一个句子,并要求它产生与输入相同的句子。在我们真正向 BERT 提供输入句子之前,我们掩盖了一些标记。

在输入 BERT 之前,单词序列中有 15% 的单词被 [MASK] 标记替换。这是在将单词序列输入 BERT 之前完成的。然后,该模型将尝试预测被屏蔽词的可能值。它在左右方向上都使用周围单词提供的上下文。

为了预测掩码句子,我们需要在编码器之上增加一个层,这将有助于对掩码句子进行分类。

使用的损失函数仅考虑屏蔽值的预测。其直接结果是,该模型比有向模型收敛得更慢 ;但是,它所拥有的更高的上下文感知弥补了这一缺点。

3-1显示了训练屏蔽语言模型的工作原理。大约 15% 的输入标记被屏蔽,然后前馈神经网络被训练为仅预测这些被屏蔽的标记。

【NLP】第 3 章 :BERT_第1张图片

图 3-1 掩码语言模型

3-2显示了MLM 中的推理如何工作的示例,它显示了如何使用掩码语言模型来预测掩码词。

【NLP】第 3 章 :BERT_第2张图片

图 3-2 用于标记预测的掩码语言模型 使用

这是使用huggingface 库的截图,我们将在下一章介绍。

下一句预测

下一句预测 (NSP) 协议需要为 BERT 提供两个句子,指定为句子 A 和句子 B。然后,我们询问 BERT,“Hey, does sentence B come after sentence A?” – 根据情况,BERT 会说 IsNextSentence 或 NotNextSentence。

让我们考虑数据集中的三个句子:

1.John went to the restaurant.

2.The kite is flying high in the sky.

3.John ordered a pizza.

现在当我们看这三个句子时,我们可以很容易地看出句子 2 不跟在句子 1 之后,相反,句子 3 跟在句子 1 之后。这种推理模式涉及跨越较长时间段的短语之间的依赖关系,通过NSP 传授给 BERT 。

考虑到 NSP 的训练,BERT 架构将正对和负对作为输入。

正对构成彼此相关的句子,而负对构成序列中彼此不相关的句子。这些负样本和正样本各占数据集中的 50%。

在将输入添加到模型 之前,它会按以下方式进行处理,以便更好地帮助模型区分训练中使用的两个句子:

1.在第一个句子的开头,插入一个 [CLS] 标记,在每个句子的最后,放置一个 [SEP] 标记。

2.每个标记现在都有一个句子嵌入,指示它是属于句子 A 还是句子 B。标记嵌入和句子嵌入在概念上 是词汇量大小为 2 的可比较表示。

3.每个标记都接收一个称为位置嵌入的附加嵌入,以便可以确定其在序列 中的位置。 这在第2章的“位置编码”部分进行了解释。

NSP 中的推理

为了通过NSP 演示推理,我们采用以下三个句子:

1.John went to the restaurant.

2.The kite is flying high in the sky.

3.John ordered a pizza.

计算句子 2 是否跟在句子 1 之后的概率和句子 3 跟在句子 1 之后的概率。

我们将再次使用 huggingface 库(我们将在下一章介绍)来计算个体概率。

请参阅要在 Google Colab 中使用的示例代码。(现在不要担心代码,因为第5章中会有大量示例。)

from torch.nn.functional import softmax
from transformers import BertForNextSentencePrediction, BertTokenizer
mdl = BertForNextSentencePrediction.from_pretrained('bert-base-cased')
brt_tkn = BertTokenizer.from_pretrained('bert-base-cased')
sentenceA = 'John went to the restaurant'
sentenceB = 'The kite is flying high in the sky'
encoded = brt_tkn.encode_plus(sentenceA, text_pair=sentenceB, return_tensors='pt')
sentence_relationship_logits = mdl(**encoded)[0]
probablities = softmax(sentence_relationship_logits, dim=1)
print(probablities)

清单 3-1 用于句子预测的 BERT

我们得到输出为

tensor([[0.0926, 0.9074]], grad_fn=)

这表明句子 2 跟在句子 1 之后的概率非常低。

现在我们对句子 1 和句子 3 进行相同的推理:

sentenceA = 'John went to the restaurant'
sentenceB = 'John ordered a pizza'

我们得到输出为

tensor([[9.9998e-01, 2.2391e-05]], grad_fn=)

这表明句子 1 后面有句子 3的概率 很高。

BERT 预训练模型

BERT 基于 Transformer 架构,主要使用编码器机制。它有许多变体,包括以下内容。

BERT-Base 的transformer块和隐藏层的尺寸比 OpenAI GPT 小,但它具有相同的整体模型尺寸(12 个变换器块、12 个注意力头和 768 的隐藏层尺寸)。

BERT-Large 是一个巨大的网络,可以在 NLP 任务上取得最先进的结果。它的注意力层数是 BERT-Base 的两倍(24 个转换器块,16 个注意力头,隐藏层大小为 1024)。

Huggingface 提供预训练的 BERT 模型,可直接用于下游任务的微调。

3-3显示了 huggingface 上可用的一些预训练 BERT模型 。

【NLP】第 3 章 :BERT_第3张图片

图 3-3 来自huggingface 的 Bert 模型

BERT 输入表示

  • 始终将序列中的第一个标记视为 特殊分类标记(也缩写为 CLS)。出于分类任务的目的,将使用与此标记对应的最终隐藏状态。

  • [SEP] 标记用于划分两个句子之间的分隔符。

  • 每当处理一个句子对时,都会添加一个额外的片段嵌入。这种嵌入将指示标记是属于句子 A 还是属于句子 B。

  • 给定标记的输入表示 是通过向标记的表示添加位置嵌入来构建的。

BERT 用例

一旦我们有了编码器生成的正确表示, BERT 就可以用于各种下游任务。这些任务包括情绪分析、总结、问答、文本到 SQL 生成等。

除了使用预训练的 BERT 模型外,我们还可以使用我们特定的文本数据集对其进行微调。这将使我们能够利用我们自己的数据。

与 GPT3 等其他大型学习模型相比,BERT 的源代码是免费向公众开放的,可以在 GitHub 上查看。这使得 BERT 可以在全世界更广泛的环境中使用。这完全改变了动态!

开发人员现在可以快速启动并运行像BERT 这样的尖端模型,而无需在此过程中投入大量时间或金钱。

此外,开发人员可以专注于微调 BERT,以根据其各个项目的特定要求定制模型的性能。

如果不想花时间微调 BERT,他们应该知道有数以千计的开源和免费 BERT 模型已经过预训练,目前可用于特定用例。

BERT 模型已针对各种任务进行了预训练,例如

1.分析 Twitter 和其他社交媒体上的用户情绪

2.恶意评论检测

3.语音转文字

4.问答

还有很多。

我们在下面使用 huggingface 库以BERT 的推文分类示例。

Tweets的情感分析

BERTweet 语言模型 是第一个针对英语推文进行预训练的公开可用的大规模模型。RoBERTa 的预训练技术用于指导 BERTweet 的训练。BERTweet 的预训练数据集包括 8.5 亿条英文推文(160 亿个单词标记和 80 GB)、从 2012 年 1 月 1 日到 2019 年 8 月 8 日流式传输的 8.45 亿条推文,以及与 COVID-19 大流行相关的 500 万条推文。

model = pipeline('sentiment-analysis', model="finiteautomata/bertweet-base-sentiment-analysis")

清单 3-2使用BERT 进行情感分析

通过运行这段代码,我们得到如图3-4所示的以下输出。

【NLP】第 3 章 :BERT_第4张图片

图 3-4 清单3-2的执行。这显示了模型和分词器的下载

然后我们将两条推文 输入模型:

data = ["idk about you guys but i'm having more fun during the bear than I was having in the bull.","At least in the bear market it’s down only. Bull market is up and down"]
model(data)

这给出了以下输出:

[{'label': 'POS', 'score': 0.9888675808906555}, {'label': 'NEG', 'score': 0.7523579001426697}]

这显示了 Bertweet 模型如何能够对前面的两条推文进行分类。

POS分数 显示积极情绪,NEG 分数显示消极情绪。

BERT 在各种通用语言任务上的表现

BERT性能 是根据以下几个基准测试得出的:

  1. SQuAD (斯坦福问答数据集):这是来自斯坦福的问答数据集。BERT 在此数据集上的性能远远领先于现有模型,并且与人类相比也好得多。

  1. SWAG:在这里,SWAG 代表 Situations with Adversarial Generations 。这是一个来源于日常场景的数据集,主要测试常识和推理。在这里,BERT 的表现也优于其他模型以及人类表现。

  1. GLUE:代表通用语言理解评估 。这评估了模型在理解特定语言方面的工作方式。这里有一些特定的任务可以评估模型。在这里,BERT 的表现也非常出色 。

概括

BERT 是一种极其复杂和尖端的语言模型,可帮助个人自动化他们的语言理解。它得到了海量数据训练的支持,并利用 Transformer 架构彻底改变了自然语言处理领域,使其能够实现最先进的性能。

得益于 BERT 提供的开源库,以及令人难以置信的 AI 社区为继续改进和共享新的 BERT 模型所做的努力,未触及的 NLP 里程碑似乎拥有光明的未来。

你可能感兴趣的:(基于Transformer,的,NLP,bert,nlp,人工智能)