目录
一、概念
1、归一化(Normalization):
2、标准化(Standardization):
3、中心化/零均值化(zero-centered):
二、联系和差异:
三、标准化和归一化的多种方式
三、为什么要归一化/标准化?
四、什么时候用归一化?什么时候用标准化?
4.1 归一化、标准化使用场景
4.2、所有情况都应当Standardization或Normalization么
五、神经网络为什么要进行归一化
5.1 数值问题
5.2 求解需要
(1)将一列数据变化到某个固定区间(范围)中,通常,这个区间是[0, 1] 或者(-1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。
(2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
从公式看: 归一化输出范围在0-1之间
原始数据零均值后,再将每一维的数据除以每一维数据的标准差。将数据变换为均值为0,标准差为1的分布,切记:并非一定是正态的。
从公式看:标准化输出范围是负无穷到正无穷
# python实现
X -= np.mean(X, axis = 0) # zero-center
X /= np.std(X, axis = 0) # normalize
在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。
中心化,也叫零均值处理,就是将每个原始数据减去这些数据的均值。因此 中心化后的数据 平均值为0,对标准差无要求。
归一化和标准化的区别:
归一化和标准化的相同点:
标准化和中心化的区别:
都能实现无量纲:我的理解就是通过某种方法能去掉实际过程中的单位,从而简化计算。
广义的说,标准化和归一化同为对数据的线性变化,所以我们没必要规定死,归一化就是必须到[0,1]之间。
1、归一化的最通用模式Normalization,也称线性归一化:
2、Mean normalization:
3、标准化(Standardization),Z-score规范化,也叫标准差标准化 / 零均值标准化
如前文所说,归一化/标准化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化/标准化的前提。比如有一个很重要的性质:线性变换不会改变原始数据的数值排序。
(1)某些模型求解需要
1)在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。如左图所示,未归一化/标准化时形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。而如右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。
分析假设:
theta1 为房间数量,范围可以是 0~10
theta2 为房间面积,范围可以是 0~1000
数据没有归一化的表达式,可以为:
而数据归一化之后,损失函数的表达式可以表示为:
从归一化的公式中可以看到,变量的前面系数几乎一样,则图像的等高线为类似圆形形状,最优解的寻优过程像上图所示。
同时,从上可以看出,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。
某知乎博主分享了他个人经验:一般来说,我个人建议优先使用标准。对于输出有要求时再尝试别的方法,如归一化或者更加复杂的方法。很多方法都可以将输出范围调整到[0, 1],如果我们对于数据的分布有假设的话,更加有效的方法是使用相对应的概率密度函数来转换。
当原始数据不同维度特征的尺度(量纲)不一致时,需要标准化步骤对数据进行标准化或归一化处理,反之则不需要进行数据标准化。也不是所有的模型都需要做归一的,比如模型算法里面有没关于对距离的衡量,没有关于对变量间标准差的衡量。比如决策树,他采用算法里面没有涉及到任何和距离等有关的,所以在做决策树模型时,通常是不需要将变量做标准化的;另外,概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。
归一化/标准化可以避免一些不必要的数值问题。输入变量的数量级有可能会引起数值问题。因为tansig(tanh)的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig(w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在1.7所在的数量级左右。这时如果输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。
假如你的输入是421,你也许认为,这并不是一个太大的数,但因为有效权值大概会在1/421左右,结果是1左右,例如0.00243,那么,在matlab里输入 421*0.00243 == 0.421*2.43,会发现不相等,这就是一个数值问题。
a、初始化:在初始化时我们希望每个神经元初始化成有效的状态,tansig函数在[-1.7, 1.7]范围内有较好的非线性,所以我们希望函数的输入和神经元的初始化都能在合理的范围内使得每个神经元在初始时是有效的。(如果权值初始化在[-1,1]且输入没有归一化且过大,会使得神经元饱和)
b、梯度:以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2ew(1-a^2)*x的形式(e是误差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入),若果输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了。这时会给梯度的更新带来数值问题。
c、学习率:由b知,梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。 隐层到输出层的权值梯度可以写成 2ea,而输入层到隐层的权值梯度为 2ew(1-a^2)x ,受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。如果使用固定学习率,而数据没归一化,则后果可想而知。
d、搜索轨迹:上面已解释过
另一篇文章:
深入探讨:为什么要做特征归一化/标准化?