天天看点

吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN

目录

  • 前言
  • why BN?
    • Internal Covariate Shift
    • BN起源
  • 具体操作
    • 白化
    • 使之趋于非线性
  • 将BN拟合进神经网络
  • 测试时的BN

前言

  • 最近在着手一项课设,在使用深度学习FCN网络的时候遇到了BN的问题,正巧的是,我同时在吴恩达老师的深度学习课程上看到了有关BN的问题,同时BN也是挺有意思、挺重要的知识。于是写下这篇文章来记录有关BN的学习过程。
  • 本文综合了吴恩达老师的深度学习课程以及诸多博客的优秀见解,在此致谢。

why BN?

Internal Covariate Shift

  • 首先介绍一个概念——ics。

深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。

Google 将这一现象总结为 Internal Covariate Shift,简称 ICS.

所以ICS是什么呢?

将每一层的输入作为一个分布看待,由于底层的参数随着训练更新,导致相同的输入分布得到的输出分布改变了。

而机器学习中有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。

那么,细化到神经网络的每一层间,每轮训练时分布都是不一致,那么相对的训练效果就得不到保障, 所以称为层间的covariate shift,即Internal Covariate Shift。

简而言之,就是每轮训练会改变参数,导致每轮训练面临的输入数据分布都不相同,违背了IID独立同分布假设。

BN起源

  • ics与BN又有什么联系呢?别急,听我慢慢道来。
  • 经过上面的叙述,你应该知道ICS现象了。那么如何解决这个问题呢?解铃还须系铃人,既然每层的输入分布相同这件IID比较在乎的事情得不到满足能造成这么大的后果,那么满足它就好了。问题是如何满足?
  • 其实问题的根源就是更新参数,可是你又不能不更新参数吧!所以得在更新参数的那个步骤处做些文章,即不影响正常更新参数,又能使得更新后的输入数据分布是不受参数变化影响的。能做到这点,问题自然就解决了。那么计算机科学家们是如何做到的呢?正如吴恩达老师开头所说,计算机很多领域是相互联系的,彼此之间也多有启发,经过查阅资料了解之后我才知道吴恩达老师在这节课开头说这段话的含义。

之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话——所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布——那么神经网络会较快收敛。

那么BN作者就开始推论了:图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?这就是启发BN产生的原初想法,而BN也确实就是这么做的,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。

具体操作

白化

白化(Whitening)是机器学习里面常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。

白化是对输入数据分布进行变换,进而达到以下两个目的:

1、使得输入特征分布具有相同的均值与方差,其中PCA白化保证了所有特征分布均值为0,方差为1;而ZCA白化则保证了所有特征分布均值为0,方差相同;

2、去除特征之间的相关性。

通过白化操作,我们可以减缓ICS的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛。

  • 吴恩达老师通过z-score标准化操作达到了上述白化的目的。z-score的公式如下:
    吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN
    z是某一层输出,我们要处理一下才能作为下一层的输入。处理过程就是z-score标准化操作,其中,上图分母处的ε希腊字母的目的是防止分母为0。
  • 我们需要从直观上了解一下上面做了什么。
    吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN

    以sigmoid激活函数为例,在使用其之前,我们对数据进行了标准化操作,使其0均值,1方差的标准正态分布。

    其实,在训练过程中,随着网络加深,分布逐渐发生变动,导致整体分布逐渐往激活函数的饱和区间移动,从而反向传播时底层出现梯度消失,也就是收敛越来越慢的原因。

    而Normalization则是把分布强行拉回到均值为0方差为1的标准正态分布,使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,避免梯度消失问题产生,加速收敛。

    以上图sigmoid为例,如果不经过变换,存在一个均值为-6,方差为1的分布,对应到激活函数中就是[-8, -4]的区域,这已经是饱和区了,这也就是所谓的梯度消失。

    所以标准化其实就是把大部分激活的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。

    一石二鸟啊!即使得分布一致了,又加快了收敛过程!吴恩达老师也在之前的视频中提到过标准化操作是如何加快收敛的,如果对上面文字叙述看不太懂的同学,可以详见博客:https://blog.csdn.net/qq_41076797/article/details/111150362

    能在输入x中使用标准化,那么在每一层都使用标准化岂不美哉!

使之趋于非线性

  • 一切都如此顺利,你难道不觉得有一丝寒意么?不过放心,不得不说,巨人的肩膀真的靠得住!计算机科学家们敏锐的神经使他们迅速想到,神经网络其实最重要的部分就是激活函数,正是激活函数赋予了其非线性特征,否则不管多少层神经网络,也只不过是线性层面的排列组合罢了! 那么,上面一顿操作,强制将数据从梯度小的区域拉回了梯度大的,分布一致的区域会不会影响其非线性操作呢?会!
  • 请还以sigmoid为例!在使用sigmoid激活函数的时候,如果把数据限制到0均值单位方差,那么相当于只使用了激活函数中近似线性的部分,这显然会降低模型表达能力。
    吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN
  • 如何解决这个问题呢?

    为此,科学家们又为BN增加了2个参数,用来保持模型的表达能力。

    吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN

    这两个参数是通过训练学习到的,意思是通过这两个参数把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。

    另外,这两个参数是训练学习得到的,也就意味着,倘若并不需要对该层使用BN操作,那么这两个参数就会经过训练后很接近下面的等式: γ = √ ( σ 2 + ε ) 、 β = μ γ=√(σ^{2}+ε)、β=μ γ=√(σ2+ε)、β=μ,这样相当于没进行BN,这是训练过程中自然而然的选择。

    最终的BN操作如下:

    吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN

将BN拟合进神经网络

  • 到这里还剩最后的梳理工作了!现在把加入BN的神经网络流程呈现在大家眼前吧!
    吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN
    如吴恩达老师所写,首先x经过w和b得到z,这是常规流程,重点是得到z后并不立刻进行激活函数,而是先经过BN操作变成z’,然后再激活得到a,a作为下一层的输入继续重复这个过程。

测试时的BN

  • 在测试时,数据可能只有一个,或者多个,前者计算均值和方差是没有意义的,而后者可能数据量过于庞大消耗很多资源。所以吴恩达老师提到,将训练阶段的均值和方差保存起来,然后使用指数加权平均的方法来预测均值和方差,给测试数据使用。当然方法不一定非得是指数加权平均法,只要合理预测即可。
  • 吴恩达深度学习02-3.567 Batch Normalization(BN)前言why BN?具体操作将BN拟合进神经网络测试时的BN
  • 本篇论文主要讲了BN的起源、BN的好处、BN的操作以及BN在神经网络中的使用。梳理结束,感谢大家支持!

继续阅读