数据预处理方法详解

总结。。。

归一化

一般分为两种:

  1. 最值归一化。把最大值归为1,最小值归为0/-1,其他值在其中分布
  2. 均值方差归一化,一般把均值归一化为0,方差归一化1

为什么要做归一化:

  1. 归一化后求优过程范围变小,寻优过程变得平缓,更容易正确收敛到最优解

白化

经过白化处理后的数据有如下两个特征

  1. 特征之间相关性较低
  2. 所有特征具有相同的方差

白化算法的第一步是去除特征之间的相关性,即PCA【关于PCA在机器学习部分的矩阵分解会讲到】,第二步是对新的坐标进行方差归一化操作,即每一维度的特征均值为0,标准差为1【这里比如有m个样本,每个样本有n个特征,那么对于第i个特征,其均值就是m个样本的平均值,方差就是m个样本的方差】
白化分为PCA白化和ZCA白化,上面提到的是PCA白化,PCA白化相当于对数据进行去相关,也就是维度会降低,ZCA白化是在PCA白化的基础上做了一个处理,使数据尽可能接近原始输入数据,即当使用ZCA白化时,通常保留数据的全部n个维度,不尝试去降低它的维度

具体的:
PCA白化

  1. 矩阵分解,求其协方差矩阵,得到特征值,求得矩阵U【即对特征维度进行降维,去除相关性】,进行如下处理:【通俗的理解就是:比如原先一个样本有n个特征,但是现在就只有m个特征了,因为n-m个特征要么不重要,要么和m个特征中的某个相关性比较大】
  2. 归一化归一化就是将数据减去均值,除以标准差,因为矩阵分解后对应的对角矩阵就是协方差矩阵,那么对应的值就是方差,均值在PCA最前面就处理过了,所以这里只需要除以标准差即可【关于对角矩阵中的元素对应着方差这里懒得再深入了】

ZCA白化
就是将PCA白化还原

不知道这个怎么变的

BN原理

机器学习领域有一个很重要的假设:假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集下获得好的效果的一个基本保障
BN是基于Mini-Batch SGD(Mini-Batch SGD梯度更新方向更准确,并行计算速度快,但SGD参数调试比较麻烦,BN可以解决)
covariate shift问题:训练集中X的分布对于每批而言都在变化,这样模型就得学习迎合这种分布的变化,在深度学习中,因为各层的参数总是在变化,每个隐藏层都会面临covariate shift的问题。

上面讲到了白化,BN就是对白化进行了优化,上面白化要先去除相关性,也就是要进行矩阵分解,其过程是相当耗时的,BN忽略了该过程,直接对样本进行预处理,第二个改进是在归一化后加入可学习的参数,具体的如下做法,对于神经网络中的第 l 层,我们有:

关于BN在训练和测试上的不同
由于在优化网络的时候,我们一般采用的是batch梯度下降。所以在训练过程中,只能计算当前batch样本上的mean和var。但是我们做的normalization是对于整个输入样本空间,因此需要对每个batch的mean, var做指数加权平均来将batch上的mean和var近似成整个样本空间上的mean和var.而在测试Inference过程中,一般不必要也不合适去计算测试时的batch的mean和var,比如测试仅对单样本输入进行测试时,这时去计算单样本输入的mean和var是完全没有意义的。因此会直接拿训练过程中对整个样本空间估算的mean和var直接来用。此时对于inference来说,BN就是一个线性变换。参考4

关于BN的计算:参考5中提到使用移动平均的方式更新batch mean和variance,训练完毕后,得到一个相对稳定的mean和variance

