[NLP] 从语言模型看Bert的善变与GPT的坚守

[NLP] 从语言模型看Bert的善变与GPT的坚守

转自我的公众号: 『数据挖掘机养成记』

已授权在 @SigAI专栏发布,禁止一切未经本人@穆文许可的转载


本文将探究:Bert为何要做 masked LM,并由此引出 GPT、Elmo、MASS、Word2vec 的相关问题
本文不探究:其他细节

1. 引子

Bert面世至今已半年有余,依然风光无限热度不减,大有横扫八荒之势。 其首推的 『双向语言模型』 和 masked LM 的训练方式,一时间也成为 pre-train 的标配。

细心的同学在阅读论文时,一定会发现论文里提到:深度双向语言模型出现自己预测自己——即 『see themselves』 的问题,所以要 masked LM。 论文作者 Jacob 在 reddit 的帖子里也再次讨论这个问题,原文截取如下

It’s unfortunately impossible to train a deep bidirectional model like a normal LM, because that would create cycles where words can indirectly “see themselves,” and the predictions become trivial.

这其实是个很小的点,也很容易理解,去年跟同事们已经简单探讨过。 今年组内有同事做分享,提到微软最新的 MASS 的训练方式借鉴了 masked LM,这让我又回想起这个问题,于是做个记录,炒个冷饭,对于没有深究过的同学,可以当做一个简单入门,对于行家,则欢迎更进一步的讨论。

所以,像Bert这样的双向语言模型为何要做 masked LM? GPT 为何一直坚持单向语言模型? Elmo 也号称双向,为何不需要 mask? Word2vec 的 CBOW 为何也不用 mask?

相信每一位 nlp 爱好者在看过bert、gpt的论文后,都会产生这些来自灵魂深处的追问。 本文将尝试用浅显易懂的语言和直观的示意图,来解释这些问题。

2. Bert的善变与GPT的坚守

先解释 『see themselves』 的问题,其实很好理解: 双向语言模型在预测当前词的时候,会用到其上下文信息(类似 word2vec 里的 CBOW 模式),而 transformer 自带了全局的 self-attention,会将上下文的词编码到当前模型里,所以在预测其他词的时候,该词的信息已经包含在了前一层的网络参数里,导致间接地『自己预测自己』 ,也就是Jacob 所说的 『 indirectly see themselves』。

公式解释起来麻烦,我在原论文的图上简单标识一下,看起来更直观


不严谨地解释下:(左图)在预测 T1 的时候,transformer 模块(红框所示)已经将 T2 的信息编码进去了,所以(右图)在预测 T2 的时候,transformer 模块里,已经包含了 T2 的信息,也就是 Jacob 说的 『see themselves』。

之所以说不严谨,是因为图里的 E1、E2 并不是跟 T1、T2 严格对应的 embedding,比如预测 T1 的时候,E1 肯定不是 T1 本身,而是 SOS 标识符之类。 不过这并不影响我们直观理解这个问题,所以无妨。

那遇到这个问题怎么办?

Bert 选择了变通——既然未来要预测的词,会被编码进模型,那我就『假装』不知道未来的词是什么。 怎么假装呢? 随机mask掉15%左右的词,美名其曰 『完形填空』 ,这样还不够,还要再辅以句子预测的任务,加强模型的能力。 这样训练出来的模型,在阅读理解、句子分类等任务上,有天然优势,但这样的大改,从语言模型角度看,显然有点『变味』了,比如语言模型最常见的,根据上文生成下文的能力,原始的 Bert 是不具备的。

于是,同样是基于 transformer 的 GPT系列,坚定不移地选择了一条具有自己特色的发展道路——坚持用 transformer 做单向语言模型,而不是像 Bert 采取自欺欺人的 mask 策略。 所以 GPT 的思路就是: 既然 transformer 会做全局的 self-attention,那我每次就让这个『全局』,限制在『过去』——也就是一个词的上文。 图示如下,同样是在原论文的图上简单标识:


