飞道的博客

详细介绍BERT模型

488人阅读  评论(0)

BERT简介

BERT通过在所有层中联合调节左右语境,从未标记的文本中预训练深度双向表征。因此,预训练的BERT模型可以通过一个额外的输出层进行微调,以创建最先进的模型,用于更广泛的任务,而无需对特定任务的架构进行大量修改。

BERT, OpenAI GPT, 和ELMo之间的区别


预训练模型结构的差异。BERT使用一个双向的Transformer。OpenAI GPT使用一个从左到右的Transformer。ELMo使用独立训练的从左到右和从右到左的LSTM的串联,为下游任务生成特征。在这三者中,只有BERT的表征在所有层中都是以左和右的上下文为共同条件的。除了架构上的差异外,BERT和OpenAI GPT是微调方法,而ELMo是基于特征的方法。

相关工作

目前有两种将预训练的语言表征应用于下游任务的策略:基于特征的和微调的。

1.非监督的基于特征的方法,如ELMo(尽管用了正向和反向的语言模型,可本质上仍然是用的两个单向的LSTM然后把结果拼接起来。),使用特定任务的架构,包括预训练的表征作为额外的特征。

2.非监督的基于微调的方法,如生成性预训练转化器OpenAI GPT(虽然它一样使用了transformer,但是只利用了一个方向的注意力机制,本质上也一样是单项的语言模型。),引入最小的特定任务参数,并通过简单地微调所有预训练的参数来训练下游任务。
这两种方法在预训练期间具有相同的目标函数,它们使用单向语言模型来学习一般的语言表征。

3.在有监督的数据上做迁移学习,也有工作表明,从具有大型数据集的监督任务中迁移是有效的,如自然语言推理和机器翻译。CV研究也证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的秘诀是对用ImageNet预训练的模型进行微调。

我们认为,目前的技术限制了预训练表征的力量,特别是对于微调方法。主要的限制是,标准的语言模型是单向的,这就限制了在预训练中可以使用的架构的选择。例如,在OpenAI GPT中,作者使用了一个左-右架构,每个标记只能关注Transformer的自我关注层中的先前标记。这样的限制对于句子级别的任务来说是次优的,之前基于微调的方法应用于问题回答等标记级别的任务时,可能会非常有害,因为在这些任务中,从两个方向纳入上下文是至关重要的。

BERT的改进

作为fine-tuning这一类的方法,作者提出了改进的方案:
而BERT:来自变形器的双向编码器表示法便是要改进基于微调的方法。
1.BERT通过使用**masked language model(MLM)**预训练目标,缓解了前面提到的单向性约束。masked language model从输入中随机地遮蔽一些标记,目标是仅根据其上下文来预测被遮蔽的单词的原始词汇ID。 与从左到右的语言模型预训练不同,MLM的目标是使表征融合左和右的语境,这使我们能够预训练一个深度的双向Transformer。
2.除了masked language model,Bert还使用了一个 "next sentence prediction "任务,联合预训练文本对的表示。

图1:BERT的整体预训练和微调程序。除了输出层之外,在预训练和微调中使用了相同的架构。相同的预训练模型参数被用来初始化不同下游任务的模型。在微调过程中,所有的参数都要进行微调。[CLS]是一个特殊的符号,加在每个输入例子的前面,[SEP]是一个特殊的分隔符。

BERT 的详细实现

在BERT中,有两个步骤:预训练和微调
在预训练期间,模型在不同的预训练任务的无标签数据上进行训练。

对于微调,BERT模型首先用预训练的参数进行初始化,然后用下游任务的有标签数据对所有的参数进行微调。每个下游任务都有单独的微调模型,尽管它们是用相同的预训练参数初始化的。

BERT的一个显著特点是它在不同任务之间的统一架构。预训练的架构和最终的下游架构之间的差异很小。BERT的模型架构是一个多层双向Transformer encoder。

三个参数:
L:transformer块的个数
H:隐藏层的大小
A:在自注意力机制里面那个多头的头的个数
两个模型:
BERTBASE(L=12, H=768, A=12, Total Param-eters=110M)
BERTLARGE(L=24, H=1024,A=16, Total Parameters=340M)

BERT Transformer使用的是双向的self-attention,而GPT Transformer使用的是受限的self-attention,每个token只能关注其左边的上下文。

输入/输出表示

为了使BERT能够处理各种下游任务,我们的输入表示能够在一个标记序列中毫不含糊地表示单个句子和一对句子(例如,〈问题,答案〉)。一个 "序列 "指的是输入到BERT的标记序列,它可能是一个单独的句子或两个句子挤在一起。

