归一化和标准化
1.总结:
作用:
- 归一化后加快了梯度下降求最优解的速度;
- 归一化有可能提高精度。
- 防止梯度消失或爆炸
常见:
- 最值归一化。比如把最大值归一化成1,最小值归一化成-1;或把最大值归一化成1,最小值归一化成0。适用于本来就分布在有限范围内的数据。
- 均值方差归一化,一般是把均值归一化成0,方差归一化成1。适用于分布没有明显边界的情况,受outlier影响也较小。
举例:
- BatchNorm2d最常用于卷积网络中(防止梯度消失或爆炸),设置的参数就是卷积的输出通道数:
-
Batch Normalization对每个batch中同一维特征做normalization。
self.conv=nn.Sequential(
nn.Conv2d(in_channel, out_channel, kernel_size, stride,padding, bias=False),
nn.BatchNorm2d(out_channel),
nn.ReLU(inplace=True)
),
几种不同的归一化: https://www.jianshu.com/p/48cb47c670fc
Batch Normalization:对每个batch中同一维特征做normalization。
Layer Normalization:针对单个训练样本的所有维度做normalization,不用保存mini_batch的均值和方差。BN中同一个batch的样本中的不同特征经过处理后分布在不同的区间,而LN则是将同一个样本中的特征处理到同一区间中。比如对于图片提取的三维特征图,经过BN后每层特征图的分布是不相同的,但是经过LN后每层特征图的分布是相同。
Instance Normalization: instance norm和batch norm的区别只有一点不同,那就是BN是作用于一个batch,而IN则是作用于单个样本。也就是说,BN是同一个batch中所有样本的同一层特征图抽出来一起求mean和variance,而IN只是对一个样本中的每一层特征图求mean和variance。这么说的话似乎instance norm只对3D数据有用,也就是只对图像特征有用。(如果是一维特征,那么用了instance norm结果还是自身,因为参与计算的值只有1个
Weight Normalization:不是利用数据特性对数据进行变换,而是利用网络参数W的特性对数据进行变换。
BN、LN和IN都是用输入数据的方差对输入数据进行scale,而WN则是用模型参数W的欧氏范式对输入数据进行scale。
Group Normalization
相当于对每张特征图进行区域划分,对每一部分求mean和variance。
4种normalization方法对比图
解释:
-
加快:
下图椭圆表示目标函数(如损失函数)的等高线(横截面),两个坐标轴代表两个特征。目标函数:
寻找最优解的过程也就是在使得损失函数值最小的theta1,theta2。本质上是使得目标函数的Hessian矩阵的条件数变小,有更好的收敛性质。
未归一化:各维特征的跨度差距很大,目标函数就会是“扁”的。在进行梯度下降的时候,当时用梯度下降法时,大概要垂直等高线走,需要很多次迭代才能收敛,扭来扭去。
归一化之后:目标函数就“圆”了,每一步梯度的方向都基本指向最小值,可以大踏步地前进。(垂直等高线的梯度几乎都指向圆心,即最小值、目标)
eg:
(原损失函数表达式) (归一化之后)
图一两个特征区别相差特别大,横坐标是自变量,纵坐标是因变量,他们数据区间的不同,导致其等高线比较不均匀。比如横坐标是channel=256的特征,纵坐标是目标个数7,便会导致,比如这样,
full batch 的方式虽然是朝着梯度最大的方向下降,但是当损失横截面不是圆形的时,前进的方向并不指向误差最小点,指向了切向方向,如图 。对于球形等高线,梯度方向直接指向最小值处。对于线性神经元,使用 PCA (Principal Component Analysis) 方法去除掉各个成分之间的相关性。
有个特别好的解释,不给转载:https://www.zhihu.com/question/20455227/answer/197897298。摘抄记录了一些。
归一化可能提高精度
有些分类器需要计算样本之间的距离,例如k-means。如果一个特征的值域范围特别大。那么距离计算就主要取决于这个特征,有时会与实际情况相违背。(比如这时实际情况是值域范围小的特征更重要)
归一化和标准化
1.本质:
一维数据的缩放:
- 归一化(normalization):
- 标准化(standardization):
令常数 变形为: (公式1)
就发现事实上就是对向量 按照比例压缩再进行平移 。归一化和标准化的本质就是一种线性变换。
eg:
原始数据: ,其中 , ,
归一化:代入公式1,将 压缩4倍并平移 ,得到 ,最终有
2.线性变化的性质
线性变换有很多良好的性质决定了为什么对数据进行改变后竟然不会造成“失效”,反而还能提高数据的表现如线性变化不改变原始数据的数值排序。
3.归一化与标准化的区别
归一化的缩放是统一到区间(仅由极值决定),而标准化的缩放是更加“弹性”和“动态”的,和整体样本的分布有很大的关系。标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。
归一化:缩放仅仅与最大最小值有关。输出范围在0-1之间
标准化:缩放与每个点有关。通过方差和均值体现出来。输出范围是负无穷到正无穷。
当数据较为集中时, 更小,于是数据在标准化后就会更加分散。如果数据本身分布很广,那么 较大,数据就会被集中到更小的范围内。
使用标准化与归一化的场景
1.归一化:对输出结果范围有要求;数据较为稳定,不存在极端的最大最小值。如;BatchNorm2d、FrozenBatchNorm2d
2.标准化:数据存在异常值和较多噪音,可以间接通过中心化避免异常值和极端值的影响.
这篇博客提到他的经验:1) 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,(Z-score standardization)表现更好。2) 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。。
某知乎答主的回答一般来说,我个人建议优先使用标准化。在对输出有要求时再尝试别的方法,如归一化或者更加复杂的方法.很多方法都可以将输出调整到0-1,如果我们对于数据的分布有假设的话,更加有效方法是使用相对应的概率密度函数来转换。
eg:高斯误差函数记为 ,那么可转化
哪些机器学习书算法不需要归一化
概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、rf。而像 adaboost、svm、lr、KNN、KMeans 之类的最优化问题就需要归一化。
https://www.zhihu.com/question/37129350/answer/70592743
https://www.zhihu.com/question/20455227?sort=created
http://www.mamicode.com/info-detail-2378483.html (有pytorch示例)
https://www.zhihu.com/question/26546711/answer/62085061
https://www.zhihu.com/question/20455227?sort=created