关于BN层的一点理解

关于BN层的一点理解_第1张图片

一直以来对BN层两个学习参数belta和gamma不太理解,今天又在知乎问题上看到了“请问batch_normalization做了normalization后为什么要变回来?”这个问题,题主好像跟我之前想的一样(笑)。于是认真查阅了相关资料,得到以下一点见解:

 Internal Covariate Shift(ICS)[1]:对 DNN 某一层,随着 GD 训练的过程中参数的改变,该层的输出数据的分布可能会改变;此时,对于下一层,相当于输入数据的分布改变了,这就类似于 Covariate Shift。这种输入数据分布的改变,可能会使 DNN 的难以学习到好的参数,从而影响 DNN 的效果。

比如在训练阶段的t1时刻,第i层输出范围(分布)在0~1之间,随着训练的推移,t2时刻第i层的输出范围变化到4~10,这个现象对与第i+1层的学习是不利的,造成了其学习困难,缓慢甚至无法收敛到最优(具体缺点[1]中说的比较详细)。其实0~1的范围已经“够用”了,毕竟0~1之间存在了无穷多个有理数,因此我们希望第i层能保持这个输出分布,故有了bn层,先将其输出归一化到0均值1方差,再通过可学习参数将其分布调整至某一合适的位置。

这样不仅预防了梯度消失/爆炸等问题,还不用关心非线性层的权重初始化,学习率也可以设置大一点。

同时,因为“batch”,而不是所有数据的Normalization,Batch的分布会带一些误差,起到了Regulation的作用,因此可以少用dropout等正则化手段了。

[1]https://zhuanlan.zhihu.com/p/26682707

你可能感兴趣的:(machine,learning)