Bert: Bidirectional Encoder Representations from Transformers.html
主要创新点:Masked LM 和 Next sentence prediction。算法
NNLM:参考 :http://d0evi1.com/nnlm/
网络
Bert是一个预训练模型,对比ELMo和GPT,参考:天然语言处理中的语言模型预训练方法(ELMo、GPT和BERT)框架
预训练的思想:咱们知道目前神经网络在进行训练的时候基本都是基于后向传播(BP)算法,经过对网络模型参数进行随机初始化,而后经过BP算法利用例如SGD这样的优化算法去优化模型参数。那么预训练的思想就是,该模型的参数再也不是随机初始化,而是先有一个任务进行训练获得一套模型参数,而后用这套参数对模型进行初始化,再进行训练。其实早期的使用自编码器栈式搭建深度神经网络就是这个思想。还有词向量也能够当作是第一层word embedding进行了预训练,此外在基于神经网络的迁移学习中也大量用到了这个思想。函数
Bert: 这篇论文把预训练语言表示方法分为了基于特征的方法(表明ELMo)和基于微调的方法(表明OpenAI GPT)。而目前这两种方法在预训练时都是使用单向的语言模型来学习语言表示。学习
这篇论文中,做者们证实了使用双向的预训练效果更好。其实这篇论文方法的总体框架和GPT相似,是进一步的发展。具体的,他们BERT是使用Transformer的编码器来做为语言模型,在语言模型预训练的时候,提出了两个新的目标任务(即遮挡语言模型MLM和预测下一个句子的任务),最后在11个NLP任务上取得了SOTA。优化
在语言模型上,BERT使用的是Transformer编码器,而且设计了一个小一点Base结构和一个更大的Large网络结构。ui
对比一下三种语言模型结构,BERT使用的是Transformer编码器,因为self-attention机制,因此模型上下层直接所有互相链接的。而OpenAI GPT使用的是Transformer解码器,它是一个须要从左到右的受限制的Transformer,而ELMo使用的是双向LSTM,虽然是双向的,可是也只是在两个单向的LSTM的最高层进行简单的拼接。因此做者们任务只有BERT是真正在模型全部层中是双向的。编码
而在模型的输入方面,BERT作了更多的细节,以下图。他们使用了WordPiece embedding做为词向量,并加入了位置向量和句子切分向量。并在每个文本输入前加入了一个CLS向量,后面会有这个向量做为具体的分类向量。设计
在语言模型预训练上,他们不在使用标准的从左到右预测下一个词做为目标任务,而是提出了两个新的任务。第一个任务他们称为MLM,即在输入的词序列中,随机的挡上15%的词,而后任务就是去预测挡上的这些词,能够看到相比传统的语言模型预测目标函数,MLM能够从任何方向去预测这些挡上的词,而不只仅是单向的。可是这样作会带来两个缺点:1)预训练用[MASK]提出挡住的词后,在微调阶段是没有[MASK]这个词的,因此会出现不匹配;2)预测15%的词而不是预测整个句子,使得预训练的收敛更慢。可是对于第二点,做者们以为虽然是慢了,可是效果提高比较明显能够弥补。
对于第一点他们采用了下面的技巧来缓解,即不是老是用[MASK]去替换挡住的词,在10%的时间用一个随机词取替换,10%的时间就用这个词自己。
而对于传统语言模型,并无对句子之间的关系进行考虑。为了让模型可以学习到句子之间的关系,做者们提出了第二个目标任务就是预测下一个句子。其实就是一个二元分类问题,50%的时间,输入一个句子和下一个句子的拼接,分类标签是正例,而另50%是输入一个句子和非下一个随机句子的拼接,标签为负例。最后整个预训练的目标函数就是这两个任务的取和求似然。
在微调阶段,不一样任务的模型以下图,只是在输入层和输出层有所区别,而后整个模型全部参数进行微调。
下面咱们列出一下不一样NLP上BERT的效果。
GLUE结果:
QA结果:
实体识别结果:
SWAG结果:
能够看到在这些全部NLP任务上,BERT都取得了SOTA,并且相比EMLo和GPT的效果提高仍是比较大的。
在预训练实验分析上,能够看到本文提出的两个目标任务的做用仍是颇有效的,特别是在MLM这个目标任务上。
做者也作了模型规模的实验,大规模的模型效果更好,即便在小数据集上。
此外,做者也作了像ELMo当成特征加入的实验,从下图能够看到,当成特征加入最好效果能达到96.1%和微调的96.4%差很少,说明BERT对于基于特征和基于微调这两种方法都是有效的。
最后进行简单的总结,和传统的词向量相比,使用语言模型预训练其实能够当作是一个句子级别的上下文的词表示,它能够充分利用大规模的单语语料,而且能够对一词多义进行建模。并且从后面两篇论文能够看到,经过大规模语料预训练后,使用统一的模型或者是当成特征直接加到一些简单模型上,对各类NLP任务都能取得不错的效果,说明很大程度上缓解了具体任务对模型结构的依赖。在目前不少评测上也都取得了SOTA。ELMo也提供了官网供你们使用。可是这些方法在空间和时间复杂度上都比较高,特别是BERT,在论文中他们训练base版本须要在16个TGPU上,large版本须要在64个TPU上训练4天,对于通常条件,一个GPU训练的话,得用上1年。还有就是能够看出这些方法里面都存在不少工程细节,一些细节作得很差的话,效果也会大大折扣。
GLUE是一个天然语言任务集合,它包括如下这些数据集:
名称 全名 用途
MNLI Multi-Genre NLI 蕴含关系推断
QQP Quora Question Pairs 问题对是否等价
QNLI Question NLI 句子是否回答问句
SST-2 Stanford Sentiment Treebank 情感分析
CoLA Corpus of Linguistic Acceptability 句子语言性判断
STS-B Semantic Textual Similarity 语义类似
MRPC Microsoft Research Paraphrase Corpus 句子对是否语义等价
RTE Recognizing Texual Entailment 蕴含关系推断
WNLI Winograd NLI 蕴含关系推断
包含了各类理解句子含义和关系的任务。看一下效果:
BERT在每个单项上的表现都是最优。一个颇有意思的现象是:在全部的任务上[Math Processing Error] BERT_{LARGE}BERT
LARGE
远超过[Math Processing Error] BERT_{BASE}BERT
BASE
,其中甚至包括那些仅有少许训练数据的任务。
Ablation Studies
BERT自己包含了不少创新点,下面看一下各个部分的贡献。
先看一下pre-training中所用到的各类技术的重要性。
No NSP : 没有next sentence prediction(NSP)任务
LTR & No NSP: 没有MLM,而是用Left-to-Right(LTR) LM
+BiLSTM: fine-tuning过程当中,在LTR & No NSP上增长一个随机初始化的BiLSTM
另外做者还实验了模型大小,预训练步数,已经feature-based版本的BERT,实验结果也很是使人信服。特别要强调的一点是:咱们知道在大型任务中大的模型会带来持续的效果增加,可是这是咱们第一次看见,只要模型通过了足够的预训练,在小任务中大模型也可以带来显著的增加。