查看原文
其他

ChildTuning:试试把Dropout加到梯度上去?

苏剑林 PaperWeekly 2022-07-04


©PaperWeekly 原创 · 作者 |苏剑林

单位 |追一科技

研究方向 |NLP、神经网络


Dropout 是经典的防止过拟合的思路了,想必很多读者已经了解过它。有意思的是,最近 Dropout 有点“老树发新芽”的感觉,出现了一些有趣的新玩法,比如最近引起过热议的 SimCSE [1]R-Drop,尤其是在文章《又是 Dropout两次!这次它做到了有监督任务的 SOTA》中,我们发现简单的 R-Drop 甚至能媲美对抗训练,不得不说让人意外。

一般来说,Dropout 是被加在每一层的输出中,或者是加在模型参数上,这是 Dropout 的两个经典用法。不过,最近笔者从论文《Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuning》[2] 中学到了一种新颖的用法:加到梯度上面。

梯度加上 Dropout?相信大部分读者都是没听说过的。那么效果究竟如何呢?让我们来详细看看。


方法大意

简单来说,这篇论文主要提出了一种名为“ChildTuning”的思路,来提高预训练模型在 finetune 时的效果,其中“Child”是“Children Network”的意思,指的是从预训练模型中选择一个子网络进行优化,缓解优化整个模型所带来的过拟合风险。其中,在子网络的选择上,又分为两种方式:ChildTuning-D 和 ChildTuning-F。


ChildTuning-D
ChildTuning-D(Task-Dependent)是任务相关的选择方式,它需要下游任务的训练数据来参与计算。具体来说,假设训练数据为 ,模型为 ,其中   是模型的所有参数,而 ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 则是其中的第 i 个参数,那么我们计算如下形式的 Fisher 信息作为该参数的重要性:

有了重要性指标后,我们就可以对每个参数进行排序,然后选出最重要的  部分(比如前 20%,即 ),然后在模型更新的时候只优化这些参数。由于优化的参数变少了,所以过拟合的风险也就降低了。在实际使用时,ChildTuning-D 在 finetune 之前就把要优化的参数确定下来,然后就一直保持不变了。
要注意的是,这里的参数选择是以每个分量为单位的,也就是说,可能一个参数矩阵里边,只有一部分被选择中,所以不能说单独挑出哪些参数矩阵不优化,而是要通过构建对应的 0/1 矩阵  来将对应的梯度 mask 掉,即,其中除以  是保持整理的更新量级不变。这样没被选中的参数梯度一直是 0,所以也就没有更新了。这样一来,虽然理论上更新的参数少了,但它也不能节约计算量,所以作者只是将它定位为提高 finetune 效果的方法。


ChildTuning-F
ChildTuning-F(Task-Free)是任务无关的选择方式,其实它可以更形象地称为“梯度 Dropout”。对于 ChildTuning-D 来说,我们就是根据任务数据来构建了固定的 0/1 矩阵 ,然后将梯度修改为 ,而 ChildTuning-F 既然希望与任务无关,那么它每步更新就随机构建一个 0/1 矩阵 ,其中 1 的比例为 p,然后将梯度修改为 。可以看到,这本质就是对梯度进行 Dropout。
要注意,某个参数当前的梯度为 0,也不代表该参数当前的更新量为 0,因为我们通常用的都是带有动量的优化器如 SGDM 和 Adam,对于此类优化器,更新量是正比于动量,而动量是历史梯度滑动平均过来的,即 ,所以如果该参数的历史梯度不为 0,那么即便当前梯度为 0,动量依然很可能不会为 0,所以更新量也不为 0。
所以在这里笔者就有个疑问,按照 ChildTuning 的设计思路,它应该是想要每步只选择一个子网络进行更新,说白了就是每一步只更新  比例的参数,但根据上面的分析,对梯度进行 Dropout 其实达不到这个目的,而要实现这个目的,应该要对每步更新量  ‍‍‍‍进行 Dropout 才对。但笔者反复看了原论文,甚至对照了论文开源的代码,最终确认论文的意思确实是对梯度进行 Dropout。


实验结果
从原论文给出的实验结果来看,ChildTuning的“战绩”是相当耀眼了,几乎都有提升,而且最高提升达到 8%~

▲ ChildTuning的“战绩”-1 

▲ ChildTuning的“战绩”-2 

从表中可以看出,对于 ChildTuning-D 来说,几乎所有任务上都取得了提升,而 ChildTuning-F 也在不少任务上有效。另外,看论文描述可以知道上面给出的都是 large 版本模型的结果,而私下跟作者交流的时候,作者表示 base 版本的效果也有提升,只是限于论文篇幅,没有贴出来。


原理思考

ChildTuning-D 基于 Fisher 信息来对进行参数排序,该思路由来已久,它有效并不让人意外,类似的工作还有《Training Neural Networks with Fixed Sparse Masks》[3] 等。反倒是任务无关的 ChildTuning-F,也就是梯度 Dropout,居然也有这么效果,值得我们细细思考。

无独有偶,对梯度进行 Dropout 的工作,去年也有一篇,名为《Regularizing Meta-Learning via Gradient Dropout》[4]。这表明,Gradient Dropout 应该确实能起到一定效果的。那它究竟为什么有效呢?


论文推导

原论文给出一个基于 SGD 的理解,它指出梯度 Dropout 能扩大更新过程中的方差,从而有助于模型逃离不那么好的局部最优点。

