每天给你送来NLP技术干货!
paper: Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuning link: https://arxiv.org/pdf/2109.05687.pdf
去年让我印象最深刻的应该就是RDrop和这篇了,趁着晚上有时间,就来简单的说下这篇文章。
总体说一下
由于预训练模型的兴起,最近的研究很多投身于如何在不遗忘预训练模型的参数的同时,又能学到新的下游任务的finetune的方法。比如Henry Gouk提出的distance-based的方法,将finetune学习到的参数控制在原始预训练参数一个球形范围内;哈工大的Sanyuan Chen在EMNLP也提出了recall and learn的方法,即边预训练边学习下游任务的方法,并提出了RecAdam新的算法。
本文的方法采用了更为巧妙地方法,通过mask掉部分梯度来防止更新过度从而导致原始的预训练信息的遗忘,有点像在反向传播中使用前向传播的dropout的方法,巧也,妙也。并在实验中得出普遍比普通finetune方法还要高出1.5~8.6%的性能,也比前人改进的finetune方法高出0.6~1.3个点。
很好在自己的实验上进行落地,所以给大家推荐一下。
两种实验方法
如下图的算法所示,不要被算法吓到,很简单的,总结起来就是通过某个方法找到需要没有被mask的梯度节点(这里叫做child),然后生成0-1mask矩阵,和原来梯度乘就完成了更新与不更新的操作了。
那么如何选取哪些梯度不更新,作者提出两种方法:
- task-free方法,即随便mask梯度
- task-driven方法,即需要根据不同任务来决定mask哪些梯度
第一种为完全类似dropout一样的,随机选取部分梯度节点进行mask,不参与梯度更新,说点学术化点就是服从伯努利分布:
其中p_f为保留率,当其为1时就是所有都保留,都不mask,就是普通的finetune了。其中,当mask完后,要对保留下来的梯度进行放大1/p_f倍的操作(类似dropout吧~)。
虽然听起来这个随机的方法很简单,但值得注意的是,这个证明其有效的过程需要好好学学和看看的,这里说下最终结论:
这种随机mask的方法,有助于损失跳出局部最优,跳出鞍点,鼓励模型寻找更为平坦的局部最优面。
另一种方法为基于任务相关的mask方法,这里采用的FIM方法(Fisher Information Matrix),即对每一个梯度平方的期望:
求它在每一个样本的均值的梯度:
这个梯度越大,那么就表示这个梯度节点对该任务就格外重要,相反越不重要的就越要mask了。其中mask的比率就是选择topk的方法一样。
实验
这两种方法和普通finetune方法在4种预训练模型中的性能比较:
上面为主要试验,但感觉为了论文的充分性吧,作者又讨论了该方法的领域泛化性:
除此之外,还讨论了任务的泛化性:
都还是挺不错的。
和以往的前沿方法对比,更能体现出其有效性:
最后还做了在目前比较火的低资源情况下的性能分析:
这篇文章还是很不错的,不光是方法,更是学习如何将一个十分简单的idea写成故事(8页论文)的能力。
学习道路长且艰,与君共勉。