一篇文章搞懂Batch Normalization批标准化

Batch Normalization 是近些年深度学习的重要成果,实践证明其优先性和重要性,深度学习是一个经验领先于理论分析的偏经验的一门学问。
本文是对论文《 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》的导读。

首先介绍机器学习的一个重要概念:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型在测试数据上表现良好的一个保障。
Batch Normalization 的作用和IDD独立同分布类似,就是使深度神经网络训练过程中的每一层神将网络的输入保持相同分布,这也是BN的核心思想。

问:为什么要使用Batch Normalization 呢?也就是为什么要使深度神经网络训练过程中的每一层神将网络的输入保持相同分布呢?
答:深度神经网络存在随着网络深度加深,训练起来越困难,收敛越来越慢的问题,Batch Normalization 使深度神经网络训练过程中的每一层神将网络的输入保持相同分布可以解决这个问题。很多论文也是解决这个问题的,比如ReLU激活函数,再比如Residual Network。
又问:是什么导致深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢的问题?
答:Internal Covariate Shift问题

一、“Internal Covariate Shift”问题:

BatchNorm是基于Mini-Batch SGD,Mini-Batch SGD相对于One Example SGD的两个优势:梯度更新方向更准确;并行计算速度快,但是SGD训练存在缺点:超参数调起来很麻烦,就是缺点就要靠BN来解决了。

covariate shift:如果ML系统实例集合<X,Y>中的输入值X的分布老是变,这不符合IID假设,网络模型很难稳定的学规律。

Internal Covariate Shift(内部协变量转移):对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。

综上所述,BN就是的基本思想就是让每个隐层节点的激活输入分布固定下来,避免“Internal Covariate Shift”问题,解决深度神经网络存在随着网络深度加深,训练起来越困难,收敛越来越慢的问题。

BN不是凭空拍脑袋拍出来的好点子,它是有启发来源的:之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话——所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布——那么神经网络会较快收敛,那么BN作者就开始推论了:图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?这就是启发BN产生的原初想法,而BN也确实就是这么做的,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。

接下来具体讲一下BN的本质思想。

二、BatchNorm的本质思想

深度神经网络的激活函数( X = W U + B X=WU+B X=WU+B)的输入值 U U U随着网络深度加深,其分布逐渐发生偏移或者变动,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,以Sigmoid函数为例,意味着激活输入值 W U + B WU+B WU+B是大的负值或正值,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。

BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,激活输入值处于标准分布,也就是处于非线性函数比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,向损失函数最优值迈动的步子大,避免了梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

综上:BN=》激活输入值处于均值为0方差为1的标准正态分布= 》 梯度变大=》收敛速度快

下面的图片会更清楚展示BN到底做了什么工作。
在这里插入图片描述
最左端的浅蓝色曲线表示隐层神经元原先的激活输入x,x取值符合正态分布,正态分布均值是-2,方差是0.5。通过BN后转换为均值为0,方差是1的正态分布(对应上图中的深蓝色图形)。BN做了什么工作?它使xx的取值正态分布整体右移2(均值的变化),图形曲线更平缓了(方差增大的变化)。

为什么要使x处于均值为0,方差是1的标准正态分布呢?
在这里插入图片描述
答:标准正态分布这意味着在一个标准差范围内,也就是说64%的概率x其值落在[-1,1]的范围内,在两个标准差范围内,也就是说95%的概率x其值落在了[-2,2]的范围内。那么这又意味着什么?我们知道,激活值 x = W U + B , U x=WU+B,U x=WU+B,U是真正的输入,x是某个神经元的激活值,假设非线性函数是sigmoid,那么看下sigmoid(x)和Sigmoid(x)导数图:

在这里插入图片描述
x经过BN后,均值是0,方差是1,那么意味着95%的x值落在了[-2,2]区间内,很明显这一段是sigmoid(x)函数接近于线性变换的区域,Sigmoid(x)导数值较大,意味着x的小变化会导致非线性函数值较大的变化。

综上,BN使x的原始正态分布中心左移或者右移到以0为均值,拉伸或者缩减形态形成以1为方差的标准正态分布。

但是,通过以上的分析,通过BN,那么不就把非线性函数替换成线性函数了([-2,2]区间,sigmoid接近直线)。
这意味着什么?我们知道,如果是多层的线性函数变换其实这个深层是没有意义的,因为多层线性网络跟一层线性网络是等价的。这意味着网络的表达能力下降了,这也意味着深度的意义就没有了。

所以 BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。

核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。

三、如何做BN

DNN的t和t-1层神经网络:
在这里插入图片描述
要对每个隐层神经元的激活值做BN,可以想象成每个隐层又加上了一层BN操作层,它位于X=WU+B激活值获得之后,非线性函数变换之前,其图示如下:

在这里插入图片描述
对于Mini-Batch SGD来说,一次训练过程里面包含m个训练实例,其具体BN操作就是对于隐层内第k神经元的激活值来说,进行如下变换:

在这里插入图片描述

要注意,这里t层某个神经元的x(k)不是指原始输入,就是说不是t-1层每个神经元的输出,而是t层这个神经元的线性激活x=WU+B,这里的U才是t-1层神经元的输出。变换的意思是:某个神经元对应的原始的激活x通过减去mini-Batch内m个实例获得的m个激活x求得的均值E(x)并除以求得的方差Var(x)来进行转换。

