简介
BERT模型来自谷歌团队的paper——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,它在11个NLP任务中刷新了成绩,效果非常好,非常惊人。但是,这项工作不是很好复现,如果没有足够的资源就不要想了 。之前,利用预训练的语言表征来完成下游NLP任务的研究,可以概括为两类:feature-based和fine-tuning。feature-based类别比如ELMo,fine-tuning类别比如OpenAI GPT、ULMFiT,ELMo是把表征作为feature提供给下游任务,OpenAI GPT、ULMFiT是fine tune(微调)预训练的参数。这些方法没有很好的利用上下文(context)信息,然而这些context信息对于SQuAD类似的任务非常重要。
上图表示BERT和OpenAI GPT、ELMo模型的区别。BERT使用双向Transformer。OpenAI GPT使用从左到右的Transformer。ELMo使用经过独立训练的从左到右和从右到左LSTM的串联来生成下游任务的特征。三个模型中,只有BERT表示在所有层中共同依赖于左右上下文。除了体系结构差异之外,BERT和OpenAI GPT是fine-tuning方法,而ELMo是基于feature的方法。
原文摘要
本文介绍了一种新的语言表征模型 BERT(Bidirectional Encoder Representations from Transformers),它用Transformer的双向编码器表示。与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调,适用于广泛任务的最先进模型的构建,比如问答任务和语言推理,无需针对具体任务做大幅架构修改。
作者提出的贡献(创新)
- 我们证明了双向预训练对于语言表达的重要性。不像Radford et al. (2018)使用单向语言模型进行预训练,BERT使用屏蔽语言模型实现预训练的深度双向表示。这也与 Peters et al. (2018a)的研究结果相反,它使用了从左到右和从右到左的独立训练LMs的浅串联。
- 我们表明,预先训练的表示减少了对许多精心设计的特定任务体系结构的需求。BERT是第一个基于精细调整的表示模型,它在一组大型句子级和令牌级任务上实现了最新的性能,其性能优于许多特定于任务的体系结构。
- BERT advances the state of the art for elevenNLP tasks. The code and pre-trained models are available at https://github.com/google-research/bert.
- 采取新的预训练的目标函数:the “masked language model” (MLM) 随机mask输入中的一些tokens,然后在预训练中对它们进行预测。这样做的好处是学习到的表征能够融合两个方向上的context。这个做法我觉得非常像skip-gram。过去的同类算法在这里有所欠缺,比如上文提到的ELMo,它用的是两个单向的LSTM然后把结果拼接起来;还有OpenAI GPT,虽然它一样使用了transformer,但是只利用了一个方向的注意力机制,本质上也一样是单项的语言模型。
- 增加句子级别的任务:“next sentence prediction”作者认为很多NLP任务比如QA和NLI都需要对两个句子之间关系的理解,而语言模型不能很好的直接产生这种理解。为了理解句子关系,作者同时pre-train了一个“next sentence prediction”任务。具体做法是随机替换一些句子,然后利用上一句进行IsNext/NotNext的预测。
模型
论文使用了两种模型:
-
BERTBASE: L=12, H=768, A=12, 总参数=110M
-
BERTLARGE: L=24, H=1024, A=16, 总参数=340M
其中层数(即 Transformer 块个数)表示为 L,将隐藏尺寸表示为 H、自注意力头数表示为 A。在所有实验中,将前馈/滤波器尺寸设置为 4H,即 H=768 时为 3072,H=1024 时为 4096。
为了进行比较,paper中选择BERTBASE 的模型尺寸与OpenAI GPT具有相同的模型大小。然而BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能关注到其左侧的上下文。注意需要的是,在paper中,双向 Transformer 通常称为「Transformer 编码器」,而只关注左侧语境的版本则因能用于文本生成而被称为「Transformer 解码器」
参考:
![](/qrcode.jpg)
推荐阅读: