归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered),BN,Batch,批归一化,从归一化到批归一化

目录

1.引言:一些基本概念,

 2.为什么要进行归一化?归一化两个的优点

3.为什么要标准化?标准化的好处?

4.归一化和标准化的区别

5.什么时候用归一化?什么时候用标准化?

6. 哪些模型必须归一化/标准化?

7、逻辑回归必须要进行标准化吗?

8. 为什么需要批归一化(BN)?

9. BN的好处

10、BN的原理

11、BN到底解决了什么

Reference:


1.引言:一些基本概念,

首先需要了解下一些基本概念

  1. 归一化:1)把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
  2. 标准化:在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,标准化就是将训练集中某一列数值特征(假设是第i列)的值缩放成均值为0,方差为1的状态。这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。
  3. 中心化:平均值为0,对标准差无要求
  4. 归一化和标准化的区别:归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。
  5. 标准化和中心化的区别:标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。
  6. 无量纲:我的理解就是通过某种方法能去掉实际过程中的单位,从而简化计
  7. Batch Normalization(简称BN):就是对每一批数据进行归一化,我们的归一化操作一般都在数据输入层,对输入的数据进行求均值以及求方差做归一化,但是BN的出现打破了这一个规定,我们可以在网络中任意一层进行归一化处理,但每一层对所有数据都进行归一化处理的计算开销太大,因此就和使用最小批量梯度下降一样,批量归一化中的“批量”其实是采样一小批数据,然后对该批数据在网络各层的输出进行归一化处理 。

 2.为什么要进行归一化?归一化两个的优点

1)不归一化可能导致网络学习速度缓慢,归一化后加快了梯度下降求最优解的速度;如下图(等高线),不归一化,训练梯度会走''之''字形状,归一化后其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛

2)归一化有可能提高精度。一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

方式:

1)线性归一化

x' = \frac{x - \text{min}(x)}{\text{max}(x)-\text{min}(x)}

      这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。

2)标准差标准化

  经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:

  其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

3)非线性归一化

     经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

3.为什么要标准化?标准化的好处?

 数据标准化主要功能就是消除变量间的量纲关系,从而使数据具有可比性,可以举个简单的例子,一个百分制的变量与一个5分值的变量在一起怎么比较?只有通过数据标准化,都把它们标准到同一个标准时才具有可比性,一般标准化采用的是Z标准化,即均值为0,方差为1

好处和优点

1. 标准化也可以看做一种归一化, 所以它具有归一化的优点,即统一了量纲

2. 不改变变量之间的相关系数

例如: Pearson 相关系数还是 Spearman 或 Kendall相关系数还是偏相关系数都不会改变

3. 不改变秩

4.归一化和标准化的区别

归一化:缩放仅仅跟最大、最小值的差别有关。 输出范围在0-1之间

标准化:缩放和每个点都有关系,通过方差(variance)体现出来。与归一化对比,标准化中所有数据点都有贡献(通过均值和标准差造成影响)。输出范围是负无穷到正无穷

5.什么时候用归一化?什么时候用标准化?

1.如果对输出结果范围有要求,用归一化

2.如果数据较为稳定(图像或是视频的数据值处于固定区间),不存在极端的最大最小值,用归一化

3.如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响

6. 哪些模型必须归一化/标准化?

(1)SVM
  不同的模型对特征的分布假设是不一样的。比如SVM 用高斯核的时候,所有维度共用一个方差,这不就假设特征分布是圆的么,输入椭圆的就坑了人家,所以简单的归一化都还不够好,来杯白化才有劲。比如用树的时候就是各个维度各算各的切分点,没所谓。

(2)KNN
  需要度量距离的模型,一般在特征值差距较大时,都会进行归一化/标准化。不然会出现“大数吃小数”。

(3)神经网络
  1)数值问题
  归一化/标准化可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题吧,但其实要引起也并不是那么困难。因为tansig(tanh)的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig( w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。
  假如你的输入是421,你也许认为,这并不是一个太大的数,但因为有效权值大概会在1/421左右,例如0.00243,那么,在matlab里输入 421·0.00243 == 0.421·2.43,会发现不相等,这就是一个数值问题。

       2)求解需要
  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. 学习率:由(2)中,知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。 隐层到输出层的权值梯度可以写成 2ea,而输入层到隐层的权值梯度为 2ew(1-a^2)x ,受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。如果使用固定学习率,而数据没归一化,则后果可想而知。
  d.搜索轨迹:已解释 
(4)PCA

7、逻辑回归必须要进行标准化吗?

(这部分为某大佬的面试经历)

无论你回答必须或者不必须,你都是错的!!!哈哈。

真正的答案是,这取决于我们的逻辑回归是不是用正则。

如果你不用正则,那么,标准化并不是必须的,如果你用正则,那么标准化是必须的。(暗坑3)
为什么呢?
因为不用正则时,我们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,我们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小。而参数值的大小程度或者说大小的级别是与特征的数值范围相关的。举例来说,我们用体重预测身高,体重用kg衡量时,训练出的模型是:
身高 = 体重*x
x就是我们训练出来的参数。
当我们的体重用吨来衡量时,x的值就会扩大为原来的1000倍。
在上面两种情况下,都用L1正则的话,显然对模型的训练影响是不同的。

假如不同的特征的数值范围不一样,有的是0到0.1,有的是100到10000,那么,每个特征对应的参数大小级别也会不一样,在L1正则时,我们是简单将参数的绝对值相加,因为它们的大小级别不一样,就会导致L1最后只会对那些级别比较大的参数有作用,那些小的参数都被忽略了。

