在梯度上做简单mask竟有如此的神奇效果

2022-02-28 11:30:21 浏览数 (1)

每天给你送来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矩阵,和原来梯度乘就完成了更新与不更新的操作了。

那么如何选取哪些梯度不更新,作者提出两种方法:

  1. task-free方法,即随便mask梯度
  2. 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页论文)的能力。

学习道路长且艰,与君共勉。

0 人点赞