如何通俗地解释梯度下降法(图文版)
马同学图解数学
编辑于 2024年04月11日 15:49

最近收到很多同学和老师的私信,找我要梯度下降的图文和动画。现在我将其发布到B站,方便大家自取。(创作不易,引用时注明来源马同学,感激不尽!)

同学们大家好,今天我们来学习梯度下降法

1 简单印象

用一句话解释,梯度下降法就是快速找到最低点的一个方法。比如在山上有一个球,经过几次运动后,就会来到谷底附近。

要完成这个过程,我们需要回答三个问题:

  • 方向—首先是确定往哪个方向滚

  • 距离—然后确定滚多远

  • 终止条件—最后,附近的范围有多大,确定滚到哪里算结束

2 方向

假设有一蓝点在曲线上,要运动到最低点,这个过程大概是这样的

这是个一元函数,自变量有两个运动方向,一个朝左,一个朝右。

朝右边运动,越走越高,函数值在增加,这个方向被称为梯度方向。

朝左边运动,越走越低,函数值在减小,这个方向被称为梯度方向的反方向。显然,要走到最低处,我们应该选择梯度的反方向。

走了一次后,来到一个新的位置,这时我们需要又一次对方向进行判断,而同样的,这里的方向也有梯度方向,和梯度的反方向。

继续朝梯度的反方向移动,重复之前的逻辑,不断朝梯度反方向移动,运气好,我们就能走到最低点附近。

也就是说,要到最低点附近,我们需要朝着梯度的反方向运动。

%E6%96%B9%E5%90%91%3D-%5Cnabla%2Cf

3 距离

刚刚说“运气好”,因为要达到目的,我们还要考虑,每一次走多远。因为这个要从计算结果中反应,所以这里给出一些具体数值。设f%3Dx%5E2 ,起始点为10 这个位置

这样

%5Cnabla%2Cf%2C%3D2x%2Cx_0%3D10

根据前面讲的,下一个移动的位置在梯度的反方向,那么

x_1%3Dx_0-%5Cnabla%2Cf(x_0)%3D-10

也就是第一次移动,移动到了-10 的位置

第二次移动,也是梯度的反方向

x_2%3Dx_1-%5Cnabla%2Cf(x_1)%3D10

计算后得到,这一次移动到了10 这个位置

同样的方法,计算出x_3%2Cx_4

x_3%3Dx_2-%5Cnabla%2Cf(x_2)%3D-10

x_4%3Dx_3-%5Cnabla%2Cf(x_3)%3D10

可以看到,虽然一直在移动,但始终在10 和-10 点振荡,没有降到最低点。

为此,我们需要一个参数来控制移动的距离,这个参数被称为学习率。

3.1 学习率

将用%5Ceta 来表示,则迭代的式子可以表示为

%5Cbegin%7Balign%7D%0A%2C%2C%2C%2Cx_1%2C%3D%2Cx_0-%5Ceta%5Cnabla%2Cf(x_0)%5C%5C%5C%5C%0A%2C%2C%2C%2Cx_2%2C%3D%2Cx_1-%5Ceta%5Cnabla%2Cf(x_1)%5C%5C%5C%5C%0A%2C%2C%2C%2Cx_3%2C%3D%2Cx_2-%5Ceta%5Cnabla%2Cf(x_2)%5C%5C%5C%5C%0A%2C%2C%2C%2Cx_4%2C%3D%2Cx_3-%5Ceta%5Cnabla%2Cf(x_3)%5C%5C%5C%5C%0A%2C%2C%2C%2C%5Ccdots%2C%5Cquad%2C%5Cquad%0A%5Cend%7Balign%7D

显然,刚刚来回振荡时,%5Ceta 为1

如果将学习率继续调大,比如调大到1.05 ,多次迭代后,不仅不会降到最低点,甚至还会越走越高

而如果将学习率调低到一个较小值,比如0.02 。这时,每次迭代后,位置确实是在降低,但降低的幅度比较小,迭代很多次都没到达谷底附近。

而如果将学习率调为0.2 ,迭代10次后,基本就能降到谷底了。

从这里,我们也看出了,要完成梯度下降,需要选择合适的学习率

%E8%B7%9D%E7%A6%BB%E9%9C%80%E8%A6%81%E7%94%A8%E5%AD%A6%E4%B9%A0%E7%8E%87%5Ceta%E6%8E%A7%E5%88%B6

4 终止条件

最后,我们来看看终止条件,为此首先计算出%5Ceta%3D0.2 时,每次迭代后的梯度值

%0A%5Cbegin%7Barray%7D%7Bc%7Cc%7Cc%7D%0A%2C%2C%2C%2C%5Chline%0A%2C%2C%2C%2C%5Cquad%5Cquad%26x_0%26x_1%26x_2%26x_3%26x_4%26x_5%26x_6%26x_7%26x_8%26x_9%26x_%7B10%7D%5C%5C%0A%2C%2C%2C%2C%5Chline%5C%5C%0A%2C%2C%2C%2C%7C%7C%5Cnabla%2Cf%7C%7C%2620%2612%267.2%264.32%262.59%261.56%260.93%260.56%260.34%260.2%260.12%5C%5C%0A%2C%2C%2C%2C%5C%5C%0A%2C%2C%2C%2C%5Chline%0A%5Cend%7Barray%7D%0A

可以看到,每次迭代后,梯度值都在不断的下降。这也是将这个方法,命名为梯度下降的原因。而我们知道梯度为0时的位置,就是最低点的位置,因此选择较小的梯度值作为终止条件是比较自然的。

比如,我们希望最后的梯度值小于等于0.01 ,那么就只要迭代15 次

x_%7B15%7D%3D0.005%2C%7C%7C%5Cnabla%2Cf(x_%7B15%7D)%7C%7C%3D0.01

小于等于0.001 ,就需要迭代19次

x_%7B19%7D%3D0.0006%2C%7C%7C%5Cnabla%2Cf(x_%7B19%7D)%7C%7C%3D0.001

只要学习率选择的合适,梯度就可以下降到任意小。这是有理论支撑的,关于这个的证明,感兴趣的同学可以查看我们的课程里的证明。有了这个理论保证,我们就可以选择梯度值当做终止条件了。

%E7%BB%88%E6%AD%A2%E6%9D%A1%E4%BB%B6%E4%B8%BA%7C%7C%5Cnabla%2Cf%7C%7C

5 完整例子

三个问题都解答完了,最后我们来看个例子。设函数f%3Dx%5E2%2B2y%5E2 ,起始位置(x_0%2Cy_0)%3D(-3.5%2C-3.5) ,在图中用红点表示。

选取学习率为0.1 ,则第一次迭代后的位置

(x_1%2Cy_1)%3D(x_%7B0%7D%2Cy_%7B0%7D)-%5Ceta%5Ctimes%5Cnabla%2Cf((x_%7B0%7D%2Cy_%7B0%7D)%3D(-2.8%2C-2.1)

根据迭代公式

(x_%7Bk%2B1%7D%2Cy_%7Bk%2B1%7D)%3D(x_%7Bk%7D%2Cy_%7Bk%7D)-%5Ceta%5Ctimes%5Cnabla%2Cf((x_%7Bk%7D%2Cy_%7Bk%7D)

可以计算出每次迭代后的位置

将终止条件设为梯度值小于等于0.1 ,则迭代到第16次时

%7C%7C%5Cnabla%2Cf(x_%7B16%7D%2Cy_%7B16%7D)%7C%7C%3D0.099

小于0.1,任务完成


以上内容选自马同学图解数学系列课程,想要系统学习,推荐加入: