转: 批标准化Batch Normalization

参考:

深入理解批标准化 (推荐)

批标准化(Batch Normalization )
batch normalization, instance normalization, layer normalization, group normalization (知乎)

 

 

在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,它会导致网络模型很难稳定的学习数据中的规律,因为模型还得去学习怎么迎合这种分布变化。

BatchNorm的基本思想:能不能让每个隐层节点的激活输入分布固定下来呢?这样就避免了“Internal Covariate Shift”问题了。

因为深层神经网络在做非线性变换前的随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的原因BN就是通过一定的规范化手段,把每层神经网络任意神经元激活输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

然而,稍微了解神经网络的读者一般会提出一个疑问:如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?这意味着什么?我们知道,如果是多层的线性函数变换其实这个深层是没有意义的,因为多层线性网络跟一层线性网络是等价的。这意味着网络的表达能力下降了,这也意味着深度的意义就没有了。所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。

BN其具体操作流程如下:

 

Batch Normalization的优点:

不仅仅极大提升了训练速度,收敛过程大大加快;

②还能增加分类效果,每次对数据分布的变动,可以看做是一次数据增强方式;

③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。

 

posted @ 2020-04-18 09:06  Picassooo  阅读(132)  评论(0编辑  收藏  举报