BN学习笔记
Batch Normalization的提出
BN是谷歌提出的一种深度学习,网络优化的结构,能够加速网络的训练.
文章在提出方法之前,对之前的一些成果进行了回顾包括
-
深度学习网络在训练过程中,训练变慢的原因:随着网络深度的加深,由于训练过程的信息前向传递的过程中,一旦前一层的Layer的信息的distribution发生改变.对后面的分布也随之改变(文章中称为Internal Covariate Shift),随着深度的逐渐深入信息的distrution也会发生改变,而这些又需要重新学习,这造成了深度学习训练困难的难题(包括模型梯度爆炸或者消逝).原文也回顾了一些经验上的解决方法: ReLu结构,权重初值的小心的初始化,网络模型分步训练等等…
-
文章将问题归结到Layer输出信息的Internal Covariate Shift以后,说了一些前人与之相关的类似的工作,例如对数据集进行白化,或者简单的中心化都能够加速网络的训练使之达到比较好的训练效果,但是如果要计算数据集的协方差矩阵,存在很大的计算量,包括求逆矩阵等等,这会带来很大的计算复杂度,所以原文提出了一种简化的方法对每层的的输出进行尺度变换
μ = 1 m ∑ i = 1 m x i \mu=\frac{1}{m}\sum_{i=1}^m{x_i} μ=m1i=1∑mxi
σ 2 = 1 m ∑ i = 1 m ( x i − μ ) 2 \sigma^2=\frac{1}{m}\sum_{i=1}^m{(x_i-\mu)^2} σ2=m1i=1∑m(xi−μ)2
x ^ = x − μ σ 2 + ϵ \hat{x}=\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}} x^=σ2+ϵx−μx ^ \hat{x} x^是变换后的一个尺度无关的变量,经过这一层以后变量被固定在了一个尺度无关的区域,然后对 x ^ \hat{x} x^进行线性变换
y = γ ∗ x ^ + β y=\gamma*\hat{x}+\beta y=γ∗x^+β
其中 y , β y , \beta y,β都是自动学习的变量,一旦训练完成后,就属于固定不变的数值了
在验证集中,由于没有batch的概念,所以网络之前的参数都是 E ( x ) V a r [ x ] E(x) \quad Var[x] E(x)Var[x]使用之前的稳定的数值,这点要特别注意.E ( x ) = E b ( μ ) E(x)=E_b(\mu) E(x)=Eb(μ)
V a r ( σ 2 ) = m m − 1 E ( σ 2 ) Var(\sigma^2)=\frac{m}{m-1}E(\sigma^2) Var(σ2)=m−1mE(σ2) -
最后对BN对梯度的改善做了一些说明BN不改变输出相对于输入的梯度,当梯度变大时会减小输出相对于权值的梯度,增加网络的稳定性,防止模型崩溃
∂ B N ( W u ) ∂ u = ∂ B N ( α W u ) ∂ u \frac{\partial{BN(Wu)}}{\partial{u}}=\frac{\partial{BN(\alpha Wu)}}{\partial{u}} ∂u∂BN(Wu)=∂u∂BN(αWu)
∂ B N ( W u ) ∂ u = 1 α ∂ B N ( α W u ) ∂ W \frac{\partial{BN(Wu)}}{\partial{u}}=\frac{1}{\alpha}\frac{\partial{BN(\alpha Wu)}}{\partial{W}} ∂u∂BN(Wu)=α1∂W∂BN(αWu)
总结
在知乎看到的帖子,对于BN的原理的揭示重点是放在了梯度上,BN最重要的是对梯度进行了优化,大概率防止了原来模型中因为BP链式求导带来的累积乘法项带来的梯度消逝和爆炸.个人感觉也倾向于这点. BN虽然有效,但是理论依据个人感觉也并没有那么充分,有些推理过程中的论断更多的依赖于实践经验,而不是数学…