【AI数学】Batch-Normalization详细解析

最后都变了- 提交于 2019-12-05 10:04:56

声明:十分欢迎转载,但须先征求本人同意。


BN目前已经成为了调参师面试必问题之一了。同时,BN层也慢慢变成了神经网络不可分割的一部分了,相比其他优化操作比如dropout, l1, l2, momentum,影子变量等等,BN是最无可替代的。

论文标题: 《Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift》

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

这篇博文想以最通俗的方法解释BN,避免大量术语以及杂七杂八的公式


1. BN用在哪里

BN往往用在卷积层之后,激活函数之前(比如对于darknet-53来说,conv+BN+relu成为一个标配,构成最小组件)。当然,BN不一定用在conv之后,但用在激活函数之前是几乎必须的(这样才能发挥它的作用)。

我们把神经网络各层之间的传递称为特征图(feature map),特征图在传递的过程中,就需要用BN进行调整。为什么要调整呢

我们在训练的时候,都是输入一批一批的训练数据(mini-batch),比如batch size=32,那一次输入32个数据。这一数据可能满足一个分布A,如果A分布比较任性,那分布A在通过激活函数(非线性层)时,修剪率会很高或者很低。(修剪率是我自己定义的一个说法,神经网络就是通过特征提取层(如conv)提取特征再通过激活函数修剪从而实现神经网络的函数表达力)

多说不如一张图:

我上图展示了3中分布情况,当batch特征图分布比较任性(batch比较小的时候,很容易出现任性的情况,如上图前两种情况)。上述用的激活函数是relu,在输入大于0时保持不变,小于0时变为0。对于一二两种情况,要么修剪得过少,等于没用激活函数;要么修剪得过多,一大批0传到后面。当然,在不断训练的过程中,情况一二都会慢慢减少,因为特征提取层越来越牛x。但这需要用更多训练时间去填补,而且最终的性能不会很好,虽然是batch训练,但它的视野没到batch分布那个层面。视野太窄,也更容易过拟合。如果用其他激活函数比如sigmoid/tanh等,还有梯度加速弥散的问题存在。(自己可以画图看看,两端抑制)

OK,我们想要的是上图表示的第三种情况,激活函数的修剪率适中。这就需要用到BN操作了。

BN怎么操作

先看论文里的截图:

第一步,我们获得了一个mini-batch的输入в = {x1,..., xm},可以看出batch size就是m。

第二步,求这个batch的均值μ和方差σ

第三步,对所有xi ∈в,进行一个标准化,得到xi`。

第四步,对xi`做一个线性变换,得到输出yi。

现在对上述四个步骤做一个全面分析:我们获取一个任意分布,对这个分布包含的数据做一个标准化。这个操作是否十分熟悉呢?

我们回到高中的正态分布:

标准化一个高斯分布是怎么做的呢?对于x~N(μ, σ^2)而言,如果x` = (x- μ)/σ,则x`~N(0, 1)

这个标准化公式(即x` = (x- μ)/σ),可以通过正态分布的概率密度公式推出来,在这里就不做详解了。

对于自然界很多分布,都可以用(类)高斯分布来建模。同样,可以用这个公式x` = (x- μ)/σ来进行标准化(这个标准化公式不仅适用高斯分布),标准化之后的分布满足期望为0,方差为1。比较一下标准化公式和第三步的公式:

多了一个ε,这里的ε是一个很小的数,避免由分母等于0带来的系统错误,所以其实两个公式是等价的。

对于标准正态分布而言,刚好满足我在上图中描述的第三种情况。钟形曲线刚好关于y轴对称。

想必会有人认为,按理说BN操作到这里就结束了,为什么还会有第四步呢?

第4步恰好是BN的精髓之处:γ和β是可学习的。我们获得一个关于y轴对称的分布真的是最符合神经网络训练的吗?没有任何理由能证明这点。事实上,γ和β为输出的线性调整参数,可以让分布曲线压缩或延长一点,左移或右移一点。由于γ和β是可训练的,那么意味着神经网络会随着训练过程自己挑选一个最适合的分布。如果我们固执地不用γ和β会怎么样呢?那势必会把压力转移到特征提取层,虽然最后结果依然可观,但训练压力会很大。你想想,一边只需要训练两个数,另一边需要训练特征提取层来符合最优分布就是关于y轴的对称曲线。前者自然训练成本更低。


总结

BN就是调整每层网络输出数据的分布,使其进入激活函数的作用区。激活函数的作用区就是指原点附近的区域,梯度弥散率低,区分率高。同时,BN会在训练过程中,自己调节数据分布,使其“更合理”地进入激活函数。

所以,BN有以下特点:

1. 加速收敛。减少epoch轮数,因为不必训练神经网络去适应数据的分布。同时,完美地使用了激活函数对数据的“修剪”,减少梯度弥散。同时,学习率也可以大一点。

2. 准确率更高。这也是得亏于对激活函数的完美使用,切得更准,垂直度更高。比如,yolo v2加入BN后,mAP提高了2%。

这以上两个特点,具有普世性价值,这也是BN势不可挡的原因。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!