跳转到内容

7. Transformer 模型和 BERT 模型

  • 本课程向您介绍 Transformer 架构和来自 Transformers (BERT) 模型的双向编码器表示。您将了解 Transformer 架构的主要组件,例如自注意力机制,以及如何使用它来构建 BERT 模型。您还将了解 BERT 可用于的不同任务,例如文本分类、问答和自然语言推理。https://www.cloudskillsboost.google/course_templates/538
  • 在本模块中,您将了解 Transformer 架构的主要组件,例如自注意力机制,以及如何使用它来构建 BERT 模型。您还将了解 BERT 可用于的不同任务,例如文本分类、问答和自然语言推理。
  • 视频学习:https://youtu.be/sUCiDU8GhMA

课程1:Transformer 和 BERT 模型简介

引言

你好。我是 Sanjana Reddy,是 Google 高级解决方案实验室的机器学习工程师。生成式 AI 和所有新的进步,包括即将出现的新顶点 AI 功能,令人兴奋不已。例如 Gen AI Studio、Model Garden、Gen AI API。我们在这个简短的会议中的目标是让您在一些基本概念上打下坚实的基础。

语言建模的进展

语言建模已经发展了多年。过去十年的最新突破包括使用神经网络用于表示文本的方法,例如 2013 年的 Word2Vec 和 N-grams。2014 年,序列到序列模型(例如 RNN 和 LSTM)的开发帮助提高了 ML 模型在 NLP 任务上的性能,比如翻译和文本分类。

注意力机制的兴起

2015 年,注意力机制和基于它构建的模型令人兴奋,例如 Transformers 和 Bert 模型。今天要讲的是 Transformer 模型。

Transformer 模型的特点

Transformer 基于 2017 年发表的一篇名为《Attention Is All You Need》的论文。尽管 Transformers 之前的所有模型都能够将单词表示为向量,但这些向量并不包含上下文。单词的用法会根据上下文而变化。例如,在注意力机制出现之前,"bank" 和 "river bank" 与 "bank robber" 中的 "bank" 可能具有相同的向量表示。

Transformer 的架构

Transformer 是一种使用注意力机制的编码器解码器模型。它可以利用多元化的优势,也可以同时处理大量数据。由于其模型架构,注意力机制有助于提高机器翻译应用程序的性能。

Transformer 模型由编码器和解码器组成。编码器对输入序列进行编码并将其传递给解码器,解码器解码相关任务的表示。编码组件是一堆相同数量的编码器。介绍 Transformers 的研究论文将六个编码器堆叠在一起。六不是一个神奇的数字。它只是一个超参数。编码器在结构上都是相同的,但具有不同的权重。

编码器的结构

每个编码器可以分解为两个子层。第一层称为自我关注。编码的输入首先流过一个自我关注层,这有助于编码或查看单词的相关部分,因为它对输入句子中的中心词进行编码。第二层称为前馈层。自注意力层的输出被馈送到前馈神经网络。完全相同的前馈神经网络独立应用于每个位置。

解码器的结构

解码器既有自注意力和前馈层,但在它们之间是编码器解码器注意力层,该层帮助解码器关注输入句子的相关部分。在输入序列中嵌入单词后,每个嵌入向量都流经编码器的两层。每个位置的单词都经过自我关注过程。然后它通过一个前馈神经网络,完全相同的网络,每个向量分别流过它。在这个自我关注层中,这些路径之间存在依赖关系。但是,前馈层没有这些依赖关系,因此各种路径在流经前馈层时可以并行执行。

注意力计算

在自我关注层中,输入嵌入被分解为查询、键和值向量。这些向量是使用 Transformer 在训练过程中学习的权重来计算的。所有这些计算以矩阵计算的形式在模型中并行发生。一旦我们有了查询键和值向量,下一步就是将每个值向量乘以 soft max 分数,准备将它们相加。这里的目的是保持单词的值不变。

Transformer 模型的细节

注意力权重的计算

例如,您想通过将不相关的词乘以 0.0010.001 之类的小数字来关注并忽略它们。接下来,我们必须总结加权值向量,以在这个位置产生自注意力层的输出。

自注意力的输出

对于第一个单词,您可以将生成的向量发送到前馈神经网络。总结一下这个获取过程最终的嵌入,这些是我们采取的步骤:我们从自然语言句子开始,将每个单词嵌入句子中。之后,我们在这种情况下执行八次多头注意并相乘这个带有各自加权矩阵的嵌入词。然后我们使用生成的 Q KV 矩阵计算注意力。最后,我们可以连接矩阵以产生输出矩阵,这与该层最初得到的最终矩阵的维度相同。

Transformer 的变体

现在有多种变体。有些同时使用原始架构中的编码器和解码器组件。有些只使用编码器,有些只使用解码器。

BERT:一个Transformer的变体

