假设一个二元线性回归问题:特征为房子大小 和卧室数 ,目标为房子价格
- 房子大小 的取值范围为 300~2000(范围大)
- 卧室数 的取值范围为 0~5(范围小)
一个训练数据为 ,找合适的 进行拟合
解得 ,拟合效果非常差
解得 ,拟合效果好很多
所以:当一个特征的可能取值范围较大时,其参数的合理值会相对较小;反之当一个特征的可能取值范围较小时,其参数的合理值会相对较大
这是因为 的微小变化会对预估价格产生很大影响,进而对成本 产生很大影响;相比之下 需要有更大的变化才能对预测产生同样大的影响
这意味着:运行梯度下降可能出现的结果,如果你直接照原样使用训练数据,由于等高线又高又狭长,梯度下降最终可能会来回振荡,反复多次最终才能找到全局最小值
特征缩放
特征缩放(Feature Scaling)能使梯度下降运行速度大幅提升
这意味着对你的训练数据进行一些变换,使得 和 的取值范围接近,比如都是 0~1 之间
回顾一下:当你有取值范围差异很大的不同特征时,这会使梯度下降运行得很慢;但对不同特征进行重新缩放让它们的值域范围相近,能大幅加快梯度下降
常见特征缩放方法
除以最大值
均值归一化
z 分数归一化
一般来说:在进行特征缩放时,希望让特征范围大概在 -1~+1 之间,但 -1 和 +1 这两个值可以稍微放宽些
特征取值范围 | 特征缩放 |
---|---|
能接受 | |
能接受 | |
太大 | |
太小 | |
太大 |
判断梯度下降是否收敛
梯度下降规则:
目标是
绘制学习曲线
若梯度下降正常运行,则每次迭代后成本 应降低
若 在一次迭代后增加,意味着学习率 的选择可能有误(通常为 值过大),或者代码存在问题
上图中,当达到约 300 次选代时,成本 趋于稳定,不再大幅下降,曲线已趋平缓,这意味着梯度下降已经收敛
梯度下降收敛所需的选代次数在不同应用中差异很大,事实证明很难预先判断梯度下降需要多少次迭代才能收敛
所以需要绘制一条学习曲线进行观察,以试图找出何时可以停止训练模型
自动收敛测试
另一种判断模型训练是否完成的方法是进行自动收敛测试
令 ,如果在一次送代中代价函数 的下降小于这个 值,那么很可能位于上图学习曲线的平缓部分,这时就可以宣布收敛了
但是通常选择合适的阈值 很难,所以实际上更倾向于看学习曲线图,而不是依靠自动收敛测试判断梯度下降是否收敛
选择合适的学习率
若学习率太小,梯度下降算法运行的很慢;若学习率太大,梯度下降算法可能无法收敛(详见)
如何为你的模型选择一个合适的学习率?
绘制学习曲线观察到如上图两种情况,可能是因为学习率太大或代码有问题
正确实现梯度下降的一个调试技巧是:使用足够小的学习率,代价函数应在每次选代时减小
即使将 设为非常小的数,每次选代时 都不减小,反而有时会增大,通常意味着代码中有错误
但将学习率设置太小,梯度下降算法运行的很慢。所以通常会尝试一系列学习率的值:
0.001 → 0.003 → 0.01 → 0.03 → 0.1 → …(每次约增大三倍)
直到找到一个太小的值和一个太大的值,然后慢慢尝试选择尽可能大的学习率或者只是比找到的最大合理值略小的值,通常是一个很好的学习率