BN带来的效果
深度网络之所以收敛慢,原因是整体的分布逐渐往非线性函数的饱和区间靠近,导致反向传播时低层神经网络出现梯度消失的问题。BN通过规范化后,将每层神经网络的输入值分布拉回到均值为0,方差为1的标准正太分布,是输入到激活函数的值落在激活函数对输入比较敏感的区域,比如sigmoid函数,对其输入进行归一化后,就将输入落到线性区域,这样梯度值就比较大,避免了梯度消失的问题。
关于BN层在神经网络中的位置,如下图:
ml0701
具体BN在梯度传播的过程(解释了为什么可以解决梯度消失和爆炸的问题):

那么反向求导时便有了:

可以看到此时反向传播乘以的数不再和 w 的尺度相关,也就是说尽管我们在更新过程中改变了 w 的值,但是反向传播的梯度却不受影响。更进一步:

即尺度较大的 w 将获得一个较小的梯度,在同等的学习速率下其获得的更新更少,这样使得整体 w 的更新更加稳健起来。

总结起来就是BN解决了反向传播过程中的梯度问题(梯度消失和爆炸),同时使得不同scale的 w 整体更新步调更一致。[摘抄自参考7]

BN和ReLU的结合:
BN将数据分布到非线性函数的线性区域,一来对于非线性函数的线性区不存在梯度消失的问题,二来归一化后在反向求导的过程中会对W的一个归一,就不会出现因为W的变化导致的梯度消失和梯度爆炸问题了
但是我们知道当与ReLU结合的时候,因为BN将数据分布到均值为0的结果,也就是存在很多为负数的情况,那放到ReLU后,输入岂不是有很多0???
我的理解是一般BN后接tanh是不是会更好???

BN的优点:

  • 加速网络收敛速度[归一化后,会让梯度的方向直行最小值,对于sigmoid和tanh而言,将数据分布归一到线性区域,避免梯度消失]
  • 提升训练稳定性 [模型不用去适应数据分布不同的影响]

降维

PCA算法原理
输入:n维空间的样本集合其中;映射到k维空间

  1. 归一化,将X中样本变换为标准正态分布
  2. 计算协方差矩阵
  3. 对协方差矩阵 进行特征分解
  4. 求取最大的k个特征值以及对应的特征向量,依次记录为

输出::其中

PCA降维的意义:

  1. 数据在低维下更容易进行处理与使用,算法的开销将大大减少
  2. 重要特征通过降维在数据中显现出来
  3. 去除数据噪声,当数据受到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关。

LDA降维原理
LDA是一种监督学习的降维技术,即其每一个样本都是有类别输出的。用一句话概括:投影后类内方差最小,类间方差最大。意识就是说将数据在低维度上进行投影后,希望每一种类别数据的投影点尽可能的接近,而不同类别的数据中心之间的距离尽可能的大。
其原理看着有点难,先放着
流程如下:
输入:数据集D={(x1,y1),(x2,y2),…,((xm,ym))},其中任意样本xi为n维向量,yi∈{C1,C2,…,Ck},降维到的维度d。
输出:降维后的样本集
1) 计算类内散度矩阵
2) 计算类间散度矩阵
3) 计算矩阵
4)计算的最大的d个特征值和对应的d个特征向量,得到投影矩阵
5) 对样本集中的每一个样本特征,转化为新的样本
6) 得到输出样本集

具体参考3

n问

  1. knn如何处理高维特征
  2. svm如何处理高维特征
    svm不存在维度灾难,具体理论证明忘记了,没答上来。knn和kmeans维度过高出现距离收敛,证明也没答上来,,解决方案是降维、换距离度量。处理异常值问题可以做异常值检测,用各种优化后的kmeans。
  3. 解释维度灾难,如何解决
  4. kmeans如何处理高维特征,kmeans如何处理异常定

    参考

    1.白化
    2.BN原理与实践
    3.线性判别分析LDA原理总结
    4.BN在训练和测试使用的均值和方差计算方式不同
    5.BN是怎么计算的?
    6.BN导读
    7.深度学习中Batch Normalization为什么效果好?
    8.ReLU函数进行Batch Normalization意义分析
    9.
如果觉得有帮助,给我打赏吧!