从下面两个问题解释一下
一、目的
1. 提升模型的收敛速度
如果选择不归一化,对于数量级相差比较大的数据,绘制的图就类似于椭圆,梯度下降运算会很慢。
选择归一化,对于数量级相差比较大的数据,绘制的图就类似圆形,梯度下降速度很快,少走很多弯路。
具体说下是如何影响速度的呢?
如下图,
θ
1
{θ_1}
θ1的取值范围为[0,2000],而
θ
2
{θ_2}
θ2的取值范围为[1,5],假如只有这两个特征,对其进行优化时,会得到一个窄长的椭圆形,导致在梯度下降时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢,相比之下,右图的迭代就会很快(理解:也就是步长走多走少方向总是对的,不会走偏)
2、提高训练精度
归一化的另一好处是提高精度,这在涉及到一些距离计算的算法时效果显著,比如算法要计算欧氏距离,上图中 θ 2 {θ_2} θ2的取值范围比较小,涉及到距离计算时其对结果的影响远比 θ 1 {θ_1} θ1带来的小,所以这就会造成精度的损失。所以归一化很有必要,他可以让各个特征对结果做出的贡献相同。
3、深度学习中,可以预防梯度爆炸
二、为什么树形结构不需要归一化呢?
因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。
按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。
树模型是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化。
既然树形结构(如决策树、RF)不需要归一化,那为何非树形结构比如Adaboost、SVM、LR、Knn、KMeans之类则需要归一化呢?
对于线性模型,特征值差别很大时,比如说LR,我有两个特征,一个是(0,1)的,一个是(0,10000)的,运用梯度下降的时候,损失等高线是椭圆形,需要进行多次迭代才能到达最优点。
但是如果进行了归一化,那么等高线就是圆形的,促使SGD往原点迭代,从而导致需要的迭代次数较少。