batch normalization学习理解笔记
最近在Andrew Ng课程中学到了Batch Normalization相关内容,通过查阅资料和原始paper,基本上弄懂了一些算法的细节部分,现在总结一下.
1. batch normalization算法思想的来源
不妨先看看原文的标题:Batch normalization:acclerating deep network training by reducing internal covariate shift.字面意思即:Batch Normalization算法是通过减小内部协变量偏移来加速深度神经网络训练.不难看出,作者明确指出Batch Normalization是一种加速深度神经网络训练的方法.什么原理呢,就是通过减小内部协变量偏移.原文中明确给出变量的定义:we refer to change in the distributions of internal nodes of a deep networks,in the course of training, as Internal Covariate Shift.其实意思就是神经网络内部layer的输入(即上一layer的输出)分布的变化.
Internal Covariate Shift的定义是相对于Covariate Shift而言的,Covariate Shift是指神经网络输入(X)分布发生改变的现象.大家都知道神经网络之所以具有泛化能力,一个基本的假设就是训练样本集与测试样本集是独立同分布的(iid),如果两者分布不同(或者说两者分布之间存在Covariate Shift现象),则网络的性能就没有了保证.而Internal Covariate Shift是将这一概念进行了扩展,神经网络内部上一层的输出传递给下一层作为输入,每一层的输入是否存在Covariate Shift现象呢,答案是显而易见的.因为在神经网络训练过程中,w,b等参数是一直进行调整的,导致网络的输出也是不断变化的,而这一层的输出将作为下一层的输入,即输入也是不断变化的,即神经网络内部也存在着Covariate Shift现象,这种神经网络内部的Covariate Shift现象,就称为Internal Covariate Shift.
Batch normalization的想法来源正式通过减小Internal Covariate Shift来加速网络训练.因为对于Covariate Shift现象,通过白化操作能起到改善作用,以此类推,将相似的操作引入神经网络内部,也能起到加速每一层训练的效果.
2. 如何进行Batch Normalization
首先想到了是同样在每层使用白化操作,但是白化操作有两个缺点:
- 一是白化计算量很大,因为白化过程中要计算随机向量的协方差矩阵,然后求逆运算(要使得输入向量各维度不相关),而且还要在每层中计算,这在深度神经网络中是十分费时的;
- 二是白化结果不能保证处处可微,不能保证后向梯度下降法的顺利进行.
因此文中进行了两个简化:
- 一是对输入向量的各个维度单独进行均值为0,方差为1的标准化处理,不进行去相关操作,这样就避免了协方差矩阵和矩阵求逆运算,这一操作也能起到加速训练的效果,已有文献作证.
- 二是结合深度神经网络训练常用的mini-batch,在计算均值和方差时利用一个mini-batch中的样本,而不是整个训练集中的样本.
同时,为了保证进行了归一化后的输入能够包含处理前的输入(即不会损失前层网络的训练成果),又添加了一个仿射变换,引入了两个网络学习的参数(gamma)和(eta).Batch Normalization的计算过程如下:
当(eta = mu_B),(gamma = sqrt{sigma^{2}_B+varepsilon})时,(y_i=x_i),即Batch Normalization进行了恒等变换.
注意在测试过程中,当测试单个样本时,无法估计均值和方差,文中给出的解决办法是利用训练过程中mini-batch得到的均值和方差,求均值(指数加权平均)得到.具体的实现过程请参考原文献,此处不在累述.
3. Batch Normalization有那些作用
最主要的一点,也是原文中多次出现的就是加速网络训练,即达到相同的误差率,使用Batch Normalization可以大大减小所需要的迭代次数.
- 在原文试验中证实了,在原有网络结构中仅仅添加Batch Normalization,就可以大大加速网络的训练过程.个人认为有两点原因.一方面是因为经过Batch Normalization各层网络输入的均值和方差保持固定,因此后面的网络有了一个相对稳定的基础(Andrew Ng的观点),后面的网络减少了不断调整的过程;另外一点,经过归一化,输入向量各个维度保持了相同的尺度,这样也能加速后续网络的训练过程(类似于将原本椭圆状的损失函数变换为接近圆形的函数,即黑塞矩阵的条件数减小了)
- 另外,因为Batch Nomalization能够有效抑制梯度爆炸/消失问题,因此可以使用更大的学习率,用以加快训练.原文中对于使用更大的学习率进行了专门介绍:一般情况下,大的学习率会增加模型参数(W,b)的尺度,这在反向传播过程中会放大梯度,然后导致梯度爆炸问题.但是由于Batch Normalization能够使反向传播过程中梯度不受参数尺度的影响,因此可以有效防止这种问题的发生.对于一个尺度a,Batch Normalization过程具有以下特性:$$BN(Wu)=BN((aW)u)$$
其中W为模型参数,u为模型输入.上式的结果说明,Batch Normalization的结果不受模型参数尺度的影响,因为BN会对线性运算的输出进行归一化,即均值为0,方差为1,该过程会抵消掉a的影响.同时,对于传播过程,具有如下特性:$$frac{partial BN((aW)u)}{partial u} = frac{partial BN(Wu)}{partial u}$$
上面第一个式子表明(用本节第一个等式替换即可得到),在反向传播过程中,梯度由本层向前一层传递时,梯度的大小不受模型参数尺度的影响.第二个式子表明,反向传播过程中,参数的尺度越大,其梯度越小,这可以抑制梯度增长过大.
其实,对于抑制深度神经网络中梯度消失/爆炸问题,采用的方法主要有使用relu激活函数,小心初始化模型参数等,BN同样提供了一种有力的工具.
原文中通过实验证明了BN可以有效防止非线性饱和问题,对于sigmoid激活函数,由于BN操作,可以避免输入落入梯度很小的两端范围内.
文中同样提到了BN自带一定的regularization作用,可以替代/减弱dropout的使用.这主要是因为平均是和方差为模型引入了随机误差,从而增添了不确定性.Andrew Ng认为,应该将BN的regulatization作用作为一种副作用,真正的正则化还是应该使用L2,dropout等通用方法.