深刻理解Batch Normalization

Internal Covariate Shift, ICS

什么是Internal Covariate Shift?
原论文给的定义是:the change in the distribution of network activations due to the change in network parameters during training.
在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化。

怎么理解这句话呢?


如上图,第 n n n层有4个神经元,第 n + 1 n+1 n+1层有2个神经元。假设第 n + 1 n+1 n+1层的激活函数为Sigmoid,其图像如下:

那么第 n + 1 n+1 n+1层第1个神经元的输入为:
A 0 = ∑ i = 0 4 ( w i , 0 ∗ x i ) + b = W 0 ∗ X + b A_0=\sum_{i=0}^4(w_{i,0}*x_i)+b=\bold W_0*\bold X+b A0=i=04(wi,0xi)+b=W0X+b
n + 1 n+1 n+1层第2个神经元的输入为:
A 1 = ∑ i = 0 4 ( w i , 1 ∗ x i ) + b = W 1 ∗ X + b A_1=\sum_{i=0}^4(w_{i,1}*x_i)+b=\bold W_1*\bold X+b A1=i=04(wi,1xi)+b=W1X+b

这里我们以第 n + 1 n+1 n+1层第1个神经元来讨论。由于权重参数 w w w和偏置参数 b b b的影响使得我们计算的 ∣ A 0 ∣ > 6 |A_0| > 6 A0>6,那么该值落在Sigmoid函数的饱和区中------这一过程就叫Internal Covariate Shift。"Internal"是指神经网络层与层之间,"Internal Covariate"是指某一层的输出。"Shift"是指输出的分布对激活函数的偏移。其造成的影响是,可能导致训练过早停止,或者可能导致学习不充分而需要大量样本多次训练,经过多次参数更新(即得到合适的参数)使得输入落在Sigmoid的非饱和区—这会让训练变得很慢。另外,从第 n n n层输出到第 n + 1 n+1 n+1层输出,其输出数据分布是否改变就看是否有非线性变化,如果仅仅是线性变化那就是FeatureScaling,并不会改变数据分布。

如果网络有很多层,那么 ICS现象会发生在任何两层之间,如果激活函数没有饱和区域,那么对 ICS就不会很敏感,但是没有饱和区域的激活函数很可能会造成梯度消失或爆炸(可以从梯度下降公式中看出 ∂ L ∂ w i = 2 n ∑ j = 0 n ( ( H j − y j ) ∗ x j i ) \frac{ \partial L}{\partial w_i}=\frac{2}{n}\sum_{j=0}^n\Bigl((H_j-y_j)*x_{ji}\Bigr) wiL=n2j=0n((Hjyj)xji)),而有饱和区域的激活函数(如Sigmoid、ReLU)在一定程度上可以缓和梯度消失或爆炸,但会对 ICS很敏感。如果我们让网络自己去消除 ICS的影响(就是一点一点尝试更新参数,向非饱和区移动)这样网络学习就会变慢。而且如果学习率稍大可能会导致调整过头,所以较小的学习率是有助于解决 ICS问题,但是会导致学习变得很慢。

这个 ICS和机器学习中的经典假设—独立同分布(Independent and Identically Distributed,IID)假设没啥关系,IID假设要求源空间(source domain)即训练集和目标空间(targetdomain)即测试集的数据分布(distribution)是一致的(我们训练集和测试集的数据分布当然是一致的了)。 ICS强调的是学习的过程数据分布的改变,事实上,不管是机器学习还是神经网络,只要经过非线性化,数据分布就改变了。而且如果数据分布不改变那么就啥也抽象不出来啥也学不到,所以数据分布改变是必须的!

那么如何解决ICS问题呢?

1、Whitening—有待深入挖掘
PCA白化
ZCA白化
白化是对输入数据分布进行变换,进而达到以下两个目的:
1、使得输入特征分布具有相同的均值与方差,其中PCA白化保证了所有特征分布均值为0,方差为1;而ZCA白化则保证了所有特征分布均值为0,方差相同;
2、去除特征之间的相关性。

通过白化操作,我们可以减缓ICS的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛。
但是白化计算成本太高,每一轮训练中的每一层都需要做白化操作;同时白化改变了网络每一层的分布,导致网络层中数据的表达能力受限。

2、FeatureScaling
思路就是:对第 n + 1 n+1 n+1层的输入(注意不是第 n n n层的输出)进行FeatureScaling(线性变换),使其落入第 n + 1 n+1 n+1层的激活函数中。

