Batch Norm
在tensorflow中,实现Batch Norm只需要一行代码:本文总结自吴恩达深度学习系列视频:优化深层神经网络的Batch Norm部分,有所删减。
tf.nn.batch_normalization
Bactch Normalization通过标准化让激活函数分布在线性区间,结果就是加大了梯度,让模型更大胆的进行梯度下降。
下面我们就了解一下Batch Norm的基本原理和计算方法。
Normalizing inputs to speed up learning
回想之前对输入层的规范化(Normalization)操作:
它使得梯度下降要走的路程从一个扁圆的椭圆变成了一个相对标准的圆,这意味着从起始点到最优点的距离变短了,所以它可以加快学习速度。
那我们能不能对激活层计算出的激活值也应用Normalization呢? 答案是可以的。
Implementing Batch Norm
Given some intermediate values in NN Z ( 1 ) , . . . Z ( m ) Z^{(1)},...Z^{(m)} Z(1),...Z(m)
μ = 1 m ∑ i ( Z i − μ ) 2 mu=frac{1}{m}sum_i^(Z_i-mu)^2 μ=m1∑i(Zi−μ)2
Z n o r m ( i ) = Z ( i ) − μ σ 2 + ϵ Z_{norm}^{(i)}=frac{Z^{(i)-mu}}{sqrt{sigma^2+epsilon}} Znorm(i)=σ2+ϵZ(i)−μ
Z ~ ( i ) = γ Z n o r m ( i ) + β widetilde{Z}^{(i)}=gamma Z_{norm}^{(i)}+eta Z (i)=γZnorm(i)+β
参与网络计算的时候,我们使用 Z ~ [ l ] ( i ) widetilde{Z}^{[l](i)} Z [l](i)而不是 Z [ l ] ( i ) Z^{[l](i)} Z[l](i)。
注意到:
如果
γ
=
σ
2
+
ϵ
gamma=sqrt{sigma^2+epsilon}
γ=σ2+ϵ,
β
=
μ
eta=mu
β=μ,那么
Z
~
[
l
]
(
i
)
=
Z
[
l
]
(
i
)
widetilde{Z}^{[l](i)}=Z^{[l](i)}
Z
[l](i)=Z[l](i),退化到没有对激活层使用normalization。
所以这跟对输入层规范化的区别在于,我们不希望隐藏层被强制成mean 0和variance 1。我们使用两个参数 γ gamma γ和 β eta β来控制mean和variance,使得隐藏层有不同的计算分布,上述取值不会使用。
网络实现
在梯度下降算法中把上述式子加进去,就能在网络中实现。
因为我们减去了平均值 μ mu μ,那么parameter b b b可以略去,因为不管 b b b取任何值都在Normalization过程中被减掉了。
同理也可以在其他优化算法中实现。
更详细的说明,请参考:
http://www.cnblogs.com/bonelee/p/8528722.html
从别的角度理解Batch Normalization
Covariate Shift
x → y x ightarrow y x→y
从x到y的映射中,如果x发生了变动,应用同样的映射可能无法正确映射到y如下图这个猫从黑色变成其他颜色的例子。
更糟糕的情况可能是映射(即函数)也发生了改变,那么整个映射都不在有效。
这对于深层次的神经网络来说是一个问题。
Batch Normd修正了convariate shift
从网络第三层的角度来看,它之前的隐藏值随着时间不断发生变化,所以网络存在covariate shift的问题。
Batch Norm所做的事情是,它减小了这些隐藏层变动的幅度。
本小节重点在于:
执行Batch Norm意味着,从本例第三层角度来看,它通过将前面的层的值使用两个参数
γ
gamma
γ和
β
eta
β限制在同一mean和variance,从而减小了这些值的偏移。这使得其之后层的学习变得更容易进行。
Batch Norm与正则化
- 每一个mini-batch都被计算出的mean/variance缩放了。
- 这在计算 Z [ l ] Z^{[l]} Z[l]的值时,加入了一些噪音。仅从加入噪音这点而言,与dropout类似。
- 但是其加入噪音的程度仅有一点点,很轻微,只能被视作是小小的副作用,不能认为也同时进行了regularization。所以Batch Norm和dropout会同时使用。
原英文解释如下:
Because by adding noise to the hidden units, it’s forcing the downstream hidden units not to rely on too much on any one hidden unit.
And so similar to dropout, it adds noise to the hidden layers and therefore has a very slight regularization effect.
Because the noise added is quite small, this is not a huge regularization effect and you might choose to use batch norm together with dropout if you want the more powerful regularization effect of dropout.