文献链接及详解见 文献阅读(1)-UniLMv2
1. 背景
BERT的出现将NLU问题的SOTA向前提升了很大的一步,然而,由于BERT属于Autoencoding语言模型,需要通过上下文信息来预测被mask掉的token,在生成模型中会面临训练过程与预测过程不一致的问题。因此,BERT并没有在NLG问题中取得那么好的效果。
UniLMv1用一种elegent的方式将BERT应用在NLG任务中,并且在使用同一个model的情况下,仅通过mask矩阵控制输入就进行了不同语言模型的训练。对NLU任务就是直接使用BERT,而对seq2seq任务则是把BERT的"S1 [EOS] S2"当成 encoder-decoder结构。UniLMv1可以说结合了Autoencoding和Autoregressive两种模型的优点,在NLU和NLG任务中都取得了SOTA的结果。
然而,虽然在形式上UniLMv1通过mask矩阵用BERT模拟了Autoregressive模型,但Autoregressive中的一个核心精髓并没有体现出来,也就是一个词预测的概率和之前预测出的概率相关。
更深入的解释这句话,BERT中的掩码[Mask]之间是相互独立的。比如“意大利面酱中除了牛肉还需要用到洋葱和西芹”,如果我们把“洋葱”和“西芹”mask掉,利用BERT去预测这两个词,是分别预测“洋葱”和“西芹”。而事实上,在预测出“洋葱”之后,“西芹”的概率理应受到“洋葱”的影响,这在生成任务中是很自然的,但BERT并没有很好的体现这一点。那么本质上仍是BERT的UniLMv1自然也不能体现这个特点。
从另一方面出发,如果我们使用GPT等传统的Autoregressive模型,他的分解序列都是单向的(GPT的双向也只是从左到右和从右到左各来一次LSTM,没有体现出BERT中“天涯若比邻”的优势),不能很好的利用全局信息。因此有了后来的XLNet,把一个序列的所有tokens做一次全排列,综合考量所有分解顺序,每种分解序列都做一个Autoregressive,这样实际上全局信息还是被捕获到了。
而UniLMv2,则是在BERT的架构下,结合了XLNet序列分解的想法,在UniLMv1中消除了[Mask]之间的独立性,又保留了不同语言模型共享参数的统一训练模式,从而取得了比UniLMv1更好的效果。
2. 实现思路
2.1 掩码块和分解序列
类似于XLNet,把masked positions做一次全排列。例如,mask掉第二,第四和第五个tokens,那么全排列有六种。
当序列是时,掩码概率是
事实上,相邻tokens间往往会有较强的关系,为了避免模型过多的只学到local关系而忽视global关系,UniLMv2采取了Partially Autoregressive,将一个或几个相邻tokens封装入一个span,对于整个个序列的所有spans,相当于还是Autoregressive,但每个span中的tokens不相互attention,这样避免了总是focus在local shortcuts上。
还是刚才的序列,把4, 5封装在一个span里,序列变为,掩码概率变成了
2.2 伪掩码预训练模型
这一部分的描述在原文中比较清晰,可以参考我的文献阅读笔记 文献阅读(1)-UniLMv2
UniLMv2和UniLMv1一脉相承的点是都用mask矩阵来优雅地控制输入进行训练,但UniLMv2中,mask矩阵的设计要更加复杂,我们来看一个mask矩阵的样例:
self-attention公式为:
在公式中可以看出mask矩阵的第项表示 output 能不能看到 input 的信息(能就是0,不能就是)。
把矩阵行列调整一下顺序更有助于我们理解(行是output,列是input):
也就是论文中的:
从中我们可以总结出如下几个原则:
1. 掩码 [M] 和未被mask的原码(这里是)能看到的信息:
- 所有的掩码 [M] 和所有未被mask的原码()。
(这其实就是Autoencoder,也就是BERT的训练方式。事实上左上角是个矩阵,也就是说mask矩阵不起任何作用,可以直接拿掉,就变成了Autoencoder)
2. 被mask掉的原码()能看到的信息:
- 所有的掩码 [M],所有未被mask的原码(左半边7,8,9行)。
- 它们自身。
- 分解序列中前序序列的原码。这里分解序列是,因此可以看到但看不到,只能看到他们自己。(这体现出了序列分解Autoregressive的思想)
3. 伪掩码 [P] 能看到的信息:
- 所有的掩码 [M]和所有未被mask的原码(左半边11,12,13行)。
- 它们自身。
- 前序序列的原码,比如这里(的伪掩码)能看到。
这样的设计同时结合了Autoencoder和 Partially Autoregressive,AE就是矩阵。
而PAR,按照如上的原则,我们看一下伪掩码 [P] 都能看到什么:
而这正是PAR的设计:
另外,值得注意的是,伪掩码实际上起到的是占位符的作用,因此可以看到原码时,则对应的 [P] 不能被看到。比如不能看到,不能看到(不能看到不是因为占位,而是顺序上本身就看不到)。而因为看到了就看不到。因此,最终呈现上伪掩码只能被同一span内的伪掩码看到。
这样的设计原则,除了同时体现出AE和PAR(也就是本文说的对两种LM参数共享,一次forward就把两个LM都训练了,计算效率高)以外,还有一个很重要的点,就是防止信息泄露
信息泄露分为两种:
1. 直接泄露:
所有的掩码,如果直接看到其所对应原码,quiz的设计就失去意义了,训练时只需要把权重堆在这个通路上就行了,一定会过拟合。
上述原则可以观察到,无论是 [M] 还是 [P],都无法看到其所对应的原码,这样就避免了直接泄露。
2. 间接泄露:
因为model的结构是多层attention,因此如果存在这样一条路径(两层attention造成的),的伪掩码间接接触了它的原码,也会造成过拟合的问题。
观察上面的规则,我们先除去AE部分的和(因为由原则1,这一部分只能看到这一部分自己,形成了闭环,而闭环内显然是不存在直接泄露的,通路中一旦链到了这个闭环,也就无法泄露,因此可以去除掉)
我们先看及其伪掩码。只能看到,而永远只能看到。另一个角度,只能被以及看到,而的闭环显然是看不到这些的。
和也是一样,只能看到它自己和,而只能看到它们自己,因此永远看不到。事实上,只能被它自己看到。
通过上述分析我们可以看出,被mask掉的原码只能被它们自己,以及后序的原码和伪掩码看到。而由原则3,伪掩码只能看到它们自己和前序的原码,前序原码又只能看到更前序的原码,永远看不到后序的原码和伪掩码,因此不存在这样一条通路的存在,也就杜绝了间接泄露。
2.3 预训练
类似UniLMv1,在同时训练Autoencoding模型和Partially Autoregressive时共享参数,使训练出的model能够结合两种语言模型的优点。而误差函数则是两种语言模型误差的和。
3.结论
在许多NLG和NLU的baseline上取得了SOTA,证明了模型的有效性。对PMLM进行的消融研究表明了两种语言模型在预训练时是互补的。