batch normalization 就是对数据做批规范化,使得数据满足均值为0,方差为1的正太分布。其主要作用是缓解DNN训练中的梯度消失/爆炸现象,加快模型的训练速度。BN在2015年提出,论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
机器学习领域有个很重要的假设: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)
参数:
- 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。
来源:CSDN
作者:-牧野-
链接:https://blog.csdn.net/dcrmg/article/details/81502102