昨天同事们突然讨论起了Batch Normalization的问题,大家从internal covariate shift的角度讨论了半天,结果突然间懵逼了,陷入了“道理我都懂,但是为什么会有效的?”的状态,这个问题不弄明白感觉彻夜难眠了。于是下班后赶紧又第N遍的研究了一下bn这个操作,得到了一些有解释性的答案,在这里记录和分享一下。
关于Internal Covariate Shift
相信很多关于bn的讲解应该都是来自于“internal covariat shift”的理论,那么到底什么是internal covariat shift,理论点讲:对于层间的信号,源空间和目标空间的条件概率一致,但边缘概率不同。通俗一点说,就是对于神经网络的每一层来讲,输入和输出经过了层内的计算,他们的分布发生了变化,但是特征所指示的样本标记是一样。(来自:知乎)并且这个变化会随着网络深度的增大而增大,这就是internal covariat shift 。这样不利于网络的收敛,于是batch normalization就是通过mini-batch来规范层的输入,固定每层的均值和方差。
Bach Normalization的操作
流程如下:
大概就是:
1. 对某个神经元求mini-batch的均值和方差
2. 用均值和方差对神经元在当前batch的分布做归一化到[0,1]
3. 学习参数γ和β对分布再做scale和shift操作
理论上讲这样子能够将分布的输入归一化到一个比较一致的空间内,避免“internal covariate shift”。
这样带来的好处:
1. 减轻