【论文理解】Batch Normalization论文中关于BN背景和减少内部协变量偏移的解读(论文第1、2节)

最近在啃Batch Normalization的原论文(Title:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift)。

详细记录一下对论文前面部分的个人笔记和理解,包括第一部分的Introduction和第二部分的Towards Reducing Internal Covariate Shift(减少内部协变量偏移)。
包括了BN解决的问题的由来,以及用普通的Normalization方法减少内部协变量偏移为什么不行。
其中第二部分自己思考了很久。

论文地址:arxiv.org

摘要部分

训练深度神经网络很复杂,因为在训练中,随着前一层layer的参数的改变后面各个layer的输入分布也会改变。

这导致训练速度下降,因为需要用更小的学习率、更讲究的参数初始化来支持训练。这使得一些饱和非线性(saturating nonlinearity)模型训练变得困难。

饱和非线性(saturating nonlinearity)模型这里个人理解为使用了具有饱和区域的非线性激活函数的模型。
如sigmoid函数,越偏离中心,曲线越平,并逼近函数的值域区间,这个区域称为饱和区域,它的导数趋近于0,这是可能造成梯度消失的原因之一。

在这里插入图片描述

这种网络内部数据分布发生改变的现象被称为内部协变量偏移(internal covariate shift)。可以通过将layer的输入进行一种归一化(Normalization)处理来解决这个问题。即Batch Normalization

BN的优势:将Normalization本身作为模型结构的一部分,在每个训练批次batch进行归一化处理。
这样,在训练中就可以使用更大的学习率,不用太关心参数初始化问题。
此外BN还有正则化的作用,可替代dropout。

在比较好的图像分类模型上,使用BN后的训练速度比原模型快了14倍。
将使用了BN的网络进行集成(ensemble)后,在ImageNet图像分类的错误率降低,并超越了人类的水准。

1 Introduction

SGD的优势

BN是一种提升优化效率的策略,所以文章先对随机梯度下降SGD进行了夸赞和评价。
指出了SGD是一种高效的训练深度神经网络的方法,它通过优化网络的参数,来最小化网络的损失函数。
Θ = arg ⁡ min ⁡ Θ 1 N ∑ i = 1 N ℓ ( x i , Θ ) \Theta=\arg \min _{\Theta} \frac{1}{N} \sum_{i=1}^{N} \ell\left(\mathrm{x}_{i}, \Theta\right) Θ=argΘminN1i=1N(xi,Θ)
(上式中 x 1 . . . N \mathrm{x}_1..._N x1...N是训练集, Θ \Theta Θ是模型参数)

SGD是根据每一个数据的批次(mini-batch),一步步进行参数优化,来进行模型训练的。每一个mini-batch都用于近似估计一次损失函数的对于参数的梯度,估计方法为求均值:
1 m ∂ ℓ ( x i , Θ ) ∂ Θ \frac{1}{m} \frac{\partial \ell\left(\mathrm{x}_{i}, \Theta\right)}{\partial \Theta} m1Θ(xi,Θ)

使用mini-batch替代单独样本的好处:
①在一个mini-batch上求损失函数的梯度,是对整个训练集上的梯度的一个估计,batch数量越多,估计得越好。
②因为并行计算的特性,批量处理大小为 m m m的矩阵运算,要比对单个样本行 m m m次批处理计算高效得多。

模型参数更新产生的输入分布改变问题

虽然SGD简单有效,但需要仔细调整模型超参数如学习率、参数的初始值。因为每一层的输入都受到前面所有层参数的影响,所以随着网络变深,参数的微小变化会被放大,各层输入分布产生变化,训练变得复杂。输入分布的变化使得各层训练时需要不断地适应新的分布。
当整个模型的输入分布发生变化时,它会经历协变量偏移(covariate shift)。这个问题通常是通过一些迁移学习的方法(如domain adaptation)解决的。

协变量偏移的概念可以从整个模型扩展出来,比如一个层或一个子网络都适用。
若以固定分布输入子网络,也会对子网络之外的层产生积极的影响。


假设某一层采用了sigmoid激活函数,设该层的输入为 u,经过 x=Wu+b 的变换后输入sigmoid激活函数。如果激活函数的输入x过大,sigmoid(参考下图sigmoid的图像形状)函数的导数也会趋近于0。这意味着该层在进入sigmoid激活函数之前,它输入的所有数值的绝对值应当处于某个范围才行,否则就会导致梯度消失问题,使训练缓慢。

在这里插入图片描述

然而,由于x受到W、b和前面所有层的参数的影响,在训练过程中,这些参数的改变可能会使x中许多维度的数值进入非线性的饱和状态(即sigmoid的左右远端的趋于平滑部分),减慢收敛速度。
这种效应随着网络的加深会被放大。

