11号论文放上去,12号各个公众号推送,13号的我终于在最晚时间完成了前沿追踪,惊觉上一篇论文居然是一个月前。。。立个flag之后保持一周一更的频率。下周开始终于要在工做上接触NLP了,以后但愿会带来更多本身的东西而不是论文解析。session
Attention和Transformer还不熟悉的请移步以前的文章:app
2. 【NLP】Transformer详解函数
NLP迁移学习中的三个state of the art模型能够参考前面的文章:学习
正文分割线spa
BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,由于decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。code
因为模型的构成元素Transformer已经解析过,就很少说了,BERT模型的结构以下图最左:orm
对比OpenAI GPT(Generative pre-trained transformer),BERT是双向的Transformer block链接;就像单向rnn和双向rnn的区别,直觉上来说效果会好一些。blog
对比ELMo,虽然都是“双向”,但目标函数实际上是不一样的。ELMo是分别以 和
做为目标函数,独立训练处两个representation而后拼接,而BERT则是以
做为目标函数训练LM。token
这里的Embedding由三种Embedding求和而成:
其中:
第一步预训练的目标就是作语言模型,从上文模型结构中看到了这个模型的不一样,即bidirectional。关于为何要如此的bidirectional,做者在reddit上作了解释,意思就是若是使用预训练模型处理其余任务,那人们想要的确定不止某个词左边的信息,而是左右两边的信息。而考虑到这点的模型ELMo只是将left-to-right和right-to-left分别训练拼接起来。直觉上来说咱们其实想要一个deeply bidirectional的模型,可是普通的LM又没法作到,由于在训练时可能会“穿越”(关于这点我不是很认同,以后会发文章讲一下如何作bidirectional LM)。因此做者用了一个加mask的trick。
在训练过程当中做者随机mask 15%的token,而不是把像cbow同样把每一个词都预测一遍。关于为何这样作,我以为多是模型结构自己的缘由,从结构上看输入输出是长度同样的sequence,这样模型实际上在作sequence-level的LM。
Mask如何作也是有技巧的,若是一直用标记[MASK]代替(在实际预测时是碰不到这个标记的)会影响模型,因此随机mask的时候10%的单词会被替代成其余单词,10%的单词不替换,剩下80%才被替换为[MASK]。具体为何这么分配,做者没有说。。。要注意的是Masked LM预训练阶段模型是不知道真正被mask的是哪一个词,因此模型每一个词都要关注。
由于涉及到QA和NLI之类的任务,增长了第二个预训练任务,目的是让模型理解两个句子之间的联系。训练的输入是句子A和B,B有一半的概率是A的下一句,输入这两个句子,模型预测B是否是A的下一句。预训练的时候能够达到97-98%的准确度。
分类:对于sequence-level的分类任务,BERT直接取第一个[CLS]token的final hidden state ,加一层权重
后softmax预测label proba:
其余预测任务须要进行一些调整,如图:
由于大部分参数都和预训练时同样,精调会快一些,因此做者推荐多试一些参数。
BERT是截至2018年10月的最新state of the art模型,经过预训练和精调横扫了11项NLP任务,这首先就是最大的优势了。并且它还用的是Transformer,也就是相对rnn更加高效、能捕捉更长距离的依赖。对比起以前的预训练模型,它捕捉到的是真正意义上的bidirectional context信息。
做者在文中主要提到的就是MLM预训练时的mask问题:
一遍读下来,感受用到的都是现有的东西,可没想到效果会这么好,而别人又没想到。不过文章中没有具体解释的不少点能够看出这样出色的结果也是经过不断地实验得出的,并且训练的数据也比差很少结构的OpenAI GPT多,因此数据、模型结构,都是不可或缺的东西。
以上。
【参考资料】: