[TOC]html
博客:blog.shinelee.me | 博客园 | CSDNgit
Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术,有时甚至决定了算法能不能work以及work得好很差。谈到feature scaling的必要性,最经常使用的2个例子多是:github
特征间的单位(尺度)可能不一样,好比身高和体重,好比摄氏度和华氏度,好比房屋面积和房间数,一个特征的变化范围多是$[1000, 10000]\(,另外一个特征的变化范围多是\)[-0.1, 0.2]$,在进行距离有关的计算时,单位的不一样会致使计算结果的不一样,尺度大的特征会起决定性做用,而尺度小的特征其做用可能会被忽略,为了消除特征间单位和尺度差别的影响,以对每维特征同等看待,须要对特征进行归一化。算法
原始特征下,因尺度差别,其损失函数的等高线图多是椭圆形,梯度方向垂直于等高线,降低会走zigzag路线,而不是指向local minimum。经过对特征进行zero-mean and unit-variance变换后,其损失函数的等高线图更接近圆形,梯度降低的方向震荡更小,收敛更快,以下图所示,图片来自Andrew Ng。网络
对于feature scaling中最常使用的Standardization,彷佛“无脑上”就好了,本文想多探究一些为何,session
根据查阅到的资料,本文将尝试回答上面的问题。但笔者能力有限,空有困惑,能讲到哪算哪吧(微笑)。机器学习
在问为何前,先看是什么。ide
给定数据集,令特征向量为$x$,维数为$D$,样本数量为$R$,可构成$D \times R$的矩阵,一列为一个样本,一行为一维特征,以下图所示,图片来自Hung-yi Lee pdf-Gradient Descent:函数
feature scaling的方法能够分红2类,逐行进行和逐列进行。逐行是对每一维特征操做,逐列是对每一个样本操做,上图为逐行操做中特征标准化的示例。学习
具体地,经常使用feature scaling方法以下,来自wiki,
Rescaling (min-max normalization、range scaling):
将每一维特征线性映射到目标范围$[a, b]$,即将最小值映射为$a$,最大值映射为$b$,经常使用目标范围为$[0, 1]\(和\)[-1, 1]\(,特别地,映射到\)[0, 1]$计算方式为:
Mean normalization:
将均值映射为0,同时用最大值最小值的差对特征进行归一化,一种更常见的作法是用标准差进行归一化,以下。
Standardization (Z-score Normalization):
每维特征0均值1方差(zero-mean and unit-variance)。
Scaling to unit length:
将每一个样本的特征向量除以其长度,即对样本特征向量的长度进行归一化,长度的度量常使用的是L2 norm(欧氏距离),有时也会采用L1 norm,不一样度量方式的一种对比能够参见论文“CVPR2005-Histograms of Oriented Gradients for Human Detection”。
上述4种feature scaling方式,前3种为逐行操做,最后1种为逐列操做。
容易让人困惑的一点是指代混淆,Standardization指代比较清晰,可是单说Normalization有时会指代min-max normalization,有时会指代Standardization,有时会指代Scaling to unit length。
前3种feature scaling的计算方式为减一个统计量再除以一个统计量,最后1种为除以向量自身的长度。
稀疏数据、outliers相关的更多数据预处理内容能够参见scikit learn-5.3. Preprocessing data。
从几何上观察上述方法的做用,图片来自CS231n-Neural Networks Part 2: Setting up the Data and the Loss,zero-mean将数据集平移到原点,unit-variance使每维特征上的跨度至关,图中能够明显看出两维特征间存在线性相关性,Standardization操做并无消除这种相关性。
可经过PCA方法移除线性相关性(decorrelation),即引入旋转,找到新的坐标轴方向,在新坐标轴方向上用“标准差”进行缩放,以下图所示,图片来自连接,图中同时描述了unit length的做用——将全部样本映射到单位球上。
当特征维数更多时,对好比下,图片来自youtube,
总的来讲,归一化/标准化的目的是为了得到某种“无关性”——偏置无关、尺度无关、长度无关……当归一化/标准化方法背后的物理意义和几何含义与当前问题的须要相契合时,其对解决该问题就有正向做用,反之,就会起副作用。因此,“什么时候选择何种方法”取决于待解决的问题,即problem-dependent。
下图来自data school-Comparing supervised learning algorithms,对比了几个监督学习算法,最右侧两列为是否须要feature scaling。
下面具体分析一下。
涉及或隐含距离计算的算法,好比K-means、KNN、PCA、SVM等,通常须要feature scaling,由于
zero-mean通常能够增长样本间余弦距离或者内积结果的差别,区分力更强,假设数据集集中分布在第一象限遥远的右上角,将其平移到原点处,能够想象样本间余弦距离的差别被放大了。在模版匹配中,zero-mean能够明显提升响应结果的区分度。
就欧式距离而言,增大某个特征的尺度,至关于增长了其在距离计算中的权重,若是有明确的先验知识代表某个特征很重要,那么适当增长其权重可能有正向效果,但若是没有这样的先验,或者目的就是想知道哪些特征更重要,那么就须要先feature scaling,对各维特征等而视之。
增大尺度的同时也增大了该特征维度上的方差,PCA算法倾向于关注方差较大的特征所在的坐标轴方向,其余特征可能会被忽视,所以,在PCA前作Standardization效果可能更好,以下图所示,图片来自scikit learn-Importance of Feature Scaling,
损失函数中含有正则项时,通常须要feature scaling:对于线性模型$y=wx+b$而言,$x$的任何线性变换(平移、放缩),均可以被$w$和$b$“吸取”掉,理论上,不会影响模型的拟合能力。可是,若是损失函数中含有正则项,如$\lambda ||w||^2$,$\lambda$为超参数,其对$w$的每个参数施加一样的惩罚,但对于某一维特征$x_i$而言,其scale越大,系数$w_i$越小,其在正则项中的比重就会变小,至关于对$w_i$惩罚变小,即损失函数会相对忽视那些scale增大的特征,这并不合理,因此须要feature scaling,使损失函数平等看待每一维特征。
梯度降低算法,须要feature scaling。梯度降低的参数更新公式以下,
$E(W)\(为损失函数,**收敛速度取决于:参数的初始位置到local minima的距离,以及学习率\)\eta$的大小**。一维状况下,在local minima附近,不一样学习率对梯度降低的影响以下图所示,
多维状况下能够分解成多个上图,每一个维度上分别降低,参数$W$为向量,但学习率只有1个,即全部参数维度共用同一个学习率(暂不考虑为每一个维度都分配单独学习率的算法)。**收敛意味着在每一个参数维度上都取得极小值,每一个参数维度上的偏导数都为0,可是每一个参数维度上的降低速度是不一样的,为了每一个维度上都能收敛,学习率应取全部维度在当前位置合适步长中最小的那个。**下面讨论feature scaling对gradient descent的做用,
zero center与参数初始化相配合,缩短初始参数位置与local minimum间的距离,加快收敛。模型的最终参数是未知的,因此通常随机初始化,好比从0均值的均匀分布或高斯分布中采样获得,对线性模型而言,其分界面初始位置大体在原点附近,bias常常初始化为0,则分界面直接经过原点。同时,为了收敛,学习率不会很大。而每一个数据集的特征分布是不同的,若是其分布集中且距离原点较远,好比位于第一象限遥远的右上角,分界面可能须要花费不少步骤才能“爬到”数据集所在的位置。因此,不管什么数据集,先平移到原点,再配合参数初始化,能够保证分界面必定会穿过数据集。此外,outliers常分布在数据集的外围,与分界面从外部向内挪动相比,从中心区域开始挪动可能受outliers的影响更小。
对于采用均方偏差损失LMS的线性模型,损失函数恰为二阶,以下图所示
不一样方向上的降低速度变化不一样(二阶导不一样,曲率不一样),恰由输入的协方差矩阵决定,feature scaling改变了损失函数的形状,减少不一样方向上的曲率差别。将每一个维度上的降低分解来看,给定一个降低步长,若是不够小,有的维度降低的多,有的降低的少,有的还可能在上升,损失函数的总体表现多是上升也多是降低,就会不稳定。scaling后不一样方向上的曲率相对更接近,更容易选择到合适的学习率,使降低过程相对更稳定。
另有从Hessian矩阵特征值以及condition number角度的理解,详见Lecun paper-Efficient BackProp中的Convergence of Gradient Descent一节,有清晰的数学描述,同时还介绍了白化的做用——解除特征间的线性相关性,使每一个维度上的梯度降低可独立看待。
文章开篇的椭圆形和圆形等高线图,仅在采用均方偏差的线性模型上适用,其余损失函数或更复杂的模型,如深度神经网络,损失函数的error surface可能很复杂,并不能简单地用椭圆和圆来刻画,因此用它来解释feature scaling对全部损失函数的梯度降低的做用,彷佛过于简化,见Hinton vedio-3.2 The error surface for a linear neuron。
对于损失函数不是均方偏差的状况,只要权重$w$与输入特征$x$间是相乘关系,损失函数对$w$的偏导必然含有因子$x$,$w$的梯度降低速度就会受到特征$x$尺度的影响。理论上为每一个参数都设置上自适应的学习率,能够吸取掉$x$尺度的影响,但在实践中出于计算量的考虑,每每仍是全部参数共用一个学习率,此时$x$尺度不一样可能会致使不一样方向上的降低速度悬殊较大,学习率不容易选择,降低过程也可能不稳定,经过scaling可对不一样方向上的降低速度有所控制,使降低过程相对更稳定。
对于传统的神经网络,对输入作feature scaling也很重要,由于采用sigmoid等有饱和区的激活函数,若是输入分布范围很广,参数初始化时没有适配好,很容易直接陷入饱和区,致使梯度消失,因此,须要对输入作Standardization或映射到$[0,1]\(、\)[-1,1]$,配合精心设计的参数初始化方法,对值域进行控制。但自从有了Batch Normalization,每次线性变换改变特征分布后,都会从新进行Normalization,彷佛能够不太须要对网络的输入进行feature scaling了?但习惯上仍是会作feature scaling。
这篇文章写的十分艰难,一开始觉得蛮简单直接,但随着探索的深刻,冒出的问号愈来愈多,打破了不少原来的“理所固然”,因此,在写的过程当中不停地作加法,不少地方想解释得尽可能直观,又不想照搬太多公式,但本身的理解又不够深入,致使如今叙述这么冗长,但愿之后在写文时能更专一更精炼。
Sigh。。。