特征缩放(feature scaling)
其中,特征缩放(feature scaling)大致的思路是这样的:梯度下降算法中,在有多个特征的情况下,如果你能确保这些不同的特征都处在一个相近的范围,这样梯度下降法就能更快地收敛。
举个例子来说明:
x1=size(0−2000)feet2x1=size(0−2000)feet2
x2=卧室的数量(1−5)x2=卧室的数量(1−5)
假如你有一个具有两个特征的问题,其中x1x1是房屋面积大小,它的取值在0到2000之间;x2x2是卧室的数量,可能这个值的取值范围在1到5之间。其代价函数J(θ)J(θ)是一个关于参数θ0,θ1和θ2θ0,θ1和θ2的函数。但这里我们暂时不考虑θ0θ0并假想一个函数的变量只有θ1和θ2θ1和θ2。
如果x1x1的取值范围远远大于x2x2的取值范围的话,那么最终画出来的代价函数J(θ)J(θ)的轮廓图就会呈现出这样一种非常偏斜并且椭圆的形状:
如果你用这个代价函数来运行梯度下降的话,你要得到梯度值最终可能需要花很长一段时间,并且可能会来回波动,然后会经过很长时间最终才收敛到全局最小值。
事实上如果这些轮廓再被放大一些的话,如果你画的再夸张一些把它画的更细更长,那么可能情况会更糟糕,梯度下降的过程可能更加缓慢,需要花更长的时间反复来回振荡,最终才找到一条正确通往全局最小值的路。
在这样的情况下一种有效的方法是进行特征缩放(feature scaling)。
具体来说把特征xx定义为:
x1=size(feet2)2000x1=size(feet2)2000
x2=卧室的数量5x2=卧室的数量5
通过这样的变化,表示代价函数J(θ)J(θ)的轮廓图的形状就会变得偏移没那么严重,可能看起来更圆一些了。
如果你用这样的代价函数来执行梯度下降的话,那么可以从数学上来证明梯度下降算法将会找到一条更捷径的路径通向全局最小,而不是像刚才那样 沿着一条让人摸不着头脑的路径,来找到全局最小值。
因此在这个例子中,通过特征缩放,我们最终得到的两个特征x1x1和 x2x2都在0和1之间,这样你得到的梯度下降算法就会更快地收敛。
更一般地,我们执行特征缩放时,我们通常的目的是将特征的取值约束到−1到+1的范围内。其中,特征x0x0总是等于1,因此这已经是在这个范围内了,但对于其他的特征,你可能需要通过除以不同的数来让它们处于同一范围内。
−1和+1这两个数字并不是太重要,所以如果你有一个特征x1x1它的取值在0 ~ 3之间,这没问题 如果你有另外一个特征取值在-2 ~ +0.5之间,这也没什么关系,因为这也非常接近-1 ~ +1的范围。
但如果你有另一个特征x3,假如它的范围在-100 ~ +100之间,那么这个范围跟-1 ~ +1就有很大不同了。所以这可能是一个不那么好的特征。类似地,如果你的特征在一个非常非常小的范围内,比如另外一个特征x4,它的范围在-0.0001 ~ +0.0001之间,那么这同样是一个比-1 ~ +1小得多的范围,因此我同样会认为这个特征也不太好。所以可能你认可的范围,也许可以大于或者小于-1 ~ +1,但是也别太大或太小,只要与-1 ~ +1范围偏差不多就可以接受。
因此,总的来说不用过于担心你的特征是否在完全相同的范围或区间内,但是只要它们足够接近的话,梯度下降法就会正常地工作。
均值归一化(mean normalization)
- 第一种是min-max标准化(Min-Max Normalization)
- 第二种是0均值标准化(z-score标准化)
- 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围
- 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
2. 学习速率
梯度下降算法中,最合适即每次跟着参数θ变化的时候,J(θ)的值都应该下降 到目前为止,我们还没有介绍如何选择学历速率α,梯度下降算法每次迭代,都会受到学习速率α的影响
- 如果α较小,则达到收敛所需要迭代的次数就会非常高;
- 如果α较大,则每次迭代可能不会减小代价函数的结果,甚至会超过局部最小值导致无法收敛。如下图所示情况
观察下图,可以发现这2种情况下代价函数 J(θ)的迭代都不是正确的
- 第一个图,曲线在上升,明显J(θ)的值变得越来越大,说明应该选择较小的α
- 第二个图,J(θ)的曲线,先下降,然后上升,接着又下降,然后又上升,如此往复。通常解决这个问题,还是选取较小的α
根据经验,可以从以下几个数值开始试验α的值,0.001 ,0.003, 0.01, 0.03, 0.1, 0.3, 1, …
α初始值位0.001, 不符合预期乘以3倍用0.003代替,不符合预期再用0.01替代,如此循环直至找到最合适的α
然后对于这些不同的 α 值,绘制 J(θ)随迭代步数变化的曲线,然后选择看上去使得 J(θ)快速下降的一个 α 值。
所以,在为梯度下降算法选择合适的学习速率 α 时,可以大致按3的倍数再按10的倍数来选取一系列α值,直到我们找到一个值它不能再小了,同时找到另一个值,它不能再大了。其中最大的那个 α 值,或者一个比最大值略小一些的α 值 就是我们期望的最终α 值。