FeatureScaling是对属性的线性变换,并不改变数据的分布(不是说之前是均匀分布FeatureScaling后变成正态分布),利用Feature Scaling可以把属性值限定在一定范围内。FeatureScaling中有很多技术,比较容易想到的是Z-Score方法,在机器学习中我们使用Z-Score是为了消除量纲对建模的影响:
x ˉ i = x i − μ σ \bar x_i=\frac{x_i-μ}{σ} xˉi=σxiμ
其中 μ μ μ σ σ σ分别是属性 x x x的均值与方程。Z-Score之后的数据的均值 μ ˉ = 0 \bar μ=0 μˉ=0和标准差 σ ˉ = 1 \bar σ=1 σˉ=1

姓名 年龄 身高 视力
小明 19 180 4.5
小红 21 169 5.0
小花 18 178 4.8

Z-Score作用的是同一属性,是对所有 m m m个样本(看作一张表格)的第 i i i个属性进行操作(纵向,如年龄),而不是对第 j j j个样本的所有 n n n个属性进行操作(横向)。

在神经网络中,对于单个样本输入,没有相对性可言,所以引入了Batch。其次要明白第 n + 1 n+1 n+1层的输入是啥?这要视具体的属性函数而定,假设属性函数是 W ∗ X + b \bold W*\bold X+b WX+b,那么输入就是: W ∗ X + b \bold W*\bold X+b WX+b

对于 m m m个样本,如果第 n n n层有 k k k个神经元(输出),第 n + 1 n+1 n+1层有 z z z个神经元,那么对于第 n + 1 n+1 n+1层的第一个神经元来说其输入为:
I n p u t = Input= Input= { W 0 ∗ X 0 + b 0 \bold W_0*\bold X_0+b_0 W0X0+b0, W 0 ∗ X 1 + b 0 \bold W_0*\bold X_1+b_0 W0X1+b0,…, W 0 ∗ X m − 1 + b 0 \bold W_0*\bold X_{m-1}+b_0 W0Xm1+b0}
={ I 0 I_0 I0, I 1 I_1 I1 I m − 1 I_{m-1} Im1}

其中 W 0 \bold W_0 W0为第 n n n层神经元与第 n + 1 n+1 n+1层第1个神经元之间的权重;
X 0 \bold X_0 X0为第1个样本在第 n n n层的输出,有有 k k k个属性值。

可以很容易观察出集合 I n p u t Input Input中的每一个元素有 W 0 \bold W_0 W0 b 0 b_0 b0,我们可以把 I n p u t Input Input写出这样:

W 0 ∗ X 0 + b 0 = w 0 0 ∗ x a g e 0 + w 1 0 ∗ x h e i g h t 0 + w 2 0 ∗ x v i s i o n 0 + b 0 \bold W_0*\bold X_0+b_0=w_0^0*x_{age}^0+w_1^0*x_{height}^0+w_2^0*x_{vision}^0+b^0 W0X0+b0=w00xage0+w10xheight0+w20xvision0+b0

W 0 ∗ X 1 + b 0 = w 0 0 ∗ x a g e 1 + w 1 0 ∗ x h e i g h t 1 + w 2 0 ∗ x v i s i o n 1 + b 1 \bold W_0*\bold X_1+b_0=w_0^0*x_{age}^1+w_1^0*x_{height}^1+w_2^0*x_{vision}^1+b^1 W0X1+b0=w00xage1+w10xheight1+w20xvision1+b1

可以看出对于age属性,其系数都是 w 0 0 w_0^0 w00,这就是FeatureScaling。

计算 I n p u t Input Input集合的均值: μ = 1 m ∑ i = 0 m − 1 I i μ=\frac{1}{m}\sum_{i=0}^{m-1}I_i μ=m1i=0m1Ii
计算 I n p u t Input Input集合的标准差:
σ = 1 m ∑ i = 0 m − 1 ( I i − μ ) σ=\sqrt{\frac{1}{m}\sum_{i=0}^{m-1}(I_i-μ)} σ=m1i=0m1(Iiμ)
更新 I n p u t Input Input集合为 I ˉ n p u t \bar Input Iˉnput
I ˉ i = I i − μ σ + ε , 0 ≤ i < m \bar I_i=\frac{I_i-μ}{σ+ε},0\leq i<m Iˉi=σ+εIiμ,0i<m
为了避免除零,而引入一个极小值 ε ε ε

