百科问答小站 logo
百科问答小站 font logo



如何评价论文「Stochastic Training is Not Necessary ...」? 第1页

  

user avatar   summer-clover 网友的相关建议: 
      

这篇文章arxiv刚挂出来的时候,就觉得这个title很霸气,赶紧读了读。


与让人心神荡漾的结论比,文章论证结论的过程有点波澜不惊。

如果真的Stochastic Training is Not Necessary for Generalization完美成立,那那么一堆做深度学习优化泛化理论的顶会工作岂不是都做了个寂寞?我的顶会工作也做了一个寂寞?


单单讨论这篇文章的结论,确实有一点难以开口。

我个人觉得尤其值得关注的作者是怎么论证这么一个有点颠覆性的结论的。

当捋清楚文章里的证据,问题里关心的那几点其实都相当清楚。


理论部分。

这篇文章的理论分析很简单,甚至聊胜于无。最重要的Eq4到Eq6那一部分其实都是最近几年深度学习理论方向的进展。特别是Eq6那个写法,把SGD的正则化项近似写成 的形式是今年几篇DL Theory顶会都在用的结果。都是普遍认可的结果,并无新意,也就不多说了。



实验部分。

这篇文章真正重要的部分还是实验证据能否支持结论?

文章最主要的实验是把ResNet18用SGD在CIFAR-10训练300个epoch作为baseline。学习率、batch size、weight decay、momentum都用了很标准baseline setting。这个恰巧也是我很喜欢用的baseline。95.70%的accuracy确实也如作者所说是很有竞争力。


上图来自论文原文。这个表很清晰低展示了每一个trick分别提升了多少个点。


这里面其实真正特别有效的是前三个trick——

1.train longer:训练久一点,再久一点

2. gradient clipping :梯度剪切,grad norm别太大,最大0.25就行了

3. explicit regularization:就是我上面提到的SGD的近似正则化项

接下来,我们一个一个讨论。




Trick 1. train longer

老实说,第一个trick是如此的朴实无华,以至于很多人印象里这也算trick??

从文献[1]这篇NeurIPS2017起,可以说Train Longer, Generalize Better的结论就逐渐得到广泛认可,压倒了early stopping。

虽然大多数人最开始学的trick大概都是early stopping,但是目前除了adversarial training、label noise等少数方向外,early stopping这个trick一般不会用。在标准的图像分类任务上更是如此。

只要超参数的选得合适,的确就是Train Longer, Generalize Better



文章的实验里,最初一共是20个点的差距,光这一个trick就追回来12个点。好家伙,难道之前的人不知道Trick 1这么牛?

其实不完全是这样。我可以很肯定地说,在图像分类的最常见的三个数据集CIFAR-10/CIFAR-100/ImageNet,这个trick只会在CIFAR-10上这么有效。因为我们组在近期的一个论文里恰好跑过类似的实验。在ImageNet上large-batch training+Trick 1的效果会弱很多,而且计算成本会高很多。


这里正是这篇论文最大的缺陷,只提供了CIFAR-10的实验结果。

或许没有做过相关实验的读者和甚至部分审稿人都会觉得它和CIFAR-100、ImageNet上或许差别不大吧?有的setting下差别确实不大,但是这个问题上差别真的太大了。


我们组近期的那个论文正好也解释了这个问题。在有的数据集上,large-batch training的主要瓶颈是small gradient noise带了的generalization的问题。需要通过增强噪音的方式,比如Linear Scaling Rule,来解决这个问题。这也是large-batch training最常见的情况。

(关于Linear Scaling Rule,我在如何理解深度学习分布式训练中的large batch size与learning rate的关系里有详细讨论,不再多做介绍。)

但在有的数据集上,large-batch training的主要瓶颈是convergence不够好的问题。这个时候加噪音反而会恶化情况,我们需要的是反而是加快convergence的方法。正好,CIFAR-10就是这么个情况。

(但是我们组的这个工作还没被正式接收,所以很尴尬,应该大多数人都不会注意到这个区别。)




Trick 2. gradient clipping

其实gradient clipping是隐私算法和NLP模型训练里必用的trick,在图像分类用的反而不多。

但是由于该文章用了baseline学习率4倍大的学习率。那么用gradient clipping限制最大gradient norm来避免divergence就是一个很容易理解的trick。

一篇很重要的ICLR2020工作文献[2]研究了gradient clipping的理论,总体效果也是accelerating convergence。结合我们组工作的结论,就很明显了,就是收敛慢是CIFAR-10上的瓶颈。那么这个也暗示了,gradient clipping在ImageNet的large batch training上很可能就没有6个点提示那么显著的效果,甚至没有效果都可能。



Trick 3. Explicit Regularization SGD近似正则化项


这个trick目前是做理论方向的同行比较了解,大多数其他方向的同学应该还不知道这个东西,所以很少有人尝试过。这个trick在CIFAR-10上提高了1.5个点,虽说相对20个点的差距来说很小,也算显著了。


但是这个trick说不定才是这篇文章最可靠的发现,是在ImageNet等其他数据集上也很可能真正有效的trick。我没有看到有其他论文试过这个正则项对large batch training的影响。这个正则项的理论基础真的很好。

当然,这个trick的代价也不菲。需要计算成本翻倍,因为每个iteration要BP两次。



还有两个容易被忽略的弱点。