依然不严谨地解释下:(左图)GPT 在预测 T1 时,用不到下文——也就是 T2 向后的信息的,所以 T2 的信息就不会被编码进第一个 transformer 模块(红框所示),所以(右图)在预测 T2 时,不用担心上一层相应模块开启上帝视角。

更重要的,GPT 这么做,保留了纯正的『语言模型』血统,能完成生成式的任务——用上文生成下文,比如随便输入几句话,就可以开始一本正经地胡说八道(误)。 而这,正是 GPT 的首字母大G的含义——Generative

3. 延伸

在解释完 GPT 和 Bert 的不同选择后,相应的追问也自然产生: 为何 Elmo 、 CBOW 这样的双向语言模型不用mask?

众所周知,在 Elmo 出来之前, bi-rnn、bi-lstm 这些双向模型已被广泛用在分类、序列标注等任务上,用来提取一个词的上下文特征,所以将这种结构用在语言模型上也是自然而然,只不过 label 从分类标签、序列标签等,变成了词本身。

但如 Jacob 所说, Elmo 严格意义上确实不太算他所认为的双向语言模型,因为 bi-rnn、bi-lstm 的『双向』,并不是像 bert 一样,将上下文用同一套模型参数进行编码,而是用两个分开的单向rnn去处理,只不过共享了输入,以及输出时进行拼接。

所以像 Elmo 这么设计的话,就不会出现 Bert 的『上帝视角』问题,因为用的两套模型参数,互不干涉,不会出现下一个词被提前编码到当前词所对应的模型的情形。 简单的图示如下:

依然不严谨地解释: (上图)在预测 T1 的时候,T2 会被编码到反向语言模型的 lstm 模块里(红框所示),但并不会影响正向的语言模型,(下图)在预测 T2 时,在反向语言模型看来, T1 是 T2 的下文,所以对应的 lstm 模块并不会作用到 T2 上。

再说说 word2vec 的 CBOW,我在之前的科普小文章有剖析过:

穆文:[NLP] 秒懂词向量Word2vec的本质zhuanlan.zhihu.com图标

在 CBOW 看来 Bert 的预测模式完全借鉴的它的——用一个词周围的词,去预测其本身。 所以从这个意义上讲, CBOW 也应该算是个『双向』语言模型吧。 但为何 CBOW 不用 mask 呢? 想必看到这里大家应该都明白了, mask 的提出是为了应对 transformer 的全局 self-attention, 而非『双向』,而 CBOW 这种上古模型,只是简单的单层神经网络,根本不可能出现『see themselves』 的问题。

最后说说微软最新的 MASS,我在第一节有提到,它改进了Bert、GPT 这些模型,用到 seq2seq 的训练框架做 pre-train,而不只是普通的 LM。 这样训练出来的模型,对于机器翻译、闲聊等 seq2seq 任务具有天然优势,就跟 Bert 做完形填空阅读理解有优势一个道理。

具体训练时,MASS 借鉴了 masked LM 的训练方式,把一句话里的部分词在 encoder 里 mask 掉,只不过需要在 decoder 里预测出来。 如下所示



仔细想想, MASS 其实可以称作是『masked GPT』 : 这里的 decoder 可以看成一个 GPT,是一个单向语言模型,但预测的时候,不是完整地预测整个序列,而是只预测局部序列,这个局部序列的上下文信息,则用 Bert 作为 encoder 去额外提供。而因为 encoder 和 decoder 的输入序列的 mask token 是互补的,所以 decoder 里的词不在 encoder里,也就不存在 encoder 给 decoder 开『上帝视角』的情形。 从这个意义上讲, MASS 弥补了 Bert 无法做生成式任务的能力,同时也弥补了 GPT 无法利用到下文信息的缺憾。

参考资料

Bert、GPT、Elmo、MASS 的原始论文

编辑于 2019-05-24

文章被以下专栏收录