BERT模型的提出几乎就是针对于GPT的,文章实验部分主要就是在和GPT进行效果对比。因此,BERT模型总体上就是在GPT提出的基础上,进行了一部分创新和优化,提出了Bidirectional双向语言模型,预训练阶段采用遮罩语言模型(Masked LM)。论文同时也进行了模型下游任务训练时feature-based和fine-tuning的对比分析。
1.双向语言模型(Bidirectional)优于单向语言模型(Unidirectional);
2.fine-tuning在大部分情况下优于feature-based,但是fine-tuning也需要更高昂的成本;
3.采用Transformer encoder和采用Transformer decoder可以让模型胜任不同任务;
1.都是基于pre-train+fine-tuning的二阶段模型架构;
2.都是基于Transformer的自然语言模型;
训练阶段 | 差异项 | GPT | BERT |
---|---|---|---|
预训练阶段 | 预训练模型 | 单向语言模型(左至右) | 双向语言模型(遮罩语言模型) |
预训练目标 | 预测出给定文本后出现的文本 | 预测出遮罩的词 | |
Transformer架构区别 | decoder-only | encoder-only | |
适用场景区别 | decoder特点在于文本生成(text-generation),擅长解决例如翻译、段落归纳、编写创作 | encoder特点在于,擅长理解和解决理解之后的任务,例如问题回答、情感分析 | |
预训练数据集 | 在通用大数据集上进行预训练 | 可以在特定数据集上进行预训练 | |
调参阶段 | 具体到不同任务都会有不同的细微处理差异,并且两个模型实验方向也不完全相同 | 1.自然语言推理(NLI)2.问题回答和常识(SQuAD)3.语义相似度(MRPC)4.分类(CoLA) | 1.通用语言理解任务(GLUE,包含MRPC、CoLA等)2.标准问题回答任务(SQuAD)3.常识推理任务(SWAG) |
注释:为什么BERT采用双向语言模型
任何文本天然具有双向性。举个例子,“我要去洗衣服”,“我要去穿衣服”,左至右的理解可以获取洗和穿这两个动作可以衔接衣服这个物体,右至左的理解可以获取衣服这件物体是可以被洗和穿的。对于这两句话,左至右强调动作理解,右至左强调实体理解。因此BERT提出的双向语言模型架构会比类似于GPT这样的单向语言模型架构获取更多信息。 当然,代价就是双向学习需要更高昂的成本和更久的训练时间。
网上有人提到左序语言(例如中文、英文),和右序语言(例如阿拉伯文)与BERT有关,这是一种错误的理解。BERT提出的双向语言模型和语言的左序右序并没有直接关系,BERT强调的是通过双向语言模型和遮罩语言模型(MLM)的实现形式同时获取文本的双向上下文信息,加强模型泛化能力。
原论文地址:https://aclanthology.org/N19-1423.pdf
我们提供了一个新的语言模型BERT,是以下名词的首字母缩写:Bidirectional Encoder Representations from Transformers。不同于先前的语言模型研究,例如ChatGPT(Improving Language Understanding by Generative Pre-Training),BERT通过在所有层的左边和右边上下文中加入条件联合,从未标记的文本中预训练出深度的双向表示,由此得到的预训练BERT模型只需要再额外增加一个输出层,就可以被更好的调参优化,并在NLP各个领域上达到工业应用水准。例如问题回答、语言推理等领域,BERT模型都不需要特定的架构修改。
从我们的实验结果发现,BERT在11个自然语言任务中取得最高成绩,包括将GLUE分数提升7.7%达到80.5%,MultiNLI精准度提升4.6%达到86.7%,SQuAD v1.1问题回答测试提升1.5达到93.2分,SQuAD v2.0测试提升5.1达到83.1分。
语言模型预训练已经被证明可以在多项语言处理任务中提升模型的效果,包括理解句子级和段落级文本间的关系,同时分词级的任务诸如实体辨认和问题回答等任务也可以得到显著提升。
当下有两种主流的策略,可以将预训练语言模型调整到适应下游任务:基于特征(feature-based)和调参(fine-tuning)。基于特征实现领域,ELMo模型是典型的基于特征方案,用一个包含特征的特定任务架构。参数微调实现领域,代表性的有GPT模型,引入最小特定任务参数,通过预训练模型微调实现。两种策略在预训练阶段使用相同的目标,都是通过单向语言模型来学习通用语言表达。
注释:feature-based和fine-tuning的区别
Feature-based:在一个大数据集上进行预训练,预训练模型保留不动。在下游特定任务中,以预训练的输出为基准,在做一层模型,得到最终结果。特点在于预训练阶段数据量大于下游任务训练时的数据量,并且预训练模型在二阶段不变,二阶段增加一层适应特定任务的模型参数。
Fine-tuning:在一个相对小的数据集上进行预训练。在下游特定任务中,将整个模型重新训练,整个模型的参数都会被微调,得到最终结果模型。特点在于预训练阶段数据量小于下游任务训练时的数据量,并且预训练的模型在下游训练中整个模型参数都会发生变化。
此处作者其实表述不够清洗,GPT模型的预训练阶段数据量其实大于下游训练,但是GPT在下游阶段训练时确实是将整个模型参数都重新训练,因此精确来说,GPT模型其实是结合了feature-based和fine-tuning的特点。
我们不太认可现有的技术,我们觉得现有技术限制了预训练模型的能力,尤其是基于fine-tuning的实现。最主要的限制在于,标准语言模型都是单向的,这回导致预训练阶段的选择减少。举例来说,在GPT中,作者使用一种left-to-right的语言阅读架构,这就意味着在Transformer模型中的每个分词在自注意力层(self-attention layers)中只能依赖于它前序的分词。这种限制对于句子级的任务是次优的,但在应用到分词级的任务时将会是有害的,比如说问题回答任务。
注释:单向和双向
自然语言有left-to-right和right-to-left两种阅读方式,例如英语就是left-to-right,阿拉伯语就是right-to-left。单向就是指按照一种方向让机器阅读语言,双向就是指让机器用不同的方向阅读语言两次。双向语言模型可以适配更多的语言数据集。
在这篇论文中,我们优化了基于fine-tuning的实现方式,提出BERT:基于Transformers的双向编码表示(Bidirectional Encoder Representations from Transformers)。BERT降低了前述单向实现的限制,通过在预训练阶段引入一个遮挡语言模型(Masked Language Model,MLM)。MLM给输入的分词信息随机进行遮挡(mask),训练目标是基于上下文推测出遮挡位置的原词。不像left-to-right预训练语言模型,遮挡使得句子混淆了左右方向概念,这将有助于我们在预训练阶段得到一个双向语言模型。另外我们还使用“下一句预测”任务来预训练文本对表示。
这篇文章的重大贡献如下:
1.我们证明了双向预训练对于语言模型的重要性。这有别于GPT模型的left-to-right单向训练模式。
2.我们证明了预训练可以显著降低下游特定任务模型训练框架的复杂度。BERT是第一个基于fine-tuning模式,在句子级和分词级达到工业应用水平的语言模型。
3.BERT打破了11项语言测试记录。
本节我们将回顾一下通用预训练语言模型领域,最负盛名的几个工作成果。
从广泛的单词表征中学习是近几年的研究热点,包括非神经性和神经的方法。预训练单词嵌入就是现代NLP系统的切分部分,为模型提供了重要的性能提升。为了预训练词嵌入向量,使用了从左到右的语言建模目标,以及在左右上下文中区分正确和不正确单词的目标。
这些实现大多是粗粒度的,例如句子嵌套或者段落嵌套。为了训练句子级别的表征,先前的工作使用目标对候选句子进行排序,基于前一个句子从左到右的生成下一个句子的单词。
ELMo及其先前的模型从另一个不同的维度进行研究。他们从左至右和右至左的双向语言模型中,提取出上下文敏感的特征,每个表征都是文本的双向连接信息。ELMo模型提升了这个领域的水准,包括问题回答、情绪分析、实体命名。
与基于特征的方法一样,第一步工作也只从未标记的文本中预训练单词嵌入参数。
近期,能够产生文本级分词表征的句子或文档编码,已经通过在未标注数据中通过预训练模型和下游任务调参得到,例如2018年GPT模型所研究的。这种实现的优势在于,在二阶段训练时,几乎不需要再对参数进行多大的架构修改。基于这种优势,GPT模型实现了多个领域的指标突破。左至右的模型和自动编码任务被应用于相关预训练模型。
有很多研究证明了基于大量有监督数据的迁移学习的有效性,例如文本推理、机器翻译等领域。计算机视觉研究也证实了从预训练模型中进行迁移学习的有效性。
注释:迁移学习(transfer learning)和预训练(pre-training)的区别
Transfer learning基于一个与本任务相关的特定任务模型,继续进行fine-tuning优化;
Pre-training基于一个在大数据上预训练的泛化模型,在下游特定任务上进行fine-tuning优化;
我们将在本章节介绍BERT的实现。在我们的框架中有两个步骤:预训练和调参。在预训练阶段,模型在未标注的数据集上,进行不同任务目标的训练。在调参阶段,BERT首先基于预训练的参数进行初始化,接着所有参数会基于下游特定任务进行调参训练,每一个下有任务都会分离出一个调参模型。
BERT模型的一个特性就是在下游不同任务训练时,它使用一个通用架构。我们尽可能保证预训练阶段和调参阶段架构之间差异的最小化。
图1.BERT处理pre-training和fine-tuning的流程图
BERT的架构是一个基于多层双向Transformer encoder的原始实现。由于在该领域Transformer几乎是默认实现,我们的实现方式与主流方式也没有太大的区别,因此我们会做一个简要的说明。
在这项工作中,我们将中间层数量记为L,隐藏大小记为H,自注意力头的数量记为A。我们主要训练了两种大小的模型,BERT base版,L=12,H=768,A=12,总参数数量为11亿(对应的GPT参数数量为11.7亿)。BASE large版,L=24,H=1024,A=16,总参数量为34亿。
BERT base版和GPT几乎是一样大的,所以他们之间可以进行效果比较。不过BERT使用了双向自注意力机制,而GPT使用了从左开始的单向自注意力机制。
为了使BERT能适配大量的下游任务,我们让输入在一个句子和一对句子(例如问答对)上都表示的非常明确。在我们的工作中,一个句子指代任意文本组合的一个句子,并不是非要符合语义才行。
我们使用WordPiece,它包含30000个分词单词。第一个分词(token)代表分类[CLS],最后一个分词(token)代表分类的大总类[SEP]。句子对被打包成一个句子序列形式。我们通过两种方式对这两种句子进行区分。第一,我们用一个特殊的分词符号进行标记。第二,我们增加一个训练嵌套符号,来表示当前句子属于哪种类型。对于一个给定的分词token,它实际上是对应分词token信息、片段信息、位置嵌套信息的总和。
图2.BERT输入表示
不像之前的研究仅仅使用左至右或右至左的单向语言模型,BERT采用双向语言模型。
直观来说,双向语言模型的效果必然好于单向语言模型。双向模型调节会让每个单词看到它自己,于是模型就可以在多层上下文中精准预测目标单词。
为了得到一个深度双向表征,我们将输入语句中的部分单词随机遮挡,然后让模型去预测这些被遮挡的单词。我们将这一过程称为遮罩的语言模型(Masked LM,MLM)。在我们所有的实验中,我们随机遮挡了WordPiece中15%的单词。
这个过程存在缺点,它会导致pre-training模型和fine-tuning阶段失去关联性,因为遮罩处理不会在fine-tuning阶段出现。为了避免这个问题,我们在遮罩动作时并不是总是使用[Mask]分词。训练数据选择15%的分词位置用来做随机遮罩预测,如果第i个位置被选中,80%情况我们使用[Mask]分词,10%情况我们使用随机分词,10%情况我们不改。在这种操作下,Ti会被准确的预测出来。
诸如问题回答(Question Answering,QA)、语言推理(Natural Language Inference,NLI)等许多下游任务,都是基于对两个句子之间关系的理解,而不是直接由模型得出。为了训练出一个能捕获句子间关系的模型,我们预训练一个二进制的NSP任务。具体来说,当选择A和B两个句子时,将会有50%的概率B就是A的关联句,而50%的概率B是一个与A无关的句子。这种做法对QA和NLI任务都有很大的帮助。
BERT与先前研究不同的点在于,先前的模型只是将句子嵌套信息转入下游任务。而BERT在初始化时,将所有的参数转入下游任务。
在预训练阶段,我们使用BooksCorpus和English Wikipedia数据集,BookCorpus包含80亿个单词,English Wikipedia包含250亿个单词。对于Wikipedia我们只挖掘其中的文本段落,我们剔除了序列数据、表格数据、头数据。
对于需要文本对的应用来说,一个通用公式就是在应用双向交叉注意之前将文本对进行独立编码。BERT在这个阶段没有使用自注意力机制,因为使用自注意力机制来给文本对进行编码,需要包含在两个句子之间进行交叉注意。
对于每个任务,我们都进行了部分插件定制,并将BERT所有参数都进行fine-tuning调参。在输入阶段,预训练阶段的句子A和句子B在段落配对句子、假设前提、问题段落对、分类文本都是相似的。在输出阶段,分词表征被喂进输出层,例如序列标记或者问题回答。而[CLS]表征被喂到输出层用作分类,例如语言内涵或情绪分析。
和预训练阶段相比,调参阶段成本更低。本文中所有的实验结果都可以被复现。
以下为BERT调参模型在11项NLP任务中得出的结果。
通用语言理解评估(General Language Understanding Evaluation,GLUE)是一个大量自然语言理解任务的集合。
为了让预训练模型调参到GLUE,我们按照第三章节描述的方法对输入序列进行表示,并用一个最终的隐藏数组来对应最开始的输入分词[CLS]。Fine-tuning阶段唯一增加的新参数是一个分类层比重W∈ R (K×H),其中K是标记的数量。我们用C和W计算了标准的分布损失,log(softmax(CWT )).
我们使用一个大小为32的batch进行3轮fine-tuning。每一个任务,我们选出最佳的学习速率,介于5e-5, 4e-5, 3e-5, and 2e-5。另外,在BERT large版本中,我们发现fine-tuning在小数据集上训练有时是不稳定的,所以在这种情况下我们使用随机重启并选择适应的模型进行学习。通过使用随机重启,我们使用相同的预训练模型,但是使用不同的fine-tuning洗牌和分类层初始状态。
表1.GLUE测试结果
表1中展示了结果。BERT的base版和large版在所有任务上均领先,可以观察到,BERT base版和GPT模型大小几乎一致,但是所有测试成绩均优于GPT。BERT large版优于BERT base版,说明我们的模型架构依然可以通过增加参数数量和模型大小来提升效果,模型依然处于欠拟合状态。
标准问题回答数据集(SQuAD v1.1)是一个拥有10万个问题/答案文本对的数据集。给定一个问题和一个来自Wikipedia的文本段落,训练任务的目标就是在这个文本段落中找出并能预测问题的答案。
我们对于这个任务,在模型上同样做了一些细微的调整。表2展示了测试结果排行榜。从结果可以看到我们最好的系统超越了过去的成绩,达到+1.4F1和+1.3F1。
表2. SQuAD v1.1测试结果
SQuAD v2.0任务是SQuAD v1.1的延伸,2.0版本中的回答更加的基于现实。
我们用一个简单的实现,直接从SQuAD v1.1模型继承得来。实验结果入表3所示,相比于先前的系统,我们得到了+5.1F1的提升。
表3. SQuAD v2.0测试结果
The Situations With Adversarial Generations(SWAG)是一个包含11.3万个句子对的数据集,用来评估常识推理能力。给定一个句子,模型的任务是从四个似是而非的选项中选择一个最相关的推理分析。
在SWAG数据集上进行fine-tuning时,我们构造了四个输入序列,每一个都包含了给定句子的连接(句子A)和一个句子的延续(句子B)。最终结果显示BERT large版本将基线成绩提升了27.1%,这个成绩同样超过GPT的成绩8.3%。
表4.SWAG测试结果
消融研究是,排除某一个模型结构之后,来研究这个结构对模型整体的作用有多大。
我们评估了两种不同预训练目标(单向和双向)对于最终模型的影响,其他条件诸如训练数据、fine-tuning策略、超参数,全都保持不变。
表5.使用BERT base版的预训练消融实验结果
No NSP:一个使用遮罩语言模型(masked LM,MLM)训练的双向模型,但是没有下一句预测(next sentence prediction,NSP)任务。
LTR & No NSP:一个仅仅左至右的单向语言模型,不使用MLM策略。仅从左边的单向限制也被应用于fine-tuning阶段。并且这个模型在预训练阶段没有NSP任务,这是为了直接和GPT模型进行对比,但是依然使用BERT架构中的训练数据、输入表征、调参策略。
我们首先实验了NSP任务的影响,结果在表5中展示。移除NSP之后,在MNLI、QNLI和SQuAd 1.1测试结果引起了比较明显的下降。之后,我们评估了No NSP和LTR & No NSP,LTR单向模型在所有测试上均明显差于MLM模型。
对于SQuAD测试来说,可以非常直观的理解LTR模型不如MLM模型。为了适当的增强LTR模型的能力,我们在BiLSTM增加了一种随机初始化能力,这提升了SQuAD的测试结果,但和双向模型相比依然差很多。同时,BiLSTM的加入导致其他GLUE测试项更差。
我们训练了不同版本的BERT模型,这些模型具有不同的层数、隐藏单元、注意力头。实验结果如表6所示。表6列出了Dev Set Accuracy测试的的平均结果,我们可以看到更大的模型可以带来更多的精准度提升。
表6.BERT不同模型大小
过去的研究已经证明了更大的模型可以在大型任务上带来更好的效果,诸如机器翻译和语言模型领域。但我们的研究首次证明了扩大模型的大小同样可以在小任务上带来巨大的提升。作为对比,过去一些研究发现feature-based实现方式在小任务上扩大模型大小已经不能带来明显提升,而我们证明了基于fine-tuning实现方式的模型,可以通过扩大模型大小不断提升在小任务上的效果。
以上所有的实验结果都是基于fine-tuning实现的,在fine-tuning实现下,预训练模型会被加入一个简单的分类层,并且所有的参数都会在下游任务学习时被重新调参。对于feature-based实现,我们会从预训练模型中提取混合的特征,这种方案是会产生一定优点的。首先,不是不是所有任务都可以在Transformer encoer架构下被机器表示出来,因此需要给模型加入特定任务的训练架构。其次,feature-based实现的训练成本更低。
本章节我们将对比两种实现在CoNLL-2003命名实体识别(Named Entity Recognition,NER)任务中的效果。在输入阶段,我们使用WordPiece模型,并且使用数据提供的最大的上下文。
表7.CoNLL-2003实验结果
为了消融fine-tuning实现,我们使用feature-based实现,从许多中间层提取出活化因子,并且去除了所有fine-tuning的参数。表7中展示了实验结果,最好的一种实现方式仅和fine-tuning实现方式低了0.3F1,这证明了BERT架构能很好的同时适配fine-tuning和feature-based下游实现。
最近由于语言模型迁移学习的经验改进表明,无监督预训练成为了许多语言理解系统模型的不可或缺的组成部分,重点在于这些结果更使训练数据很少的任务也能从深度单向架构中受益。我们的贡献是进一步将这些发现推广到深度双向架构,允许相同的预训练模型成功地处理广泛的NLP任务。