我们使用WordPiece嵌入,有30,000个标记词汇。 每个序列的第一个令牌总是一个特殊的分类令牌([CLS])。 与该标记相对应的最终隐藏状态被用作分类任务的集合序列表示。 句子对被打包成单一序列。

因为两个句子可能在一起,所以可以用两种方式来区分这些句子。 1.我们用一个特殊的标记([SEP])将它们分开。2.我们给每个标记添加一个学习过的嵌入标记,表明它是属于A句还是B句。

对于一个给定的标记,其输入表示是通过将相应的标记、段和位置嵌入相加而构建的。 图2是这种结构的可视化图。

预训练BERT

BERT整体是一个自编码语言模型(Autoencoder LM),它设计了两个任务来预训练该模型。第一个任务是采用 MaskLM 的方式来训练语言模型,随机屏蔽一定比例的输入标记,然后预测这些被屏蔽的标记。
第二个任务在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务,即预测输入 BERT 的两段文本是否为连续的文本,引入这个任务可以更好地让模型学到连续的文本片段之间的关系。

AR:autoregressive,自回归模型;只考虑单侧的信息,典型的就是GPT。
AE:autoencoding,自编码模型;从损坏的输入数据中预测重建原始数据,可以使用上下文的信息,BERT用的就是AE。

任务1:Masked LM(带掩码的语言模型)

深度双向模型严格来说比从左到右的模型或从左到右的模型和从右到左的模型的浅层串联更强大。不幸的是,标准的条件语言模型只能从左到右或从右到左进行训练,因为双向调节将允许每个词间接地 “看到自己”,并且该模型可以在多层次的背景下简单地预测目标词。

为了训练深度双向表征,我们只需随机屏蔽一定比例的输入标记,然后预测这些被屏蔽的标记。我们把这个过程称为 “masked LM”(MLM),常被称为Cloze任务。

在这种情况下,对应于掩码标记的最终隐藏向量被送入词汇的输出softmax,就像在标准LM中一样。在我们所有的实验中,我们随机屏蔽了每个序列中15%的所有WordPiece标记。我们只预测被屏蔽的词,而不是重建整个输入。

尽管这使我们能够得到一个双向的预训练模型,但缺点是我们在预训练和微调之间产生了不匹配,因为[MASK]标记在微调期间没有出现。

为了缓解这种情况,我们并不总是用实际的[MASK]标记来替换 "被屏蔽 "的单词。训练数据生成器随机选择15%的标记位置进行预测。如果选择了第i个令牌,我们就用(1)80%的概率替换成[MASK]标记(2)10%的概率随机标记(3)10%的概率未改变。然后,Ti将被用来预测具有交叉熵损失的原始标记。

任务二:下一句预测(NSP)

许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于对两个句子之间关系的理解,而语言建模并不能直接捕捉到这种关系。 为了训练一个能够理解句子关系的模型,我们对一个二进制的下一句预测任务进行了预训练,该任务可以从任何单语语料库中简单地生成。 具体来说,在为每个预训练例子选择句子A和B时,50%的概率B是A后面的实际下一句(标记为IsNext),50%的概率是语料库中的一个随机句子(标记为NotNext)。 针对这一任务的预训练对QA和NLI都非常有益。

图2:BERT输入表示。输入嵌入是标记嵌入、分段嵌入和位置嵌入的总和。

微调BERT

微调是直接的,因为Transformer中的自我注意机制允许BERT通过替换适当的输入和输出来模拟许多下游任务,无论它们涉及单个文本还是文本对。对于涉及文本对的应用,一个常见的模式是在应用双向交叉注意力之前对文本对进行独立编码。

BERT则使用自我注意机制来统一这两个阶段,因为用自我注意对串联的文本对进行编码,有效地包括两个句子之间的双向交叉注意力。

对于每个任务,我们只需将特定任务的输入和输出插入BERT,并对所有参数进行端到端的微调。在输入端,预训练中的句子A和句子B类似于(1)转述中的句子对,(2)必然性中的假设-前提对,(3)问题回答中的问题-段落对,和(4) 文本分类或序列标签中的退化文本-∅对。在输出层,标记表征被送入输出层,用于标记级任务,如序列标签或问题解答,而[CLS]表征被送入输出层,用于分类,如包含关系或情感分析。

与预训练相比,微调的成本很低。从完全相同的预训练模型开始,最多只需1小时就可以在一个独立的云TPU上完成所有的结果,或者在一个GPU上多花几个小时。

