[算法前沿]--024-图解BERT以及原理介绍
BERT(Bidirectional Efficient Transformer)是一种基于Transformer架构的语言模型,在自然语言处理(NLP)领域取得了显著突破。自2018年提出以来,BERT通过大规模无监督预训练显著提升了多种NLP任务的表现(如句子分类、 named entity recognition 等)。其核心在于通过预训练任务(如Masked Language Model)学习语义表示,并结合下游任务的数据进行微调优化。
BERT的基本架构包括多个Transformer层和词嵌入技术(如分词方法),能够捕捉词语的上下文信息并生成多维语义向量。与传统的RNN或CNN相比,BERT通过双向Transformer结构实现了更高效的特征提取和语义理解。
值得注意的是,尽管OpenAI的Transformer decoder在语言建模中表现优异,但BERT采用了双向Transformer encoder结构,并在此基础上进行了更广泛的预训练任务设计(如判断两个句子是否相邻),从而实现了对上下文的更深入理解和利用。
此外,对比其他模型(如ELMo)显示,在保持语义理解能力的同时,BERT在处理长距离依赖关系方面表现更为出色。这种优势使其在多种下游任务中取得了超越传统方法的最佳效果(SOTA)。
文章目录
- 图解BERT
-
- BERT句子分类
- 模型结构
- 模型输入
- 模型输出
- 预训练任务:Masked Language Model
- 预训练任务:相邻句子判断
- BERT的应用
- BERT特征提取
- 拓展阅读
-
- 对比CNN
- 词嵌入(Embedding)进展
-
- 回顾词嵌入
- 语境问题
- Transformer:超越LSTM
- OpenAI Transformer:预训练一个Transformer Decoder进行语言建模
- BERT:Decoder到Encoder
图解BERT
从2021年的视角看去,“AI Winter”确实标志着自然语言处理技术发展史上的一个重要转折点。不仅展示了深度学习技术在文本处理方面的巨大潜力,并且得到了充分的发挥。随着NLP开源社区的蓬勃发展,“开源”的力量让许多强大的模型得以被封装成易于使用的组件。这些强大的模型被包装成了易于使用的组件,在众多NLP预训练模型中,默认的基础型就是BERT和GPT。
该研究方法在2018年首次发布便取得了显著成效,在多种自然语言处理领域均实现了最佳表现记录。随后不久其论文发表后研究团队即公开了该模型的具体代码实现,并提供了基于大规模书籍数据集进行预训练完成后的完整模型供下载使用。该开源策略不仅简化了其他研究者的工作流程同时也降低了开发人员对从零构建高效语言处理系统所需投入的技术门槛和资源消耗。
BERT是如何实现其功能的?如图所示,在整个流程中,BERT通过在大规模无监督语料上的预训练阶段,成功地从大量未标注的数据中学习到了语言的基本规律。随后,系统在此基础上增加了专门针对特定任务设计的一层神经网络,并基于该任务领域的数据进行了精细的微调训练,最终实现了显著的效果。其整个训练流程可概括为'预训练'与'微调'(即Finetuning)的过程,这一方法论已成为当前NLP领域广泛采用的标准范式。

图:BERT训练和微调
BERT句子分类
为了更好地掌握BERT的核心原理,首先需要弄清楚BERT的主要应用场景是什么。接着要明确输入数据的格式以及模型输出的结果类型。最后深入探究BERT的工作原理及其训练优化方法。因此,在全面介绍与BERT相关的各种技术概念之前,请允许我们暂时跳过这些细节内容。
首先,在无监督语料的基础上下载并获取经过预训练的专业BERT模型资源包(该资源包包含三个关键组件:BERT模型配置文件、BERT模型参数以及BERT词表)。随后,在该专业资源包基础上进行进一步开发工作(如:基于现有基础构建新的功能模块)。具体而言就是:针对特定任务构建微调模型(该过程包括以下步骤操作:1. 基于现有基础构建新的功能模块;2. 在特定任务监督数据上完成微调训练;3. 通过学习率较小、训练周期较短的方式对全模型参数进行精细优化调整)。
首先探讨如何利用BERT进行文本分类技术实现自动化邮件筛选功能。我们的目标是区分一封邮件是否为垃圾邮件。当然这一技术并非唯一的应用场景
- 输入:影片或产品的一系列评论用于评估其质量。输出:判断这些评论是正面的还是负面的。
- 输入:两个句子之间是否存在相同的含义?输出:判断这两句话是否表达相同的意思。

图:垃圾邮件分类
如图所示,在应用BERT模型进行文本分类任务时,我们向其添加了一个轻量级的fc layer(全连接层)作为分类器。由于该fc layer是 newly added到bert架构中,在 training之前需要先随机初始化其权重参数。因此必须利用相应的supervise dataset来进行该fc layer的预训练阶段。值得注意的是,在实际 training过程中,在优化bert模型的过程中也能自然地同步更新该fc layer的权重参数。

