Batch Normalization详解

本文详细介绍了批量归一化(Batch Normalization,BN)的工作原理,包括BN解决的问题、思路、简化处理、公式、疑问解答以及在CNN中的应用。同时,还探讨了BN的益处,如加速训练、减少对学习率和初始化的依赖以及提升泛化能力。此外,文章还对比了Layer Normalization、Instance Normalization和Group Normalization等其他归一化方法,分析了它们在不同场景下的适用性。
摘要由CSDN通过智能技术生成

这几天重新看了BN,完成了翻译,也仔细的对里面一些自己感到疑惑的点,进行了查阅和思考,其中有一些个人见解,欢迎大家来讨论。
本文分两个部分,第一部分对BN进行一些基本讲解,第二部分讲其他的一些Normalization方法。

Batch Normalization

1 问题

首先我们要明白BN想要解决的问题是什么,参考原文我们发现,随着网络越来越深,训练深度网络变得很困难,收敛速度很慢。

1.1 原因

原文告诉我们是因为 Internal covariate shift (ICS)现象以及梯度弥散等问题。ICS,简言之就是网络中间层输入数据分布的不断变化,这样就导致网络后面层被迫去追随这种变化。

1.2 原来的方法

没有BN之前,网络也是要训练的,那么怎么保证收敛呢,原文提到,一是使用较小的学习率,二是对参数初始化进行精心设计。

1.3 BN的好处

自然有了BN之后,就能加快深度网络的训练,加快收敛。那BN的优势就在于。一,解决了(或者说减弱了)ICS现象;二,解决了梯度弥散;三,减小了对于学习率和初始化的依赖;四,引入了一定的泛化效果。

2 BN的思路

现在我们从问题出发,也就是我们知道现在网络收敛慢的原因了——ICS,那么我们如何来进行突破呢?从ICS的字面上,我们知道是因为中间层的输入数据分布的不断变化导致的。那么自然就想到固定每一层的输入数据分布,岂不是就可以了。那么问题又来了,如何固定呢,应该选择怎样的分布来进行固定呢?

2.1 数据白化(标准化)

做深度学习或机器学习的人们都知道,在训练之前,我们的数据都是要进行预处理的。要么做数据白化(使数据不同维度去相关,使数据每个维度的方差为1),让数据近似满足独立同分布的条件,或者退而求其次,做数据标准化(减去均值,除以方差),让数据满足近似的同分布。然后这样做了,就可以加快模型的收敛。

2.1.1 原因

那么为什么做了这样的数据预处理就可以加快收敛呢?请参考博主很早的博客feature scaling以及Efficient BackProp

2.2 子网络

这里我们引入子网络的概念,正常一个N层的网络,我们剥离开第1层,那么剩下的N-1层可以看成是一个新网络,它就是原来网络的一个子网络,那同理,剥离掉第1,2层,剩下的N-2层又是一个新的子网络。
结合2.1,我们知道了对输入数据做白化是能加快收敛的,那么对于子网络的输入数据做白化按理来说也是可以加快收敛的,以此类推。

我们结合2.1和2.2,是不是就回答了我们刚才的问题,那么BN的思路就是对每一层进行数据白化。

3 BN里面的简化处理

我们已经知道我们要怎么做了,可是真正做的时候遇到一些阻碍,需要进行简化处理,原文提到了两种简化处理。

3.1 标准化取代白化

做数据白化是很繁琐且计算量巨大的,因为涉及到协方差矩阵的运算,要求取所有特征之间的协方差,同时在反传的时候还要求取相应变换,这会随着特征的增多而指数性的增长,因此,我们退而求其次,进行简单的标准化处理。就像计算机视觉中,对于输入图像,我们往往进行简单的标准化处理,而非白化处理。

3.2 使用mini-batch统计信息来近似全局分布

既然要进行标准化处理,就涉及到对于每个特征的均值和方差的求取,原则上我们是希望使用全局的训练数据来统计均值和方差的,但是使用SGD的话,或者说mini-batch SGD的话,我们无法得到全局的信息(我们虽然有所有的训练数据,但是我们也只能求到输入层的均值和方差,我们无法得到中间层的均值和方差,因为它们是在随时变化的)。所以我们使用mini-batch来生成每个特征的均值和方差的估计。

4 BN公式

到这里,我们终于可以给出BN的公式了。
在这里插入图片描述

5 疑问

我第一次看到这个公式的时候,讲道理是一头雾水,前面顺下来都讲的通,你让我标准化,那我就给你标准化,然后你又告诉我要进行平移缩放,wat?仿佛在玩我的样子,这里自然就有海量疑问。

5.1 为什么要进行再次的缩放和平移?

对于这个地方,原文真的是一笔带过,虽然加入了斜体,但真真是轻描淡写,the transformation inserted in the network can represent the identity transform。也就是现在我们已经完成了标准化了,每一层的输入都被我们强行调整成了近似0均值,1方差。那么直观上来讲,就是我学了半天,你给我标准化了,我再学,你再标准化,我岂不是白学了。所以为了解决这个问题,需要进行缩放和平移,来以网络自己学习的方式来复原该层所学习到的东西,它可能是完全复原,也可能变成别的分布,这样就是所谓的恢复了模型的容量(capacity),恢复了网络的表达能力。

5.2 两次变换是否有用,是否会相互抵消,是否真的有效?

首先需要肯定的是,这两次变换肯定是有效的,毕竟BN已经被反复验证是work了的,个人觉得,这样看似矛盾的来去变换其本质是在进行参数更新的解耦,让各自层的参数尽量各自的学习,减少层之间的影响。这里从反传梯度的角度来看一下。
在这里插入图片描述
左图为我原始网络的其中两层,右图为在其间加入BN层,这里我将激活函数省略了。
ICS现象告诉我们,后面层会因为前面层的输出的不断变化而迫使自己不断的去学习这个新的分布,所以我们主要看 W 2 W_2 W2的更新情况。
左图原始的参数更新:
∂ ℓ ∂ W 2 = ∂ ℓ ∂ z 2 ∂ z 2 ∂ W 2 = ∂ ℓ ∂ z 2 z 1 ∝ z 1 \frac{\partial \ell}{\partial W_2}=\frac{\partial \ell}{\partial z_2}\frac{\partial z_2}{\partial W_2}=\frac{\partial \ell}{\partial z_2}z_1\propto z_1 W2=z2W2z2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值