Batch Normalization论文解读

BN这篇论文,我看了很久,是时候来归纳总结一下论文的整体思路与原理,顺便巩固与加深对BN的理解~

文章主要会从四个方面对Batch Normalization进行详解:

  • 提出背景
  • BN的整体思路
  • inference阶段BN的使用
  • BN的优势

文章主要参考了论文以及其他博主的资料。所有参考链接均见文章参考链接部分。

前言

在开始论文的讲解之前,先抛出两个概念梯度消失梯度爆炸

为什么会产生梯度消失和梯度爆炸?

目前优化神经网络都是基于反向传播,即根据损失函数的计算通过梯度反向传播的方式,使得网络权值更新优化,而这个反向传播的过程用到了链式法则反向传播算法可以说是梯度下降在链式法则中的应用。

链式法则是一个连乘式,当层数越深时,梯度也会以指数形式传播。在跟新网络权值时,得到的梯度接近0特别大,也就是梯度消失爆炸。梯度消失与梯度爆炸其实在本质上是一样的。

梯度消失

深层网络或是选择了不合适的激活函数,例如sigmoid。梯度消失发生时,接近输出层的隐藏层权值更新相对正常,但是当越靠近输入层时,会导致靠近输入层的隐藏层权值更新缓慢或更新停滞。这相当于训练时,只等价于后面几层的浅层网络的学习。

梯度爆炸

一般出现在深层网络权值初始值太大的情况下,在深层神经网络或循环神经网络中,误差的梯度可在更新中累计相乘。如果网络层之间的梯度值大于1,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大,然后导致网络权重的大幅更新,并因此使网络变得不稳定

梯度爆炸会伴随一些细微的信号,如:

  1. 模型不稳定,导致更新过程中的损失出现显著变化
  2. 训练过程中权值变得非常大,以至于溢出,导致模型损失变成NaN

提出背景

首先解读论文标题《Batch Normalization: Acclerating Deep Network Training by Reducing Internal Covariate Shift》:通过减少内部协变量偏移来加速深度网络的训练。所以首先需要搞清楚内部协变量偏移是什么!

什么是Internal Covariate Shift

原论文作者在文中给的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。

其实通俗理解就是:对于深度学习这种包含很多隐层的网络结构,在训练过程中,由于每一层的参数会被更新,而每一层的输出都会作为下一层的输入,意味着下一层要去不停适应这种数据分布的变化,这一过程就叫做Internal Covariate Shift。

Internal Covariate Shift会带来什么问题

(1)上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低

由于后层网络需要不停去适应输入数据分布的变化,会使得整个网络的学习速率过慢。

(2)网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度

当我们使用饱和激活函数(saturated activation function)时,例如sigmoid,tanh激活函数,很容易使得模型训练陷入梯度饱和区(saturated regime)。随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值,即函数最平缓的部位),所以这导致反向传播时低层神经网络的梯度消失。

对于激活函数梯度饱和问题,有两种解决思路,第一种是用非饱和激活函数,例如线性整流函数(ReLU)可以在一定程度上解决训练进入梯度饱和区的问题。另一种思路是,我们可以让激活函数的输入分布保持在一个稳定状态来尽可能避免它们陷入梯度饱和区,这也是Normalization的思路。

如何缓解Internal Covariate Shift

要缓解这个问题,其实就是缓解每一层输入值分布的不停变化,因此可以固定每一层网络输入值的分布来缓解ICS问题。

(1)白化(Whitening)

白化是BN的启发来源——所谓白化就是对输入数据分布变换到0均值,单位方差的正态分布。在Lecun 98年发表的论文里验证了如果在图像处理中对输入图像进行白化(Whiten)操作的话,神经网络会较快收敛。因此BN的作者也作了类似的推论:图像是深度神经网络的输入层,做白化能加快收敛,那么对于深度网络来说,任何隐层的输出都是作为下一层的输入,即每一个隐层都可以看作是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?于是作者提出了BN的思想。

(2)Batch Normalization的提出

既然白化可以解决这个问题,为什么还要提出别的解决办法,因为白化存在着以下两个问题:

  • 白化过程计算成本太高:1. 白化需要拿整个训练集进行归一化 2.白化需要计算协方差矩阵 C o v [ x ] = E [ x x T ] − E [ x ] E [ x ] T Cov[x]=E[xx^T]-E[x]E[x]^T Cov[x]=E[xxT]E[x]E[x]T还要计算 C o v [ x ] − 1 2 ( x − E [ x ] ) Cov[x]^{-\frac{1}{2}}(x-E[x]) Cov[x]21(xE[x])
  • 白化过程改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力。底层网络学习到的参数信息会被白化操作丢弃掉。

于是作者主要是解决白化的以上两个问题,提出了一个简化版的Batch Normalization。一方面,BN方面要能够简化计算过程;另一方面又需要经过规范化处理后让数据尽可能保留原始的表达能力。


Batch Normalization 整体思路

思路

BN算法一共做了两个简化:

  1. 单独对每个特征进行Normalization,让每个特征都有均值为0,方差为1的分布就可以。
  2. 使用随机梯度下降时,拿整个训练集进行归一化不实际,于是提出了使用mini-batch的方式,对每个mini-batch计算对应的均值与方差。

算法

由于白化操作减弱了网络中每一层输入数据的表达能力,作者又加了一个线性变换操作,让这些数据能够尽快恢复本身的表达能力。

参数定义

  • l : l: l: 网络中的层标号
  • L : L: L: 网络中的最后一层或总层数
  • d l : d_l: dl: l l l 层的维度,即神经元结点数
  • W [ l ] : W^{[l]}: W[l]: l l l 层的权重矩阵, W [ l ] ∈ R d l × d l − 1 W^{[l]}\in R^{d_l \times d_{l-1}} W[l]Rdl×dl1
  • b [ l ] : b^{[l]}: b[l]: l l l 层的偏置向量, b [ l ] ∈ R d l × 1 b^{[l]}\in R^{d_l \times 1} b[l]Rdl×1
  • Z [ l ] : Z^{[l]}: Z[l]: l l l 层的线性计算结果, Z [ l ] = W [ l ] × i n p u t + b [ l ] Z^{[l]}= W^{[l]} \times input +b^{[l]} Z[l]=W[l]×input+b[l]
  • g [ l ] ( ⋅ ) : g^{[l]}(\cdot): g[l](): l l l 层的激活函数
  • A [ l ] : A^{[l]}: A[l]: l l l 层的非线性激活结果, A [ l ] = g [ l ] ( Z [ l ] ) A^{[l]}=g^{[l]}(Z^{[l]}) A[l]=g[l](Z[l])

样本定义

  • M : M: M: 训练样本的数量
  • N : N: N: 训练样本的特征数
  • X : X: X: 训练样本集, X = { x ( 1 ) , x ( 2 ) , . . . , x ( M ) } X=\{x^{(1)},x^{(2)},...,x^{(M)}\} X={ x(1),x(2),...,x(M)}, X ∈ R N × M X\in R^{N\times M} XRN×M(这里 X X X的每一列是一个样本)
  • m : m: m: batch size,即每个batch中样本的数量
  • χ ( i ) : \chi^{(i)}: χ(i): i i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值