图:BERT句子分类
模型结构
参考上面的例子学习BERT的具体应用。接下来让我们进一步深入探讨其工作原理。 Bert 原始论文阐述了两个版本的模型: Bert-base 和 Bert-large. 参数数量上稍逊于后者的是 Bert-base. 它们在下图中即可直观展示.

图:BERT base和large
基于Transformer架构设计而成的BERT模型结构主要由编码器部分构成,在具体实现中,BERT-base版本包含12层编码器而BERT-large则包含24层编码器。

图:BERT-base为12层的encoder
模型输入
接着观察模型的输入与输出机制:BERT系统在处理文本时,在每条信息最前端添加了一个特殊的[CLS]标记符(如图所示)。这种独特的标记符在经过BERT处理后所生成的向量表示通常会被用作当前文本段落的整体表征。值得注意的是,在这种特殊标记符之外的其他输入词项则是遵循相同规则进行处理的。BERT系统会接收并处理一系列单词序列作为输入数据,并通过多层编码器依次传递信息到更深一层编码器中去。每一层都经历并进行相应的Self-Attention机制计算以及前馈神经网络处理。

图:模型输入
模型输出
所有输入到BERT中的token都会通过其编码层处理,并在每个位置生成一个大小为hidden_size(例如,在BERT-base中为768)的向量。

图:BERT output
在之前所述的句子分类示例中, 我们采用了第1个位置对应的向量输出(即[CLS])作为输入至Classifier网络, 并随后完成分类任务.

图:BERT 接分类器
预训练任务:Masked Language Model
知道了模型输入数据、输出结果以及Transformer架构的相关知识后,请问大家:BERT是如何在无监督的情况下完成预训练任务?它又是如何提取出准确反映词项和句子潜在意义的有效表示呢?传统的NLP预训练方法通常建立在语言模型的基础之上。例如,在标准的语言模型中取前三个单词就可以预测第四个单词。然而,在这种情况下[BERT]采用的是Masked Language Model(MLM)策略:它会随机遮盖输入序列中大约15%的文字内容。如上图所示:

图: BERT mask
该训练方法可追溯至Word2Vec时代,在经典的Word2Vec架构中
预训练任务:相邻句子判断
除了Masked Language Model之外,在BERT的预训练过程中新增了一个特定任务:即判断这两个句子之间是否存在相邻关系。如上图所示,在输入层接收两个句子A和B,在经过BERT编码后其[CLS]位置的向量表示被用来预测这两个句子之间是否存在相邻关系。

图: 2个句子任务
需要注意的是,在本文的讨论中,默认会跳过BERT的tokenization步骤。需要注意的是,在实际应用中,BERT确实采用了WordPiece算法来进行分词处理。值得注意的是,在WordPiece算法中有一些词语会被进一步拆分为更小的部分。此外,在提出Roberta模型时就不再将其作为预训练任务进行处理。
BERT的应用
BERT论文探讨了BERT在不同领域的具体应用情况,请参考下图以获取详细信息。该系统能够用于评估两段文本之间的相似度,并能识别单个文本的情感倾向。此外它还可以应用于问答系统构建以及命名实体识别任务中。

图: BERT应用
BERT特征提取
基于BERT模型能够生成输入序列中每个token对应的向量表示这一特性,在实际应用中我们通常采用两种主要方法处理这些嵌入信息:首先是可以将最高层BERT的输出对接至任务网络进行微调;其次则可以直接将这些token向量作为特征输入到现有特定任务神经网络中进行训练。值得注意的是,在实际操作中为了提高模型性能可选方案还包括逐层提取各编码器输出中的token表示并将其依次作为特征供现有特定任务神经网络处理。

图: BERT特征提取
那么我们考虑使用最后几层的向量表示吗?或者是否应该综合考虑所有层次?通过实验数据可以看出以下结果:

图: BERT特征选择
拓展阅读
对比CNN
具备计算机视觉相关知识的人能够联想到基于BERT编码机制所描述的技术与卷积神经网络(如VGGNet)结合全连接层用于执行分类任务。如图所示,其基本训练方法和流程具有相似性。

图:CNN
词嵌入(Embedding)进展
回顾词嵌入
机器学习模型无法直接接受单词作为输入;因此必须将这些单词转换成特定的数值形式以便于模型能够进行计算处理。利用Word2Vec技术我们可以将每个单词映射到一个向量(即一组数字),从而有效地捕捉词语的意义以及词语之间的相互关联(例如:如过去时态中的动词 "had" 和 "has" 的意义与现在时态中的动词 "was" 和 "is" 的意义具有相似性)以及词语在语法上的关联(例如:如 "Stockholm" 与 "Sweden" 的关系类似于 "Cairo" 与 "Egypt" 的关系)。
大家迅速认识到,与在小规模数据集上联合训练词嵌入相比,将词汇嵌入预训练于大规模文本数据并随后使用是一种更为高效的方法.我们可以通过访问预训练资源获取这些工具.例如,以下是单词 "stick" 在 Glove 词嵌入模型中的向量示例(该向量长度为 200).

