深度学习中 Batch Normalization为何效果好

看mnist数据集上其余人的CNN模型时了解到了Batch Normalization 这种操做。效果还不错,至少对于训练速度提高了不少。html

batch normalization的作法是把数据转换为0均值和单位方差网络

这里分五部分简单解释一下Batch Normalization (BN)。
1. What is BN?
顾名思义,batch normalization嘛,就是“批规范化”咯。Google在ICML文中描述的很是清晰,即在每次SGD时,经过mini-batch来对相应的activation作规范化操做,使得结果(输出信号各个维度)的均值为0,方差为1. 而最后的“scale and shift”操做则是为了让因训练所需而“刻意”加入的BN可以有可能还原最初的输入(即当 \gamma^{(k)}=\sqrt{Var[x^{(k)}]}, \beta^{(k)}=E[x^{(k)}]),从而保证整个network的capacity。(有关capacity的解释:实际上BN能够看做是在原模型上加入的“新操做”,这个新操做很大可能会改变某层原来的输入。固然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既能够改变同时也能够保持原输入,那么模型的容纳能力(capacity)就提高了。)

关于DNN中的normalization,你们都知道白化(whitening),只是在模型训练过程当中进行白化操做会带来太高的计算代价和运算时间。所以本文提出两种简化方式:1)直接对输入信号的每一个维度作规范化(“normalize each scalar feature independently”);2)在每一个mini-batch中计算获得mini-batch mean和variance来替代总体训练集的mean和variance. 这即是Algorithm 1.

 

2. How to Batch Normalize?
怎样学BN的参数在此就不赘述了,就是经典的chain rule:app


3. Where to use BN?
BN能够应用于网络中任意的activation set。文中还特别指出在CNN中,BN应做用在非线性映射前,即对x=Wu+b作规范化。另外对CNN的“权值共享”策略,BN还有其对应的作法(详见文中3.2节)。dom

4. Why BN?
好了,如今才是重头戏--为何要用BN?BN work的缘由是什么?
说到底,BN的提出仍是为了克服深度神经网络难以训练的弊病。其实BN背后的insight很是简单,只是在文章中被Google复杂化了。
首先来讲说“Internal Covariate Shift”。文章的title除了BN这样一个关键词,还有一个即是“ICS”。你们都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。若是不一致,那么就出现了新的机器学习问题,如,transfer learning/domain adaptation等。而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件几率是一致的,可是其边缘几率不一样,即:对全部x\in \mathcal{X},P_s(Y|X=x)=P_t(Y|X=x),可是P_s(X)\ne P_t(X). 你们细想便会发现,的确,对于神经网络的各层输出,因为它们通过了层内操做做用,其分布显然与各层对应的输入信号分布不一样,并且差别会随着网络深度增大而增大,但是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。因为是对层间信号的分析,也便是“internal”的来由。机器学习

那么好,为何前面我说Google将其复杂化了。其实若是严格按照解决covariate shift的路子来作的话,大概就是上“importance weight”( ref)之类的机器学习方法。但是这里Google仅仅说“经过mini-batch来规范化某些层/全部层的输入,从而能够固定每层输入信号的均值与方差”就能够解决问题。若是covariate shift能够用这么简单的方法解决,那前人对其的研究也真真是白作了。此外,试想,均值方差一致的分布就是一样的分布吗?固然不是。显然,ICS只是这个问题的“包装纸”嘛,仅仅是一种high-level demonstration。

那BN究竟是什么原理呢?说到底仍是为了防止“梯度弥散”。关于梯度弥散,你们都知道一个简单的栗子:0.9^{30}\approx 0.04。在BN中,是经过将activation规范为均值和方差一致的手段使得本来会减少的activation的scale变大。能够说是一种更有效的local response normalization方法(见4.2.1节)。学习

5. When to use BN?
OK,说完BN的优点,天然能够知道何时用BN比较好。例如,在神经网络训练时遇到收敛速度很慢,或梯度爆炸等没法训练的情况时能够尝试BN来解决。另外,在通常使用状况下也能够加入BN来加快训练速度,提升模型精度。spa


诚然,在DL中还有许多除BN以外的“小trick”。别看是“小trick”,实则是“大杀器”,正所谓“The devil is in the details”。但愿了解其它DL trick(特别是CNN)的各位请移步我以前总结的:Must Know Tips/Tricks in Deep Neural Networks
以上。

 
 

做者:魏秀参
连接:https://www.zhihu.com/question/38102762/answer/85238569
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。

 

参考资料:.net

https://blog.csdn.net/shuzfan/article/details/50723877scala

https://www.zhihu.com/question/38102762orm

https://arxiv.org/pdf/1502.03167.pdf

相关文章
相关标签/搜索