I n p u t ˉ \bar {Input} Inputˉ={ I ˉ 0 \bar I_0 Iˉ0, I ˉ 1 \bar I_1 Iˉ1 I ˉ m − 1 \bar I_{m-1} Iˉm1}

I n p u t ˉ \bar {Input} Inputˉ相对于 I n p u t Input Input数据分布并没有改变,只是数据被限定在一定范围内了,均值为0标准差为1

难道我们把输入转变成均值为0标准差为1就万事大吉了?是否存在这种情况, I n p u t Input Input集合中的元素服从均值为0标准差为5的分布(更松散),然后被我们转变成 I n p u t ˉ \bar {Input} Inputˉ服从均值为0标准差为1的分布(更紧凑)(他们还是同一类分布),这意味着 I n p u t Input Input I n p u t ˉ \bar {Input} Inputˉ有更高的区分度。同样,对于激活函数是Sigmoid变成均值为0还能接受,但是对于ReLU就不太能接收了,均值为0意味着有大约一般的输入都被抑制了。为了能有合适的区分度(标准差)和合适的位置(均值)我们需要对 I n p u t ˉ \bar {Input} Inputˉ进行Re-FeatureScaling—这就是Batch Normalization。

如上图红色点是均值为0标准差为1,黑色点是均值为0,方差为1.9,显然黑色点更加松散,区分度也更高。

可以看到饱和区的导数接近0。

Batch Normalization来自Google在2015年的论文。其核心就是引入了再缩放参数(re-scale parameter) γ γ γ和再平移参数(re-shift parameter) β β β,并按照如下公式将 I n p u t ˉ \bar {Input} Inputˉ变成 I n p u t ˉ ˉ \bar {\bar {Input}} Inputˉˉ
I ˉ i ˉ = γ I ˉ i + β , 0 ≤ i < m \bar{\bar I_i}=γ\bar I_i+β,0\leq i<m Iˉiˉ=γIˉi+β,0i<m
= γ I i − μ σ + ε + β =γ \frac{I_i-μ}{σ+ε}+β =γσ+εIiμ+β
= γ σ + ε I i + ( β + γ μ σ + ε ) = \frac{γ}{σ+ε}I_i+(β+\frac{γμ}{σ+ε}) =σ+εγIi+(β+σ+εγμ)

可以看到我们最终只是对 I i I_i Ii做了FeatureScaling即线性变换。
最后 I n p u t ˉ ˉ \bar {\bar {Input}} Inputˉˉ服从均值 μ ˉ ˉ = β \bar {\bar μ}=β μˉˉ=β,标准差 σ ˉ ˉ = γ \bar {\bar σ}=γ σˉˉ=γ的分布。

BN有多少个参数?
如果Batch大小为 m m m,第 n n n层有 k k k个神经元,第 n + 1 n+1 n+1层有 z z z个神经元,那么第 n + 1 n+1 n+1层的输入shape=(m,z),那么第 n + 1 n+1 n+1层有多少个参数?

全连接的情况下第 n + 1 n+1 n+1层有 ( k ∗ z ) + z + ( 4 ∗ z ) (k*z)+z+(4*z) (kz)+z+(4z)个参数,其中 k ∗ z k*z kz是权重参数 w w w z z z个偏置参数 b b b 4 ∗ z 4*z 4z个参数是指 z z z个γ、 z z z个β、 z z z个μ、 z z z个σ,其中μ和σ是不可训练参数,γ和β是需要训练学习的。

BN中参数是怎么更新的?
参数更新包括权重参数 w w w、偏置参数 b b b、再缩放参数 γ γ γ和再平移参数 β β β,其实他们的更新和权重参数 w w w的更新一样。可以参考参数是如何更新的和参考Batch Normalize的几点说明

如何理解BN对大学习率更友好?
BN在预测时怎么使用?
在这里插入图片描述https://zhuanlan.zhihu.com/p/34879333
几种提高BN效力的方法
怎么理解BN是whiten的简化之后的版本?
以上问题可以参考Batch Normalize的几点说明

Batch Normalization的优势
(1)BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度
(2)BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
(3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
(4)BN具有一定的正则化效果

Tensorflow 实现 BN例子

猜你喜欢

转载自blog.csdn.net/weixin_38052918/article/details/107785512