Batch Normalization 导读

来源:互联网 发布:vmware安装ubuntu禁用 编辑:程序博客网 时间:2024/06/06 01:57

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

而BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。


为什么深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢?这是个在DL领域很接近本质的好问题。

很多论文都是解决这个问题的,比如ReLU激活函数,再比如Residual Network,BN本质上也是解释并从某个不同的角度来解决这个问题的。


covariate shift的概念:如果ML系统实例集合<X,Y>中的输入值X分布老是变,这不符合IID假设。


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


然后BathNorm的基本思想:能不能让每个隐层节点的激活输入分布固定下来呢?这样就避免了"Internal Covariate Shift"问题了。


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


BatchNorm的本质思想:

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U就是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者移动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致向后传播时底层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值得分布强行拉回到均值0方差为1的标准正态分布而不是萝莉分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入小的变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习速度收敛速度快,能大大加快训练速度。


其实一句话就是:对于每个隐层神经元,把逐渐向非线性函数映射后取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变化函数的输入值落入对输入比较敏感的区域,以避免梯度消失的问题。


BN其实就是把每个隐层神经元的激活输入分布从偏离均值为0方差为1的正态分布通过平移均值压缩或扩大曲线尖锐程度,调整为均值为0方差为1的正态分布。


BN其实就是把隐层神经元激活输入x=WU+B从变化不拘一格的正态分布通过BN操作拉回到了均值为0,方差为1的正态分布,即原始正态分布中心左移或者右移到以0为均值,拉伸或缩减形态形成以1为方差的图形。就是说经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离饱和区,这样来加速训练收敛过程。


很明显, 如果都通过BN,那么不就把非线性函数替换成线性函数效果相同了?我们知道,如果是多层的线性函数变换其实这个深层是没有意义的,因为多层线性网络跟一层线性网络是等价的。这意味着网络的表达能力下降了,这也意味着深度的意义没有了。所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了shift操作

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


BatchNorm的推理过程

BN在训练的时候可以根据Mini-Batch里的若干训练实例进行激活数值调整,但是在推理的过程中,很明显输入就一个实例,看不到Mini-Batch其他实例,那么这时候怎么对输入做BN呢?


We refer to the change in the distributions of internal nodes of a deep network, in the course of training, as Internal Covariate Shift. Eliminating it offers a promise of faster training. We propose a new mechanism, which we call Batch Normalization, that takes a step towards reducing internal covariate shift, and in doing so dramatically accelerates the training of deep neural nets. It accomplishes this via a normalization step that fixes the means and variances of layer inputs. Batch Normalization also has a beneficial effect on the gradient flow through the network, by reducing 

0 0
原创粉丝点击