批规范化 Batch Normalization

batch normalization 就是对数据作批规范化,使得数据知足均值为0,方差为1的正太分布。其主要做用是缓解DNN训练中的梯度消失/爆炸现象,加快模型的训练速度。BN在2015年提出,论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shiftpython

机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是知足相同分布的,这是经过训练数据得到的模型可以在测试集得到好的效果的一个基本保障。可是在深层神经网络中,每轮迭代后基本上全部的网络的参数都会更新,因此就致使在训练过程当中,每个隐藏层的输入分布老是变来变去的,而且随着网络层数加深,更深层的隐藏层网络的输入分布差别会更大,这就是所谓的“Internal Covariate Shift”现象,这种现象影响之一是咱们训练时候不敢设置较大的学习率,训练很困难,收敛愈来愈慢,而且容易产生梯度消失或梯度爆炸。网络


为了不“Internal Covariate Shift”问题,论文中提出了Batch Normalization(BN)的基本思想:让每一个隐藏层节点的激活输入分布固定下来。具体如何操做呢?就是经过必定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把愈来愈偏的分布强制拉回比较标准的分布,这样把输入的分布变窄(固定在[-1,1]),可是让梯度变大,避免梯度消失问题产生,并且梯度变大意味着学习收敛速度快,能大大加快训练速度。机器学习


BN操做把分布压缩在[-1,1],服从均值为0,方差为1的正太分布,至关于把大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。这种变换也致使一个问题,就是下降了网络的表达能力,增长了网络线性表达的能力,抑制了网络的非线性表达,因此BN为了保证非线性的得到,对变换后的知足均值为0方差为1的x又进行了scale加上shift操做(y=scale*x+shift),每一个神经元增长了两个参数scale和shift参数,这两个参数是经过训练学习到的,意思是经过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每一个实例挪动的程度不同,这样等价于非线性函数的值从正中心周围的线性区往非线性区作了细微的调整,防止BN的“矫枉过正”。函数

 

BN的优势:学习

  • ①极大提高了训练速度,收敛过程大大加快;
  • ②增长了分类效果,一种解释是这是相似于Dropout的一种防止过拟合的正则化表达方式,因此不用Dropout或正则化也能达到至关的效果;
  • ③简化了调参过程,对于初始化参数权重不太敏感,容许使用较大的学习率

 

BatchNormalization keras实现测试

keras.layers.normalization.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)


参数:code

  •     axis: 整数,指定要规范化的轴,一般为特征轴。例如在进行data_format="channels_first的2D卷积后,通常会设axis=1。
  •     momentum: 动态均值的动量
  •     epsilon:大于0的小浮点数,用于防止除0错误
  •     center: 若设为True,将会将beta做为偏置加上去,不然忽略参数beta
  •     scale: 若设为True,则会乘以gamma,不然不使用gamma。当下一层是线性的时,能够设False,由于scaling的操做将被下一层执行。
  •     beta_initializer:beta权重的初始方法
  •     gamma_initializer: gamma的初始化方法
  •     moving_mean_initializer: 动态均值的初始化方法
  •     moving_variance_initializer: 动态方差的初始化方法
  •     beta_regularizer: 可选的beta正则
  •     gamma_regularizer: 可选的gamma正则
  •     beta_constraint: 可选的beta约束
  •     gamma_constraint: 可选的gamma约束

执行BN函数不会改变数据的shape。orm