一种流行的仅编码器架构是 Bert。Bert 是训练有素的 Transformer 模型之一。Bert 代表双向编码器表示来自 transformers,由谷歌于 2018 年开发。从那时起,已经构建了 Bert 的多个变体。今天,Bert 为 Google 搜索提供支持。您可以看到 Bert 为相同的搜索查询提供的结果有多么不同。

Bert 的规模与能力

Bert 接受了两种变体的训练。一个模型包含 Bert Base,它有 12 个 Transformers,大约有 1.1 亿个参数。另一个 Bert Large 有 24 层 Transformer,大约有 3.4 亿个参数。Bert 模型之所以强大,是因为它可以处理长输入上下文。它在整个维基百科语料库和书籍语料库上进行了训练。Bert 模型训练了 100 万步。

Bert 的多任务训练

Bert 接受过不同任务的训练,这意味着它具有多任务目标。这使得 Bert 非常强大,因为它接受过训练的任务类型。它适用于句子级别和标记级别。这是最初发布的两个不同版本的 Bert:一个是 Bert Base,它有 12 层,而 Bert Large 有 24 层,与原来的六层 Transformer 相比。

Bert 的训练任务

任务一:掩码语言模型

Bert 的工作方式是它接受了两项不同任务的训练。任务一称为掩码语言模型,其中句子被掩码,模型被训练以预测被掩码的单词。如果您要从头开始训练 Bert,则必须屏蔽语料库中一定比例的单词。推荐的掩蔽百分比为 15%。遮蔽率达到平衡在太少和太多掩蔽之间。掩蔽太少会使训练过程极其昂贵,而掩蔽太多会消除模型所需的上下文。

任务二:下一句预测

第二个任务是预测下一句话。例如,模型被赋予两组句子。Bert 旨在学习句子之间的关系,并根据第一个句子预测下一个句子。例如,句子 A 可能是“一个男人去了商店”,句子 B 是“他买了一加仑牛奶”。Bert 负责分类句子 B 是否在句子 A 之后的下一个句子中。这是一个二元分类任务。

BERT的输入表示

不同类型的嵌入

为了训练BERT,您需要为输入句子的模型提供三种不同类型的嵌入:令牌嵌入、段嵌入和位置嵌入。

令牌嵌入

标记嵌入是每个标记作为输入句子中的嵌入的表示。单词被转换为特定维度的向量表示。

段嵌入

BERT如何区分给定对中的输入?答案是使用段嵌入。有一个由“SEP”表示的特殊标记,用于分隔句子的两个不同拆分。

位置嵌入

另一个问题是学习句子中单词的顺序。BERT由一堆Transformer组成,旨在处理最大长度为512的输入序列。输入序列的顺序被合并到位置嵌入中。这允许BERT学习每个位置的向量表示。

BERT在NLP任务中的应用

文本分类

BERT也可以解决涉及文本分类的NLP任务。一个例子是分类两个句子 "my dog is cute" 和 "he likes playing" 在语义上是否相似。输入文本对被简单地连接起来并输入到模型中。

适用于不同的下游任务

尽管BERT接受过大规模语言建模和单句分类方面的培训,但它可以用于流行的NLP任务,如单句分类、句对分类、问答和单句标记任务。

结语

谢谢你的聆听。

课程2:使用预训练的BERT模型进行文本分类

介绍

你好。我是Sanjana Reddy,是Google高级解决方案实验室的机器学习工程师。欢迎来到Transformer模型和BERT模型的实验室演练。在本实验室演练中,我们将通过使用预训练的BERT模型进行分类。

准备工作

您可以在我们的GitHub存储库中找到设置说明。要使用此笔记本,您需要登录Google Cloud,进入Vertex AI并单击Workbench。确保在创建笔记本实例后创建了一个笔记本。单击打开Jupyter实验室。

导航到项目

按照我们的GitHub存储库中的说明进行操作后,在本笔记本中导航到使用BERT对文本进行分类。

项目概述

我们将学习如何从TensorFlow Hub加载预训练的BERT模型,并使用预训练的BERT模型构建我们自己的分类。我们还将学习如何在开始之前通过微调来训练BERT模型。

配置环境

请注意,此笔记本需要CPU,因为训练确实需要相当多的时间。当您打开此笔记本时,会显示一条设置说明,用于设置BERT内核以安装此笔记本所需的所有库。对于这个笔记本,我们将使用TensorFlow和TensorFlow Hub。TensorFlow文本是需要的,因为我们需要它来预处理BERT模型的输入。您可以看到我正在检查是否连接了GPU,并且我看到我有一个GPU连接到此笔记本电脑。

数据集概览

在本笔记本中,我们将训练一个情感分析模型,根据评论文本将电影评论分类为正面或负面。我们将使用IMDB数据集,您可以从指定的URL下载。下载数据集后,我们可以检查数据以查看其中的内容。我们看到我们有25,000个文件属于两个类,正和负。我们将使用20,000个文件进行训练,其余5,000个文件进行测试。此数据集的示例向您显示了此处的电影评论和相关标签。

