星标/置顶小屋,带你解锁
最萌最前沿的NLP、搜索与推荐技术
文 | 苏剑林
编 | 夕小瑶
在训练模型的时候,我们需要损失函数一直训练到0吗?显然不用。一般来说,我们是用训练集来训练模型,但希望的是验证集的损失越小越好,而正常来说训练集的损失降低到一定值后,验证集的损失就会开始上升(即过拟合),因此没必要把训练集的损失降低到0。
为了对抗这种过拟合现象,提高模型的测试集表现(即泛化能力),一种很自然的想法是提前终止(early stopping),也就是当观测到模型的验证集表现不降反升时,果断停止训练。这也是如今大模型跑小数据时的最常用做法。
既然如此,在模型训练loss已经到达某个阈值之后,我们可不可以做点别的事情来继续提升模型的测试集性能呢?一篇发表于机器学习顶会ICML2020上的论文《Do We Need Zero Training Loss After Achieving Zero Training Error?》[1]回答了这个问题。
不过这篇论文的回答也仅局限在“是什么”这个层面上,并没很好地描述“为什么”,另外看了知乎上kid丶[2]大佬的解读,也没找到自己想要的答案。因此自己分析了一下,记录在此。
思路描述
论文提供的解决方案非常简单,假设原来的损失函数是,现在改为:
其中
这样做有什么效果呢?论文显示,训练集的损失函数经过这样处理后,验证集的损失能出现“二次下降(Double Descent)”,如下图。简单来说就是最终的验证集效果可能更好些。
左图:不加Flooding的训练示意图;右图:加了Flooding的训练示意图
效果
从上图可以看出来这个方法的理想很丰满,那么实际表现如何呢?
作者这里在MNIST、CIFAR等众多CV领域的benchmark上进行了实验,且如下图所示
图中中间一栏是没有加flooding的结果(early stopping和weight decay的四种排列组合),右边一栏是加了flooding的结果(四种排列组合的基础上都加上flooding)。可以看到加了flooding后,大部分情况下模型都能比之前有更好的测试集表现。
个人分析
如何解释这个方法的有效性呢?可以想象,当损失函数达到
我们有
(滑动查看完整公式)
近似那一步是使用了泰勒展式对损失函数进行近似展开,最终的结果就是相当于损失函数为梯度惩罚
本质上来讲,这跟往参数里边加入随机扰动、对抗训练等也没什么差别,只不过这里是保证了损失足够小后再加扰动。读者可以参考《泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练》[3]了解相关内容,也可以参考“圣经”《深度学习》第二部分第七章的“正则化”一节。
方法局限性
虽然这个方法看起来还挺work,但是不能忽视的一个细节是,作者在做上面表格里的每组flooding的实验时,都对flooding的超参b调节了20组(从0.01~0.20),如下
这在数据规模很小时实验代价还好,但单次实验代价较高时,可能就不那么实用了。
继续脑洞
有心使用这个方法的读者可能会纠结于
其中
(滑动查看完整公式)
这就相当于自始至终都在用学习率
文章小结
本文简单介绍了ICML2020一篇论文提出的“到一定程度后就梯度上升”的训练策略,并给出了自己的推导和理解,结果显示它相当于对参数的梯度惩罚,而梯度惩罚也是常见的正则化手段之一。
文末福利
后台回复关键词【入群】
加入卖萌屋NLP/IR/Rec与求职讨论群
有顶会审稿人、大厂研究员、知乎大V和妹纸
等你来撩哦~
关注星标
带你解锁最前沿的NLP、搜索与推荐技术
参考文献
[1] Do We Need Zero Training Loss After Achieving Zero Training Error?: https://arxiv.org/abs/2002.08709
[2] kid丶: https://zhuanlan.zhihu.com/p/163676138
[3] 泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练: https://kexue.fm/archives/7466