BERT: Bidirectional Encoder Representations from Transformers
BERT 是用于语言理解的预训练深度双向编码表征的 transformer结构。它被设计为通过在所有网络层中基于左右文本来预训练深度双向表征。因此通过外接一个输出层来 fine-tuned 预训练好的BERT 表征形成一个新的模型,这种做法可以将BERT运用在大量的其他任务上。
Introduction
预训练的语言模型被证实在提升自然语言处理的性能上很有效,这些任务包括句子层面的,比如自然语言推理、释义;分词层面的,比如命名实体识别、SQuAD 问答。目前存在的将预训练好的语言表征运用在下游任务的方法主要有:基于特征(feature-based)的和微调(fine-tuning)。基于特征的方法,比如 ELMo,将预训练好的表征作为额外的特征加到某个基于任务的架构中。基于微调的方法,比如 OpenAI GPT,引入最小任务相关的参数,运用下游的特定任务来微调训练好的参数。
目前的这些方法限制了预训练模型的能力特别是基于微调的方法。最主要的限制在于传统的语言模型都是单向的,这种设计限制了训练时模型结构的选择。OpenAI GPT 使用了一种从左向右的架构,在Transformers 的 self-attention layer 中每个分词只能被添加到它前一个分词之后。这种设计对于处理句子层面的任务来说是个 sub-optimal,但是在分词层面的任务中微调训练好的模型时,这种设计可能带来灾难性的结果。
作者引入了 BERT通过提出了一个新的预训练目标:“masked language model”(MLM)。遮蔽语言模型随机地遮蔽输入中的一些分词,目标是为了能够在仅基于上下文的情况下预测出被遮蔽的分词的id。不同于以往的从左至右的预训练语言模型,MLM模型允许融合左边和右边两边的上下文,从而可以形成深度双向的Transformer。同时文章引入了预测下一个句子的任务来预训练文本对表征。
这篇文章的贡献:
- 证实了双向预训练对于语言表征的重要性
- 证实了预训练表征能够减少很多针对特定任务的特征架构
- BERT 在11项自然语言处理任务中取得了最先进的效果
BERT
模型架构--符号说明
:层数(Transformer block 的数量)
:隐层的数量
:自注意力头的数量(number of self-attention heads)
输入表示
输入可以是一个单独的文本也可以是文本对。对于一个给定的输入语料,它的输入表征为词嵌入、分割嵌入和位置嵌入的和(summing the corresponding token, segment and position embeddings)。
几个细节:
- 使用了30000词汇量的 WordPiece embeddings。
- 使用了 positional embeddings,最长可达512。
- 每一个句子的第一个 token都是[CLS],对应这个分词的最后隐层输出(Transformer 的输出)可以被用于分类任务的句子表征。对于非分类任务,该向量将被忽略。
- 句子对被整合在一起,两个句子用特殊的分词 [SEP]分开。针对句子对中的第一个句子,把学习到的 sentence A embedding 加入到第一个句子的每个分词上,同样把学习到的sentence B embedding 加入到第二个句子的每个分词上。
- 对于单个句子的输入,只有 sentence A embedding。
预训练过程
Masked LM
传统的模型都是从左到右或者从右到左训练,这极大地限制了模型的能力。为了解决这一问题,都是为了避免出现在多层的双向训练中出现标签泄漏,文章提出 Masked LM 方法。对输入的句子随机地 Mask 住 15%的 分词,训练模型去预测句子中被 Mask的分词。被 Mask的分词对应的最后的向量会被传入到输出的 Softmax函数。
这种方法虽然可以得到双向的预训练模型,但是也存在两个问题。
第一个就是 pre-training 和 fine-tunning 语料不匹配的问题,因为 被 Mask住的分词不会在 fine-tunning阶段出现。为了解决这个问题,被随机挑选出来被 Mask 的分词比不总是以 [MASK]出现。
- 80%的时间,用 [MASK]代替被选中的词,如 my dog is hairy -> my dog is [MASK]
- 10%的时间,用一个随机挑选的词代替被选中的词,如 my dog is hairy -> my dog is apple
- 10%的时间,保持原来的单词不变,如 my dog is hairy -> my dog is hairy
Transformer解码器不知道哪个单词需要被预测以及哪个单词是被替换了的,因此它被要求保持对每个输入token分布式的表征,否则会一直记着被 Mask的词是 hairy。
第二个问题就是因为每个Batch中只有15%的分词被预测,所以模型需要训练更多的次数才能收敛。但是模型带来的性能提升比计算消耗更值得。
Next Sentence Prediction
许多自然语言处理的任务如QA、NLI,是基于模型对两个不同文本之间关系的理解的,而语言模型并不能直接反应这种关系。为了使预训练模型能够很好地处理这类任务,作者提出了 next sentence prediction 任务。特别地,在训练集中,有50%的句子B是句子A的真正的下一句,而另外50%的句子B是从语料中随机抽取的句子。
实验结果表明,增加的这个任务在 QA 和 NLI 都取得了很好的效果。
Pre-training Procedure
预训练过程中使用的语料是 BooksCorpus (800M 词) 和 English Wikipedia (2,500M 词).每一个 Batch有256个Sequences,每个Sequence有 512个tokens (256 sequences * 512 tokens = 128,000 tokens/batch),训练1百万次。在33亿的单词语料上训练40个epoches。优化算法采用的是Adam,learning rate 1e-4, β1 = 0.9, β2 = 0.999, L2 权重衰减为 0.01, learning rate 在前10,000次训练后线性衰减。Dropout 概率所有层都为0.1,激活函数和 OpenAI GPT 一样为 gelu 而不是 relu。训练的损失函数为 Masked LM likelihood平均值和next sentence prediction likelihood平均值的和。