归一化
归一化
小游归一化
参考文章
Batch normalization 和 Layer normalization的区别_白化whitening-CSDN博客
归一化了解
归一化的定义
归一化是一种常见的数据预处理技术,用于将数据转换为统一的比例范围,以消除不同变量之间的量纲差异。通过归一化,可以将数据映射到一个特定的范围,例如[0, 1]或[-1, 1],使得不同特征或属性具有相似的数值范围。
归一化的目的
1.消除量纲差异
不同的特征往往具有不同的量纲,例如身高和体重,身高的单位是厘米,体重的单位是千克,它们的数值范围也相差较大。如果不进行归一化处理,这些量纲差异可能会影响到某些数据分析和模型算法的结果。
2.避免权重不平衡
在某些机器学习算法中,例如基于距离的算法(如K-means聚类、K近邻算法等),特征之间的数值范围差异较大可能导致某些特征对算法的影响更大。通过归一化处理,可以使得各个特征在计算距离或相似度时起到相同的作用,避免权重不平衡的问题。
3.提高模型收敛速度
某些机器学习算法,如神经网络、支持向量机等,对输入数据的数值范围敏感。如果输入数据的数值范围相差较大,可能导致模型训练过程收敛速度较慢。通过归一化处理,可以加快模型的收敛速度,提高训练效率。
我们举个例子直观感受一下~
1.譬如,下面为具有两个特征的样本数据x1、x2、x3、x4、x5、x6(特征向量—>列向量),其中x6这个样本的两个特征相对其他样本而言相差比较大,因此,x6认为是奇异样本数据。
x1=房价(元),x2=面积(m^2)
未归一
归一化之后
将特征凸显
归一化的几种方法
- 最小-最大归一化(Min-Max Scaling)
将数据线性地映射到一个特定的范围(通常是[0, 1]或[-1, 1])
- 标准化(Standardization)(z-score)
将数据转换为均值为0,标准差为1的正态分布(也称为标准正态分布)(高斯分布)
第一个公式是求均值;第二个是求方差;第三个是均值为0 方差为1的数据,其中E是一个极小数,防止分母为0;第四个中的γ和β是两个学习参数,这样数据的分布更利于我们深度学习
什么时候用归一化
- 如果对输出结果范围有要求,用归一化。
- 如果数据较为稳定,不存在极端的最大最小值,用归一化。
- 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。
归一化方法解析
Batch normalization和Layer normalization,顾名思义其实也就是对数据做归一化处理——也就是对数据以某个角度或者层面做0均值1方差的处理。
白化(whitening)
在机器学习和深度学习中,有一个共识:独立同分布的数据可以简化模型的训练以及提升模型的预测能力——这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
也就是说我们在使用机器学习和深度学习的时候,会把数据尽可能的做一个独立同分布的处理,用来加快模型的训练速度和提升模型的性能。说到这里就不得不提一下——白化whitening
。
什么是白化呢?就是对数据进行如下的2个操作:
- 去除数据之间的关联性,使之满足独立这个条件;
- 使得特征具有相同的均值和方差,就是同分布。
以上就是白化,具体的算法有PCA降维白化。
内部变量偏移(Internal Covariate Shift)
深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化。另一方面,深度神经网络一般都是很多层的叠加,每一层的参数更新都会导致上层的输入数据在输出时分布规律发生了变化,并且这个差异会随着网络深度增大而增大——这就是Internal Covariate Shift
。
Internal Covariate Shift会导致的问题:
- 每个神经元的输入数据不再是独立同分布的了,
- 上层参数需要不断适应新的输入数据分布,降低学习速度
- 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区。反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因——梯度消失。
BN的工作原理
BN把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布。这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
对于为何BN能起作用这个问题,有不同的观点。有人认为BN能够减少ICS问题,但是有人发布论文说并没有直接的证据表明BN能够稳定数据分布的稳定性,同时也不能减少ICS。作者认为起作用的原因是由于:An empirical analysis of the optimization of deep network loss surfaces
- BN层让损失函数更平滑
- BN更有利于梯度下降,使得梯度不会出现过大或者过小的梯度值
BN和LN的不同
- 从原理操作上来讲,BN针对的是同一个batch内的所有数据,而LN则是针对单个样本。
- 从特征维度来说,BN是对同一batch内的数据的同一纬度做归一化,因此有多少维度就有多少个均值和方差;而LN则是对单个样本的所有维度来做归一化,因此一个batch中就有batch_size个均值和方差。
batch是每次训练时用于前向传播和反向传播的一组训练样本
简单介绍BN、LN、IN、GN
在输入层面:
4表示4张图片,3表示3个通道,240表示图片大小。
BN
:分三次进行归一化(三个通道),每次是对4张图片的某个通道层 共同进行一个归一化。就是每次对4x240x240进行求均值求方差
LN
:四张图片就分四次归一化,每一次就是一整张图片3x240x240进行归一化,但是不一定是3,提取特征之后就不一定是3了
IN
:每张图片,每个通道层分别去归一
GN
:对通道层进行分组,然后进行nx240x240的归一化
从图形分布上:
下图是我们常见的一个激活函数,我们做归一化的主要目的是让数据集中在[-1,1]之间,如果数据分布过开就会发生左下角图片的情况,求出的值都太接近于0了,数字的变化小了,斜率小了,这就是梯度消失。
BN和LN的优点和不足
BN
的优点:加快神经网络的训练时间。BN强行拉平了数据分布,它可以让收敛速度更快。使得总的训练时间更短。
容忍更高的学习率(learning rate)和初始化权重更容易。对于深层网络来说,权重的初始化要求是很高的,而BN能够动态的调整数据分布,因此初始化的要求就不像以前那么严格了。
可以支持更多的损失函数。有些损失函数在一定的业务场景下表现的很差,就是因为输入落入了激活函数的死亡区域——饱和区域。而BN的本质作用就是可以重新拉正数据分布,避免输入落入饱和区域,从而减缓梯度消失的问题。
提供了一点正则化的作用,可能使得结果更好。BN在一定的程度上起到了dropout的作用,因此在适用BN的网络中可以不用dropout来实现。
BN
的缺点:- BN对于batch_size的大小还是比较敏感的,batch_size很小的时候,其梯度不够稳定,效果反而不好。
- BN对于序列网络,RNN、lstm等模型的效果并不好
LN
在继承了BN
的优点上,还有另外2个优点:
LN
能够很好的应用在RNN
、lstm
等类似的网络上。LN
是针对一层网络所有的神经元做数据归一化,因此对batch_size的大小并不敏感。
Bert、Transformer中为何使用的是LN而很少使用BN
第一个解释
我们先把这个问题转化一下,因为Bert和Transformer基本都是应用到了NLP任务上。所以可以这样问:
为何CV数据任务上很少用LN,用BN的比较多,而NLP上应用LN是比较多的?
我们用文本数据句话来说明BN和LN的操作区别。
我是中国人我爱中国
武汉抗疫非常成功0
大家好才是真的好0
人工智能很火000
上面的4条文本数据组成了一个batch的数据,那么BN的操作的时候
就会把4条文本相同位置的字来做归一化处理,例如:我、武、大、人
我认为这里就破坏了一句话内在语义的联系。
而LN则是针对每一句话做归一化处理。例如:我是中国人我爱中国——归一化处理后,一句话内每个字之间的联系并没有破坏。从这个角度看,LN就比较适合NLP任务,也就是bert和Transformer用的比较多。
第二个解释
- layer normalization 有助于得到一个球体空间中符合0均值1方差高斯分布的 embedding, batch normalization不具备这个功能。
- layer normalization可以对transformer学习过程中由于多词条embedding累加可能带来的“尺度”问题施加约束,相当于对表达每个词一词多义的空间施加了约束,有效降低模型方差。batch normalization也不具备这个功能。
NLP和CV的任务差别:
图像数据是自然界客观存在的,像素的组织形式已经包含了“信息”
NLP数据则是由embedding开始的,这个embedding并不是客观存在的,它是由我们设计的网络学习出来的。
通过layer normalization得到的embedding是 以坐标原点为中心,1为标准差,越往外越稀疏的球体空间中。这个正是我们理想的数据分布。
另外一词多义的表示中——简单来说,每个词有一片相对独立的小空间,通过在这个小空间中产生一个小的偏移来达到表示一词多义的效果。transformer每一层都做了这件事,也就是在不断调整每个词在空间中的位置。这个调整就可以由layer normalization 来实现,batch normalization是做不到的。