但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如下的scale和shift操作:

在这里插入图片描述

四、BatchNorm的推理(Inference)过程

BN在训练的时候可以根据Mini-Batch里的若干训练实例进行激活数值调整,但是在推理(inference)的过程中,很明显输入就只有一个实例,看不到Mini-Batch其它实例,那么这时候怎么对输入做BN呢?因为很明显一个实例是没法算实例集合求出的均值和方差的。这可如何是好?

既然没有从Mini-Batch数据里可以得到的统计量,那就想其它办法来获得这个统计量,就是均值和方差。可以用从所有训练实例中获得的统计量来代替Mini-Batch里面m个训练实例获得的均值和方差统计量,因为本来就打算用全局的统计量,只是因为计算量等太大所以才会用Mini-Batch这种简化方式的,那么在推理的时候直接用全局统计量即可。

决定了获得统计量的数据范围,那么接下来的问题是如何获得均值和方差的问题。很简单,因为每次做Mini-Batch训练时,都会有那个Mini-Batch里m个训练实例获得的均值和方差,现在要全局统计量,只要把每个Mini-Batch的均值和方差统计量记住,然后对这些均值和方差求其对应的数学期望即可得出全局统计量,即:
在这里插入图片描述
 有了均值和方差,每个隐层神经元也已经有对应训练好的Scaling参数和Shift参数,就可以在推导的时候对每个神经元的激活数据计算NB进行变换了,在推理过程中进行BN采取如下方式:
 在这里插入图片描述
 这个公式其实和训练时
在这里插入图片描述
是等价的,通过简单的合并计算推导就可以得出这个结论。那么为啥要写成这个变换形式呢?我猜作者这么写的意思是:在实际运行的时候,按照这种变体形式可以减少计算量,为啥呢?因为对于每个隐层节点来说:

都是固定值,这样这两个值可以事先算好存起来,在推理的时候直接用就行了,这样比原始的公式每一步骤都现算少了除法的运算过程,乍一看也没少多少计算量,但是如果隐层节点个数多的话节省的计算量就比较多了。

在这里插入图片描述
都是固定值,这样这两个值可以事先算好存起来,在推理的时候直接用就行了,这样比原始的公式每一步骤都现算少了除法的运算过程,乍一看也没少多少计算量,但是如果隐层节点个数多的话节省的计算量就比较多了。

五、BatchNorm的好处

BatchNorm为什么NB呢,关键还是效果好。
①不仅仅极大提升了训练速度,收敛过程大大加快;
②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;
③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。总而言之,经过这么简单的变换,带来的好处多得很,这也是为何现在BN这么快流行起来的原因。

问:文章针对的只是sigmoid激活函数,会存在梯度消失问题。但是如果采用relu作为激活函数,他的导数固定为0或1,这样bn不就没意义了吗 ?
答:无论是Relu、BN还是resNet,都是从不同角度来解决随着网络层数加深而导致学习速度减慢的。并不是说如果采用Relu激活BN就没有意义了,BN的算法的核心思想是“Reducing Internal Covariate Shift”减小内部协方差偏移的,无论使用什么激活函数,随着网络层数的加深都会产生内部协方差偏移,这样也就会导致网络学习速度减慢,而Batch Norm就是解决这个问题的。而本文中所提到的Sigmoid只是从另一个角度来分析BN的作用而已,并不是说BN只能依靠Sigmoid、tanh等激活函数才能发挥作用。
问:想问问楼主,BN放在激活函数之前还是之后。如果是之前,那么x=uW+b 那么偏置bias就白加了如果是之后,那么就不能起到避免梯度消失的问题。
答:说的非常正确!是放在激活函数之前,如果使用了BN,的确不需要添加bias。
问:文章中好像把输入限定为符合正太分布的情况中了,然后将输入转换成标准正太分布。
1,如果输入本身不符合正太分布呢?
2,实际情况中如何判样本输入是否符合正太分布?
答: 个人认为所有的特征的参数的整体分布均可以使用高斯分布来拟合,并不是说其必须要满足高斯分布。

作者:郭耀华
出处:http://www.guoyaohua.com
【深度学习】深入理解Batch Normalization批标准化

独立同分布:

“白化(whitening)”是一个重要的数据预处理步骤。白化一般包含两个目的:

(1)去除特征之间的相关性 —> 独立;

(2)使得所有特征具有相同的均值和方差 —> 同分布。

独立同分布的数据可以简化常规机器学习模型的训练、提升机器学习模型的预测能力,已经是一个共识。

白化最典型的方法就是PCA

内部协变量转移(Internal Covariate Shift)

协变量:神经网络的参数就是协变量,因为它是不可控的且在训练过程中是必须变化的,且对输出值会产生影响,所以当参数发生变化时,就发生了协变量转移。

简而言之,Internal Covariate Shift会使得每个神经元的输入数据不再是“独立同分布”。
其一,上层参数需要不断适应新的输入数据分布,降低学习速度。(为什么?会降低学习速度) 答:每次训练的输入的数据分布都不一样,导致学习速度慢,BN可以让的数据的分布偏于同一分布,所以可以提升速度
其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。 ==激活函数时relu呢?没有像sigmoid函数一样有饱和区呢?==答:relu会出现0值,BN可以激活值尽量回到正半轴 参考
其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。

详解深度学习中的Normalization,BN/LN/WN

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值