赞
踩
归一化是一种常用于数据预处理的方法。根据需求定义将数据约束到固定的一定范围。希望转化后的数值满足一定的特性(分布)。
在神经网络的训练中,数值更大的参数会对结果的影响更大,所以需要设定不同的学习率。这样是很麻烦的,所以我们会引入归一化提前对数据进行预处理。具有统一规格的数据, 能让机器学习更容易学习到数据之中的规律。
深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。
为了训练好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。
这种现象就是Internal Covariate Shift协方差偏移。将每一层的输入作为一个分布看待,由于底层的参数随着训练更新,导致相同的输入分布得到的输出分布改变了。
机器学习中有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
那么,细化到神经网络的每一层间,每轮训练时分布都是不一致,那么相对的训练效果就得不到保障,所以称为层间的covariate shift。
能不能让每个隐层节点的激活输入分布固定下来呢?想解决ICS问题,我们就想使输入分布满足独立同分布。这时会用到白化的方法,缺点是过于复杂,计算成本高。而之前所说的归一化就是一种简化的白化方法。
BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布。
Batch normalization 的 batch 是批数据, 把数据分成小批小批进行随机梯度下降 ,而且在每批数据进行前向传递 的时候, 对每一层都进行 normalization的处理,。在全连接层和激励曾之间加入BN层。
在神经网络中, 数据分布对训练会产生影响. 比如某个神经元 x 的值为1, 某个 Weights 的初始值为 0.1, 这样后一层神经元计算结果就是 Wx = 0.1; 又或者 x = 20, 这样 Wx 的结果就为 2。现在还不能看出什么问题, 但是, 当我们加上一层激励函数, 激活这个 Wx 值的时候, 问题就来了. 如果使用 像 tanh 的激励函数, Wx 的激活值就变成了 ~0.1 和 ~1, 接近于 1 的部已经处在了 激励函数的饱和阶段, 也就是 x 无论再怎么扩大, tanh 激励函数输出值也还是接近1。
我们为了避免这种情况,就会对数据进行归一化,对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。
经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
如果使用标准化,那就相当于把非线性激活函数替换成线性函数了。如果是多层的线性函数变换其实这个深层是没有意义的,因为多层线性网络跟一层线性网络是等价的。这意味着网络的表达能力下降了,这也意味着深度的意义就没有了。
所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),让神经网络自己去学着使用和修改这个扩展参数 scale, 和 平移参数shift, 这样神经网络就能自己慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用, 如果没有起到作用, 我就使用 scale和 shif来抵消一些 normalization 的操作。通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。
核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
用了BN之后,数据分布会集中在0-1之间,这一区间激活函数曲线比较线性(导数接近1),这样就不能很好的利用激活函数的非线性化性质了。
所以加γ和β就是要在一定程度下抵消BN带来的线性化。
normalization后,目的是把值往后续要进行的非线性变换的线性区拉动,增大导数值,增强反向传播信息流动性,加快训练收敛速度。但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如下的scale和shift操作,这其实是变换的反操作。
normalization是一种处理数据的方法。
因为ICS现象的存在导致训练的困难,我们对每一层都进行BN来解决这个现象。
而BN使得数据集中分布在了激活函数的线性部分,需要再用一个反操作来在一定程度下抵消这个线性化。
BN的优点:
①极大提升了训练速度,收敛过程大大加快;
②增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;
③简化调参过程,对于初始化要求不高,可以使用大的学习率。
主要参考:
https://blog.csdn.net/sinat_33741547/article/details/87158830
https://www.cnblogs.com/guoyaohua/p/8724433.html
https://zhuanlan.zhihu.com/p/24810318
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。