CV/DL基础知识 之 深入理解Batch Normalization -我觉得很多人用正态分布来解释是错误的

1,前言

关于Batch Normalization的作用和流程请参考郭耀华的博客Double_V_的博客,博主写的非常详尽。
Batch Normalization的作用是处理梯度消失问题,其是通过将激活函数的输入能够很好的集中在[-1,1]之间,从而对抗梯度消失的。
本文主要深入探讨为什么Normalization之后,能够将神经元中激活函数的输入能够很好的集中在[-1,1]之间。以及gama和belta参数的作用。
上述两个博客及网上一般的解释是:假设输入服从正态分布来解释,然而本人觉得这是相对片面的,本文将更加深入的研究该问题。

2,关于Batch Normalization

在讨论之前,先概括一下Batch Normalization方法:一般来说,Batch Normalization是对神经元激活函数的输入值(以下称该神经元的净输入x)进行的。训练时,minibatch的size为m,以该minibatch训练一次时,某一个神经元,会进行m次前向传播,即其有m个净输入x。Batch Normalization就是首先计算这m个净输入的均值u,和方差v,并将以此对每个净输入进行Normalization(即,x = (x-u)/(v0.5) )后,得到新的净输入x,作为该神经元激活函数的输入。

由于通过Batch Normalization后,m个x往往会变换到区间[-1,1],而当自变量x在区间[-1,1]时,各类激活函数f的导数f’(x)往往是远离0的,因此通过Batch Normalization可以有效的解决梯度消失问题。

在这里插入图片描述

3,But, why?

那么,为什么通过Batch Normalization后,m个x往往会变换到区间[-1,1]呢?

一般的说法是:如果我们假设输入x本身服从正态分布,那么Batch Normalization后,m个x将服从标准正态分布,如此一来,x处于1倍标准差范围内(即[-1,1])的概率将为68.3%。也就是说,通过Batch Normalization,我们可以尽量保证68.3%的x,处于[-1,1],从而应对梯度消失。

但上述说法有一个问题是,尽管现实生活中有很多属性可以通过正态分布很好的拟合,但我们仍无法保证使用Batch Normalization处理的x是一个近似的正态分布。那么,服从某种未知分布的随机变量x,在进行Batch Normalization后,即进行均值归0化方差归1化之后,x仍服从原分布,而不会变成一个标准正态分布。因为本质上Batch Normalization只是对所有x在坐标轴上进行了相同的移动和相同的压缩(压缩的相同是对移动后的x来说的),这不会改变x的分布形式。

通过假设x属于正态分布,并不能完全证明对于任意分布的x,在Batch Normalization后,有足够比例的x会变换到区间[-1,1]。

下面的部分是按照本人考虑该问题的思路组织的,3.1,3.2本质上还是采用了对于正态分布相同的处理,只能表明在相应分布上Batch Normalization是有效的,不具有普适性。3.3是采用了最一般的分布进行推导,结论具有普适性。读者可以直接看3.3部分,也推荐看一下3.1,3.2以加深理解。

为了方便,下述操作涉及的随机变量均为有限离散变量,显然这不影响讨论的结果

3.1,均匀分布

随机变量x属于某均匀分布,假设x共有2n+1个不同的取值,那么对x进行Normalization(均值归0化+方差归1化)后,x取值为[-nd, -(n-1)d, …, -d, 0, d, …, (n-1)d ,nd],其中d是相邻两个取值的间隔。

我们想要知道,此时x的取落在区间[-1,1]的概率P是多大,只需要知道nd是多大。
因为P = 1/nd, nd>1或者P =1,nd <=1。(其实由于x是离散变量,因此只有当d趋近于0时,上述公式才成立,否则只是近似成立。不过这并不影响结论,因为只要P是一个足够大的概率就行了,这个“足够大”本身其实根训练数据、模型有关,没法定量计算,只能定性分析。另外,后面可以看到在本例中d趋于0是很容易满足的)

那么,如何计算nd呢?

x的方差(此时方差为1,均值为0)计算公式如下:

[(-n)2d2 + (-(n-1))2d2 +…+(n-1)2d2 + n2d2]/(2n+1) = 1
[2d2/(2n+1)]*[12+22+…+n2] /(2n+1)= 1
[2d2/(2n+1)] * [n(n+1)(2n+1)/6] = 1
d2 * n(n+1)= 3
n2d2 + nd2 = 3

