研究问题
BERT为transformer模型的双向编码器表示。BERT工作是基于GPT、ELMo工作的,本文讲述了三者区别,重点讲述BERT。
一.摘要
首段讲述本文工作对GPT和ELMo做出怎样的改进,第二段是BERT结果怎样好,讲述BERT在NLP(自然语言处理方面)取得了先进的成果,包括绝对精度和相对精度。
BERT、GPT和ELMo的区别:
GPT使用新的Transformer架构,使用左侧信息来预测未来信息。单项模型的缺点主要是不能获得好的词表示。
ELMo通过使用从左到右(LTR)、从右到左(RTL)两个模型的输出拼接获得词的表示,双向信息融合的浅,且由于基于RNN架构,当涉及到下游任务时,需要对架构做出调整。
BERT基于Transformer架构,使用双侧信息,使用没有标号的数据,当涉及下游任务时,和GPT一样只需要微调输出层。
二.Introduction
第一段:语言模型预训练可以改善许多NLP任务:
(1)句子级别的任务:主要用来建模句子之间的关系,比如对句子的情绪识别或者两个句子之间的关系
(2)词元层面(token-level)的任务:包括实体命名的识别(对每个词识别是否为实体命名,人名街道名等等)
第二段:在预训练模型做特征表示的时候,一般有两种策略:
一种策略是基于特征(feature-based),举例ELMo,对每一个下游任务构造一个与该任务相关的神经网络,然后将预训练好的表示(比如词嵌入)作为一个附加特征,将其和原始输入一起放进模型中,由于附加特征已经有了好的表示,所以训练起来比较容易,这也是NLP中使用预训练模型最常用的方法。
另一种策略是基于微调(fine-tuning ),举例GPT,将预训练好的模型放在下游任务时不需要改变太多,只需要在输出层稍微改动,再使用自身数据做一个增量训练,对训练好的参数在下游训练中进行微调。
第三段:提出上述两种策略的局限性。
这两种方法在预训练过程中使用的都是一个目标函数,即单向的语言模型(给定一个词预测下一个词是什么,给出一句话预测下一个词),限制了预训练表达的能力。以GPT为例,使用从左到右架构(只能从左到右看句子),但是在句子层面要去看句子的情绪时,从左到右和从右到左都是合法的;同样在词元层面一样,Q&A也是看完问题去选答案,并非一步一步往下走。
第四段:针对上述问题,提出如果将双向信息都加进去,性能应该是有提升,所以提出BERT。
使用带掩码的语言模型(MLM,masked language model)预训练目标,减轻了单向语言模型的限制。
(1)遮蔽语言模型在输入中随机屏蔽某些token,目的是根据上下文内容来预测被遮蔽的内容。(类似与完形填空)
(2)与标准的语言模型从左到右不同之处在于:带掩码的语言模型允许看左右两侧的信息,这样允许训练更深的双向的transformer模型。
(3)此外,还训练了一个任务,判断两个句子在原文中是相邻的还是随机采样的,这样就训练了句子层面的任务。
第五段:本文贡献:
(1)证明了双向语言信息的重要性。GPT使用单向语言模型,而BERT使用掩码语言模型实现预训练的深度双向表示。ELMo仅仅将从左到右和从右到左的信息简单组合,类似于双向RNN模型,而BERT更好的应用了双向信息。
(2)一个较好的预训练模型,不需要针对具体的下游任务设计特定的神经网络。BERT是第一个基于fine-tuning的表示模型,在语句层面和词元层面都取得很好的成果。
(3)BERT推动了11项NLP任务的发展。
三. Related Work
2.1 Unsupervised Feature-based Approaches(基于特征的无监督方法)
主要将词嵌入、ELMo和以后的一些工作。
2.2 Unsupervised Fine-tuning Approaches(无监督的微调方法)
代表作GPT
2.3 Transfer Learning from Supervised Data(监督数据中的迁移学习)
计算机视觉研究证明了从大型预训练模型进行迁移学习的重要性,方法是对通过对数据集预训练的模型进行微调。在NLP中,已经有标号而且比较大的数据(包括自然语言的推理和机器翻译这两块中都有比较大的数据集),在这些有标号的数据集上训练好了模型,然后在别的任务上使用,效果是非常好的。但是在NLP领域,迁移学习的应用不是特别理想,一方面可能是因为这两个任务跟别的任务差别还是挺大的,另一方面可能是因为数据量还是远远不够的。BERT和他后面的一系列工作证明了在NLP上面使用没有标号但大量的数据集训练成的模型效果比在有标号但小一点的数据集上训练的模型效果更好,同样的想法现在也在慢慢地被计算机视觉采用,即在大量无标签的图片上训练的模型,可能比在ImageNet上训练的模型效果更好。
四.BERT
(1)BERT框架有两个步骤:预训练和微调。
预训练是在无标签数据集上训练的。微调使用的也是BERT模型,其权重初始化为预训练权重,所有权重在微调时都会参与训练,微调时使用带有标签的数据。每个下游任务都会创建一个新的BERT模型,根据自己有标记的数据进行训练。
(2)Model Architecture模型架构
BERT模型架构是多层Transformer的Encoder。
三个参数:L(transformer的个数);H(隐藏层的大小);A(多头自注意力机制的头数)
两个模型:
BERT base:跟GPT模型的参数差不多,来做一个比较公平的比较。BERT base(L=12,H=768,A=12,Total Parameters=110M)
BERT large:用来刷榜。BERT large(L=24,H=1024,A=16,Total Parameters=340M)
(3)可学习参数的大小
BERT可学习参数来自词嵌入层和transformer块。
嵌入层:就是一个矩阵,输入是字典的大小(假设30k),输出是隐藏单元的个数(H)
transformer块中有两块:
A.自注意力机制。本身没有学习参数,但是多头注意力会把所有K、V、Q分别做一次投影,每次投影的维度是64。因为有多个头,投影前后维度不变,头的个数A*64等于H,参数矩阵 (WQ,WK,WV)在每个头之间合并起来其实就是H*H的矩阵了。输出的多头注意力还会经过一个矩阵 WO将其映射回H维,也是一个H*H的矩阵,所以对于一个transformer块,他的自注意力可学习的参数是4H2
B.MLP:MLP里面需要两个全连接层,第一个层的输入是H,但是它的输出是4*H,另外一个全连接层的输入是4*H,输出是H,所以每一个矩阵的大小是H*4H,两个矩阵就是8H2
这两部分加起来就是一个transformer块中的参数,还要乘以L(transformer块的个数),所以总参数的个数就是30K⋅H+L⋅12H2,带入base的参数大概就是1.1亿。
(4)Input/Output Representations输入输出
A.Input sequence:
BERT预训练的输入统一称为Input Sequence。下游任务有的是处理一个句子,有的是处理两个句子,为了使BERT能够处理这些任务,所以Input sequence既可以是一个句子也可以是一个句子序列(此处句子可以是没有任何逻辑的词的组合)。与transformer不同:transformer在训练时,输入是一个序列对,因为它的编码器和解码器的输入都是序列;而BERT只有一个编码器,输入是一序列,为了让它处理两个句子,比需要把两个句子换成一个序列。
B.WordPiece
空格切词法:一个词就是一个token,BERT的训练数据量特别大,那么切割后的词典也会特别大。
WordPiece:如果一个词在数据集中出现的概率不大,那就继续把它切割子序列,如果子序列(很可能是词根)出现概率很大,那就只需要保留其子序列,此时词表(字典)小很多。
C.特殊记号
序列的第一个词总是永远是一个特殊记号[cls]。cls对应的最终输出可以代表整个序列的信息,如果是单句子分类,表示输入句子的类别;如果是句子对分类,表示输入句子是相关/不相关等。因为自注意力层每一个词都会去看输入输出中所有词,就算是放在词的首位,仍可以看到后面所有词,所以该记号不必须放在句尾。
句子对是合在一起输入的,但是为了实现句子层面的任务,需要将句子分隔开:有两种方法,一种是句尾加上[sep]来分割,另一种是在词嵌入层用一个可学习变量表示每个token是句子1还是句子2。
D.三种Embedding
对于给定token,它的输入表征是由token,segment和position Embedding相加构成的,得到的向量序列会进入Transformer块。
Token Embedding:将各词元转换成固定维度的向量
Segment Embedding:针对句子对任务设定的,用于区分两个句子,0表示句子a,1表示句子b,在单句子任务中编码都为0
Position Embedding:输入的大小就是这个序列的最大长度,输入就是这个词元在序列中的位置信息(从0开始)
(5)3.1 Pre-training BERT(MLM+NSP)
Task 1:Masked LM
随机屏蔽每个token序列的15%,将其替换为[MASK]([cls][sep]不做替换),让模型去预测这些空的词,将mask部分的相应输出向量通过一个Linear transform(矩阵相乘),并做Softmax得到一个分布,使其和MASK字符one-hot vector之间的交叉熵损失最小。本质上是在解决一个分类问题,BERT要做的是预测什么被盖住。
这带来的一个问题是,微调时数据中是没有[MASK]的,于是预训练和微调时看到的数据不一样。为了缓解这种情况,我们并不总是用实际的[mask]标记替换“masked”词。
如果某个token被选中masked,那么有80%的概率是真的将它替换成[MASK],还有10%的概率将它替换成一个随机的词元(噪音),最后有10%的概率维持原单词不变(仍然要做预测)。
Task 2:Next Sentence Prediction
选择的句子对A和B,B有50%的概率是A的下一句(is next),50%概率是在语料库中随机挑选的句子(not next),这就意味这50%的概率是正例,50%是负例。目的是让模型理解到两个句子之间的关系,从而能够应用于问答QA和自然语言推理NLI等下游任务中。
只看CLS的输出,CLS的输出经过和masking input一样的操作,目的是预测第二句是否是第一句的后续句。这是一个二分类问题,有两个可能的输出:是或不是。
(6)3.2 Fine-tuning BERT
由于Transformer使用的是自注意力机制,使得BERT可以应用于各种各样的下游任务。对于句子对任务,常规的做法是先单独对句子对编码,再计算交叉注意力。而BERT将其合为一步,即使用自注意力机制来对句子进行编码。
微调的过程中,对于下游任务的训练,仍然需要少量的标记数据。对于每个下游任务,只需将特定于任务的输入和输出连接到BERT中,然后端到端微调所有参数。
对于输入是两个句子(A和B)的任务,A和B可以是意思相同的两种表述,可以是假设-前提对,可以是问答系统中的问题-回答对,也可以是文本分类或序列标注的文本对。而在输出侧,token的输出向量用于分词级的分类任务,例如序列标注或问答系统;而[CLS]的输出向量用于分类任务,如蕴涵分析或情感分析等。不管怎么样都是在最后加一个输出层,然后用一个softnax得到想要的标号。
和预训练相比,微调便宜很多,TPU只需要跑1个小时,GPU几个小时也可以。
五.Experiments
4.1 GLUE数据集(分类)
GLUE基准是一个有着各种NLU任务的集合,是一个句子层面的任务。BERT把特殊词元[CLS]的输出向量C拿出来,放进学习到的输出层w,之后用softmax就能得到标号,这就变成了一个多分类问题了,即使用CLS最终输出向量来分类。
4.2 SQuAD v1.1(问答)
给定一段话,然后问一个问题,答案在给定的那段话中,预测答案在段落中所在的位置(这个片段的开头和结尾),类似于阅读理解。就是对每个词元进行判断,看是不是答案的开头或者答案的结尾。
具体来说就是学习开始向量S和结尾向量E,分别对应这个词元是答案开始的概率和答案最后的概率。对第二句话中每个词元,计算Ti和Si的点积,然后对段落中所有词的点积都进行softmax之后,得到这个段中每一个词元是答案开头的概率。结尾概率的计算同理。
4.3 SQuAD v2.0(问答)
4.4 SWAG(句子对任务)
SWAG数据集包括了113K个句子对,给定一个句子,任务是从备选的四个选项中选择最合理的下一句。在SWAG数据集上微调的时候,我们构造四个输入,每一个序列都是由给定的句子(sentenceA)和可能的下一句(sentence B)组成。唯一要引入的特定任务参数是一个向量,这个向量与[CLS] 的输出C进行点积表示为每一个选择的分数,然后用softmax得到概率。
六.Ablation Studies(消融实验,看每个部分的贡献)
5.1 Effect of Pre-training Tasks
5.2 Effect of Model Size
探讨模型大小对微调任务准确度的影响。使用不同的层数,隐藏单元,注意力头数训练了一些BERT模型,而其他超参数和训练过程与之前描述的一样。能够看出在所有的数据集上,越大的模型准确率越高。
5.3 Feature-based Approach with BERT(将BERT作为特征提取器)
将BERT作为特征提取器,而不是进行微调,效果相比之下会差一些。所以使用BERT应该微调。
七.Conclusion
实验表明,无监督预训练使得即使样本少(资源少)的任务也可以享受深度神经网络,主要的工作就是结合GPT的transformer架构和ELMo的双向信息处理创作BERT深层双向体系结构。
创新点
1.BERT与GPT、ELMo相关,在摘要部分讲出三者之间工作的区别。
2.在介绍自身模型好时,两个东西很重要,一个是好的绝对精度,另外一个是比其他好的相对精度。
3.鉴于NLP,可以尝试cv领域,在大量无标签的数据集上训练可能比在少量有标签的数据集上训练效果好。
知识点补充
1.Pre-training是在一个数据集上训练一个模型,但目的是解决另外一个任务,目标任务的训练是training,则在当前数据集上训练就叫做Pre-training预训练。
2.下游任务:主要指在实际应用场景中,使用预训练的模型或学到的特征进行具体任务的实施。
核心结论
(1)证明了双向语言信息的重要性。GPT使用单项语言模型,而BERT使用掩码语言模型实现预训练的深度双向表示。ELMo仅仅将从左到右和从右到左的信息简单组合,类似于双向RNN模型,而BERT更好的应用了双向信息。
(2)一个较好的预训练模型,不需要针对具体的下游任务设计特定的神经网络。BERT是第一个基于fine-tuning的表示模型,在语句层面和词元层面都取得很好的成果。
(3)BERT推动了11项NLP任务的发展。
论文不足
这篇文章认为本文的最大贡献就是双向性。BERT使用Transformer的编码器而不是解码器,好处是可以训练双向语言模型,在语言理解类的任务上表现比GPT更好,但是也有坏处,做生成类的任务不方便,比如机器翻译、摘要生成等等。只不过NLP领域,分类之类的语言理解任务多一些,所以大家更喜欢用BERT。
BERT所提供的是一个完整的解决问题的思路,符合了大家对于深度学习模型的期望:训练一个3亿参数的模型,在几百GB的数据集上预训练好,通过微调可以提升一大批NLP的下游任务,即使这些任务的数据集都很小
GPT和BERT是同期提出的模型,两者都是预训练模型微调,很多思路是一样的,即使后者效果好一点,但是早晚也会被后来者超越,那为啥BERT更出圈?因为BERT的利用率是GPT的10倍,影响力自然就大了10倍不止。