可以说,梯度是深度学习中最重要的术语,也是初学者最难迈过的一道门槛。我觉得,梯度和方向导数犹如一枚硬币的两面,两者缺一不可,相辅相成。也就是说,一看到或者一听见“梯度”二字,你的脑海里面应该立马想到“方向导数”。你的脑海应该浮出这样一个画面:存在一个点,它有多个方向导数,沿着其中某个方向做运动,此时点所对应的函数值的变化是最剧烈的。这个方向是由梯度来定义的,函数值变化的剧烈程度则是梯度的模。

本文给大家说一下梯度以及梯度的物理意义。对于“梯度”这个东西,很多初学者搞不清楚,就连知乎上的大V,也是独乐乐不能与众乐乐,洋洋散散说了半天,读者也是一头雾水。
之所以大家对“梯度”一头雾水,这是因为大家没有一个明确的学习路线,本文制定出一条关于梯度的学习路线:导数->偏导数->方向导数->方向->方向导数的表示方法->方向导数的最值->梯度的物理意义。
本文希望通过这个系统化的学习路线,让大家能深刻地理解和掌握“梯度”这个机器学习和深度学习核心数学技术。再退一步来说,即便你读完了本文依然没有吃透梯度的含义,那么按照本文所倡导的“路线学习法”,也必能让自己对“梯度”的理解迈入一个新的台阶。
导数反映的是函数沿坐标轴方向的变化率。
大家要明白一点:导数是个标量。
所谓偏导数,简单来说是对于一个多元函数,选定一个自变量并让其他自变量保持不变,只考察因变量与选定自变量的变化关系。数学上说,是指对于多元函数$y=f(x_1,x_2,...x_n)$,假设其偏导数都存在,则该函数共有$n$个偏导数,可以表示为:
$$f_{x_1} = \frac{ \partial y }{\partial x_1}, f_{x_1} = \frac{ \partial y }{\partial x_2}, ..., f_{x_n} = \frac{ \partial y }{\partial x_n}$$
需要强调一点:偏导数只能表示多元函数沿某个坐标轴方向的导数。
除了沿坐标轴方向上的导数,多元函数在非坐标轴方向上也可以求导数,这种导数称为方向导数。很容易发现,多元函数在特定点的方向导数有无穷多个,表示函数值在各个方向上的增长速度。
再次要强调一下:导数是个标量。方向导数是依然是标量。
说到“方向”,估计很多读者此时一头雾水了,大家有方向感啊,出门都知道东南西北啊。不,我说的方向指的是坐标系中的方向,用角度表示,如下图所示:

若有一个二元函数$z=f(x, y)$,当它由点A移动到点B时(设移动的距离为$l$),此时函数值有一个增量$\partial f$。当$l$趋于无限小时,若$\frac{ \partial d }{\partial l}$有一个极限值,那么这个极限值就叫做函数在方向$AB$上的方向导数。除了向$B$方向移动外,经过点$A$函数可以朝任意方向移动,函数就有任意多个方向导数。根据上文我们已经知道方向用角度来表示,此处用$\phi$表示,则函数的方向导数表示为:
$$\frac{ \partial f }{\partial l} = \frac{ \partial f }{\partial x}cos\phi + \frac{ \partial f }{\partial y}sin\phi$$
说明:$\phi$表示从$x$轴转动到方向$l$的夹角。
方向导数是个标量,标量只有大小这一个属性。而一个点有多个方向导数,这些方向导数之中必定存在最大值和最小值。如何求方向导数的最值呢?请看下文的推导:
$$\frac{ \partial f }{\partial l} = \frac{ \partial f }{\partial x}cos\phi + \frac{ \partial f }{\partial y}sin\phi = [\frac{ \partial f }{\partial x},\frac{ \partial f }{\partial y}] \cdot [cos\phi,sin\phi]$$
上式中$[\frac{ \partial f }{\partial x},\frac{ \partial f }{\partial y}]$表示偏导$gradf(x)$,而$[cos\phi,sin\phi]$则表示单位向量$e$,所以可以进一步变形为:
$$gradf(x) \cdot e$$
此时,方向导数的定义变成了偏导数和单位向量的内积。关于内积的计算,如果大家不清楚,可以看看这个:
$$A \cdot B = |A||B|cos(\alpha)$$
A与B的内积等于A到B的投影长度乘以B的模。再进一步,如果我们假设B的模为1,即让|B|=1,那么就变成了:
$$A \cdot B = |A|cos(\alpha)$$
综上所示,
$$gradf(x) \cdot e = |gradf(x)|cos(gradf(x)^\Delta,e)$$
$(gradf(x)^\Delta,e)$表示向量$gradf(x)$和向量$e$的夹角,当向量$e$与梯度$gradf(x)$方向一致的时候,$\frac{ \partial f }{\partial l}$有最大值。也就是说,沿着梯度方向的函数$z=f(x, y)$增长的最快。与之对应,方向导数正好与梯度反向,是函数值减小的最快方向。通常我们称之为负梯度。
最后,我们可以得知:方向导数要想取得最大值,其方向必须是梯度的方向,其最大值就是梯度的模。
梯度值是一个向量值,它在坐标轴上表示一个箭头,即指向,方向导数按照它的指向才能取得最大值。
方向导数是标量,表示在不同方向中函数增长的快慢,朝着最大方向导数所指的方向,函数增长的才是最快的。