因为要准备面试,把之前摘录的简单梳理下,名词缩写从简,有空再好好补充。
首先,不准备写一个完整的normalization和初始化的清单,应该也不难搜到。
看到很多文章引用bn的时候,还是在提ICS的解释,有点难过。更甚至于还有bn把输入归一化到0附近减少梯度消失的解释,说着说着发现还有个beta和gamma,然后就尿了。
其实18年就有人发表跟进文章:ICS不能解释bn的作用。稍微捋捋这条线,也当做笔记。
优化领域本身也很玄学,一方面有很多工作研究怎么降低train loss;另一方面,train loss低的解不一定泛化能力强,所以有人研究什么样的解泛化能力更强,比过拟合稍微复杂些,毕竟double descent目前也没有很好的解释。第二条线本篇先略过了,有机会再挖坑。
tldr;
bn的作用是光滑loss;bn,ics,performence 3者没有必然关系;
合理的初始化能找到更光滑的初始区域,从而去掉bn,或者warm-up;
最后的很短的总结可以瞄一眼,总结了下几个主题之间的关系。
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift,2015
原文总结的bn的作用:1. 允许大lr;2. 初始化不敏感;3. 一种正则,减少对dropout的需求。
除了操作上的别扭,也有一些其他文章提及bn的负面作用[1][2]
原文将bn的成功归因为减少bn前一层输出的ics,也就是参数更新前后,某一层输入分布的变化。后面的工作基本上推翻了这个解释。
How Does Batch Normalization Help Optimization? 2018
这篇文章的几个结论:
- ics和bn带来的性能提升没关系
- bn不能减少ics
- bn有用的原因是它能使损失函数曲面(loss landscape)更光滑
下图是在某个点,沿着一个梯度方向走,观察到的loss,loss方差越大,越容易产生梯度爆炸,结果就是发散。
![30afa1f602b27c136b01ed5cb821678f.png](https://img-blog.csdnimg.cn/img_convert/30afa1f602b27c136b01ed5cb821678f.png)
Fixup Initialization: Residual Learning Without Normalization,2019
这篇文章说的是,其实不需要bn,只要找到一个好的初始化。结论是针对resnet的,之前还有一篇针对vanilla cnn的dynamic isometry研究[3],没时间看了,等忙完一起补。
分析:
- 标准初始化导致某些层的梯度随着深度爆炸
- 想要使gradient norm和深度无关,只要两步:
- 标准初始化之后,缩放一下每层的参数
- 在分支上加几个乘数和bias
按照不严谨的思考,这意味着在参数空间的某些区域里,梯度呈现爆炸,像是雷区,不能开大lr走,在另一些区域里,就更加安全(光滑),可以用大lr训练;bn能减少这种雷区。
类似这个原理的工作还有rezero[4],也是针对residual连接,residual分支的0初始化,可以去除warm-up和layer norm。
这是不是意味着warm-up有了一个直观解释?通过小lr迭代进入安全区,再开始大lr训练,不过这种解释也没有实验验证,我看过的唯一专门讨论warm-up的工作[5]好像也没解释原因,有时间再去调研一下。不过对使用warm-up原因还是有比较一致的观点,初始化区域的loss方差太大,逼格高一点的说法就是loss的Lipschitzness特性不够好。
刚看到一篇ICLR2020关于warm-up的投稿[6](虽然被拒了,分析和结论还挺有意义的,这里看中文[7]),把layer-norm移到residual分支,能缓解初始区域梯度爆炸的问题,从而不需要warm-up。还没来得及细看论文,以后补吧。
总结
可以看到,优化的研究方向:
- 寻找更光滑的区域(挑简单的路走)
- 改造网络,使整体的loss landscape整体上更光滑(改造山路)
- 使优化器更鲁棒,来应对不光滑的loss,使优化器能在各种崎岖山路一马平川(改进交通工具)
对应的方法:
- 主要是各种初始化方案
- 各种norm
- 各种优化技巧,比如warm-up,RAdam[8],Gradient Centralization[9]
第一种方向听起来像是逃避现实,实际上也有相关的更深入的研究,是优化领域的另一条线:SGD实际上本身就是一种正则化,只会搜索初始化附近一个领域。所以初始化区域挑好了,就很难再走到那些雷区。
好像还有证明,等下次来更新补充,本来不想这么短就结束,要滚去刷题了,时间超预算了,扎心。
TOREAD
19年的两篇文章[10][11]研究了bn的负作用:
bn似乎要配合skip连接才能光滑loss,否则会使初始梯度更加容易爆炸[10];
bn容易造成模型不robust,带来对抗样本[11]。
参考
- ^CPC http://arxiv.org/abs/1905.09272
- ^adversary https://www.reddit.com/r/MachineLearning/comments/d2m5zr/d_batch_normalization_is_a_cause_of_adversarial/
- ^dynamic_isometry https://arxiv.org/abs/1806.05393
- ^rezero https://arxiv.org/abs/2003.04887
- ^warmup https://openreview.net/forum?id=r14EOsCqKX
- ^On Layer Normalization in the Transformer Architecture https://openreview.net/forum?id=B1x8anVFPr
- ^香侬读 | Transformer中warm-up和LayerNorm的重要性探究 https://zhuanlan.zhihu.com/p/84614490
- ^Ranger https://zhuanlan.zhihu.com/p/100877314
- ^GC https://arxiv.org/abs/2004.01461v2
- ^abA Mean Field Theory of Batch Normalization https://arxiv.org/abs/1902.08129
- ^abBatch Normalization is a Cause of Adversarial Vulnerability https://arxiv.org/abs/1905.02161