如果你回答到这里,面试官应该基本满意了,但是他可能会进一步考察你,如果不用正则,那么标准化对逻辑回归有什么好处吗?

答案是有好处,进行标准化后,我们得出的参数值的大小可以反应出不同特征对样本label的贡献度,方便我们进行特征筛选。如果不做标准化,是不能这样来筛选特征的。

答到这里,有些厉害的面试官可能会继续问,做标准化有什么注意事项吗?

最大的注意事项就是先拆分出test集,不要在整个数据集上做标准化,因为那样会将test集的信息引入到训练集中,这是一个非常容易犯的错误

8. 为什么需要批归一化(BN)?

  1. 中间层数据分布发生改变的情况。输入层的数据,已经归一化,后面网络每一层的输入数据的分布一直在发生变化,
  2. 尤其是在神经网络中,特征经过线性组合后,还要经过激活函数,如果某个特征数量级过大,在经过激活函数时,就会提前进入它的饱和区间,即不管如何增大这个数值,它的激活函数值都在 1 附近,不会有太大变化,这样激活函数就对这个特征不敏感。在神经网络用 SGD 等算法进行优化时,不同量纲的数据会使网络失衡,很不稳定

通过使用BN,每个神经元的激活变得(或多或少)高斯分布,即它通常中等活跃,有时有点活跃,罕见非常活跃。协变量偏移是不满足需要的,因为后面的层必须保持适应分布类型的变化(而不仅仅是新的分布参数,例如高斯分布的新均值和方差值)。

神经网络学习过程本质上就是为了学习数据分布,如果训练数据与测试数据的分布不同,网络的泛化能力就会严重降低。

输入层的数据,已经归一化,后面网络每一层的输入数据的分布一直在发生变化,前面层训练参数的更新将导致后面层输入数据分布的变化,必然会引起后面每一层输入数据分布的改变。而且,网络前面几层微小的改变,后面几层就会逐步把这种改变累积放大。训练过程中网络中间层数据分布的改变称之为:"Internal Covariate Shift"。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。

原理介绍:

BN是一个非常有效的正则化方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提升。BN在用于神经网络某层时,会对每一个mini-batch数据的内部进行标准化处理,使输出规范化到N(0,1)的正太分布减少了内部神经元分布的改变Internal Covariate Shift)。BN论文指出,传统的深度神经网络在训练时,每一层的输入分布都在变化,导致训练变得困难,我们只能使用一个很小的学习率来解决这个问题。而对每一层使用BN之后,我们就可以有效的解决这个问题。

9. BN的好处

  1. 加快训练速度
  2. 可以省去dropout,L1, L2等正则化处理方法
  3. 提高模型训练精度

我们以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过σ(WX+b)σ(WX+b)这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。 
这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。BN在神经网络训练中会有以下一些作用:


 

10、BN的原理

BN可以作为神经网络的一层,放在激活函数(如Relu)之前。BN的算法流程如下图:
在这里插入图片描述

  1. 求每一个小批量训练数据的均值
  2. 求每一个小批量训练数据的方差
  3. 使用求得的均值和方差对该批次的训练数据做归一化,获得0-1分布。其中εεε是为了避免除数为0时所使用的微小正数。
  4. 尺度变换和偏移:将xix_ixi​乘以γγγ调整数值大小,再加上βββ增加偏移后得到yiy_iyi​,这里的γγγ是尺度因子,βββ是平移因子。这一步是BN的精髓,由于归一化后的xix_ixi​基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:γ,βγ,βγ,β。 γγγ和βββ是在训练时网络自己学习得到的

11、BN到底解决了什么

一个标准的归一化步骤就是减均值除方差,那这种归一化操作有什么作用呢?我们观察下图
在这里插入图片描述
在这里插入图片描述
a中左图是没有经过任何处理的输入数据,曲线是sigmoid函数,如果数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。减均值除方差后,数据就被移到中心区域如右图所示,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的(比如ReLU),这可以看做是一种对抗梯度消失的有效手段。对于一层如此,如果对于每一层数据都那么做的话,数据的分布总是在随着变化敏感的区域,相当于不用考虑数据分布变化了,这样训练起来更有效率。

那么为什么要有第4步,不是仅使用减均值除方差操作就能获得目的效果吗?我们思考一个问题,减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?不能,比如数据本身就很不对称(不符合正态分布),或者激活函数未必是对方差为1的数据最好的效果,比如Sigmoid激活函数,在-1~1之间的梯度变化不大,那么非线性变换的作用就不能很好的体现,换言之就是,减均值除方差操作后可能会削弱网络的性能!针对该情况,在前面三步之后加入第4步完成真正的batch normalization。

BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力。BN的极端的情况就是这两个参数等于mini-batch的均值和方差,那么经过batch normalization之后的数据和输入完全一样,当然一般的情况是不同的。

Reference:

https://www.jianshu.com/p/3da70e672c8b为什么要做BN?

https://blog.csdn.net/vict_wang/article/details/88075861【深度学习】批归一化(Batch Normalization)

https://blog.csdn.net/c123_sensing/article/details/82252655

https://www.cnblogs.com/skyfsm/p/8453498.html

https://www.jianshu.com/p/78b6058995ee数据标准化的性质及用处

https://www.jianshu.com/p/4c3081d40ca6?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin机器学习面试之归一化与标准化

https://www.jianshu.com/p/95a8f035c86c归一化 (Normalization)、标准化 (Standardization)和中心化/

http://www.cnblogs.com/LBSer/p/4440590.html为什么一些机器学习模型需要对数据进行归一化?

猜你喜欢

转载自blog.csdn.net/qq_35290785/article/details/89322289