摘要:
提出了一个新的语言表示模型(language representation), BERT: Bidirectional Encoder Representations from Transformers。不同于以往提出的语言表示模型,它在每一层的每个位置都能利用其左右两侧的信息用于学习,因此,它具有强大的表示能力,所以,BERT在预训练之后,只需要加一个简单的输出层,并在新结构上fine-tuned 就能获得 SOTA的结果。
引言
语言模型预训练在自然语言处理任务中占据着越来越重要的位置。当前有两种方法将预训练的特征表示用于具体的任务,分别是:
- feature based。 如 ELMo针对不同的任务使用不同的网络结构,并将预训练的特征表示作为额外的特征输入到具体的网络中。
- fine-tuning。如GPT,对不同的任务只引入很少的额外参数,在应用到下游任务时直接在pre-train的网络上fine-tune。
它们的目标函数都是单向的语言模型。从左到右的单向语言模型的表达能力有限,因为在attention layer中,每个单词只能获取到其左边的信息,而在SQuAD 这样的token-level的任务中,获取左右两边的信息是至关重要的。BERT提出了两个新的预训练的目标函数:
- Masked Language Model
- Next Sentence Prediction
其中MLM的目标函数允许BERT采用双向的attention(一般的LM建模只能是单向的,因为如果采用双向attention,那么对于指定token,其在网络下一层的输入信息会包含当前token的相关信息,因为信息是双向流动的,每个token位置都能获取整个句子的信息,由于LM的任务是给定一个序列,预测序列的下一个token,所以LM不能获取token后面的信息,BERT采用的是双向的attention,相当于Transformer中的encoder部分)。MLM能使用双向的attention是因为其随机屏蔽一段句子中的一部分单词,然后MLM的任务就是预测这些被屏蔽的单词,所以即便信息是双向流动,也不导致信息泄露。
BERT
模型结构
BERT的每一层都是transformer中的双向encoder结构,假设 层数为L,hidden size 为H,self-attention head的个数为A, 设feedforward部分的hidden size为 4H。
BERT base: L=12,H=768,A=12, total parameter:110M
BERT large:L=24, H=1024,A=16, total parameter:340M
BERT 与 GPT和ELMo的结构对比如上图。
bert是language understanding model,因为他的信息是双向流动的,不好做generation的任务,双向的 transformer 也被称为 transformer ecoder。
gpt是language generation model,他基于单向的lm,所以可以做序列生成的任务,也被称为 transformer decoder, 但其实称为transformer decoder并不准确,因为transformer decoder除了 self-attention 之外还有来自encoder的cross-attention,但gpt并没有cross-attention。
输入表示
输入可以分为三部分,分别是token的表示,segment的表示(用于区分句子A和句子B,比如QA等问题需要涉及sentence-level的学习),和positional encoding.
预训练任务
Masked LM
随机屏蔽掉一部分token, MLM的任务是根据未屏蔽的token预测被屏蔽的token. 每个句子屏蔽15%的单词,用[MASK] 替代,但是这种做法会导致 预训练过程和fine-tining阶段不匹配,因为fine-tuning阶段没有[MASK]这个token。所以,并不总是将masked单词替换成[MASK],具体做法如下:
a. 对于被15%被替换的单词,80%的时间都是用[MASK]替换
b. 10%的时间随机选择一个单词替代
c. 10%的时间保持不变
transformer encoder不知道它要预测的是哪个单词,也不知道哪个单词是被随机替换的,所以,对于每个单词,它都需要学习到上下文的表示分布情况(这个比较玄学)。而且只有1.5%的单词被随机替换了,这并不不会干扰模型的学习。
MLM的另一个缺点是在每个batch中只会预测15%的token,相比于预测全部的token,它需要更多的迭代次数以收敛。
- Next Sentence Prediction
很多nlp任务比如 Question Answering(QA), Natural Language Inference(NLI) 都需要理解句子间的关系,而在 语言建模中这种关系并不会直接体现。bert在预训练中加入了一个二分类任务:判断一个句子是不是另一个句子的下一句。
实验
GLUE dataset
这是一个用于language understanding模型的数据集合,其中有single-sentence 的任务也有 sentence-pair的任务,如上图(a)所示,两个句子拼接在一起,通过segment embedding区分句子A和句子B,取第一个token [CLS]在最后一层对应的hidden state作为整个sequence 的represention C,然后将C与待fine-tunning的参数W相乘之后取softmax就是分类的各类概率。
SQuAD v1.1
问答数据集。如上图(c)所示, 问答的输入一个问题以及一段话,需要在这一段话中找到问题的答案,具体到这里的任务其实是定位答案在这一段话中的位置,所以需要找到 start position和 end position。在fine-tunning阶段需要学习一个 start vector (Sin R^{H})和一个end vector (Ein R^{H}),对于每个token,其最后一层的hidden state表示为 (T_iin R^{H}),那么每个token为 start token 的概率为: