本篇博文为转载,老搬运工了!这是转载许可
本篇文章原地址:https://mp.weixin.qq.com/s/U-zwXm-Z5pVOVr6sJQFgcA
更多精彩 / 干货文章请戳公众号:Z小刀
![](https://i-blog.csdnimg.cn/blog_migrate/8f91498ffef136e611434492d89d25b6.png)
也可以移步到刀哥的个人博客地址:https://junno_code_blog.gitee.io/junno_code_blog.gitee.io
![](https://i-blog.csdnimg.cn/blog_migrate/aebb083f86334dccfb02c885d96929a8.png)
小刀不仅是个大 N 狗,还对 ML 和 CV 感兴趣的,好了,话不多说,开始今天的学习 吹水 之旅啦 ~ ~
Batch Normalization 顾名思义就是批量归一化的意思,广泛地应用在现在的各种神经网络结构中,起到重要的作用。它最早出现在 Google 的论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中,从标题我们可以知道,运用这个方法的目的就是为了解决 Internal Covariate Shift 问题,那什么是 Internal Covariate Shift?为什么会出现这个问题?Batch Normalization(以下用BN代替)的原理以及实现方法是什么?让我们来一一探讨。
![](https://i-blog.csdnimg.cn/blog_migrate/bb180895e840e17100283fd07476a2a3.png)
01 常见的问题
机器学习中的一个经典假设就是现有数据的分布函数曲线和理想数据分布的函数曲线是一致的,即源空间和目标空间的数据分布应该一致,如果不一致,就出现了新的机器学习问题,即论文中提到的 domain adaptation 。
而在神经网络的训练过程中,各层的输入是前一层的输出,数据经过层内部的操作,其分布特性会随之改变,可能导致与各层理论上对应的输入分布不同。这也就是 Internal Covariate Shift 的由来。在越深的网络中这个问题也就越发明显。
而论文中想要通过 BN 解决的问题实则是 Internal Covariate Shift 引起的训练梯度消失,或者梯度更新缓慢的问题。
02 举个梨子
sigmoid 损失函数,它把输出强行拉到 0-1 之间,而且其非线性部分只占很小的一部分。
![](https://i-blog.csdnimg.cn/blog_migrate/253d82482c3196f6a1452160bc53d758.png)
可以看到如果输入值太大,或者太小, 都会使 sigmoid 函数不能激活,导致梯度很小或者基本为 0。而 BN 要做的就是把数据分布拉回到均值为 0,方差为 1 的情况下,使大部分的输入值都能出现在 sigmoid 的响应区,这样也就能在训练时传回较大的梯度,加快训练。在论文中,作者实验发现,有使用BN的梯度下降比没有使用BN的收敛速度快了 6 倍。这足以证明 BN 的强大 power。
03 算法介绍
上面讲了BN的基本原理,下面来讲解一下BN的实现方法,先丢论文图:
![](https://i-blog.csdnimg.cn/blog_migrate/e3f35063097a486a2753076061afa373.png)
训练时算法把一个 mini-batch 的均值和方差做为这次训练的均值和方差,ε 是为了防止分母为 0。最后再设置两个 learnable 的参数 γ,β,得到 yi。这么做的假设是,经过我们人为的把每一层的数据分布变为均值为 0,方差为 1 的分布后,有可能使 model 对数据特征的表达能力(represent capacity)产生改变,通过参数 γ,β 来作为一种补偿,当然这里应当指出的是,最终学到的参数 γ,β 不一定真的可以做出补偿,即近似于 mini-batch 的均值和方差,论文中也只是说 γ,β 的作用是 scale(缩放)和shift(平移)。
![](https://i-blog.csdnimg.cn/blog_migrate/e9b283935abbd8f7a74d62db2d20b61f.png)
04 一些Tricks
可是在做 prediction 时,我们每次的输入只有一个,没有办法知道 mini-batch 的均值方差,怎么办呢?回想我们做 mini-batch 的原因,本来 BN 所要求的就是总体的均值和方差,但是因为计算量大所以才分批进行。这样,在训练时那些 mini-batch 的 mean 和 variance 我们就可以事先保存下来,通过求它们的期望来得到总体的 mean 和 variance,进而用到 prediction 期间的 BN 操作。
![](https://i-blog.csdnimg.cn/blog_migrate/232443d4a2b42e0c1aebe1bb58618035.png)
05 扩展与总结
而对于时下流行的 CNN,论文中也有谈到对应的 B N方法(详见论文3.2节),用到了 CNN 的重要思想-权值共享。在此就不展开,有兴趣的话,在此也附上一篇专门介绍 CNN 中应用 BN 的前沿论文《RESTRUCTURING BATCH NORMALIZATION TO ACCELERATE CNNTRAINING》
最后总结一下Batch Normalization 的优点:
◆ 提高训练速度,收敛加快,还可以用较大的学习率
◆ 能起到类似于Dropout的作用,可以抑制过拟合
◆ 运用简单,初始化要求低
那今天对BN的介绍就到这里,第一次写技术推文,不足的地方还请大家多多指教,共同进步。
注:本文章之前在其他公众号首发过,那时是小刀我第一次投稿,现在自己开大号(其实我是小号)就作为自己的首发啦~