数据标签

因此,对于这里的标签,我们看到关联的标签是负面的,而下面的标签是正面的。

加载预训练的BERT模型

一旦我们检查了我们的数据集并且我们对此感到满意,我们从TensorFlow Hub加载预训练的BERT模型。TensorFlow Hub提供多种不同大小的BERT模型变体。我们将为今天的笔记本使用小型BERT。

BERT模型规格

我们所使用的BERT模型具有四个不同的层,512个隐藏单元,和8个注意力头。每个从TensorFlow Hub加载的BERT模型都与相应的预处理模型相关联。

加载和检查预处理模型

您可以在TensorFlow Hub上找到相应的预处理模型。我们首先加载预处理模型,传递一个示例文本“这是一部了不起的电影”,并检查输出。

预处理模型的输出

预处理模型为我们提供了多个输出:

  1. 输入词ID:输入的单词ID是标记化句子中单词的索引。
  2. 屏蔽(Mask):每个句子都被转换成固定长度的输入,并屏蔽无效的单词。

BERT模型与预处理

一旦我们预处理了我们的输入文本,我们就可以使用从TensorFlow Hub加载的BERT模型。在训练模型之前,这些输出没有实际意义,它们只是一组随机的数字列表。但是,一旦您将预处理文本传递到这个BERT模型中,您就会得到相应的嵌入。

定义分类模型

为了定义我们的分类模型,我们从一个输入层开始:

  1. 输入层:原始文本作为输入传递给处理层进行预处理。
  2. 预处理层:将输入文本转换为标记ID、BERT ID和掩码ID。
  3. BERT层:将预处理后的单词传递给预训练模型。

微调参数设置

这里有一个参数叫做trainableTrainable此处确定是否要使用正在训练的新数据微调预训练模型。在我们的示例中,我们将trainable设置为true,这意味着我们将更新预训练模型的初始权重。

如何决定trainable的设置

  1. 数据集大小:如果您的数据集相对较小,建议将其设置为false,这样您就不会在预训练的权重中引入噪声。但是,如果您有足够大的数据集,您可以将其设置为true
  2. 密集层:一旦我们有了预训练的模型,我们就将它传递给一个密集层,以获得每个类别的概率。这就是模型的输出结果。

训练与优化

输出将是这个特定句子是否为正面或负面的概率。由于我们正在处理二元分类问题,我们将使用二元交叉熵作为我们的损失函数,而要优化的指标将是二元精度。通过定义优化器来初始化我们的训练。在我们的例子中,我们使用Adam,它是神经网络模型的流行选择。

开始训练

一旦我们初始化训练,我们就可以开始使用model.fit进行训练。

模型训练与评估

一旦我们定义了我们的模型,我们可以传递训练数据集和验证数据集以及我们想要训练的时期数。在我们的案例中,模型训练完成后,我们评估了模型的性能。该模型达到了85%的准确率,考虑到我们只训练了五个epoch,这是相当不错的。

模型性能可视化

您可能会想要绘制准确性和随时间的损失图,以便可视化模型的性能。在我们的例子中,我们看到训练损失正在下降,而验证损失稍微波动。

保存与加载模型

一旦您对训练的模型感到满意,您可以使用model.save方法导出并保存模型到本地路径。保存模型后,您可以加载它以进行预测。

预测示例

在这个例子中,我们有一组不同情感的评论句子。我们根据我们训练的模型对这些句子中的每一个进行预测。

部署模型到Vertex AI

如果您想更进一步,并将您的模型部署到Vertex AI上以获得在线预测,您可以采用本地保存的模型并将其导出到Vertex AI。

模型的签名

您需要检查模型的签名以了解如何将预测传递给模型。模型的签名告诉您什么是第一层接受的输入。

上传模型到Vertex AI

一旦我们拥有本地保存的模型,我们将使用一系列命令将模型推送到Vertex的模型注册表。为了将模型放入Vertex的模型注册表中,您需要确保您有一个Google Cloud存储桶。

部署模型

上传模型后,我们就可以在Vertex上部署模型并获得在线预测。为此,我们可以使用Python SDK,它将做两件事:

  1. 创建一个端点。
  2. 将模型上传到这个特定的端点。

部署模型大约需要5到10分钟。一旦将模型部署到端点,您就可以从该端点获得预测。

获得预测

创建一个实例对象,并使用模型的签名,将评论文本传递给这个特定的键。这个实例对象将被传递给endpoint.predict函数,它会给我们预测。

预测示例

例如,对于评论“I love this movie and highly recommend it.”,我们的预测为0.99,这意味着模型非常确定这是一种正面情绪。

总结

这就是您如何从预训练的BERT模型中创建分类模型,并将其部署到Vertex AI上以获得在线预测。

参考链接

https://github.com/GoogleCloudPlatform/asl-ml-immersion/blob/master/notebooks/text_models/solutions/classify_text_with_bert.ipynb