提纲
-
简介
-
UNILM
-
UNILMv2
-
GLM
-
总结
参考文献
1. 简介
在文本生成序列之预训练模型一章我们说过,语言模型可以分为四类,包括前面两章提到的encoder-decoder跟因果语言模型,掩蔽语言模型(在bert系列里对它介绍也相当充分了), **还有这次想要介绍的前缀语言模型。前缀语言模型的设计是主要为了规避掩蔽语言模型跟因果语言模型的不足,同时又能利用它们的优势,类似于取其精华,弃其糟粕。** 通过利用一个混合的注意力mask矩阵,能够实现源文本的token可以看得到其他源文本的token,看不到目标文本的token,但是目标文本的token不仅能看到所有源文本的token,还能看得到在它之前的目标文本的token。回想transformer的结构,掩蔽语言模型(encoder部分)attention跟因果语言模型(decoder部分)其实在模型结构结构上也只是multi-head attention跟masked multi head attention之间的区别(因果语言模型没有encoder部分,所以也就没有encoder跟decoder之间计算attention的结构),这两者的差异其实也就是一个mask矩阵的区间,前缀语言模型就是通过利用一个特别的mask矩阵机制,将掩蔽语言模型跟因果语言模型结合到一起。而因果语言模型的源文本就跟掩蔽语言模型相似,而目标文本就跟因果语言模型相似,前缀语言模型结合掩蔽语言模型跟因果语言模型的特点,通过mask矩阵的设置,前缀语言模型也可以退化成掩蔽语言模型或者因果语言模型。
图1: transformer的结构
**虽然前缀语言模型是特定为了文本生成任务设计的,但是它的表现依旧不及双层堆叠的encoder-decoder结构,因为encoder跟decoder之间attention对于文本生成任务有一定的帮助。**
2. UNILM
UNILM是第一个被提出的前缀语言模型,是一个联合的预训练语言模型,通过几种共享参数的语言模型的联合优化,使得它具备直接在NLU或者NLG任务进行微调的能力,在NLU任务上的效果可以媲美Bert,在NLG的部分任务上甚至超过了当时的SOTA模型。
UNILM在三种不同的语言模型任务上(包括双向语言模型,单向语言模型,seq2seq)进行预训练,然后可以通过mask矩阵的调整可在以自然语言理解或者自然语言生成的任务下进行微调。 **UNILM之所以在多种类型的语言模型任务下进行预训练,是因为不同语言模型任务能学到不同的能力,UNILM想通过这种方式把相关的能力都学习到,集百家之长。**
图2: 不同语言模型任务的特点。
UNILM沿用的依旧是transformer的结构,按照Bert large的样式采用了24层transformer进行堆叠,在进行不同语言模型任务时只要通过设置相应的mask矩阵就可以实现,使得当前token能看到某些token,同时看不到另外一些token,具体实现过程可以见后面的attention计算介绍。可以理解为不同语言模型共用同一个transformer模型结构,同时维护自身的一个mask矩阵。另外UNILM每个句子的开头都有一个【SOS】,同时用【EOS】来划分不同的句子,其实这跟Bert的设计没本质区别,只是换了个名字而已。
图3: UNILM的结构
整个模型结构上跟掩蔽语言模型或者因果语言模型的差异也就在于attention计算的部分,具体差异见下图, **相比寻常的attention计算,这里多一个一个掩蔽矩阵M,用来显示token之间的信息交流。M(i,j)第i个token是否能看得到第j个token的信息,如果可以,M(i,j)就等于0,相当于对原本的计算没有影响,退化为原始的attention计算,相当于掩蔽语言模型,如果不可以,M(I,j)就等于负无穷(实际在计算机会赋值-10000),那么在计算当前attention的得分时第j个token所占的比重就微乎其微,可以忽略,退化为因果语言模型的mask attention。**
图4: UNILM的attention计算
在预训练过程中,每一个epoch有1/3的时间用来做双向语言模型任务,1/3的时间用来做seq2seq语言模型任务,1/6的时间做从左往右的单向语言模型任务,1/6的时间做从右往左的单向语言模型任务。 **这几个任务都是通过随机mask一些token,然后去进行重建,这里有80%被mask的是单独的token,有20%被mask的是一个2-gram或者3-gram。除此之外,双向语言模型还多一个NSP任务(跟Bert一样)。**
在完成预训练后,UNILM支持在自然语言理解任务或者自然语言生成任务下进行微调。对于NLU任务,像Bert一样需要在UNILM后面接上相应的神经网络,例如对于文本分类任务,可以在最后一层【SOS】位置接一层全连接+softmax,然后根据最大似然去做指定任务下的训练就可以。对于NLP任务,以seq2seq任务为例,假设源文本是S,目标文本是T,那么模型的输出会是“【SOS】 S 【EOS】 T 【EOS】”,可以通过随机mask一定比例的在目标文本T的token,然后去重建这些token来做进一步的微调,训练目标就是去最大化给定文本下这些被mask掉的token的概率。无论是有条件的文本生成,还是无条件的文本生成,都可以支持。
3. UNILMv2
UNILMv2是在UNILM基础上的改进,但是只有12层transformer结构,但是却在多个NLU和NLG的下游有所提升。UNILMv2明显是在XLNET问世后有感而发得到的思路,相比于UNILM每次只能做一个语言模型任务,通过设置相应的mask矩阵,决定当前任务是双向语言模型或者单向语言模型或者seq2seq任务, **但是UNILMv2支持同一个输入同时进行自编码和自回归的任务,这样就减少了大量的重复计算工作。**
**MLM可以分为自编码,自回归跟部分自回归三种类型,三者的区别在于怎么去分解被mask掉的token的概率,而UNILMv2采用的是其中的自编码跟部分自回归这种两种。这里部分自回归跟自回归的区别在于对于一个被mask掉的片段,在自回归中后面的token是可以看得到同个片段里前面token的信息,但在非自回归中则是看不到的** ,比如下图中第四个跟第五个token都是被mask掉的,属于一个连续的片段,在自回归中,也就是第三个例子(总共5个例子),在预测第四个token的概率时用到了前面第五个token的信息,但是在部分自回归中,也就是第五个例子中,在预测第五个token的概率计算时依旧没用到前面的第四个token的信息。部分自回归可以让模型学到长距离的依赖避免陷入局部的路径中去,在论文中的消融实验中也验证明了使用部分自回归的效果。(注意这里的文本要根据分解后的顺序)
图5: MLM的三种类型
**下面我们来看看UNILM是怎么实现同个输入同时进行自编码和部分自回归任务的,如下图所示,跟以往的只用[mask]来替代被mask掉的token不同,UNILMv2因为同时采用了两种语言模型任务,所以每个被mask掉的token会用同时采用两种不同的符号标记,分别是【M】,【P】,分别对应自编码任务和部分自回归任务** 。这里看到在做部分自回归任务时序列的顺序发生变化了是因为这里采用了跟XLNET一样的机制,在进行部分自回归时会对序列进行重排。
图6: UNILMv2的效果
图7: UNILMv2的框架
对于输入文本【x1,x2,x3,x4,x5,x6】,随机mask掉x2,x4,x5,那么输入文本会转变为【x1,【M】,【P】,x3, 【M】,【P】, 【M】,【P】】,然后通过相应的mask矩阵,可以使得自编码任务用到相应的【M】位置的信息,部分自回归任务用到相应的【P】的信息,既然有相应的mask矩阵,那么我们把被mask的token也加进去,通过mask矩阵让其他token看不见这些被mask掉的token不也可以嘛,所以模型的输入会变成【x1,x2,【M】,【P】,x3, x4,【M】,【P】,x5, 【M】,【P】】,然后通过相应的mask矩阵同时完成自编码跟部分自回归的任务。这里可以看到位置信息是没有变化的,被mask掉的token的位置信息跟相应的【M】【P】的位置信息是保持一致的。
图8: UNILMv2的mask矩阵
**预训练过程,60%mask的是单个的token,40%mask的连续的片段,自编码任务的损失函数就是常规的MLM任务的损失函数,然后部分自回归的损失函数跟XLNET的损失函数基本一致(除了对于被mask的连续片段,后面的token计算概率是不能用到这个片段其他被mask掉的token信息,这也是前面提到的自回归跟部分自回归的差异),同时因为部分自回归任务会随机对文本进行重排,这里不会计算相应的期望损失,而是随机选一种重排后的结果相应的损失作为该文本部分自回归任务的损失,然后总体损失由这两部分损失加起来得到。**
在下游任务进行微调时,对于NLU任务而言,例如文本分类任务,是将UNILMv2作为一个双向语言模型进行微调,同样是在UNILMv2后加一个全连接层+softmax然后去做特定任务的训练,跟UNILM的方式一样。 **对于NLG任务,可以随机mask源文本或者目标文本上的token(UNILM只能mask掉目标文本上的token),通过mask矩阵可以实现源文本跟目标文本不同的mask策略,然后按照自回归的方式做训练即可。**
4. GLM
GLM同样是采用XLNET的重排机制的前缀语言模型,它的基本结构跟Bert相似,是由多层transformer组成, **但有两点调整。**
a) 调整了layer normalization跟残差连接的顺序。
b) 将用于token预测的FFN换成了线性层。
跟其他MLM任务不同,GLM每次mask的都是一个片段,将一个片段替换为一个【MASK】符号,然后对于每一个被mask掉的片段,采用自回归的方式依次进行预测,直到预测token是终止符【E】。这也就要求模型不仅能预测正确的token,还要提高正确预测被mask掉的片段长度的能力。然后通过mask矩阵同时实现自编码跟自回归的任务。另外,为了维护好位置信息, **GLM采用了一种2D位置信息编码,第一维位置信息用于表示在原本序列中的位置,第二维用于记录在被mask掉的片段的位置。**
图8: GLM的框架
预训练过程中,有两个任务,一个是跟MLM一样的预测被mask掉的片段,另一个是生成更长的文本。被mask的片段长度是通过泊松分布抽样得到,重复这个过程只要有15%的token被mask掉。
**在下游任务微调时,对于NLU任务而言,不同以往的做法,这里是利用模版构建相应的完形填空任务(跟当下火热prompt一样),然后进行训练。对于NLG任务,就是在源文本后面加上【MASK】,然后让模型不断预测指导终止符出现。**
5. 总结
前缀语言模型,在模型结构上基本沿用的还是transformer的结构,通过设计合理的mask矩阵,可以在同一个模型结构上完成多种语言任务的预训练,使得模型具备更加强大的能力,进而能直接应用到下游的NLU或者NLG任务中,媲美相应的SOTA模型。
参考文献
- (UNILM, 2019) Unified Language Model Pre-training for Natural Language Understanding and Generation
https://arxiv.org/pdf/1905.03197.pdf
- (UNILMv2, 2020) UniLMv2: Pseudo-Masked Language Models for Unified Language Model Pre-Training
https://arxiv.org/pdf/2002.12804.pdf
- (GLM, 2021) All NLP Tasks Are
Generation Tasks: A General Pretraining Framework