我们先来玩一个游戏,假如你在一座山上,蒙着眼睛,但是你必须到达山谷中最低点的湖泊,你该怎么办?
梯度可以帮助你完成这个游戏。
图片来自Introduction to Gradient Descent Algorithm (along with variants) in Machine Learning。
梯度和方向导数紧密相关,让我们从方向导数开始。
1 方向导数
顾名思义,方向导数就是某个方向上的导数。
什么是方向:
函数
在这个方向上的图像:
我们知道:
函数
的
点在这个方向上也是有切线的,其切线的斜率就是方向导数:
我之前在什么是全导数、偏导数、方向导数?这个回答中,已经全面回答过什么是方向导数了。感兴趣可以看看。
2 梯度
很显然,
点不止一个方向,而是
都有方向:
每个方向都是有方向导数的:
此处有互动内容,点击此处前往操作。
这就引出了梯度的定义:
梯度:是一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数。
定义出来了,并不复杂,但对于我而言这才是开始,因为我还有两个疑问:
- 为什么所有方向导数中会存在并且只存在一个最大值?而不是有多个最大值、或者说没有最大值?
- 这个最大值在哪个方向取得?值是多少?
2.1 为什么所有方向导数中会存在并且只存在一个最大值?
其实我最困惑的是梯度的存在性,你说有这么多方向导数,有最大值我觉得还好理解,为什么偏偏只有一个?
我们来看一个显而易见的物理现象:
光滑的、笔直的玻璃上的水滴,一定会沿着玻璃滑下来,(理想情况下)滑下来的方向就是玻璃最陡峭的地方。对于笔直的平面玻璃而言,这个滑下来的方向是只有一个。
说这个干什么?我们回头来看看梯度的数学定义,并且画一下重点:
具有一阶连续偏导数,意味着可微。可微意味着函数
在各个方向的切线都在同一个平面上,也就是切平面:
此处有互动内容,点击此处前往操作。
所有的切线都在一个平面上,就好像刚才我说过的光滑的笔直玻璃上,某一点一定有且只有一个(梯度为0的情况除外,可以自己想想为什么?)最陡峭的地方(因为方向导数是切线的斜率,方向导数最大也就意味着最陡峭)。
这就解决了我对于“为什么所有方向导数中会存在并且只存在一个最大值”的疑问。
注意,因为这里举的例子是水滴往下滑,所以要说多说明一下,往下滑是梯度的反方向。因为梯度指的是增长最快的方向,而往下滑是减少最快的方向。
2.2 这个最大值在哪个方向取得?值是多少?
这个最大值的方向我们就取名为梯度方向。
最大方向导数的值是多少这个问题,我没有找到特别直观的方法来说明。我也不想给出计算步骤,要不看起来和数学书也没啥区别。大家自己去查找计算过程吧。
2.3 方向导数与梯度的关系
方向导数与梯度的关系,我在这里给大家一个直观的操作感受。
先说明一下,下图的矢量表示
在
点处的梯度,切线是梯度方向的切线。因为我把梯度画在了
点处,所以我画了一个辅助平面,这个平面和
平面平行:
为了方便观察,我把切平面也画出来了,切平面是之前的辅助平面有一根交线,这根交线很明显平行于
平面:
我增加切平面、平行于
的平面以及两者的交线,都是为了方便有个参照物,看出切线的陡峭的程度。
然后我们来观察不同方向的切线和梯度方向的切线的关系(绿色是梯度以外的方向,它和梯度成
夹角):
自己动手操作以下,就很容易观察出为什么梯度是最陡峭的方向,以及
对方向导数大小的影响:
此处有互动内容,点击此处前往操作。
2.4 总结
简单总结下:
- 方向导数是各个方向上的导数
- 偏导数连续才有梯度存在
- 梯度的方向是方向导数中取到最大值的方向,梯度的值是方向导数的最大值
3 完成最开头的游戏
对于最开头的游戏,我们只需要通过手感受附近梯度最大的方向,一直沿着梯度相反的方向就可以到达谷底(原理和弹珠从高处滚落最后会滚进最低处一样):
图片来自Introduction to Gradient Descent Algorithm (along with variants) in Machine Learning。
为了不误导,我要多说一下,这个算法叫做梯度下降算法,我在这里只是描述了它的算法思想,真正实用中还需要很多的改进和优化,以及有它的局限性,这里就不展开讲了。