BERT用在下游任务

GLUE(一个自然语言任务集合)

一般语言理解评估(GLUE)基准是一个多样化自然语言理解任务的集合。为了在GLUE上进行微调,我们按照上文所述表示输入序列(对于单句或句子对),并使用与第一个输入标记([CLS])对应的最终隐藏向量C∈RH作为总体表示。在微调过程中引入的唯一新参数是分类层权重W∈RK×H,其中K是标签的数量。我们用C和W计算一个标准的分类损失,即log(softmax(CW T ))。

表1:GLUE测试结果,由评估服务器打分,每个任务下面的数字表示训练实例的数量。

SQuAD v1.1(QA数据集)

斯坦福大学问题回答数据集(SQuAD v1.1)是一个由10万个众包问题/答案对组成的集合。如图1所示,在问题回答任务中,我们将输入的问题和答案表示为一个单一的打包序列,其中问题使用A embedding,段落使用B embedding。

表2:SQuAD 1.1的结果。BERT组合是7个系统,使用不同的预训练检查点和微调seeds。

SQuAD v2.0

SQuAD 2.0任务扩展了SQuAD 1.1的问题定义,允许在提供的段落中不存在简短的答案,使问题更加现实。

我们使用一个简单的方法来扩展SQuAD v1.1的BERT模型来完成这项任务。我们将没有答案的问题视为有一个答案跨度,其起点和终点在[CLS]标记处。开始和结束答案跨度位置的概率空间被扩展到包括[CLS]标记的位置。

表3:SQuAD 2.0的结果。我们排除了将BERT作为其组成部分之一的条目。

SWAG

有对抗性的情况(SWAG) 数据集包含11.3万个句子对组合的例子,评估接地气的常识性推理。

在SWAG数据集上进行微调时,我们构建了四个输入序列,每个序列都包含给定句子(句子A)和可能的续篇(句子B)的连接。

唯一引入的特定任务参数是一个向量,其与[CLS]标记代表C的点积表示每个选择的分数,该分数用softmax层归一化。 结果见表4。 BERTLARGE比作者的基准ESIM+ELMo系统高出27.1%,比OpenAI GPT高出8.3%。

表4:SWAG开发和测试准确性。正如SWAG论文中报道的那样,人类的表现用100个样本进行了测量。

消融实验

在本节中,我们对BERT的一些方面进行了消融实验,以便更好地了解其相对重要性。

表5:使用BERTBASE架构对预训练任务的消融。"No NSP "是在没有下句预测任务的情况下进行训练。"LTR & No NSP “被训练为从左到右的LM,没有下句预测,就像OpenAI的GPT。”+BiLSTM "在微调期间在 "LTR + No NSP "模型的基础上增加了一个随机初始化的BiLSTM。

预训练任务的影响

我们通过使用与BERTBASE完全相同的预训练数据、微调方案和超参数评估两个预训练目标来证明 BERT 深度双向性的重要性:

No NSP:(去掉下一句预测)
一个双向模型,它使用 “遮蔽的语言模型”(MLM)进行训练,但没有 “下句预测”(NSP)任务。

LTR & No NSP:(去掉下一句预测并且不用带掩码的语言模型)
一个仅有左边语境的模型,它使用标准的从左到右(LTR)的LM进行训练,而不是使用MLM。

在微调时也应用了纯左约束,因为去除该约束后,会出现预训练/微调不匹配的情况,使下游性能下降。

此外,这个模型在没有NSP任务的情况下进行了预训练。这与OpenAI的GPT有直接的可比性,但使用了我们更大的训练数据集、我们的输入表征和我们的微调方案。我们首先检查了NSP任务带来的影响。在表5中,去除NSP后,QNLI、MNLI和SQuAD 1.1的性能明显下降。

接下来,我们通过比较 "No NSP "和 "LTR&No NSP "来评估训练双向表示的影响。LTR模型在所有任务上的表现都比MLM模型差,在MRPC和SQuAD上有很大的下降。对于SQuAD来说,直觉上很清楚,LTR模型在标记预测上的表现会很差,因为标记级的隐藏状态没有右侧上下文。

为了真诚地尝试加强LTR系统,我们在上面添加了一个随机初始化的BiLSTM。这确实大大改善了SQuAD的结果,但结果仍然比预训练的双向模型差很多。

BiLSTM损害了GLUE任务的性能。我们认识到,也可以像ELMo那样,单独训练LTR和RTL模型,并将每个标记表示为两个模型的连接。然而:
(1)这比单一的双向模型要贵一倍;
(2)这对于像QA这样的任务是不直观的,因为RTL模型不能对问题的答案进行调节;
(3)这严格来说不如深度双向模型强大,因为它可以在每一层使用左和右的上下文。

