NAACL 2019 |BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding
1.摘要
Bert的提出:
GPT unibidirectional, 使用左边的上下文信息来预测未来,down-stream 任务只需改最上层
ELMo 基于RNN,将从左向右和从右向左的RNN拼接起来,down-stream 任务需要调整一点架构
Bert bidirectional 使用左右侧的上下文信息,based on Transformers,down-stream 任务只需改最上层
BERT:(Bidirectional Encoder Representations from Transformers)
Bert 是在 GPT 和 ELMo 的基础上的改动
Bert的设计思想:
从无标记的文本中联合上下文信息 pre-train 得到无标记文本的 deep bidirectional representation(深度双向表示)
pre-trained BERT 可以通过加一个输出层来 fine-tune, 在很多任务上有SOTA结果,而不需要对特定任务做框架上的修改
Bert 的好处:
simple and empirically powerful
在11项NLP任务上取得了SOTA的结果,(相对精度+绝对精度)
2.前言
Language model pre-training 可以有效提升NLP任务的性能
NLP任务分类:
- sentence-level tasks NLI,句子关系,句子情绪识别
- token-level tasks named entity recognition(NER),QA,需要fine-grained output(细粒度输出)
pre-trained language representations 应用于down-stream 任务的两类策略:
-
基于特征
如ELMo,构建和每一个下游任务相关的 NN 架构;训练好的特征(作为额外的特征) 和 输入 一起放进模型
-
微调
如GPT,所有的权重参数根据新的数据集进行微调
两种方法在预训练期间共享相同的目标函数
ELMo 和 GPT 预训练时使用 unidirectional language model,使用相同的目标函数
当前技术的局限性:
标准语言模型是单向的,限制了在预训练期间模型架构的选择
如何解决:
Bert 使用MLM(带掩码的语言模型)作为预训练的目标,来缓解语言模型的单向约束
-
MLM做法:
每次随机选输入的词源 tokens, 然后 mask 它们,目标函数是预测被 masked 的词;类似完形填空
-
MLM和标准的语言模型的区别:
标准的语言模型只看左边上下文的信息,MLM可以看左右的上下文的信息,pre-train deep bidirectional transformer 的基础
Bert除了MLM还用了什么:
-
NSP:next sentence prediction
用于判断两个句子是随机采样的还是原文中相邻的
本文的三个贡献:
-
the importance of bidirectional pre-training for language representations(双向预训练对于语言表征的重要性)
GPT 只用了单向的语言模型进行预训练
ELMo 把独立训练的从左到右和从右到左的语言模型 shallow concatenation 拼接在一起
-
BERT是第一个基于微调的表示模型,在大量句子级和令牌级任务上取得了最先进的性能,超过了许多特定任务的体系结构。对于特定任务,不用对模型架构做一些改动
-
开源
3.相关工作
对 pre-training general language representations (预训练通用语言表示)最广泛使用方法的回顾
-
Unsupervised Feature-based Approaches
无监督的基于特征的方法: 词嵌入,ELMo
-
Unsupervised Fine-tuning Approaches
无监督的基于微调的方法:
-
Transfer Learning from Supervised Data
从监督数据进行迁移学习
4.BERT模型:
1_Bert的两个步骤:
-
预训练
使用unlabelled data 训练
-
微调
微调的 BERT 使用 预训练的参数 初始化,所有的权重参数通过 下游任务的 labeled data 进行微调。每个下游任务创建单独的微调模型,即使它们是用相同的预训练参数初始化的。
2_Model Architecture:
multi-layer bidirectional Transformer encoder(一个多层双向的Transformer解码器)
-
模型调的3个参数:
L:transform blocks的个数
H: hidden size 隐藏层大小
A: 自注意力机制 multi-head 中 head 头的个数
-
两个模型:
BERT_BASE (L=12, H=768, A=12, Total Parameters=110M)
BERT_LARGE (L=24, H=1024, A=16, Total Parameters=340M)
BERT_base 的参数选取 和 GPT 差不多,比较模型;BERT_large 刷榜
3_Input/Output Representations:
下游任务有处理一个句子 or 处理 2 个句子,BERT 能处理不同句子数量的下游任务,使输入可以是 a single sentence and a pair of sentences (Question answer)
a single sentence: 一段连续的文字,不一定是真正上的语义上的一段句子
A “sequence” 序列可以是一个句子,也可以是两个句子。
-
BERT 的输入和 transformer 区别:
transformer 预训练时候的输入是一个序列对。编码器和解码器分别会输入一个序列。
BERT 只有一个编码器,为了使 BERT 能处理两个句子的情况,需要把两个句子并成一个序列。
-
Bert 如何切词:
WordPiece, 把一个出现概率低的词切开,只保留一个词出现频率高的子序列,30k token 经常出现的词(子序列)的字典。
否则,空格切词 得到一个词是一个 token。数据量打的时候,词典会特别大,到百万级别。可学习的参数基本都在嵌入层了。
-
Bert 的输入序列的如何构成的:
序列开始: [ CLS ] 输出的是句子层面的信息 sequence representation
BERT 使用的是 transformer 的 encoder,self-attention layer 会看输入的每个词和其它所有词的关系
就算 [ CLS ] 这个词放在第一个的位置,它也是有办法能看到之后所有的词。所以它放在第一个位置是没关系的,不一定要放在最后。
区分 两个合在一起的句子 的方法:
每个句子后 + [ SEP ] 表示 seperate
学一个嵌入层 来表示 整个句子是第一句还是第二句
[ CLS ] [Token1] …… [Token n] [SEP] [Token1'] …… [Token m]
每一个 token 进入 BERT 得到 这个 token 的embedding 表示。
对于 BERT,输入一个序列,输出一个序列。
最后一个 transformer 块的输出,表示 这个词源 token 的 BERT 的表示。在后面再添加额外的输出层,来得 到想要的结果。
-
Bert的input表示:
进入 BERT 的表示 = token 本身的表示 + segment 句子的表示 + position embedding 位置表示
Token embeddings: 词源的embedding层,整成的embedding层, 每一个 token 有对应的词向量。
Segement embeddings: 这个 token 属于第一句话 A还是第二句话 B。
Position embeddings: 输入的大小 = 这个序列最长有多长? i.e., 1024
Position embedding 的输入是 token 词源在这个序列 sequence 中的位置信息。
这里Bert的segment embedding 和 position embedding 首先随机生成,然后通过学习来的,transformer 的 position encoding 是通过公式计算来的,是给定的。
4_Pre-training BERT:
使用两个无监督任务预训练BERT
1.Masked LM
2.Next Sentence Prediction (NSP)
Masked LM:
由 WordPiece 生成的词源序列中的词源,它有 15% 的概率会随机替换成一个掩码。但是对于特殊的词源不做替换,比如, 第一个词源 [ CLS ] 和中间的分割词源 [SEP]。
-
MLM带来的问题:
预训练和微调看到的数据不一样。
预训练的输入序列有 15% [MASK],微调时的数据没有 [MASK]。
-
采取的措施:
15% 计划被 masked 的词: 80% 的概率被替换为 [MASK], 10% 换成 random token,10% 不改变原 token。但 T_i 还是被用来做预测。
Next Sentence Prediction (NSP):
QA问题和NLI自然语言推理都是理解两个句子之间的关系,但这是普通语言模型无法捕捉到的,利用Bert
输入序列有 2 个句子 A 和 B,50% 正例,50%反例;50% B 在 A 之后(labeled as IsNext),50% 是 a random sentence 随机采样的(labeled as NotNext)
C用于下一个句子预测( NSP )。
5_Pre-training data:
-
BooksCorpus (800M words)
-
English Wikipedia (2,500M words)
只提取文本段落,忽略列表、表格和标题
6_Fine-tuning BERT
Bert和一些基于encoder-decoder的架构有什么不同:
- transformer是encoder-decoder架构,Bert只使用encoder
- Bert因为把整个句子对都放在一起放进去了,所以自注意力能够在两端之间相互能够看到,但是在编码器解码器这个架构中,编码器一般是看不到解码器的东西的,所以BERT在这一块会更好一点,但是实际上也付出了一定的代价(不能像transformer一样能够做机器翻译)
下游任务的应用:
在做下游任务的时候会根据具体任务来设计相关任务的输入和输出,其优点是模型不需要做大的改动,主要是怎么样把输入改成所要的那个句子对
然后根据下游的任务要求,要么是拿到第一个词元对应的输出做分类或者是拿到对应的词元的输出做所想要的输出,不管怎么样都是在最后加一个输出层,然后用一个softmax得到想要的概率
5.实验
GLUE
SQuAD v1.1
SQuAD v2.0
SWAG
6.Ablation Studies
Ablation Studies(削减实验)是一种实验方法,用于评估机器学习模型中不同组件或特征的重要性。在这种方法中,研究人员通过逐步削减模型中的某个组件或特征,然后观察模型性能的变化,以确定其对整体模型性能的贡献。
Effect of Pre-training Tasks
- No NSP:在预训练的时候去掉对下一个句子的预测
- LTR & No NSP:使用从左到右的单向语言模型,没有使用MLM,并去掉对下一个句子的预测
- +BiLSTM :在LTR & No NSP基础上加一个双向LSTM
- 结果:无论去掉哪一部分,最后的性能都会下降
Effect of Model Size
- Bert_base中有1亿的参数
- Bert_large中有3亿的参数
- 结果:当模型变得越来越大的时候,效果也会随之得到提升
Feature-based Approach with BERT
假设不用BERT做微调而是把BERT的特征作为一个静态特征输进去会怎样
结论是效果确实没有微调好,所有用BERT的话应该用微调
7.conclusion
最近一些实验表明,使用无监督的预训练是非常好的,这样使得资源不多(训练样本比较少的任务也能够享受深度神经网络),本文主要的工作就是把前人的工作扩展到深的双向的架构上,使得同样的预训练模型能够处理大量的不同的自然语言任务
简单概一下:本文之前的两个工作一个叫ELMo,它使用了双向的信息但是它网络架构比较老,用的是RNN,另外一个工作是GPT,它用的是transformer的架构,但是它只能处理单向的信息,因此本文将ELMo双向的想法和GPT的transformer架构结合起来就成为了BERT
具体的改动是在做语言模型的时候不是预测未来,而是变成完形填空
很多时候我们的工作就是把两个东西缝合到一起,或者把一个技术用来解决另外领域的问题,如果所得到的东西确实简单好用,别人也愿意使用,就朴实地将它写出来也没有问题
elmo、GPT、bert三者之间有什么区别?
特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。
单/双向语言模型:GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。
GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子
mer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。
单/双向语言模型:GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。
GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子