【深度学习】 Batch Normalization

作者:魏秀参
链接:https://www.zhihu.com/question/38102762/answer/85238569
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

这里分五部分简单解释一下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:

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

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来加快训练速度,提高模型精度。


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

************************************************************************************************************************************

另一篇:https://blog.csdn.net/hduxiejun/article/details/60468146

Batch Normalization

批量归一化技术出现在2015年。 
机器学习领域有个很重要的假设,独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型,能够在测试集获得的效果的一个基本保障。而BN就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的

Mini-Batch SGD**优点**:梯度更新方向比较准确,并行计算速度比较快。 
Mini-Batch SGD**缺点**:麻烦。超参数调起来很麻烦,比如学习率,参数初始化,Dropout比例等等。BN应用于Mini-Batch SGD之后就可以解决很多SGD的缺点,不用在担心调参的问题。

我们的训练数据是有一定的固定分布,不过深度学习中有很多的隐层,在训练过程中,各层参数会不断变化,很长时间之后才会稳定。BN的基本思想就是让每个隐层节点的激活输入分布股东下来,来提升训练速度。

收BN的起来发源于图像处理的白花操作。所谓白化,就是对输入数据分布变换到均值为0,方差为1的正态分布,那么神经网络较快收敛。

为什么要利用?

这里写图片描述

如果不利用BN,数据就会落在激活函数的饱和区,这样梯度越来越小,甚至出现梯度消失现象。

如何实现BN

这里写图片描述

把输入数据重新拉回到均值为0,方差为1的区域,这样让每层的输入落在(-1,1)区间,这段刚好是激活函数性能最好的区域。

落在0附近的线性区域也不好,进行下面的操作y= scale*x+shift。每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是scale和shift把这个值重标准正态分布左移和右移一点并且长胖或变瘦一点。使得整个分布从中心周围的线性区往非线性区移动了一些。核心思想就是找到一个合适的位置,既能享有非线性的表达能力,又避免太靠近非线性去的两头使得网络收敛速度太慢。

这里写图片描述

对比了利用BN和不利用BN的结果,可以发现利用BN的结果性能更好。

网络中实现

这里写图片描述

对于一个m个样本的输入,对于每一层的输入进行归一化操作

这里写图片描述

这里写图片描述

其中X(k)=W*U+b 
E[X(k)]代表m个样本在某个神经元之前x(k)的均值。 
分母代表m个样本的x(k)的标准差。

算法原理如下所示:

这里写图片描述

测试阶段的均值和方差

测试阶段的均值和方差要用整体的均值和方差,这要求在计算每个mini-batch的时候要记录每个mini-batch的均值和方差 
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_34106574/article/details/82454471