重新认识BN算法

Google在2015年发表论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》。随后BN的作用被证实,大量的神经网络都会采用在激活层前面加入BN层。起初我认为BN层只是一个简单的数据预处理,随着研究的深入,我发现其背后的原理值得深思。

论文地址:https://arxiv.org/pdf/1502.03167v3.pdf

对理解有帮助的博客:https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html

该作者借鉴了CS231n的课程用计算图表达梯度传播的过程。让我明白了为什么需要计算除\beta \gamma之外其他的节点的梯度(需要向后传播)

知乎上我不坏博主写了一段关于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的参考。

https://zhuanlan.zhihu.com/p/26138673

猜你喜欢

转载自blog.csdn.net/hai008007/article/details/84535379