归一化和标准化
归一化和标准化
最小最大归一化(减最小值,除最大最小的差值)和均值方差归一化(减均值,除方差)
作用
1)统一量纲,加快模型收敛速度,(不做归一化,梯度下降时,各数据对模型的贡献不一致,导致模型不稳定,收敛性不好,错过最优解)
2)提高模型精度
归一化
一般用于线性模型
适用范围:对输出结果范围有要求的,数据较为稳定,不存在极端的最大最小值
缺点:当有新数据加入时,可能导致max和min的变化,需要重新定义。
另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景
标准化
存在异常值和较多噪音,用标准化。
Batch Normalization
原理
参数根据梯度下降在不断变化,每经过一个网络层数据的分布都会发生不同的改变。我们将这种由于网络参数更新造成的数据分布变化称为Internal Covariate Shift。Internal Covariate Shift会导致输入数据分布向某一个方向偏移,从而造成网络数据训练缓慢。以sigmoid为例,sigmoid函数的导数在输入为0时变化大,梯度下降最快,假如分布偏移到6以上,则大部分数据落入饱和区,梯度下降会非常缓慢。解决在训练中,中间层数据分布发生改变的情况,于是就有了Batch Normalization
步骤
1)计算均值和方差;2)进行标准化;3)进行scale和shift
需要学习参数γ,β:找到一个线性和非线性的平衡点,既能享受非线性较强的表达能力,有可以避免非线性饱和导致网络收敛变慢问题。如果不加,分布一直都是正太分布,学不到东西。
描述过程就是:在batch上进行标准化,即将batch上的所有图片的通道R作为1组,进行标准化;将batch上的所有图片的通道G作为1组,进行标准化
训练与测试时的区别
训练时均值和方差为计算所得,γ,β进行学习
测试时,γ,β为学习到的,均值方差为训练过程中的平均值,或者指数加权移动平均值,pytorch默认用的指数加权移动平均
优点
1)对模型初始化和超参不敏感,减少超参数调整,允许使用更大的学习率。
2)可以加快模型收敛速度
因为神经网络本质上是学习数据的分布情况,而mini-batch每次都会有不同的分布,也就是说,每次训练的数据都有不同的分布,数据抖动很大,所以权重变化也会很大。而batch norm会将数据归一化,减少不同batch间数据的抖动情况,从而提高训练速度
3)提高模型泛化能力,抑制模型过拟合,起到正则化的作用,类似dropout的功能。
dropout在训练阶段引入随机性,防止过度匹配;在测试阶段去除掉这种随机性, 从而获得确定而准确的结果。BN也是一样,训练阶段的随机性为随机batch的方差均值,在测试阶段通过求期望等方式在全局去除掉这种随机性获得准确的结果。
与L1、L2正则化方法概念有区别
4)避免深层网络的梯度消失或爆炸问题
BN通过固定网络层输入的均值和方差,即使网络较深层的响应或梯度过小或过大时,也可通过BN的规范化作用将其缩放到一个比较合理的取值范围,从而避免梯度消失或爆炸问题
5)允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
缺点
1)不适合小batch;
2)有可能训练的结果跟测试的不一样
3)对于在线学习可能有影响,因为在线学习改变数据分布太大
4)不是适合所有任务,盲目使用可能效果并不好
注意
使用BN的过程中,作者发现Sigmoid激活函数比Relu效果要好
对于sigmoid函数而言,拉回到非饱和区域。
对于relu函数而言,gamma作用不大,beta很重要,否则0均值1方差会导致一半的数值在负半轴失活
BN与Dropout影响
BN或Dropout单独使用能加速训练速度并且避免过拟合,但是倘若一起使用,会产生负面效果。BN在某些情况下会削弱Dropout的效果
BN与Dropout最好不要一起用,若一定要一起用,有2方法:
1 在所有BN层后使用Dropout
2 修改Dropout公式(如使用高斯Dropout)使得它对方差不是那么敏感
总体思路是降低方差偏移
Dropout 与BN之间冲突的关键是网络状态切换过程中存在神经方差的(neural variance)不一致行为。
各种标准化区别
标准化层,目前主要有这几个方法
1)Batch Normalization(2015年)
2)Layer Normalization(2016年)
3)Instance Normalization(2017年)
4)Group Normalization(2018年)
5)Switchable Normalization(2018年);
将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,
batchNorm:是在batch上,计算N x HW均值方差,对小batchsize效果不好,相当于把一个batch里所有图片的R、G、B分别计算均值方差,分别对RGB标准化;
layerNorm:在通道方向上,计算C x HW均值方差,主要对RNN作用明显,在CNN上,不如BN,相当于对单张图片把R、G、B合在一起计算均值方差,进行标准化;
instanceNorm:在图像像素上,计算HW均值方差,用在风格化迁移,单个图片单个通道进行标准化;
GroupNorm:将channel分组g,计算C/g x HW均值方差然后再做标准化;
SwitchableNorm:是将BN、LN、IN结合,赋予权重,让网络自己去学习标准化层应该使用什么方法。