1、引言
在上一篇文章中,我们介绍了如何使用线性回归和成本损失函数为房价数据找到最拟合的线。不过,我们也看到,测试多个截距值可能既繁琐又低效。在本文中,我们将深入探讨梯度下降算法,这是一种更加强大的技术,可以帮助我们找到完美的截距并进而优化模型。我们将探究其背后的数学原理,看看如何将其应用到线性回归问题中。
闲话少说,我们直接开始吧!
2、梯度下降
梯度下降是一种强大的优化算法,旨在快速有效地找到曲线的最低点。将这一过程形象化的最佳方式就是想象你站在山顶,山谷中有一个装满黄金的宝箱在等着你。
然而,山谷的确切位置却不得而知,因为外面一片漆黑,什么也看不见。此外,你还想赶在其他人之前到达山谷(因为您想独自拥有所有宝藏)。梯度下降算法可以帮助你驾驭地形,高效快速地到达最佳点。在每个点上,它都会告诉你需要走多少步,朝哪个方向走。
同样,梯度下降算法的处理步骤也可以应用于线性回归问题。为了直观地展示寻找最小值的过程,让我们绘制 MSE 曲线。我们已经知道该曲线的方程为:
从上一篇文章中,我们知道问题中的 MSE 方程为:
如果我们把视角放大,就会发现在上式中代入一系列截距值,就能得到一条 MSE 曲线(与我们的山谷相似)。因此,让我们输入 10,000 个截距值,就能得到这样一条曲线:
我们的目标是达到 MSE 曲线的底部,我们可以通过下面的来步骤实现这一目标。
3、步骤一:随机初始化
在这种情况下,我们可以从截距值随机初始化开始,这里假设我们最初猜测的截距值为 0。
4、 步骤二:计算梯度值
曲线在某一点处的梯度值用该点的切线表示(切线是曲线在该点与曲线相切的一种特殊说法)。例如,在 A 点,当截距等于 0 时,MSE 曲线的梯度可用红色切线表示。
为了确定具体梯度值,我们需要运用微积分的知识。具体来说,梯度等于曲线相对于给定点截距的导数,计算公式表示为:
我们据此,计算 MSE曲线在截距为零处的导数如下:
现在,为了求出在A点的梯度,我们将 A 点的截距值代入上式。由于截距 = 0,所以 A 点的导数为:
因此,当截距为0时,梯度值为-190。
注意:当我们接近最佳值时,梯度值将趋近于零。在最佳值处,梯度值等于零。相反,离最佳值越远,梯度值越大
由此我们可以推断,步长应该与梯度有关,因为梯度会告诉我们应该迈小步还是大步。这意味着,当曲线的梯度值接近 0 时,我们就应该迈小步,因为我们已经接近最优值了。而如果梯度较大,我们就应该迈大步,以便更快地达到最优值。
注意:如果我们迈出了超级大的一步,那么我们可能会跳得很大,错过最佳点。因此,我们需要小心谨慎。
5、步骤三:更新
由于我们看到步长和梯度成正比,因此步长是通过梯度乘以一个预先确定的常量值(称为学习率)来确定的:
学习率控制步长的大小,确保步长不会过大或过小。
实际上,学习率通常是一个小正数,即 ≤ 0.001。但对于我们的问题,让我们把它设为 0.1。
因此,当截距为 0 时,计算步长公式为:
根据上述计算出的步长,我们使用以下任何一个等效公式更新截距(又称更改当前位置):
要在这一步中找到新的截距,我们只需要代入相关的值,如下:
求解得到新的截距 = 19。现在将这个值代入MSE 等式,我们会发现截距为 19 时的 MSE = 8064.095。我们又一步就接近了最佳值,降低了 MSE。
即使观察我们的图表,也会发现截距为 19 的新直线比截距为 0 的旧直线更适合我们的数据,如下:
6、步骤四:重复
接着我们使用更新后的截距值来重复步骤 2 和 3。
例如,由于本次迭代的新截距值为 19,因此在步骤 2 之后,我们将计算这一新点的梯度:
我们发现,在截距值 19 处,MSE 曲线的梯度为-152(如下图中红色切线所示)。
接下来,根据步骤 3,我们来计算步长:
随后,更新截距值:
现在,我们可以将截距为 19 的直线与截距为 34.2 的新直线进行比较,如下:
我们可以看到,新的直线更加符合数据的分布。总体而言,MSE 越来越小。
而我们的步长却越来越小:
我们反复重复这一过程,直到趋近于最优解:
当我们向曲线的最小点前进时,我们发现步长越来越小。13 步之后,梯度下降算法估计截距值为 95,这将被确认为 MSE 曲线的最小点。很明显,这种方法比我们在上一篇文章中看到的 "暴力 "方法更有效。
现在我们有了截距的最佳值,线性回归模型就应该是这样:
线性回归方程线可视化是这样的:
最佳拟合线,截距=95,斜率=0.069
最后,回到马克朋友的问题–他的 2400 平方英尺的房子应该卖多少钱?
将 2400 平方英尺的房屋面积代入上式,计算结果如下:
然后就可以了。我们可以告诉我们这位杞人忧天的朋友马克,根据他所在社区的 3 所房子的情况,他应该以 26.06 万美元左右的价格出售自己的房子。
7、 为什么梯度下降有用?
为了说明这一点,请考虑这样一种情况:我们试图到达曲线 C 的最小点,记为 x*。而我们目前在 A 点,位于 x* 的左边:
如果我们求出曲线在 A 点相对于 x 的导数(表示为 dC(x)/dx
),会得到一个负值(这意味着梯度是向下倾斜的)。我们还观察到,我们需要向右移动才能到达 x*。因此,我们需要增加 x 才能达到最小值 x*。
由于 dC(x)/dx
为负值,x-𝛂*dC(x)/dx
将大于 x,从而向 x* 移动。
同样,如果我们位于最小点 x* 右侧的 A 点,那么我们会得到一个正梯度(梯度向上倾斜),即 dC(x)/dx
。
因此, x-𝛂*dC(x)/dx
将小于 x,从而向 x* 移动。
8、梯度下降什么时候停止?
因此,当某一点的梯度接近 0 或在最小点附近时,步长也将接近 0,表明算法已达到最优解。
当我们接近最小点时,梯度接近 0,因此步长也接近 0
通常,最小步长 = 0.001 或更小
尽管如此,梯度下降法也有一个在终止前的步数限制,称为 “最大步数”。
通常,最大步数 = 1000 或更大
因此,即使步长大于最小步长,如果步数超过最大步数,梯度下降算法也会停止。
9、多个局部最优解
到目前为止,我们一直在处理一条很容易确定最小点的曲线(这类曲线称为凸曲线)。但如果我们有一条不那么漂亮的曲线(技术上又称非凸曲线),看起来像这样呢?
在这里,我们可以看到 B 点是全局最小值(实际最小值),而 A 点和 C 点是局部最小值(可能会被混淆为全局最小值的点,但其实不是)。因此,如果一个函数有多个局部最小值和一个全局最小值,并不能保证梯度下降一定能找到全局最小值。此外,找到哪个局部最小值还取决于初始猜测的位置(如梯度下降的步骤 1 所示)。
以上面这条非凸曲线为例,如果初始猜测点位于block A 或block C,梯度下降算法会宣布最小点分别位于局部最小点 A 或 C,而实际上它应该位于 B。
现在的问题是,我们如何做出正确的初始化猜测?
答案并不简单:从上图中可以看出,如果我们对 x 的最小值猜测是 0,因为它位于图块 A 中,那么它将导致局部最小值 A 的出现。此外,如果可行的话,使用不同的初始化猜测运行算法并比较其结果,可以让我们了解猜测之间是否存在显著差异。这有助于更有效地确定全局最小值。
10、总结
本文重点介绍了如何利用梯度下降法来求解线性回归问题,并给出了详细的图例说明。
您学废了吗?