对于深度学习中 Batch Normallization (BN) 和 Batch Renormalization 的理解

为什么需要Batch Normalization

在深度学习中,因为网络的层数非常多,如果数据分布在某一层开始有明显的偏移,随着网络的加深这一问题会加剧(即internal covariate shift),进而导致模型优化的难度增加,甚至不能优化。BN与对输入进行Normalization类似,只不过是Normalization网络的中间层,从而使中间各层输入值的分布相对独立,减小前层网络对其的影响,从而加速学习的过程。(如果没有进行BN操作,对于深层网络,中间层输入特征分布可能一直在变化,将会使后面的网络很难对其进行学习。)

Batch Normalization算法

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
BN Transform

由上图可知,Batch Normalization(BN)算法总共有四行,分两步。第一步是前三行,将激活值(原论文中进行BN的是激活函数的输入值)转换到均值为0,方差为1的分布范围内;第二步是第四行,为了对进行Normalization操作后的激活值进行微调(Normalization操作后的激活值与),其中 β \beta β γ \gamma γ是可学习的,以此来补偿Normalization操作后神经网络的非线性表达能力(对于sigmoid、tanh激活函数,如果输入值都服从均值0,方差1的分布,那么绝大部分值将落在线性段,使神经网络的非线性表达能力减弱。ReLu激活函数?)。

关于BN算法的几个小问题

为什么用可学习的 β \beta β γ \gamma γ对网络激活值进行微调? -> 从某种意义上来说, γ \gamma γ β \beta β代表的其实是输入数据分布的方差和偏移。对于没有BN的网络,这两个值与前一层网络带来的非线性性质有关,而经过变换后,就跟前面一层无关,变成了当前层的一个学习参数,这更加有利于优化并且不会降低网络的能力。(深度学习中 Batch Normalization为什么效果好? )

进行BN的位置? -> 目前有两种在神经元中插入Normalization操作的地方(参考下图),第一种是原始BN论文提出的,放在激活函数之前;另外一种是后续研究提出的,放在激活函数之后,不少研究表明将BN放在激活函数之后效果更好。(深度学习中的Normalization模型
Batch-normalized 应该放在非线性激活层的前面还是后面?
BN_position

对于MPL和CNN,需要Normalization的值有哪些? -> 对于多层感知器(MLP),如上图,每个神经元输出是一个激活值,对此激活值进行Normalization操作;对于卷积神经网络(CNN),可以把卷积层想象成MLP中的一个隐藏层,然后把对应的某个卷积核想象成MLP隐层中的一个神经元,经过每个卷积核(神经元)输出是一个激活平面,激活平面中任意一个激活值都需要进行Normalization操作。(深度学习中的Normalization模型

Batch Normalization的缺点

Training BN

上图是BN的training过程,第10步计算了所有mini-batch的均值 μ B \mu_\Beta μB的期望 E [ x ] E[x] E[x],方差 σ B 2 \sigma_\Beta^2 σB2的无偏估计 V a r [ x ] Var[x] Var[x],以此作为后续Inference时固定的均值 E [ x ] E[x] E[x]和方差 V a r [ x ] Var[x] Var[x](第11步)。这一步默认了mini-batch与样本整体服从同一分布(即可以用计算的 E [ x ] E[x] E[x] V a r [ x ] Var[x] Var[x]代替样本整体的 μ a l l \mu_{all} μall σ a l l 2 \sigma^2_{all} σall2
当存在以下两种情况:

  1. mini-batch的尺寸很小;
  2. mini-batch内数据不是独立同分布。

以上两种情况会使默认的条件不成立,因此需要寻找解决这个问题的办法,即下面的Batch Renormalization。

Batch Renormalization算法

Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models
Batch Renormalization

通过对BN中Normalization后的值进行一步仿射变换(一个线性变换 r = σ B σ r=\frac{\sigma_\Beta}{\sigma} r=σσB和一个平移 d = μ B − μ σ d=\frac{\mu_\Beta-\mu}{\sigma} d=σμBμ,r和d不参与反向传播),然后计算移动平均值,对 μ \mu μ σ \sigma σ不断更新,training结束时候的值作为Inference时固定的均值和方差。这样做的好处有以下两个:

  1. 对于BN,在training中计算的移动平均值 μ \mu μ σ \sigma σ,仅仅在Inference时使用;对于Batch Renormalizatiuon,计算的移动平均值 μ \mu μ σ \sigma σ在训练的时候就在不断的修正,使 μ \mu μ σ \sigma σ更加逼近样本整体的均值和方差
  2. 使用BN算法,在Training和Inference中进行Normalization后的均值和方差是不一样的;而使用Batch Renormalization算法,在Training和Inference中进行Normalization后的均值和方差是一样的( μ , σ \mu,\sigma μσ为Inference时的固定的均值和方差)。
    x i ^ = x i − μ B σ B μ : = μ + α μ B σ : = σ + α σ B B a t c h N o r m a l i z a t i o n x i ^ = x i − μ B σ r + d = x i − μ σ μ : = μ + α ( μ B − μ ) σ : = σ + α ( σ B − σ ) B a t c h R e n o r m a l i z a t i o n \hat{x_i}=\frac{x_i-\mu_\Beta}{\sigma_\Beta} \quad \mu:=\mu+\alpha\mu_\Beta \quad \sigma:=\sigma+\alpha\sigma_\Beta \quad BatchNormalization \\ \hat{x_i}=\frac{x_i-\mu_\Beta}{\sigma}r+d=\frac{x_i-\mu}{\sigma} \quad \mu:=\mu+\alpha(\mu_\Beta-\mu)\quad \sigma:=\sigma+\alpha(\sigma_\Beta-\sigma) \quad BatchRenormalization xi^=σBxiμBμ:=μ+αμBσ:=σ+ασBBatchNormalizationxi^=σxiμBr+d=σxiμμ:=μ+α(μBμ)σ:=σ+α(σBσ)BatchRenormalization

因此,当mini-batch足够大( μ B \mu_\Beta μB σ B \sigma_\Beta σB可以代替 μ \mu μ σ \sigma σ),使用BN和Batch Renormalization性能差别不大;当minibatch很小时( μ B \mu_\Beta μB σ B \sigma_\Beta σB噪声很大,不能代替 μ \mu μ σ \sigma σ),用Batch Renormalization会取得更好的性能。

ps:论文中指出,根据实验的结果,在迭代初期仅使用BN而后逐步进行修正时效果较好,r和d施加了上下界的约束就是为了实现这一点(?)。

主要参考

  1. 深度学习中 Batch Normalization为什么效果好?
  2. 深度学习中的Normalization模型
  3. 如何评价batch renormalization?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值