可以看出,当n取值较大时(即该均匀分布取值较多时,对于深度学习所需的数据量来说,n往往时非常大的),d取值必然非常小,因此我们忽略掉nd2
n2d2 = 3
nd = 1.732

其实,此处不忽略nd2能更好地说明结论,我们直接去掉nd2,则上面的=将变为<,有nd < 1.732
那么P >0.577,如果我们认为0.577是相当高的比例的话,则结果是可以接受到。其实不论是不是相当高,都至少能说明,不论该均匀分布原来在哪个区间,Normalization能够将均匀分布向区间[-1,1]移动,并保证一部分随机变量处于[-1,1],因此若净输入近似于均匀分布,那么Normalization对梯度消失有一定的抗性。

3. 2,不知道啥分布A

可以看出,3.1中关于 Batch Normalization对均匀分布作用的推导 与 其对正态分布作用的推导 的逻辑是一样的。结论也只适用于均匀分布,不具有普适性。

于是本人设想能不能构造一种均值=0,方差=1的最离散的分布D,即,对于任意均值=0,方差=1的分布X,从X中采样足够数量的一组随机变量x,从D中采样相同数量的随机变量d,d远离0的平均距离总是>= x远离0的平均距离

但上述定义并不适用于本问题,于是改成: d属于[-1,1]的比例总是<= x属于[-1,1]的比例

本人并没有找到这么一个分布,下面内容只是一个错误尝试。从结果上看,只是对另一种分布又重复之前对正态分布、均匀分布进行的[-1,1]比例计算。

直观的想法是,能不能定义随机变量的取值与均值0的距离均相同。下面称这个分布为A,随机变量为a。
那么其实a只有互为相反数的两个取值,后面可以看到,这两个取值的概率并不影响结果,因此在此不予考虑。

假设采样了n个数据
(n*a2)/n = 1
a= 1/-1。
可以看到,a的取值都在[-1,1]内,也就是说,比例是100%。看来这显然不是“最离散”的分布,自然结论不具有普适性,甚至远远小于正态和均匀分布带来的启发

3.3,具有普适性的推论

3.2的失败表明直接去寻找这么一种“最离散”分布是困难的,那么我们能不能跳出“分布”的概念,直接去研究的比例呢?
因为我们就是想知道一组数值,经过均值归0方差归1后,有多大的比例落在[-1,1]。
准确地说是,任意一组数值,经过均值归0方差归1后,元素落在[-1,1]的比例最小是多少。

这种思路有两个好处:
1,现实中的数据以及各神经元的净输入本身可能就不属于某个可以被描述的分布,它的分布就是模型在训练和使用过程中遇到的所有数据的集合,简单来说,就是没有分布。
2,我们本身不在意分布如何,“均值归0方差归1”这个操作也是分布无关的,我们只想知道比例

那么,我们假设,已经采样了一个随机变量z,假设z<-1或z>1,现在我们需要再采样n-1个数据xi,i=1,2,…n-1,才能保证这一组采样值(z,x1,x2,…,xn-1)的均值为0,方差为1。

先考虑方差:
(z2+x12+x22+xn-12)/n = 1     式(3-3-1)

显然,由于z<-1或z>1,均值为0,那么为了将方差“扯回到”1,那么xi必然都属于[-1,1]。(可以这么解释,如果某个|xi|>1,那么 相当于有两个z,计算两遍,因为我们这里z的取值没有固定,所以计算两遍获得的最小比例和一遍相同)

ok,那么 落在[-1,1]的比例一定是P=(n-1)/n,为使结论具有普适性,我们要获得最小的P,就要计算最小的n。
前面提到,我们没有固定z的值,但对于每一个具体的式(3-3-1),z取值是不会变化的,尽管值未确定

那么,要想n最小,只有xi=0,i=1,2,…n-1
于是:n=z0.5
最小比例P=1-1/z0.5

在进行下一步之前,我们先考虑均值=0的要求:
z+x1,x2,…,xn-1 = 0     式(3-3-2)
为满足式(3-3-2),则必不能满足xi=0,i=1,2,…n-1。

