梯度下降的定义
当回归问题中特征较多时,预测函数的参数也会跟着变多,此时代价函数的最小化将会非常困难。而梯度下降算法可以帮助我们在参数很多的情况下找到最优的参数取值。
假设我们站在一座小山上,我们的任务就是一直向下走直到处在最低点。首先环顾四周,找一个当下最陡峭的方向,以固定的步长向该方向走一步,再重复此过程,最终会走到一个区域的最低点,但不一定是整座山的最低点。值得注意的是,当我们一开始站的位置不同时,最后走到的位置也可能不同,即会产生不同的局部最优解。梯度下降算法的过程大致与此相同,如下图所示:
梯度下降算法同样会陷入局部最优解问题,不同的迭代起点可能会得到不同的梯度下降结果,如下图所示:
梯度下降的数学表示
以两个参数为例,梯度下降算法的数学表示如下:
其中符号 “ := ” 表示赋值, 表示学习率,它来控制梯度下降的步长,
后面跟着的是代价函数
分别对
、
的偏导数。算法的实现过程大致如下:
1、初始化 、
,可以都赋予0。
2、不断更新 、
的值,使
的值更小,直到找到最小值或局部最优解,而且
、
一定要同时更新。其计算方法如下:
以一个参数为例,其梯度下降的过程可用下图表示,其中每条彩色线都表示一次梯度下降,最终到达函数的最低点。
再次贴上代价函数 的数学表示:
每次梯度下降时,都要对 的偏导数进行一次计算,而
本身要遍历整个数据集,于是每次梯度下降也都会遍历整个数据集,所以上述介绍的梯度下降方法也称为:Batch(批,批量)梯度下降法。
特征缩放
梯度下降存在的一个问题就是,如果各个特征的取值范围差别较大,例如第一个特征取值范围为1~2000,第二个特征取值范围为1~5,此时代价函数的等高线会显得非常细长,例如下图:
此时梯度下降的足迹将会呈现左右横跳,并不直指向椭圆中心,导致梯度下降速度缓慢。此时我们可以将每个特征值进行缩放,第一个特征都除以2000,第二个特征都除以5,这样两个参数的取值范围都是0~1。这样可以得到更加缓和的等高线图,在梯度下降过程中每一步都直接指向圆心,例如下图:
一般来说特征值的取值范围在-3~3之间都比较合适,此时代价函数的等高线图会更加缓和,收敛的速度也会加快。还有一种特征缩放的办法为均值归一化:将每个特征值减去该特征的平均取值,再除以该特征的取值范围。经过此操作后,特征值更容易变换到-0.5~0.5这个范围内。特征缩放并不需要特别精确,只需将特征值的取值范围收束到一个相近似的范围内即可,目的是加快梯度下降的速度。
如何确定学习率α
学习率决定了梯度下降的步长,代价函数的收敛程度与迭代次数有关,在到达一定迭代次数后代价函数会收敛到最低点,因此要选择合适的学习率,迭代合适的次数,才能更好的实现梯度下降算法。通过观察代价函数与迭代次数的对应关系,才可以发现学习率时候合适。我们想要随着迭代次数增加,代价函数值不断减小,如下图所示,X轴为迭代次数,Y轴为代价函数值:
若学习率过大,可能导致梯度下降在接近最低点时冲破最小值,左右横跳,导致无法收敛,例如下图所示,X轴为参数取值,Y轴为代价函数值:
若学习率过小,可能导致梯度下降次数太多,影响程序效率。例如下图所示,X轴为参数取值,Y轴为代价函数值:
学习率α 太小的话,收敛过程会很缓慢,导致系统效率下降。α 太大的话,可能会导致梯度下降无法收敛。实际上,当梯度下降接近局部最优解时,公式中的导数项会变得越来越小,梯度下降的步长也会跟着变小,因此不必将α设置的非常小,一般以3倍为步长,从0.001、0.003、0.01、0.03、0.1、0.3、1……中选择,再结合图像来确定。