为了解决这个问题,可采用ReLU激活函数(又叫修正线性单元)、仔细进行参数初始化、降低学习率等方法。
但是,如果能确保非线性输入部分的分布在网络训练的时候一直保持稳定,那么优化器就不太会陷入饱和状态(即由于函数趋近于某个常数,导致梯度变得很小),这样训练就会加速。

内部协变量偏移(ICS)

我们把深度神经网络内部节点中数据分布的变化,称为内部协变量偏移(ICS)。
消除ICS就意味着加速训练。
本文提出一个新的方法,称为Batch Normalization(批量归一化),以试图减轻内部协变量偏移,结果加速了深度神经网络的训练。

  • BN通过一个normalization的步骤,固定一个层输入的均值和方差来实现的
  • BN对整个网络的梯度流产生积极的影响,它减少了梯度对参数规模或初始化值的依赖。这使得我们可以使用更高的学习率,而不用顾虑收敛问题。
  • BN还起到一定正则化的作用,不再需要使用dropout。
  • 因为BN能防止网络数值陷入饱和状态,这让我们可以使用饱和非线性的激活函数(如sigmoid)。

4.2的实验中,我们发现使用BN后的模型,训练到同样的性能,只需要7%的训练步骤,同时还提高了模型的准确率。

2 Towards Reducing Internal Covariate Shift(关于减小内部协变量偏移)

如前所述我们将训练过程中,因网络参数变化,导致网络内部各神经元激活值分布的变化称为内部协变量偏移(ICS)。
所以需要试图减小ICS以改善训练,我们把着眼点放在固定网络各层输入的分布上,以提升训练的速度。

我们知道在图像处理时,采用将输入的图像白化(whitening)处理:对输入数据变换到均值为0,方差为1的分布上,并去除特征之间的相关性,这样网络训练时会更快地收敛。
那么我们在网络中,将每一层输入都进行白化处理,也许就能达到固定输入的分布,从而消除内部协变量偏移的目的。

白化(whitening)是一种图像预处理的方法,概括起来包含以下步骤:
1、将图像数据转换为均值为0,方差为一个单位(比如1)的数据。
2、去相关处理。具体做法是求得数据的协方差矩阵,计算协方差矩阵的特征向量,将特征向量矩阵应用于数据(对数据进行线性变换,变换到以新的特征向量组成基的空间)。即线性解耦各个维度的联系。
3、适当缩放数据。

我们可以考虑在每一步training或某些时段内进行白化,我们既可以修改网络结构,也可以修改参数优化算法使参数的更新依赖于对应层的输入
但是后者会弱化参数的梯度下降,使对应层的Normalization对参数梯度更新影响很小。

作者在文中举了个例子,即下面难理解的这段。

这里是引用

用大白话解释一下:
即作者对某一层的输入使用了一种减均值的Normalization。
然后,发现梯度的更新过程与Normalization本身没有关系(因为梯度的跟新并没有考虑减均值的变换和参数的依赖,原文“a gradient descent step ignores the dependence of E[x] on b”)。
并且参数( b b b)经过更新后,竟然input=output,这样更新了参数却不减小loss值,训练失败。


分析上面的例子出现问题的原因:
上面的优化计算没有把Normalization和各个层的参数考虑其中,以致于不能用参数的梯度来解释Normalization和模型参数的依赖

所以我们需要重新设计这样的Normalization变换:
x ^ = Norm ⁡ ( x , X ) \hat{x}=\operatorname{Norm}(x, \mathcal{X}) x^=Norm(x,X)
在这个变换中, x x x是层的输入, X \mathcal{X} X是这些输入在整个训练集上的集合。即这个变换不仅依赖于给定的输入训练样本x,还依赖于所有样本信息。

因此,在实际训练中,不仅需要对上式的 x x x求导,还需要对 X \mathcal{X} X求导,而后者的梯度中即覆盖了Normalization与上面层所有参数的信息。
原文中,作者给了下面两个求导公式,即如果我们进行有效的Normalization变换时,在训练时需要对两者都求偏导,这样就覆盖了Normalization与上面层所有参数的信息。

原文中的求偏导公式
∂ Norm ⁡ ( x , X ) ∂ x  and  ∂ Norm ⁡ ( x , X ) ∂ X \frac{\partial \operatorname{Norm}(\mathrm{x}, \mathcal{X})}{\partial \mathrm{x}} \text { and } \frac{\partial \operatorname{Norm}(\mathrm{x}, \mathcal{X})}{\partial \mathcal{X}} xNorm(x,X) and XNorm(x,X)

但是,文中指出可以见到这样的设计,需要求 x x x的协方差矩阵和其二次方根的倒数(参考白化),计算极其复杂。

针对这样的情况,我们需要寻求一种替代方案,以可微分的方式执行输入的Normalization,并且在每次参数更新后不需要对整个训练集进行分析。

这就有了后面Batch Normalization的设计,比如对输入数据的每一维度进行减期望值+除标准差的处理等等。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值