那么我们使用xi=0,i=1,2,…n-1。算出来的最小的这个n,其实小于实际的n*,那么P<P*。即我们算出的最小比例P,比实际最小比例P还要小,那么当我们认为可以接受 P是足够应对梯度消失时,P必然也可以,所以结论具有普适性。

显然随z取值增大,P逐渐增大。
为了直观的表明结论,给z取值z=1.5+0.5*i, i=0,1,2,…,计算P:
(下图中,红线右边的一列是接在左边一列末尾的,我为了减小篇幅,将P的列表截成了4段,拼在一起了)
在这里插入图片描述注:本部分以及前文以[-1,1]作为判断区间,其实是很严苛的,可以将其放宽。但是本部分涉及的公式并不受到[-1,1]影响,若是放宽[-1,1],那么z的最小取值可能更大一点,这将更加支持我们的结论。

结论:对于任意一组的数值,当我们对其进行Batch Normalization后,其中存在的可能引起梯度消失的值z的比例不会超过1-P = 1/(z0.5),因此Batch Normalization能够有效的处理梯度消失问题

4,超参数gama和belta的作用

一般在Batch Normalization流程中,在对净输入x进行均值归0和方差归1后,还要对其进行缩放:
x = gama*x + belta

前面的讨论专注于探讨为什么Batch Normalization能够处理梯度消失,所以忽略了这一步。下面讨论gama和belta的作用,这个过程同时说明x = gama*x + belta不影响前面的结论。

4.1 均值归0和方差归1带来了什么坏处

网上一般的说法是这样的:均值归0和方差归1后,x变为了标准正态分布,这样网络就学习不到东西了。
我个人是不认同这种说法的。
首先,正如前面讨论的那样,均值归0和方差归1后,x并不会变为标准正态分布,x还是原来的分布类型。
其次,即便x是标准正态分布,或者其他任何分布,网络仍然可以学习到东西,因为激活函数是非线性的。可以这样考虑,如果均值归0和方差归1后,x变为了标准正态分布,那么变换之前x也一定是正态分布,那为什么之前网络能够学习到东西,现在就不能了呢?这样理解明显是不对的。

所以均值归0和方差归1带来的坏处,并不在于此。带来的问题是:x间的差异变小了,导致学习变得困难。这个问题在本文第3部分的讨论中已经昭然若揭了。
我们在第3部分中提到了:通过均值归0和方差归1,我们将x向0进行了压缩,特别是其中大比例的x集中到了[-1,1]。
这帮助我们解决了梯度消失,但是,这种模式统一的压缩方式会不会过于单调且严厉了。

这样想,
神经网络模型各不相同;
训练模型的数据集各不相同;
不同层的位置连接关系不同,其对整个模型梯度消失的影响就不同;
不同层的权重w不同,其对整个模型梯度消失的影响就不同(权重和激活函数的导数同时影响梯度消失);
不同层的激活函数各不相同;
那么,x的值大小、分布是必然是各不相同的,但我们对x进行的都是统一规格的变换:均值归0和方差归1。这是不是有点不合适呢?

简单来说,可能有的层,有P比例的x集中到[-3,3]就能避免梯度消失了,没必要集中到[-1,1],或者没有必要将P比例集中到[-1,1],按均值归0和方差归1处理对该层来说过于严苛,并导致了x间的差异变小,学习变得困难。这只是一个抽象的例子,用来帮助大家理解:x的值大小、分布是各不相同的,因此我们对x进行统一规格的变换是不合适的。

4.2 How?

那么该怎么做,才能够在避免梯度消失的基础上,尽量保持x的差异,从而保证学习的稳定和高效率?
答案是:学习一个x最适合的均值和方差,是的。就是belta和gama。

首先说明,belta和gama是学习到的超参数,至于其学习方法本文不涉及。
既然是学习的,那我们认为,它们就是最适合本层的均值和方差。
那现在在回过头来看我们在均值归0和方差归1后进行的操作:x = gama*x + belta 就很显然了。这是均值归0和方差归1的逆操作,将x变为了均值为belta方差为gama。

学习到的belta和gama,能够保证本层不向模型贡献导致梯度消失的因素,又能最大化x间的差别,保证学习的效率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值