梯度下降(Gradient Descent)数学原理分析与实例
本文循序渐进描述梯度下降算法,从导数的几何意义开始聊起,如果熟悉微积分可以跳过,主要内容如下:
一. 导数的几何意义
导数用来衡量函数对取值的微小变化有多敏感,如下图所示,假设有一辆汽车在行驶,s(t)是关于时间tt的行驶距离函数,dt表示一小段时间,ds表示dt时间段内行驶的距离,导数表示,在t点,当dt趋近于0时,ds和dt的比值
那么当dt趋近于0时(注意,趋紧0,但不是0),导数的几何含义是什么呢?我们来看下面一张动图,解释了导数在几何意义上表示函数图上某点切线的斜率:
关于使用链式求导法计算导数的两个例子如下:
备注:
二. 偏导数
三. 什么是梯度
四. 梯度下降算法
梯度下降算法是通过逐步迭代达到函数最小值的算法(不是所有情况都能达到最小值,有一些注意事项后续说明),例如下图中的红色圆点:
想象一下我们在徒步下山,我们不能从全局的视野找到最快的下山路径,我们怎样该怎么走呢?是不是会看看周围,选择一条当前最陡峭的下坡路?怎么找这个方向呢?这个方向是上升最快的反方向。第三节中我们介绍了梯度向量给出了多元函数的最大变化量和方向,这意味着,如果我们在点θ0,想要移动到附近的最低点(也就是“局部最小值”),我们的下一步θ1应该这样计算:
α是什么含义? α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点。 (感兴趣的小伙伴可以尝试在谷歌机器学习课程上的调节学习率看效果https://developers.google.com/machine-learning/crash-course/fitter/graph)
为什么是−? 梯度前加一个负号,表示朝着梯度相反的方向前进,我们在前文提到,梯度的方向就是函数在此点上升最快的方向,而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号。
梯度下降举例一
而当我们将学习率设置为α=0.75时:
梯度下降举例二
可以看出我们的确在不断接近最小值,即(0,0)。
-
函数必须是可微分的 (differentiable)(左侧示例); 学习率α不应太小(中间示例)或太大(右侧示例)。
五. 梯度下降应用于线性回归
5.1 批量梯度下降
5.2 批量梯度下降算法python实现
假设有原始数据集:
1.1 1.5 2.5 1.3 1.9 3.2 1.5 2.3 3.9 1.7 2.7 4.6 1.9 3.1 5.3 2.1 3.5 6 2.3 3.9 6.7 2.5 4.3 7.4 2.7 4.7 8.1 2.9 5.1 8.8
使用批量梯度下降算法求解线性回归代码如下:
固定学习率为0.05,更改迭代次数为5000时,结果为:
[ 9.5 10.2 10.9 11.6 12.3]
参考资料
