相信BN层对大家来说并不陌生,今天除了讲解BN被大家说的比较多的东西外会讲一下BN真正work的本质。今天之所以来讲解BN是因为早上听了一个旷视的讲座,听完之后发现旷视研究院在今年1月19日发表的用来解决小批量训练BN不稳定的问题论文:MABN。这对于一般用自己电脑来训练网络的我来说感觉是一个福音,可以减缓batch_size设小之后性能降低的问题(谷歌在一个月前也提出了改进的FRN:一种不依赖batch的归一化层,不过之前没有关注到),所以本文就作为解读MABN的基础,也顺便当作回顾一下基础。
目录
- 为什么要用BN层
- BN层公式
- BN层的本质(平滑了优化空间)
- 论文地址
为什么要用BN层
- 批归一化(Batch Normalization/BN是当前最为流行的神经网络训练技术之一,其有效性在诸多应用中已广泛证明,成为一些当前最佳的深度模型的必备组件,像YOLO v3里的conv BN leaky_relu一样。那我们为什么要使用BN层呢,论文中 提出了两点:Internal Covariate Shift(后面简称ICS)和梯度消失。(其中被大家一直在讨论的ICS已经在2018年的这篇How Does Batch Normalization Help Optimization?被推翻,并且揭示了BN的本质,这个在后面第三点会谈到。)
Internal Covariate Shift
- BN的原论文作者给了ICS一个较规范的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作ICS。举个例子:在我们训练网络的过程中,我们的参数时刻在发生变化,这就导致了每一层输出的数据分布会因为时刻更新的参数而改变,这是一种不好的现象。我们知道机器学习中有一个经典假设:源空间和目标空间的数据分布是一致的。如果不一致,就会出现新的问题,而我们现在条件分布相同,但边缘密度却不一定相同,所以就引发了问题。(虽然很有道理,但是最后还是被人用实验推翻)
梯度消失
- 我们前面说过,在网络层数加深的时候,会影响我们每一层输出的数据分布。而之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(以Sigmoid函数为例),所以这导致后向传播时低层神经网络的梯度很小甚至消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,所以就可以让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
BN层公式
- 我们上面了解了不用BN层的后果,那我们直接归一化每一层的数据分布就好了,为什么还要BN层?而且机器学习中就有这种操作:白化。白化是机器学习里面 常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。白化是对输入数据分布进行变换,进而达到以下两个目的:(1)使得输入特征分布具有相同的均值与方差。(2)去除特征之间的相关性。但是白化也存在两个问题:(1)计算成本太大,像PCA白化还要算协方差矩阵等。(2)白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力。底层网络学习到的参数信息会被白化操作丢失掉。而BN正是针对了白化的这两个缺点进行了改善,我们来看看BN的计算公式:
- 我们可以看到,针对每一个mini-batch的数据,BN先计算他们的均值与方差,接着做了一个归一化处理,变成均值为0方差为1的数据(其中是为了防止方差为0),最后利用可学习的两个参数:缩放参数和偏移参数进行了一个线性变换作为输出。
- 前面规范化数据的原因很好理解,自然是为了减缓梯度消失的问题,但最后为什么要进行线性变换呢?按白化来说,是为了增加网络层中本身数据因改变分布损失的表达能力。我觉得这一点跟ResNet的short cut机制有点异曲同工之妙,我们知道数据被我们规范之后,可能损失了某些信息,这些信息可能是有用的,可能是无用的,我们引入一个线性变换让模型具有还原的能力。这就是说,如果神经网络发现我们规范数据分布之后损失的数据是有用对模型有利的,那他可以通过更新线性变换里面的两个参数,让数据分布变回去,给了网络多一个“选择”。
BN层的本质(平滑了优化空间)
- How Does Batch Normalization Help Optimization?给了我们答案,这篇论文主要做了四个工作:
1.做了一个对比实验,证明BN之所以起作用,并不是因为减少了ICS。
- 作者用不加BN,加了BN,加了有噪音的BN(noisy BN,ICS更大)用VGG做了一个对比实验:
- 实验结果表明noisy BN和标准的BN虽然ICS有差异,但在训练集上的误差和收敛速度上基本持平。
2.作者又做了一个更直观的实验,无论是在VGG还是在DLN(纯线性深度网络,去除了非线性的影响)加了BN之后的ICS都基本持平甚至更大,这更能说明BN并没有减少ICS。
3.作者又做了一个对比实验,对比了损失和梯度。作者发现使用了BN后,loss的变化变得更加稳定,同样梯度也变得更加平滑稳定,这也带出了BN的本质:BN实际上是平滑了优化空间。
4.最后用了一些其他方法和BN效果进行对比,如使用L1,L2的方法,发现效果和BN差不多,而且有些时候可以比BN更好。
论文地址
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- How Does Batch Normalization Help Optimization?