Google在2015年发表论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》。随后BN的作用被证实,大量的神经网络都会采用在激活层前面加入BN层。起初我认为BN层只是一个简单的数据预处理,随着研究的深入,我发现其背后的原理值得深思。
论文地址:https://arxiv.org/pdf/1502.03167v3.pdf
该作者借鉴了CS231n的课程用计算图表达梯度传播的过程。让我明白了为什么需要计算除之外其他的节点的梯度(需要向后传播)
知乎上我不坏博主写了一段关于BN的深入探讨,我明白了BN为什么会使收敛速度快,减轻梯度爆炸或消失问题。其中有句话:
正如文章中所说,使用gamma和beta是为了通过 "scale and shift" 操作来保证整个网络的capacity,毕竟,一直将feature限制在均值为0方差为1的分布下,明显是不那么明智的。尤其是在使用ReLU激活函时,将其输入限制在均值为0,相当于强制让其输出中总有一半为0,想想都觉得荒谬。
所以原作者加入了gamma和beta,让网络自己学习数据的分布哪种是最好,如果是原数据分布最好也是可以学习出来(恢复)的。
链接:https://www.zhihu.com/question/38102762
博主Peng写了BN的代码,可以作为以后手写BP的参考。