第一个是,其实在相同的epochs数目下,如果我们用baseline SGD训练3000个epoch,你可以发现SGD立马又毫无悬念地超过GD。对于SGD来说,Trick 1也有显著加成。


第二个是,在文章的setting里,GD的训练成本已经远远高出baseline SGD的。所以这一套训练方法暂时还没有实用价值。通常大家做的large-batch training实验里是要在相同epoch数做比较的,这样才说说服力。



好了。主要的tricks介绍完了,其他warmup之类的也是large-batch training都会用的tricks也不多谈了。

现在,大家应该也能很容易看出来这篇文章的弱点在哪里、贡献在哪里。


如果真的Stochastic Training is Not Necessary for Generalization完美成立,那那么一堆做深度学习优化泛化理论的工作岂不是做了个寂寞?

还好,我们没有做了个寂寞。


文章最多只是支持Stochastic Training is Not Necessary for Generalization on CIFAR-10。而且,相同计算成本的时候,GD还是不如SGD。

但我还是觉得这是一篇贡献足够大的文章了。

毕竟,我们之前也不知道在CIFAR-10上可以搞定full-batch training。



References:

[1] Hoffer, E., Hubara, I., & Soudry, D. (2017, December). Train longer, generalize better: closing the generalization gap in large batch training of neural networks. InProceedings of the 31st International Conference on Neural Information Processing Systems(pp. 1729-1739).

[2] Zhang, J., He, T., Sra, S., & Jadbabaie, A. (2019, September). Why Gradient Clipping Accelerates Training: A Theoretical Justification for Adaptivity. InInternational Conference on Learning Representations.


user avatar   liustein 网友的相关建议: 
      

多谢推给我这篇文章啊,很不错,作为一个关于batch size的survey看再好不过了(大雾)。

简单地说,文章根据理论公式设计了一个惩罚项,成功地让full batch的GD算法达到了SGD的精度,这等于验证了理论公式的正确性。

但这文章其实实际用途有限。如果确实卡多的话用full batch确实是可以加速吧,但这个世界上有几个厂能做到呢?日常工作,使用SGD肯定是最佳选择,效果好,训练鲁棒性强,超参数不怎么需要调。SGD泛化性更好,能达到更flat的minima,这都是众所周知的。

关于Batch Size的研究背景

大背景就是各路人马用了各种办法想要让full batch的GD能够达到SGD的精度,主要手段是疯狂的调参和使用各种trick,包括:

  • 调整学习率(说是batch size和学习率线性相关,其实也不尽然)
  • 调整Momentum,使用adaptive momentum
  • 使用合适的Scheduler+Warmup
  • 对权重和偏置使用规范化项
  • 使用Label smoothing
  • 使用二阶优化器(这是拼了的节奏)
  • 往梯度里加入噪声

即便如此,最终还是不能达到SGD的精度。。。

SGD的理论公式

这里就提到了用公式来表达SGD的优化过程,就是这篇论文:

里的一个公式,认为SGD可以用下面这个二阶近似公式来表达:

就是待优化的参数, 是损失函数,最后那一坨乱码是梯度噪声和布朗运动模型的微分(别问,问就是看不懂)。

既然这是SGD的公式,那只要照着公式构造训练过程就可以了。

稳定Full batch训练

首先什么都不做,先让训练稳定下来再说,Full batch训练最大的问题是不稳定。原因是大部分梯度肯定是很微小的,但因为一些corner case偶尔会有很大的梯度产生,导致梯度两极分化,基本上安安全全的训练出来都困难。

作者用了三个办法让Full batch训练至少能够稳定下来:

  1. 使用温柔一些的学习率,按照batch size和学习率线性相关的理论,那学习率得去到39,这太夸张了,不可能训得出来的。最后作者用了0.4的学习率。
  2. Warmup,光是Warmup就耗掉400个Epoch 。。。意思很明显,既然梯度太极端,那我就试探性的,慢慢来,安全第一嘛,时间长一点,总是能训出来的。
  3. 梯度裁减,这也是提高安全性的,太大的梯度就裁掉,没什么好说的。

总之,用了以上三板斧,至少能train出来了,这个时候和SGD的版本还差2%的gap

引入梯度惩罚项

上面那个公式稍微展开一下可得:

第一项是普通的梯度不提,第二项是一个二阶导,实际使用不现实,那就进行进一步的近似:

这样的话要得到这一项只需要多跑一次forward+backward pass就可以了,操作起来比较现实。

加上这个近似的梯度惩罚项,在Warmup结束之后再让学习率加倍成0.8继续训一通,最后就达到了和SGD一样的精度。




  

相关话题

  国内目前的量化交易是否很少涉及到机器学习? 
  深度学习如何入门? 
  如果人工智能迎来下一个寒冬,你认为会是卡在什么问题上? 
  究竟什么是损失函数 loss function? 
  如何评价论文「Stochastic Training is Not Necessary ...」? 
  精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么? 
  如何看待Hinton的论文《Dynamic Routing Between Capsules》? 
  人工智能领域有哪些精妙的数学原理? 
  如何评价Yann LeCun宣称『他已经做好放弃概率论的准备』? 
  当前(2020年)机器学习中有哪些研究方向特别的坑? 

前一个讨论
为什么 Python 的 GIL 问题一直让人诟病,Python 社区却不解决?
下一个讨论
如何把自己的导师培养成杰青?





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利