最近被 Google 的 BERT (Bidirectional Encoder Representations from Transfoemers)模型给刷屏了。该模型破了 NLP 界的 11 项纪录,所以这两周特意挑选这篇论文来满足好奇心。第一作者还在 Reddit 上进行了解答,具体可以戳:这里。为了方便学习,我翻译了这篇解读(只包含正文):BERT 论文 - 第一作者的 Reddit 解读说明翻译
前几天,谷歌公开了关于 BERT 模型的代码,感兴趣的可以在 Colab 上使用免费 TPU 微调 BERT,具体可以戳:这里。也可以看看谷歌官方项目地址。
BERT 和以往的语言表示模型不太一样,其是通过在所有层左右文本内容联合调节来预训练深层双向表征的模型。在结果上看来, BERT 模型只通过添加一个额外的输出层来进行微调,就能够创建出 state-of-the-art 模型用于各种不同的任务。BERT 简单又强大,在 11 项 NLP 任务上创造了新的记录。本篇论文的核心创新部分是预训练部分。
语言模型预训练的优点是高效性,其提高了很多 NLP 任务的水准。有两种现有的策略可以将预先训练好的语言表征应用到下游(downstream)任务中:feature-based 和 fine-tuning。feature-base 方法,如 ELMo,使用特定任务的体系结构,其中包括将预先训练的表征作为附加特性。fine-tuning 方法,例如 Generative Pre-trained Transformer(OpenAI),引入极小的任务特定的参数,并对其进行训练通过简单地微调方法预训练参数来完成下游任务(如:问题回答,自然语言推断,情感分析等)。在前人的工作中,这两种方法在预训练前都有相同的目标函数,他们使用单向的语言模型来学习一般的语言表示。
作者认为现有的技术严重的限制了预训练表示的能力,对于 fine-tuning 方法来说,尤为如此。主要的限制就是现有的模型都是单向的,这限制了可以被用于预训练的结构选择。例如,在OpenAI 的 GPT 模型中,作者使用了从左到右的结构,其中每个 token 只能在转换器的 self-attention 层中处理之前的 token。这种限制对于语句级别的任务来说是次优的,并且当将基于微调的方法应用到 token 级别的任务(如 SQuAD 问题回答)时,可能会造成破坏性的影响。因为在这些任务中,从两个方向结合上下文是至关重要的。
BERT 的模型结构是一个基于 Vaswani 等人描述的原始模型而构建的多层双向转换编码器,该原始模型已经在 tensor2tensor 库中发布。因为 Transformer 的使用最近变得无处不在,并且 BERT 的实现与原始实现完全相同,所以作者将省略对模型结构的详细描述,并将 Vaswani 等人的论文推荐给读者。 还有 “The Annotated Transformer” 这个优秀的指南也值得一读。
OpenAI 的 GPT 使用了一个从左到右的模型。ELMo 使用了经过独立训练的从左到右和从右到左 LSTM 的连接来为下游任务生成特性。从图中也可以看出是两个相互独立的结构。而 BERT 使用的是一个双向的结构,从图中可以看出是在所有的网络层中都受到左右文本的共同作用。
与 BERT 最具可比性的现有预训练方法是 OpenAI 的 GPT 模型,它在大型文本语料库中训练从左到右的 Transformer LM。实际上,BERT 中的许多设计决策都被有意地选择为尽可能接近 GPT,以便可以最小化地比较这两种方法。这项工作的核心论点是论文 3.3 节中提出的两个新的预训练任务占了大多数经验改进,但可以注意到BERT 和 GPT 在如何训练上还存在其他一些差异:
BERT 的输入由 token embedding,segmentation embedding 和 position embedding 共同构成。
这一块内容是 BERT 论文的核心创新部分。作者使用两个新的无监督预测任务对 BERT 进行预训练。第一个任务是 Masked LM,第二个是 Next Sentence Prediction。
为了训练深度双向表征,作者采用了一个直接的方法,即随机的掩盖一定比例的输入 token ,然后只预测这些被掩盖的 token。作者将这个过程作为 Masked LM,也被称为 “完形填空”。在这个任务中,被掩盖的 token 的最终隐藏向量将被输入到词汇表中的输出 softmax 层,就像标准的语言模型一样。虽然这个方法确实可以获得双向预训练模型,但这种方法有两个缺点。第一个缺点是创建了预训练和微调之间的不匹配内容,因为在微调期间从未看到 MASK token。为了缓解这个问题,作者并不总是用实际的 MASK token 替换被掩盖的单词。相反,训练一个数据生成器来随机选择 15% 的 token。 比如:my dog is hairy
这个句子中选择 hairy
。然后执行以下过程:
my dog is hairy
→ my dog is [Mask].
my dog is hairy
→ my dog is apple.
my dog is hairy
→ my dog is hairy.
(这样做的目的是将表征偏向于实际观察到的单词)这个转换编码器并不知道哪个单词将被预测,或者哪个单词被随机单词取代。所以,它被迫保持每个输入 token 的分布式的上下文表征。另外,因为随机取代对于所有 token 来说,发生的概率只有 1.5% (15% 中的 10%),所以并不会损害模型的理解能力。
另一个缺点是,由于在每个 batch 中,只有 15% 的 token 需要被预测,这表明模型可能需要更多的预训练步骤才能收敛。在论文 5.3 节中,作者也证明 Masked LM (MLM)的收敛速度略慢于从左到右的模型(预测每个标记),但 MLM 模型的实证改进远远超过增加的训练成本。
很多重要的下游任务,像问题回答(QA),自然语言推断(NLI)等都是基于理解两个句子之间的关系。这种句子之间的关系不能够被语言模型直接捕获。为了训练理解句子关系的模型,作者预先训练二进制化的下一句子预测任务,该任务可以从任何单词语料库中简单的生成。具体来说,当为每个预训练样本选择句子 A 和 B 时,50% 的时间 B 是跟随 A 的实际下一个句子,50% 的时间是来自语料库的随机句子。如下所示:
[CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
IsNext
[CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
NotNext
作者完全随机选择NotNext
语句,最终预训练模型在此任务中达到 97%-98% 的准确率。尽管它很简单,但之后在 5.1 节中证明,预训练这项任务对 QA 和 NLI 都非常有帮助。