具体来说,因为我们是用了 SGD,所以每步所计算的梯度有一定的随机性,假设它服从均值为 、方差为  的高斯分布;对于 ChildTuning-F 来说,引入一个随机变量 ,有  ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍的概率为 1,剩下  的概率为 0。那么我们将有:


所以:

也就是说,梯度 Dropout 能保持梯度的均值不变,但能扩大方差,而在 SGD 中,更新量正比于梯度,因此梯度 Dropout 扩大了更新量的方差,论文认为这有助于模型达到更好的收敛结果。


答非所问
这个解释看上去挺合理的,也符合很多人的直觉,因为很多人的潜意识里觉得随机梯度下降比全量梯度下降好的原因就是因为有噪声。然而,只要我们稍微深入思考一下,就能发现上述解释其实是“答非所问”。
原因很简单,上面分析的是 SGD,但实际上在 NLP 中我们用的都是 Adam(或者是它的变种),上述结论还能在 Adam 中保持吗?很遗憾,不能,甚至刚好相反。在 Adam 中,长期来看,更新量可以近似看成( 是学习率)

于是加了梯度 Dropout 后,更新量变为:

可以看到,长期来看,Adam 加上梯度 Dropout 后,仅仅相当于学习率降低为原来的 ‍‍‍‍倍!而且由于降低了学习率,也即降低了更新量,从而更新量的方差也随之降低。也就是说,如果你用了 Adam 优化器,那么实际情况跟论文的解释刚好相反,更新量的方差不仅没有增加,反而是降低了。
出现这个现象的根本原因就是,当我们使用了带有滑动平均的优化器时,更新量通常已经不在正比于梯度了,所以梯度如何变化,跟更新量如何变化,并没有必然的关联。这就回到了笔者前面的疑问了:为什么作者不干脆直接对更新量进行 Dropout?如果是更新量 Dropout,那么前面基于 SGD 的推导也能搬过来了。


个人理解

不过,笔者认为,就算把优化器限制为 SGD,或者直接对更新量进行 Dropout,原论文的推导也不能完全解释它的有效性。理由也很简单,能够达到“均值不变、方差扩大”的操作太多了,比如直接往梯度里边加点高斯噪声也可以,难道所有的这些操作都能达到同样的效果?个人感觉不大可能。笔者认为,要解释梯度 Dropout 或者更新量 Dropout 的有效性,得着眼于 Dropout 带来的稀疏性。

在这个问题上,笔者联想到了之前写过的文章《从动力学角度看优化算法(七):SGD ≈ SVM?》,这篇文章告诉我们,所有 SGD 出来的模型,其解本质上都类似于 SVM 模型:

其中 是第 个训练样本。它有什么特点呢? 的表现类似一个“相似度函数”,上述形式意味着模型实际上会以某种形式把训练集“背”下来了,然后预测的时候会以 为相似度取检索训练集,然后给出预测结果。当然,这只是一个原理性的解释,我们并不是主动将模型设计成这样的形式,我们只是从这个角度看出,梯度下降实际上也是在背样本,然后以类似于 KNN 的形式给出预测结果,这就不难理解为什么通常来说“训练样本越多,效果越好”的结论了。
回到 ChildTuning-F 上,我们每次采样一个 batch,然后对算出来的梯度或更新量进行 Dropout,结合上面的“背样本”解释,我们可以直观地想象,这本质上就是“只用一小部分参数来背诵一小部分样本”,而不是每次都要用全体参数来背诵那一小批样本。所以,这跟“不要将鸡蛋放在同一个篮子里”应该是相似的,将样本更均匀分散在每一个参数中,从而降低了过拟合风险。


尝试一下

对于 ChildTuning-F 来说,如果自己懂得改优化器的话,不管是对梯度 Dropout 还是对更新量 Dropout,都只是一行代码的工作量,因此还是值得尝试一下的。万一真的有用呢?

这里笔者在 CLUE 的几个任务上做了测试,结果如下表。其中,baseline 代码来自《bert4keras 在手,baseline 我有:CLUE 基准代码》,“grad drop”是对梯度进行 Dropout,“incre drop”是对更新量进行 Dropout,绿色表示相比 baseline 有提升,红色则表示下降。时间算力都有限,所有结果都只跑了一次,存在一定的随机波动。

从表格中,我们大致可以看出:

1. 对梯度 Dropout 和对更新量进行 Dropout,大致上各有优劣;

2. 在 BERT 上的效果明显一些,在 RoBERTa 上的效果几乎没有,这跟论文给出的英文实验结果相似。

这结果挺让人无语的,不能说它没效,但正常来说,谁会用速度一样、效果更差的 BERT 而不用效果更好的 RoBERTa 呢?那么,如果 RoBERTa 不怎么 work 的话,似乎就没啥尝试的价值了?当然,原论文提升最大的是 Electra,这个我没尝试过,有兴趣的读者尝试了把结果告诉我一下哈。


文章总结
本文介绍了往梯度里边加入 Dropout 来提高 finetune 效果的做法,并给出了自己的理论分析。总的来说,个人的感觉是:可以尝试,可能有效,但不要期望太高。


参考文献


[1] https://kexue.fm/archives/8348
[2] https://arxiv.org/abs/2109.05687
[3] https://arxiv.org/abs/2111.09839
[4] https://kexue.fm/archives/8764


特别鸣谢

感谢 TCCI 天桥脑科学研究院对于 PaperWeekly 的支持。TCCI 关注大脑探知、大脑功能和大脑健康。


更多阅读




#投 稿 通 道#

 让你的文字被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。


📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算


📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿


△长按添加PaperWeekly小编




🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧


·
·

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存