模型大小的影响

在本节中,我们探讨了模型大小对微调任务准确性的影响。我们训练了一些具有不同层数、隐藏单元和注意头的BERT模型,除此之外,还使用了与前面所述相同的超参数和训练步骤。

表6:BERT模型尺寸上的消融。#L =层数;#H =隐藏的大小;#A =关注头的数量。LM (ppl)是held-out训练数据的遮蔽的LM困惑度。

留出法(held-out)
留出法的含义是:直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另外一个作为测试集T,即D=S∪T,S∩T=0。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的评估。其中T也叫held-out data。

困惑度是用来衡量语言概率模型优劣的一个方法,困惑度越小,句子概率越大,语言模型越好。

选定的GLUE任务的结果显示在表6中。在这个表中,我们报告了5次随机重启微调的平均Dev集准确率。我们可以看到,更大的模型在所有四个数据集上都导致了严格的准确性提高,即使是只有3600个标记的训练例子的MRPC,也与训练前的任务有很大的不同。

同样令人惊讶的是,我们能够在相对于现有文献已经相当大的模型之上实现如此显著的改进。例如,《Attention Is All You Need》探索的最大的Transformer是(L=6,H=1024,A=16),编码器的参数为100M,而我们在文献中发现的最大的Transformer是(L=64,H=512,A=2),参数为235M。相比之下,BERTBASE包含110M参数,BERTLARGE包含340M参数。

众所周知,增加模型规模将导致大规模任务的持续改进,如机器翻译和语言建模,这一点可以通过表6中显示的保持训练数据的LM困惑度来证明。然而,我们认为这是第一个工作令人信服地证明了只要模型经过充分的预训练,扩展到极端的模型规模也会导致在非常小的规模任务上的巨大改进。

Peters等人(2018b)提出了关于将预训练的bi-LM大小从两层增加到四层的下游任务影响的混合结果;Melamud等人顺便提到,将隐藏的维度大小从200增加到600有帮助,但进一步增加到1,000并没有带来进一步改善。 这两个先前的工作都使用了基于特征的方法。

我们假设,当模型直接在下游任务上进行微调,并且只使用非常少的随机初始化的额外参数时,特定任务的模型可以从更大、更有表现力的预训练表征中受益,即使下游任务数据非常小。

基于特征的BERT方法

迄今为止,所有提出的BERT结果都使用了微调方法,即在预训练的模型中加入一个简单的分类层,并在下游任务中共同微调所有的参数

然而,基于特征的方法,即从预训练的模型中提取固定的特征,具有一定的优势。首先,并不是所有的任务都能很容易地用Transformer encoder架构来表示,因此需要增加一个特定任务的模型架构。其次,对训练数据表示进行一次昂贵的预计算,然后在这个表示之上用更便宜的模型进行许多实验,有很大的计算优势。

在本节中,我们通过将BERT应用于CoNLL-2003命名实体识别(NER)任务来比较这两种方法。

在BERT的输入中,我们使用了一个保全的WordPiece模型,并且我们包括了数据提供的最大的文档上下文。
按照标准做法,我们将其制定为一个标签任务,但在输出中不使用CRF层。 我们使用第一个子标记的表示作为对NER标签集的标记级分类器的输入。

不用微调方法,我们应用基于特征的方法,从一个或多个层中提取激活,而不对BERT的任何参数进行微调。 这些上下文嵌入被用作分类层之前随机初始化的两层768维BiLSTM的输入。

结果见表7。 BERTLARGE的表现与最先进的方法相比具有竞争力。表现最好的方法是将预先训练好的Transformer的前四个隐藏层的token表示连接起来,这比微调整个模型只差0.3个F1。 这表明,BERT对微调和基于特征的方法都很有效。

表7:CoNLL-2003的命名实体识别结果。超参数是用Dev集选择的。报告的Dev和Test分数是使用这些超参数的5次随机重启的平均分数。

结论

最近由于语言模型的迁移学习而带来的经验改进表明,丰富的、无监督的预训练是许多语言理解系统的一个组成部分。 特别是,这些结果使低资源的任务也能从深度单向的架构中受益。

BERT的主要贡献是将这些发现进一步推广到深度双向架构中,使同一预训练模型能够成功地处理一系列广泛的NLP任务。


转载:https://blog.csdn.net/zag666/article/details/127817715
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场