其他分享
首页 > 其他分享> > 预训练模型的三大改进方向

预训练模型的三大改进方向

作者:互联网

预训练模型的改进主要有预训练任务,模型结构和时间空间复杂度优化三个方向,重要性我认为依次递减。
先说预训练任务。最近打天池小布的比赛深刻体会到了一个好的局部极大值的重要性。当预训练模型面对较为简单的下游任务往往会很快地就收敛到一个不那么优的局部极大值,而且由于预训练模型本身具备极强的拟合能力,想要靠随机数种子直接调到一个较好的finetune结果几乎是不可能的。而一个较难的预训练任务可以发挥很大的作用,好的预训练相比直接finetune的auc可以有3-4个点的提升。预训练任务的改进方向主要体现在对作为基石的mlm的改进,以及添加的其他预训练任务,核心就是任务要难,比赛的过程中我们发现每当我们怀疑这个预训练方式是不是太难不靠谱时,finetune的结果都出乎意料地更上一层楼,只能说bert超乎你的想象。
首先是从bert的静态mlm到roberta的动态mlm,同时更多的bs,数据,step,去掉简单的nsp,再到albert去掉dropout,加上sop。后续wwm的提出,相比随机单字mask更难,而albert中其实也用到了ngram的mask,spanbert中则是把n扩大到了10,同时细节地span起始位置是某个词的起点且整个span的mask方式一致。ernie中又提出entity和phrase的mask,百度具有大量的知识图谱基础,通过把这些信息融入模型,截止现在ernie仍是glue榜首。bart中mlm方式花样更多一些,还加入了deletion和infilling。除了mask方式本身,mask概率在我看到的论文中几乎都是15%的总量,而在比赛中mask总量取到40%效果反而比15%好很多。猜想是论文中数据量足够大因此不需要太大的mask概率?此外固定mask占比似乎也要比概率的mask占比要差一些。说完了mask方式和概率,还有mask的预测方式。mask的预测一般来说就是直接接全连接,但这里的做法其实既有和字向量做内积也有全连接。mask的预测任务上的改进有bart中的deletion用到了预测某个位置是否被删除,infill预测了有几个token,deberta中只在mlm层加入了绝对位置编码。除了最强大的mlm任务,后续任务上的改进主要有roberta,spanbert等去掉NSP,Albert加上SOP,MT-DNN加了一堆下游任务,spanbert添加了SBO loss。我个人的看法是:基础的mlm任务是最重要的,其他只是起到锦上添花的作用,判断改进好不好可以看是不是增加了任务的难度。
其次是模型结构。我把模型结构分为两方面,一个是纯模型结构,另一个是单独拎出来的效果超群的位置编码。模型结构主要就是attention层和ffn层。模型结构整体的改进其实并不多,一个是走cnn方向,另一个就是魔改多头。cnn方向上convbert就是从light cnn到dynamic cnn到Span-based dynamic cnn,informer中提出的所谓自蒸馏其实就只是把ffn的全连接换成了一维卷积的下采样。魔改多头有longformer,他把多头注意力改成了非全局的类似空洞卷积的多头注意力。可以看到convbert和longformer的出发点其实都是原始多头注意力有很多冗余,注意力得分大头集中在对应head局部,这个出发点和相对位置编码其实也有点像,相对位置编码也是认为局部的信息比绝对位置信息更重要。这里要多说一句,一方面convbert并没有舍弃多头注意力,只是减少了数量,所以cnn在bert应用上的真实效果很难说,另一方面longformer的稀疏多头现有的深度学习包无法很好运行,论文是靠修改cuda代码这一比较硬核的方式。位置编码是一个很重要的改进,在使用nezha的过程中,事实上我们的nezha使用相比bert仅仅只多了位置编码,但却可以有稳定的1个点的auc提升,可见相对位置的重要性。位置编码主要有三角函数和可训练这两种,可训练的效果一般会好于三角函数,使用三角函数的原因一般是可扩展和最初Google希望三角函数的绝对位置在函数过程中能产生相对位置的效果虽然失败了。位置编码又分为相对和绝对。绝对位置编码的运算方式就是加法为主,一般bert添加在embedding层,而deberta则添加在最后的隐状态输出层,deberta使用了相对位置编码但同时也肯定了绝对位置的重要性。相对位置编码的运算方式加法乘法都有,我认为区别不大。添加的位置主要集中在QKVA。这里基本就是排列组合,google,xlnet,nezha,t5,deberta,tf库的bert各不相同。但是思想基本上是一样的,我的实验结果影响并不大。
最后就是时间空间复杂度的优化了,诸如reformer,linformer,performer,informer,convbert,longformer,都是聚焦多头和ffn层。多头的改进出发点就一个,不需要全局多头,局部多头就可以取得几乎一致的效果。reformer是通过lsh相当于对QK做聚类,这样同一类的QK注意力得分高,以此来减少每个头的数量。linformer和performer都是通过减少矩阵乘法时的维度来降低复杂度,有点类似albert的矩阵分解,区别是一个是直接全连接减少,一个是通过核函数。informer则是比较暴力的直接通过采样过滤掉注意力得分较低的QK。convbert是通过局部卷积减少时空复杂度,堆叠深以后感受野就可以扩展到整个序列,longformer也是类似空洞卷积来减小每个头的数量。这里比较有意思的就是,convbert认为低层卷积核小点高层大点,linformer则是反过来,认为高层k值可以大点。到底谁是对的呢。我也不知道,反正论文实验都说自己是对的(狗头)。ffn层的改进一个是informer用一维下采样卷积(因为实际是时序任务所以下采样),reformer用了可逆revnet,这个流模型太复杂了,然而论文又没有细讲,看到苏神的博客也说自己放弃了,只能说Google nb。
总结一下我的一些想法:预训练任务可以取百家之长,位置编码一定要加,时间空间效率主要是时间其实并没有太好的解法,与其用那些优化时间的算法,不如寄希望于微软把onnx对位置编码的支持多多完善,起码自己出品的deberta可以用onnx优化把。

标签:编码,训练,模型,位置,mask,mlm,多头,三大
来源: https://www.cnblogs.com/www1617/p/14779291.html