本文总结自吴恩达深度学习系列视频:优化深层神经网络的Batch Norm部分,有所删减。
在tensorflow中,实现Batch Norm只需要一行代码:
tf.nn.batch_normalization
Bactch Normalization通过标准化让激活函数分布在线性区间,结果就是加大了梯度,让模型更大胆的进行梯度下降。
下面我们就了解一下Batch Norm的基本原理和计算方法。
回想之前对输入层的规范化(Normalization)操作:
它使得梯度下降要走的路程从一个扁圆的椭圆变成了一个相对标准的圆,这意味着从起始点到最优点的距离变短了,所以它可以加快学习速度。
那我们能不能对激活层计算出的激活值也应用Normalization呢? 答案是可以的。
Given some intermediate values in NN Z(1),...Z(m)Z^{(1)},...Z^{(m)}Z(1),...Z(m)
μ=1m∑i(Zi−μ)2\mu=\frac{1}{m}\sum_i^(Z_i-\mu)^2μ=m1∑i(Zi−μ)2
Znorm(i)=Z(i)−μσ2+ϵZ_{norm}^{(i)}=\frac{Z^{(i)-\mu}}{\sqrt{\sigma^2+\epsilon}}Znorm(i)=σ2+ϵZ(i)−μ
Z~(i)=γZnorm(i)+β\widetilde{Z}^{(i)}=\gamma Z_{norm}^{(i)}+\betaZ(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+ϵ,β=μ\beta=\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γ和β\betaβ来控制mean和variance,使得隐藏层有不同的计算分布,上述取值不会使用。
在梯度下降算法中把上述式子加进去,就能在网络中实现。
因为我们减去了平均值μ\muμ,那么parameter bbb可以略去,因为不管bbb取任何值都在Normalization过程中被减掉了。
同理也可以在其他优化算法中实现。
更详细的说明,请参考: http://www.cnblogs.com/bonelee/p/8528722.html
x→yx\rightarrow yx→y
从x到y的映射中,如果x发生了变动,应用同样的映射可能无法正确映射到y如下图这个猫从黑色变成其他颜色的例子。
更糟糕的情况可能是映射(即函数)也发生了改变,那么整个映射都不在有效。
这对于深层次的神经网络来说是一个问题。
从网络第三层的角度来看,它之前的隐藏值随着时间不断发生变化,所以网络存在covariate shift的问题。
Batch Norm所做的事情是,它减小了这些隐藏层变动的幅度。 本小节重点在于: 执行Batch Norm意味着,从本例第三层角度来看,它通过将前面的层的值使用两个参数γ\gammaγ和β\betaβ限制在同一mean和variance,从而减小了这些值的偏移。这使得其之后层的学习变得更容易进行。
原英文解释如下: 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.