/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/
author: 张俊林
(想更系统地学习深度学习知识?请参考:深度学习枕边书)
Batch Normalization作为最近一年来DL的重要成果,已经广泛被证明其有效性和重要性。目前几乎已经成为DL的标配了,任何有志于学习DL的同学们朋友们雷迪斯俺的詹特曼们都应该好好学一学BN。BN倒过来看就是NB,因为这个技术确实很NB,虽然有些细节处理还解释不清其理论原因,但是实践证明好用才是真的好,别忘了DL从Hinton对深层网络做Pre-Train开始就是一个经验领先于理论分析的偏经验的一门学问。
如何理解BatchNorm?请参考论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。因为对于部分基础不是太好的同学们朋友们雷迪斯俺的詹特曼们可能阅读理解有一定障碍,所以本文是为了更容易理解BN而做的一番导读。由于本人水平也很有限,假设导游导错了了路,那么…….您就认倒霉好了,毕竟这是免费的导游您说是不,期望别太高,“任何对其它人或者事物报以极高期望的人是这个世界上最不幸福的人”,这是出自我的非名人的名言,所以“降低期望是通向幸福之路”,这也是我的名言。
机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。而BatchNorm是干啥的呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。OK,BN讲完了,再见。
嗯,这么讲步子迈得有点大,我们放慢脚步,把学习率调小一点,一步一步接近理解BN的最优解。
为什么深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢?这是个在DL领域很接近本质的好问题。很多论文都是解决这个问题的,比如ReLU激活函数,再比如Residual Network,BN本质上也是解释并从某个不同的角度来解决这个问题的。
|“Internal Covariate Shift”问题
从论文名字可以看出,BN是用来解决“InternalCovariate Shift”问题的,那么首先得理解什么是“Internal Covariate Shift”?
论文首先说明Mini-Batch SGD相对于One Example SGD的两个优势:梯度更新方向更准确;并行计算速度快;(本文作者:为啥要说这些?因为BatchNorm是基于Mini-Batch SGD的,所以先夸下Mini-Batch SGD,当然也是大实话);
然后吐槽下SGD训练的缺点:超参数调起来很麻烦。(本文作者:作者隐含意思是用我大BN就能解决很多SGD的缺点:用了大BN,妈妈再也不用担心我的调参能力啦)
接着引入covariate shift的概念:如果ML系统实例集合<X,Y>中的输入值X的分布老是变,这不符合IID假设啊,那您怎么让我稳定的学规律啊,这不得引入迁移学习才能搞定吗,我们的ML系统还得去学习怎么迎合这种分布变化啊。
对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数老在变