对Batch Normalization的理解


这几天在看Res_Net的相关知识,其中遇到了有关Batch Normalization的深层次问题,为什么越深层次的网络学习会越慢,收敛会越慢的问题。于是写一篇博客,作为对Batch Normalization的学习笔记。

机器学习领域or深度学习领域都会有这样的假设:IID独立同分布,就是假设训练数据和测试数据都是满足相同分布的,这是通过训练数据获得的模型在测试集获得好的效果的一个基本保障。
BatchNormalization层就是深度网络训练过程中要让每一层神经网络的输入保持相同分布的。

BN思想产生的来源

因为在深度神经网络在做非线性变换前的激活输入值(就是哪个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下两端靠近。所以这会导致反向传播时低层神经网络的梯度消失。举个sigmoid函数和relu函数的例子。
在这里插入图片描述

图1 Sigmoid(x)

在这里插入图片描述

图2 Relu(x)

这两个函数都是机器学习或者深度学习领域两个典型的激活函数,激活函数的作用大概我不用多说。但现在的问题是,我们知道梯度下降法是从前层神经网络向后层神经网络不断传送梯度的,每一层的隐层的参数变化完全靠梯度的变化幅度。什么意思,就是我现在的w要到一个我希望的w*,如果上层传过的来梯度值过于小,我每次加的▲w就特别小,这样可能需要非常多的时间,或者我需要走很多步才能到达w*这个位置。这也是为什么网络层数越深,越难以收敛,训练速度慢的原因。因为前层网络的梯度几乎传不到后层。
那么我们就会问了,决定这个梯度传过来的大小到底是由什么决定的?
在这里插入图片描述

图3 神经网络结构图

深层神经网络在做非线性变换前的激活输入值(就是y=WX+b,中的那个x)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近。
对sigmoid函数来说,也就是网络层数越深,后来网络的激活输入值y逐渐往趋于正无穷或负无穷的方向跑了,这就导致此时的梯度几乎为0,那么这么小的梯度乘上层传回来的损失值再传到下层基本上就没了,下层学不到什么。而对Relu函数来说,比较糟糕的整体的输入值都往负无穷方向跑了,那么梯度都为0,而且还有糟糕的是,几乎激活激活函数后全部输出值也都为0。

Batch Normalization其实就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布。
在这里插入图片描述

图4 不同均值方差的正态分布曲线图

假设某个隐层神经元原先的激活输入x取值符合正态分布,正态分布均值是-2,方差是0.5,对应上图中最左端的浅蓝色曲线,通过BN后转换为均值为0,方差是1的正态分布(对应上图中的深蓝色图形),意味着什么,意味着输入x的取值正态分布整体右移2(均值的变化),图形曲线更平缓了(方差增大的变化)。这个图的意思是,BN其实就是把每个隐层神经元的激活输入分布从偏离均值为0方差为1的正态分布通过平移均值压缩或者扩大曲线尖锐程度,调整为均值为0方差为1的正态分布。

假设s(x)=sigmoid(x),则s(x)的导数为s‘(x)=s(x)*(1-s(x)),因为s(x)的取值范围是(0,1),所以s’(x)的图像如下:

在这里插入图片描述

图5 sigmoid导数图

假设没有经过BN调整前x的原先正态分布均值是-6,方差是1,那么意味着95%的值落在了[-8,-4]之间,那么对应的Sigmoid(x)函数的值明显接近于0,这是典型的梯度饱和区,在这个区域里梯度变化很慢,为什么是梯度饱和区?请看下sigmoid(x)如果取值接近0或者接近于1的时候对应导数函数取值,接近于0,意味着梯度变化很小甚至消失。而假设经过BN后,均值是0,方差是1,那么意味着95%的x值落在了[-2,2]区间内,很明显这一段是sigmoid(x)函数接近于线性变换的区域,意味着x的小变化会导致非线性函数值较大的变化,也即是梯度变化较大,对应导数函数图中明显大于0的区域,就是梯度非饱和区。

只有BN层就能解决问题了吗?

在这里插入图片描述

图6 BN层操作

在这里插入图片描述
学过概率论与数理统计就知道,就是把一个分布变成正态分布的过程,而且BN层操作注意是在x=WU+b之后,激活函数g(x)之前。
仅仅有BN操作会出现问题吗?

如果仅仅是有BN,那就跟把非线性函数替换成线性函数差不多了,如果所有的值都大体落在线性区域,我们知道,多层的线性函数层其实跟一层的线性函数层没有区别,这也是为什么加激活函数的原因。我们讲,只是这样加BN操作,会使得网络得表达能力下降,学不到更深层次得特征。那么该如何解决呢?

所以BN为了保证非线性得获得,对变换后得满足均值为0得方差为1得x又进行了scale加上shift的操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
在这里插入图片描述
所以总结一下,Batch Normalization分两个步骤,单位高斯化+缩放操作
在这里插入图片描述
注释: γ \gamma γ, β \beta β是两个需要学习的参数,我们可以让他学习如上图所示一样,从而恢复恒等映射,就是什么也没干,但一般是不会这么做,一般学到的参数 γ \gamma γ, β \beta β代入进去的yi还是和原数据xi有差异的。

BN也可以看作正则化(regularaztion)的一种特殊形式,你可以理解为这像是在输入数据中加入了一些抖动,从而实现正则化的效果。

BatchNorm的好处

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

参考博客

【深度学习】深入理解Batch Normalization批标准化
https://www.cnblogs.com/guoyaohua/p/8724433.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值