图: wrod vector
词 'stick' 的 GloVe 词向量具体表现为:一个包含200个浮点数的向量,并保留两位小数。
考虑到这些向量都具有较长长度并且全部都是数值型数据,在文章中采用以下形式来表达这些向量:

图:vector
语境问题
当我们采用Glove的词嵌入表示方法时

图:ELMo
语境化的词嵌入,可以根据单词在句子语境中的含义,赋予不同的词嵌入。
ELMo未对每个单词采用固定词嵌入方案,在分配每个词的词嵌入之前综合考虑整个句子的信息并整合上下文信息。
该模型通过训练于特定任务并结合双向LSTM架构来生成这些语义表示。

图: ELMo embedding
ELMo 在预训练过程中取得了关键性的进展。基于一个庞大而多样化的训练数据集进行学习后,ELMo-LSTM 可以为多种自然语言处理任务提供支持。
那么 ELMo 的秘密是什么呢?
ELMo经过训练后能够预测单词序列中的下一个词。这一过程赋予了模型语言理解能力。实现这一目标非常容易。我们拥有大量文本数据。模型能够从这些数据中自动生成表示。无需人工标注信息

图: ELMo 训练
ELMo预训练阶段属于这类常见的语言模型。它基于"Let’s stick to"这一特定输入序列进行学习,并预测其后的下一个单词。在经过大规模数据集的训练后, 该模型能够识别并学习各种语言模式. 具体来说, 在遇到像 "hang" 这样的短语后 (如 "hang out" 作为一个完整的短语), 该模型会预测出更高的可能性为 "out" 而不是将之误认为是单独的名词 "camera".
在图中可以看到ELMo头部上方呈现了LSTM每一时刻的隐藏层状态向量。经过预训练后,在词嵌入过程中这些隐藏层状态得以应用。

图:ELMo 训练
ELMo通过以下方式实现语言模型:它将LSTM模型的隐藏层表示向量与初始词嵌入相结合,并采用了融合的方式进行整合。该过程生成了具有语境信息的词表示。

图:ELMO 训练
Transformer:超越LSTM
随着Transformer论文及其代码的公布,并在其在机器翻译等领域的显著成果出现后,开始促使人们认识到它是LSTM的一个替代方案。这一转变主要源于两个关键因素:首先,由于Transformer能够更有效地处理长距离依赖关系;其次,基于这种架构设计的独特优势在于能够并行处理输入信息。
2017年, Transformer架构中的Encoder-Decoder模式在其机器翻译领域取得了显著成效,彰显了其强大的能力。然而,如何将其应用于文本分类这一特定领域的问题尚待解决?另外,我们又该如何通过这一技术框架来构建一个可迁移到多种下游任务的语言模型?这些关键点值得我们深入探讨:首先,我们需要了解如何将其应用于预训练语言模型的构建;其次,要探索其在不同应用场景下的适应性机制;最后,明确哪些类型的任务可以作为有效的监督学习目标进行处理
OpenAI Transformer:预训练一个Transformer Decoder进行语言建模
基于预训练好的LSTM语言模型替换为其Transformer架构版本后(相当于),我们直接使用预训练语言模型参数,并对下游任务相关的监督数据进行微调。与传统的用于seq2seq翻译任务的Transformer架构相比,在这种设计下等价于仅采用了Decoder模块。借助Transformer架构和语言建模任务的设计框架,在处理大规模未标注数据时(相当于将7000本书的文字依次输入),模型能够逐步预测出每个序列中的下一个词。具体而言,在处理大量未标注文本数据时(相当于将7000本书的文字依次输入),模型能够不断学习并生成后续的词汇。

图: open ai模型预测下一个词
现在我们投入使用的OpenAI Transformer模型已经接受了系统的预训练,并且其网络参数经过反复优化以提高模型性能。该模型能够有效地以向量形式表征文本内容,并随后投入实际应用。

图: open ai模型做句子分类
涵盖多种类型的自然语言处理(NLP)任务的研究者们,在OpenAI发表的一篇论文中系统地阐述了几种有效的输入转换方法,并能够应对各类不同的输入形式。在该论文中下图展示了各类型模型架构及其对应的输入转换方式

图: open ai微调
BERT:Decoder到Encoder
OpenAI 开发了一种基于 Transformer 架构的语言模型。然而,在将 LSTM 替换为 Transformer 的过程中,默认了一些信息。例如,在过去的研究中,ELMo 是一个双向语言模型。那么我们能否设计出一种基于 Transformer 的语言模型既能向前推导又能向后推导?答案是 BERT:它采用双向 Transformer 架构,在遮蔽语言建模任务中接受了系统的预训练。这一创新方法在多个自然语言处理任务中实现了最佳性能。
