PTM|乘风破浪的 PTM,深度解读预训练模型的进展( 五 )


这样,我筛出了一批表现优秀的模型,包括:RoBERTa,Google T5,ALBERT,ELECTRA,XLNet,GPT3,BART,UNILM v2, StructBert,MacBert。这些模型要么在某个榜单前几名,要么论文实验结果显示效果非常好,二者占其一。这里面,GPT3 是个纯生成模型,ELECTRA 相对而言方法比较特殊,在后面我会单独说下它。需要说明的是,ERNIE 和 NEZHA 模型,效果也是非常好的,能够排在某些榜单前列。但是因为它们对应的论文比较早,我猜测现在打榜的模型,估计和原始论文中的做法,已经做了变动,但是具体怎么变的不清楚,所以没有在上面列表中列出。上述表单,应该基本囊括了目前时间(2020 年 9 月)绝大多数效果最好的预训练模型了。
上述模型,都能找到对应的文章,可供仔细分析模型的有效因素。如果你仔细分析上述各个模型的共性,会发现,那些真正有效的因素会慢慢浮出水面。我在这里归纳一下:促进模型性能快速提高的因素,主要包含下列几方面。而且,这几方面的因素是可叠加的,就是说,如果一个模型采纳其中越多的因素,那么这个模型的效果表现可能会更好。
首先,更高质量、更多数量的预训练数据。
 PTM|乘风破浪的 PTM,深度解读预训练模型的进展
文章图片
关于预训练数据对模型效果的影响,Google T5 做了大量对比实验,目前的结论,如果归纳一下的话,应该是这样的:在保证预训练数据质量的前提下,数据规模越大模型效果越好。这里需要注意的是,数据规模越大越好,这点其实从 Bert 一出来,就是一个容易想到的重要因素。因为数据量越多,数据里蕴含的知识也越多,那么模型能学到的东西越多,所以模型效果会更好,这是一个靠简单推理就能得出的结论。但是,它是有前提的,前提是数据质量要高,光数据量大不行,很多乱七八糟的数据,反而会对模型效果带来负面影响。第二,增加模型容量及复杂度。
 PTM|乘风破浪的 PTM,深度解读预训练模型的进展
文章图片
所谓增加模型容量及复杂度,指的是增加 Transformer 模型的参数量,一般而言,模型容量越大,模型的表达能力越强。最直接的增加模型容量的方式就是增加 Transformer Block 层深,比如可以从 Bert base 的 12 层,增加到 Bert Large 的 24 层,还可以继续增加到比如 36 层,这是纵向增加复杂度,Google T5 走的这条路(从上图可以看出,模型容量增加到 4 倍后,有些数据集效果相对 Baseline 有大幅度的提升)。除此外,还可以横向增加模型复杂度,比如在固定 Transformer 层深的情况下,可以通过放大 Transformer 中构件的大小,比如 Hidden Size 的增大,FFN 层对隐层的放大,Multi-Head Self Attention 的 Attention 头的增加,等多种方式来做到这一点。ALBERT 走的这条路,它的 xxLarge 模型效果最好,只用了 12 层 Transformer Block,但是 Hidden Size 达到了 4096。这两种模式还可以相互结合,就是同时纵向和横向增加模型复杂度,GPT 3 即是如此,将模型复杂度这点推到了极致。单词特征的 Embedding 不会放的太大,一般采用 64 或者 128 大小,ALBERT 证明了如果单词特征 Embedding 跟着 Transformer 内部的 Hidden Size 同步放大,效果反而会降低。也就是说,增加模型容量指的是放大 Transformer 模型本身的参数量,但不包括输入层 Embedding 的参数。
第三,更充分地训练模型。
这里所谓的"更充分",一般指的是放大 Batch Size、增加预训练步数,就是 RoBERTa 做的那两个事情。这块上文有述,这里不再赘述。
第四,有难度的预训练任务。
 PTM|乘风破浪的 PTM,深度解读预训练模型的进展
文章图片
原始的 Bert 预训练,有两个训练任务:一个是单词级的 Mask 语言模型 MLM,一个是句子级的下一句预测任务 NSP。RoBERTa 证明了 NSP 对于模型效果没什么影响,所以拿掉了这个任务。有很多研究集中在这一块,采取了五花八门的预训练任务(如上图所示)。那么哪些预训练任务相对而言更有效呢?目前已经能够得出些比较明确的结论。如果归纳一下的话,应该是这样的:对于单词级的 Mask 语言模型来说,Span 类的预训练任务效果最好。所谓 Span 类的任务,就是 Mask 掉的不是一个独立的单词,而是一个连续的单词片断,要求模型正确预测片断内的所有单词。Span 类任务,只是一个统称,它会有一些衍生的变体,比如 N-Gram,就是 Span 模型的一个变体,再比如 Mask 掉的不是单词而是短语,本质上也是 Span 类任务的变体,这里我们统称为 Span 类任务。
目前有相当多的研究证明 Span 类任务是效果最好的,最近有些工作(微软的 ProphetNet 和百度的 ERNIE-GEN)进一步说明,Span 内多个单词独立被生成效果会更好。所谓独立生成,举个例子,假设被 Mask 掉的片断是:[公式] [公式] [公式] ,之前一般 Span 类的预训练是顺序生成片断内的单词,就是先生成 [公式] ,然后根据上下文及 [公式] ,生成 [公式] ,这么个顺序,就是说序列生成片断内单词。而独立生成,就是根据上下文,同时生成 [公式] , [公式] 和 [公式] ,被生成的单词之间无影响。所以目前单词级的 Mask 语言模型,独立生成的 Span 类任务,应该是目前效果最好的。


推荐阅读