[关闭]
@songying 2019-04-24T03:39:58.000000Z 字数 2161 阅读 1288

深入理解Batch Normalization

博客文章


前言

最近,在整理以前看过的论文,偶然间翻出之前对于 Batch Normalization 的笔记,发现有些浮于表面,再结合年前看到的一篇关于 Batch Normalization 的解释文章以及诸多变体,来深入探讨一下 Batch Normalization 为什么如此优秀。

深度学习中的 Normalization

深度学习中的 Normalization 与机器学习中有着很大的不同,对于机器学习来说,Normalization 常常发生在特征工程阶段,而对于深度学习而言,其可以大致分为两大类:

目前第一类的 Normalization 是很主流的算法,本文也主要是讲述第一类算法,由 Batch Normalization 逐渐展开。

Batch Normalization 做了什么 ?

首先,对于神经网络来说,我们在一次迭代的过程中往往采用 个样本同时进行运算, 并采用对应的优化算法进行优化,这里假设优化算法为 mini-batch。

其次, Batch Normalization 原论文中的 Normalization 是作用在L层激活函数输入值上的, 因此我在这里遵循原论文。

假设,第L层其激活函数的输入值为一个d维的向量: , 而对于一个mini-batch 而言,我们一次迭代有m个输入 , 那么, 对于向量X, 其在一个Batch Normalization 中的计算公式如下:


我们看到,Batch Normalization 本质上就是对一个 batch 的样本进行归一化,那么为什么要这么做呢?

从 Internal covariate shift 谈起

首先,原论文中认为Batch Normalization 之所以 work 是因为其减轻了 ICS (Internal covariate shift ), 而ICS指的是在训练过程中由于网络参数的变化而导致各层网络的输入分布发生了变化。如果我们将每层神经元的激活值控制在均值为 0, 方差为1 的正态分布中,的确能够减轻 ICS, 但这真的是最终的答案吗? 去年的一篇文章[2] 从更深层次的角度解释了 Batch Normalization 为什么会 work。

Why BN work?

BN 之所以 work 其实并不是因为 ICS,文章 [2] 中提到,通过注入噪声来模拟各层的分布极不稳定的情况,此时,BN依旧取得了很好的结果,这说明 ICS 并不是原因所在。

文章给出了最根源的解释:BN使得优化空间更加平滑。具体来说,BN实际上是改变了损失函数的 lipschitz 性质[4], 使得梯度的改变变得很轻微,这使得我们可以采用更大的步长且仍然能够保持对实际梯度方向的精确估计。

通俗来讲, 不进行BN, 损失函数不仅仅非凸且趋向于坑洼,平坦区域和极小值,这使得优化算法极不稳定,使得模型对学习率的选择和初始化方式极为敏感,而BN大大减少了这几种情况发生。

Batch size 的影响

实验证实, 对于任意模型来说,batch size 设置的较小训练出的模型相对大batch size 训练处的模型泛化能力更强, 在测试集上表现更好。但如果batch size 太小, BN的效果又会有明显的下降,这是因为batch 过小使得无法得到有效的统计量所造成的,也就是说batch size 过小,无法估计整体数据分布情况。

最后

限于数学水平,无法就具体的详细细节进行描述,十分推荐 [2], [5] 这两篇文章,值得拜读。

Reference

[1] Batch normalization: Accelerating deep network training by reducing internal covariate shift

[2] How Does Batch Normalization Help Optimization

[3] Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks

[4] https://baike.baidu.com/item/lipschitz%E6%9D%A1%E4%BB%B6

[5] http://www.cvmart.net/community/article/detail/368

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注