BERT(Bidirectional Encoder Representations from Transformers)是一个双向transformer编码器的言表示模型。来自论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
。由Google公司的研发,BERT的出现使得我们能够在一个大的数据集上面训练好一个比较深的神经网络,简化了NLP任务的训练,又提升了它的性能,使得自然语言处理有了质的飞跃。
基本信息
论文:Pre-training
of Deep
Bidirectional
Transformers for Language Understanding
地址:arxiv.org/abs/1810.04…
BERT全称:Bidirectional Encoder Representations from Transformers
源码:github.com/google-rese…
关键字:Pre-training(预训练)、Deep(深度)、Bidirectional(双向)
BERT特点
Pre-training
BERT的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。
在海量语料的基础上通过前期的Pre-training,让其达到一定的语言表达;后期再通过少量的样本,比如文本分类(正向、负向、中性等情感类文本分类)再进行训练,就可以达到很好的效果。
Deep
BERT-base采用12层Encoder,层数更深。它使用更强大的机器训练更大规模的数据,使BERT的结果达到了全新的高度,并且Google开源了训练好的多语言BERT模型代码,用户可以直接使用BERT作为Word2Vec的转换矩阵并高效的将其应用到自己的任务中。
Bidirectional
通过MLM(masked language model) 任务实现上下文理解。
和ELMo/GPT的区别
- GPT使用新的Transformers结构,用左侧信息去预测未来信息,单向模型的主要缺点在于不能获得足够好的词表示;
- ELMo通过从左向右(LTR)和从右向左(RTL)两个模型的输出拼接获得词的表示,双向信息融合的很浅,且由于基于RNN的架构,在应用到下游任务时,需要对架构做一些调整;
- BERT是基于Transformer,用了左右侧信息,使用的是没有标号的数据,用到一些下游任务的时候,和GPT一样只需要微调输出层就可以了。
和Transformer的区别
- 只使用了transformer的encoder,然后堆叠多层(12层)
- BERT的Transformer Encoder端输入的向量表示,多了Segment Embeddings。计算位置向量的时候是随机初始化加上带训练的,Transformer的位置编码是固定的。
BERT极大的拓展了Transformers的应用,使其可以在更大的无标签的数据集上训练,其效果比有标签、更小数据集上训练的模型效果还要好。
模型
网络层数L, 隐藏层维度H, Attention多头个数A,总参数TP(Total Parameters)
Bert参数计算见’附:BERT可学习参数计算’
机器学习相关术语
- few-shot learning(FSL 少样本学习)
- zero-shot learning(ZSL 零样本学习)
- Meta learning(学习其它机器学习任务输出的机器学习算法)
主要贡献
- 引入了Masked LM, 使用双向LM做模型预训练。为预训练引入了新目标NSP(预测上句和下句的关系),它可以学习句子与句子间的关系。
- 进一步验证了更大的模型效果更好: 12 --> 24 层。
- 为下游任务引入了很通用的求解框架,不再为任务做模型定制。
- 刷新了多项NLP任务的记录,引爆了NLP无监督预训练技术
应用场景
文本分类
标注数据是AI模型训练里最艰难的工作。NLP的标注更是需要投入大量的人力,文本标注因为没有标准答案比图像标注还要困难.而BERT在文本多分类的任务中,能在极小的数据下带来显著的分类准确率提升。有数据表示采用了BERT之后其效果显著提升。
BERT文本分类就是使用预训练的BERT模型来对文本进行分类,例如文本分类为新闻、科技、娱乐等类别。在这个过程中,BERT 模型可以自动学习到文本的语义信息,从而实现准确的分类。
网上教程:Bert Tutorial 文本分类指南
情感分析
在深度学习应用中,研究者主要在三个粒度级别上研究情感分析:文档级、语句级和方面级。其中文档级情感分类是指为观点型文档标记整体的情感倾向或极性,即确定文档整体上传达的是积极的还是消极的观点。句子级别的情感分类是确定单个给定句子中表达的情感。而方面级因为情感始终具有目标其情感分类会同时考虑情感和目标信息。
网络好文 基于BERT的中文情感分析指南
命名实体识别
命名实体识别(NER 也称为实体识别、实体分块 或 实体提取)是信息提取的一个子任务,旨在将文本中的命名实体定位并分类为预先定义的类别,如人员、组织、位置、时间表达式、数量、货币值、百分比等。而一个命名实体就是一个词语或是一个短语,它能够清晰地将一个物体和与他有相似属性的物体区分开来 (来自基于深度学习的NER综述)。
机器翻译
在基于BERT的机器翻译模型中,通常采用编码器-解码器结构。编码器负责将源语言句子编码成一系列的隐藏表示,而解码器则将这些隐藏表示解码成目标语言句子。BERT作为编码器的一部分,能够为解码器提供更加丰富的语义信息,从而提升翻译质量。
网络好文 INCORPORATING BERT INTO NEURAL MACHINE TRANSLATION
两阶段模型
BERT是一个预训练的语言表征模型,不再像以往的模型采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的masked language model(MLM) ,以生成深度的双向语言表征。
BERT模型是一个两阶段模型,第一阶段 pre-training,第二阶段 fine-tuning。即预训练和微调。
第一阶段: 预训练阶段
预训练阶段模型有两个任务,即Masked Language Model (简称MLM) 和Next Sentence Prediction (简称NSP)。
第二阶段: 预训练后
只需要添加一个额外的输出层进行fine-tune,就可以在各种各样的下游任务中取得state-of-the-art的表现。在这过程中并不需要对BERT进行任务特定的结构修改。
除了输出层之外
- 在预训练和微调中都使用了相同的架构,还使用了相同的预先训练过的模型参数d为不同的下游任务初始化模型。
- 在微调期间,所有参数都会进行微调。[CLS]是添加在每个输入示例前面的一个特殊符号,而[SEP]是一个特殊的隔板 工具标记(例如,分离问题/答案)。
[CLS]
和[SEP]
用于表示句子的开始和结束,或者在处理多个句子时进行分隔 BERT的主要特征是,对于不同的任务都有一个统一的模型结构,是一个泛化能力较强的预训练模型。
自监督学习
在机器学习中,最常见的是有监督学习,即通过人工对数据进行标注,然后在提供输入x 和 标签y的情况下,对模型进行训练,让模型输出`y`尽可能与标签y一致。
自监督不需要人工标注,通过将数据处理成两部分,一部分作为输入x一部分作为标签X,然后使用这组数据对模型进行训练,让模型输出y尽可能与标签一致。由于自监督不需要大量的人工标注,因此能够极大的降低模型训练成本。BERT的大规模预训练就是基于自监督学习。
图示说明
- 左侧为有监督学习:模型、标签
- 右则为自监督学习:数据本身就有Label, MLM’s masked通过掩盖(或称之为完形填空)的方式,将Label提取,把数据变为有标签的数据。
Pre-training
预训练任务之MLM(Masked Language Model)
在每一个训练序列中以15%的概率随机地选中某个token进行MASK,当一个token被选中后,有以下三种处理方式(my dog is hairy 为例):
- 80%的概率被[MASK]。如:my dog is hairy --> my dog is [MASK]
- 10%的概率修改为随机的其他token。如: my dog is hairy --> my dog is apple
- 10%的概率不变。如,my dog is hairy --> my dog is hairy
然后在对该位置的MASK进行预测: 主要是对80%被掩码的数据进行预测,预测被掩码的位置上的数据,如果预测错了,计算损失进行反向传播。
上述操作方法主要是要解决BERT的两个缺点:
- 因为Bert用于下游任务微调时,
[MASK]
标记不会出现,它只出现在预训练任务中。这就造成了预训练和微调之间的不匹配,微调不出现[MASK]
这个标记,模型好像就没有了着力点、不知从哪入手。所以只将80%的替换为[MASK]
,但这也只是缓解、不能解决。 - 相较于传统语言模型,Bert的每批次训练数据中只有15%的标记被预测,这导致模型需要更多的训练步骤来收敛。
预测训练任务之NSP(Next Sentence Predict)
除了masked的自监督的构建方式,对于每一个训练样例又以另外一种方式(NSP)进行预测,主要原理:
- 将一句话的前后两句话拿出来
- 50%的概率保持原有顺序 (标注为IsNext)
- 50%的概率后面的句子被替换为文档的其他随机句B (标注为NotNext)
这就意味着50%的样本是正例,50%的样本是负例,接下来把训练样例输入到BERT模型中,用[CLS]对应的信息去进行二分类:
预测当前句子是否有Next sentence的关系,是否是前后句。
假定1代表是一句话,0代表不是一句话。那么:如果概率>0.5,表不变,标签为0;概率 <0.5,表变化,标签为1
经过上面两个任务的处理,训练数据如下所示(为了方便浏览,制作成表格样式):
两个任务共享Bert,使用不同的输出层,做Muti-Task
Bert双向的理解
Bert可以看作Transformer的encoder部分,Bert模型舍弃了GPT的attention mask。双向主要体现在Bert的预训练任务一:遮蔽语言模型(MLM)。如:
我 [MASK] 学 习 英 语。
这句话输入到模型中,[MASK]通过attention均结合了左右上下文的信息,这体现了双向。
attention是双向的, 只是GPT通过attention mask达到单向,即让[MASK]看不到 学 习 英 语这四个字,只看到上文 我 喜 欢 。
附录
语言模型预训练可改善的NLP任务与策略
语言模型预训练可以改善许多NLP任务,这些任务包括:
- 用来建模句子之间的关系,比如说对句子的情绪识别或者两个句子之间的关系
- 实体命名的识别(对每个词识别是不是实体命名,比如说人名、街道名)
在使用预训练模型做特征表示的时候,一般有两类策略
- 一个策略是基于特征feature-based的(代表作是ELMo):对每一个下游的任务构造一个跟这个任务相关的神经网络,然后将预训练好的这些表示(比如说词嵌入)作为一个附加特征把它们和原始输入一起放进模型中。
- 另一个策略是基于微调fine-tuning的: 就是把预训练好的模型放在下游任务的时候不需要改变太多,只需要简单的修改一些输出层,再用我们自己的数据进行一个增量训练,对预训练好的参数会在下游的数据上再进行微调。
来自李沐老师关于BERT论文精读的内容。
BERT可学习参数计算
BERT模型可学习参数来自词嵌入层和Transformer块
嵌入层 就是一个矩阵,输入是字典的大小(这城假设是30k),输出是隐藏单元的个数(这里假设是H)
transformer块有两部分:
第一次看时,认真清楚的核算过。这次排版,有点忘了以前是怎么计算的,希望没有排错。
来自李沐老师关于BERT论文精读的内容。
BERT与GPT的比较
架构层面
- GPT采用单向的Transformer Decoder结构,只能利用上文信息无法利用下文信息。在预训练时使用了"语言模型(LM)“和"下一句预测(NSP)”。
- BERT采用双向Transformer Encoder结构,在预训练阶段使用了"遮盖语言模型(Masked Language Model,MLM)“和"下一句预测(Next Sentence Prediction,NSP)”
训练任务
- 在GPT两个预训练任务中,语言模型任务是模型根据前面的文本预测下一个单词;在下一句预测任务中模型则需要判断两个句子是否相邻。
- 在BERT预测训练任务中,遮盖语言模型是模型根据上下文预测被遮盖的单词;在下一句预测任务中模型则需要判断两个句子是否相邻,并给出是或否的预测结果
数据集
- GPT使用的是使用了WebText等大型文本语料库
- BERT使用了Wikipedia等大型文本语料库,以及BookCorpus等小型语料库
应用场景
- GPT适用于于语言生成、文本补全、问答等任务。
- BERT适用于文本分类、命名实体识别、情感分析等任务