多元梯度下降法
- 多元梯度下降法:使用梯度下降法来处理多变量线性回归(多元线性回归)。
多元梯度下降运算中的实用技巧
(均用于优化梯度下降,最终目的均是使下降速度变得更快)
特征缩放
- 特征缩放的作用:使梯度下降的速度变得更快,则收敛所需的迭代次数便更少,这就是特征缩放。
首先讨论什么情况下需要特征缩放
- 比如你有一个机器学习问题,这个问题有多个特征,如果你能确保这些特征都处在一个相近的范围内,那么这样梯度下降法就能更快地收敛。具体地说,假如你有一个具有两个特征的问题,其中x_1是房屋面积大小,他的取值范围在0到2000之间。x_2是卧室数量,他的取值范围在1到5之间。
- 代价函数J(θ)是一个关于参数θ0、θ1、θ2的函数,但暂时忽略θ0,并假设这个函数的变量就只有θ1、θ2。但如果x_1(房屋面积大小)的取值范围远远大于x_2(卧室数量)的取值范围的话,那么最终画出的代价函数J(θ)的等值线就会呈现出如下图,一种非常歪斜并且椭圆的形状。实际2000比5(房屋面积大小比卧室数量)的比例,会让这个椭圆更加瘦长,所以这个又瘦又高的椭圆形等值线图就是如下图这些非常高大细长的椭圆形,从而构成了代价函数J(θ)的等值线。
- 如果你在这种代价函数上运行梯度下降的话,你的梯度最终可能需要花很长一段时间,并且可能会来回波动,然后会经过很长时间最终才收敛到全局的最小值。如果这些等值线还更夸张一些的话,那么可以把它画的更细更长,可能比这还更夸张一点,结果就是梯度下降的过程可能更加缓慢,并且反复来回震荡,需要花费很长时间才找到一条通往全局的最小值的路线。在这样的情况下,一种有效的方法就是进行特征缩放。
结论
- 更一般的,在执行特征缩放时的通常目的是:将特征的取值范围约束到-1到+1的范围之内。比如说特征值x_0总是等于1,那么这已经在-1到+1的范围之内。但对于其他特征值可能需要通过除以不同的数来让他们处于这同一范围之内。
- -1和1这两个数字并不是太重要。比如说有一个特征值x_1的取值范围在0到3之间,非常接近-1到+1的范围之内这没问题。如果还有另外一个特征值x_2的取值范围在-2到+0.5之间,这也非常接近-1到+1的范围之内这也没问题。但如果说有另外一个特征值x_3它的取值范围在-100到+100之间,那么它和-1到+1的范围就有很多差异了,所以这个便是范围不是太合适的特征。
- 如果特征值在非常非常小的范围之内的话,比如说一个特征值x_4的取值范围在-0.0001到+0.0001之间的话,那么这便是比-1到+1小得多的范围,因此同样认为这个特征值的范围不合适。所以可能认可的范围也许可以大于+1或者小于+1,但是也别相差太大,比如+100,也别太小,比如刚才所述的+0.001。
- 可以一般这么考虑,特征值的取值范围在-3到+3的范围之内是可以接受的,如果某个特征值的取值范围大于-3到+3的范围的话,就需要注意了。比如某个特征值的取值范围在-1/3到+1/3之间 或 0到+1/3之间 或 -1/3到0之间的话,可以认为都可以接受的。比如前面所述的特征值x_4的取值范围在-0.0001到+0.0001之间就需要重新考虑了。
学习率a
- 如果学习率a过小,可能收敛的速度会很慢,则造成梯度下降算法的迭代次数需要非常多次才能到达最低点。
- 如果学习率a过大的话,可能收敛的速度过于太快,则造成代价函数J(θ)值可能不会在每次迭代之后都下降,甚至反而可能在上升,最终无法收敛。
如果学习率a过大的话,也可能会出现收敛的速度很慢,但更加常见的是每次迭代之后代价函数J(θ)值都并不会下降。
解决方法和步骤:
- 在运行梯度下降算法时,通常可以尝试一系列学习率a值,比如说每隔10倍取一个值,即0.001->0.01->0.1->1->…等。然后对于这些不同的学习率a值,绘制代价函数J(θ)随迭代次数不断增加而J(θ)值不断变化的曲线图。最终选择一个可以使代价函数J(θ)值快速下降的学习率a值。
- 事实上,通常并不仅可以是每隔10倍取一个值作为学习率a值,还可以每隔3倍取一个值作为学习率a值.比如 0.001->0.003->0.01->0.03->0.1->0.3->1->…等。可以这么看,0.001->0.003增加3倍,0.003->0.01则大约增加3倍多一点,而0.01->0.03又增加3倍,而0.03->0.1则又大约增加3倍多一点,以此类推。
- 所以可以尝试一系列学习率a值,那么便可以找到最小值(比如0.001),再找到另外一个最大值(比如1),然后可以取最大值或者比最大值略小一些的比较合理的值,通常这样做便可以为梯度下降算法找到一个合适的学习率a。