什么是梯度?为什么梯度下降最快?
什么是梯度?为什么梯度下降最快?
梯度是多元函数微积分中的核心概念,广泛应用于机器学习、优化算法等领域。本文从直观的山地爬升场景出发,逐步深入到数学证明层面,详细解释了为什么梯度方向是函数值增长最快的方向。通过阅读本文,你将对梯度的概念及其性质有更深入的理解。
梯度的通俗解释
在多元微积分、机器学习、优化和许多其他领域中,我们经常听到函数的梯度方向指向函数值增长最快的方向。但为什么这是正确的呢?在这篇文章中,我们将深入探讨这一概念背后的原因,并了解梯度为何如此特殊。
梯度不仅在数学中扮演着重要角色,也在诸如通过梯度下降法训练机器学习模型、优化工程系统,甚至在经济学中确定最大利润点等实际应用中起着重要作用。梯度的概念对于解决我们需要找到最有效路径或解决方案的现实问题至关重要。如果你对这个概念有疑问或者需要复习一下,希望这篇文章可以帮助到你。
引言
当我们处理多个变量的函数(例如 )时,我们希望了解函数在任意点如何变化。梯度是实现这一目标的强大工具。梯度被定义为包含函数偏导数的向量,并指向函数值增加最快的方向。
简单来说,想象一下你站在一座山上,想要找到爬山最快的方向。梯度向量所指的方向就是那个方向。可能你已经在非常多地方看过这个说法了,接下来我们从几何证明的角度上一步步推这个结论!别慌,这个证明非常的直观,只需要你有一点点的极限基础!
证明:梯度是函数增长最快的方向
这里先给出一个总体的大概框架(并不严格数学准确,只是一在三维空间中简化的直观理解):
首先在这座山上的某一点,我们可以用一个平面去近似,如下图的红色平面所示,所以我们需要要求山上这个地方够平滑( 可微 ),想想如果山坡凹凹凸凸的你很难用一个平面去近似这个山坡( 不可微 )。
因此,我们先给出第一个核心的概念点:如果一个曲面是可微的,那么对于曲面上一点,可以使用切平面近似替代改点的曲面,详细参考全微分 的定义。
使用切平面有啥好处?最主要是他简单,特别是对于函数值和自变量的关系是线性的,比如对于平面 $z=ax+by+c$ ,我们往 $x$ 方向走一个单位,$z$ 就会增加 $a$ ,往 $y$ 走一个单位,$z$ 就会增加 $b$ ,你也同时随便往 $x$ 走 $0.5$个单位,往 $y$ 走$0.6$个单位,$z$ 对应增加 $0.5a+0.6y$ ,这就是线性的力量!
最后,我们只要搞清楚这里面的 $a$ 和 $b$ ,就可以去近似我们往某个方向走,函数值可以增加多少了。
接下来我们开始证明,
首先考虑一个可微函数(这是关键!否则,我们无法通过平面在局部近似函数) $z=f\left(x,y\right)$ 在点 $A\left({x}_{0},{y}_{0}\right)$ 处。我们可以用一个平面来局部近似这个函数:
${z}^{\prime }=ax+by+c$
$z$ 的增量,用 $\mathrm{\Delta }z$ 表示,可以写为:
$\mathrm{\Delta }z=f\left({x}_{0}+\mathrm{\Delta }x,{y}_{0}+\mathrm{\Delta }y\right)-f\left({x}_{0},{y}_{0}\right)...\left(1\right)$
利用线性近似,也就是上图中的红色平面来近似这个目标函数:
$\begin{array}{c}\mathrm{\Delta }{z}^{\prime }=a\left({x}_{0}+\mathrm{\Delta }x\right)+b\left({y}_{0}+\mathrm{\Delta }y\right)+c-\left(a{x}_{0}+b{y}_{0}+c\right)=a\mathrm{\Delta }x+b\mathrm{\Delta }y\\ \mathrm{\Delta }{z}^{\prime }=a\mathrm{\Delta }x+b\mathrm{\Delta }y...\left(2\right)\end{array}$
其中 $a,b$ 是待定常数。 $\mathrm{\Delta }z$ 和线性近似之间的误差,即上图中的黄色虚线:
$\mathrm{\Delta }z-\mathrm{\Delta }{z}^{\prime }=\text{error}$
当 $\mathrm{\Delta }x,\mathrm{\Delta }y\to 0$ 时,我们将误差项表示为 $ϵ\left(\mathrm{\Delta }x,\mathrm{\Delta }y\right)$
由于函数是可微的,无论从哪个方向逼近,都可以保证误差项足够小。所以我们可以写为:
$\mathrm{\Delta }z=a\mathrm{\Delta }x+b\mathrm{\Delta }y+ϵ\left(\mathrm{\Delta }x,\mathrm{\Delta }y\right)...\left(3\right)$
此外,可微性意味着误差项为距离的高阶无穷小 $o\left(\sqrt{\left(\mathrm{\Delta }x{\right)}^{2}+\left(\mathrm{\Delta }y{\right)}^{2}}\right)$ ,即 $\frac{ϵ\left(\mathrm{\Delta }x,\mathrm{\Delta }y\right)}{\sqrt{\left(\mathrm{\Delta }x{\right)}^{2}+\left(\mathrm{\Delta }y{\right)}^{2}}}\to 0$ ,其中 $\sqrt{\left(\mathrm{\Delta }x{\right)}^{2}+\left(\mathrm{\Delta }y{\right)}^{2}}$ 表示点 $A\left({x}_{0},{y}_{0}\right)$ 和点 $\left({x}_{0}+\mathrm{\Delta }x,{y}_{0}+\mathrm{\Delta }y\right)$(图中的蓝线)的距离。
这里不想看也没关系,这一步主要的目的就是想表达,用平面去近似的误差的非常小的。
接下来求 $a$ 和 $b$
我们先考虑在 $x$ 方向变化对 $z$ 的影响,我们首先设 $\mathrm{\Delta }y=0$ ,只考虑 $x$ 方向的变化,而 $\mathrm{\Delta }z$ 有两种表示方式,分别是(1)和(3),因此变化率 $\frac{\mathrm{\Delta }z}{\mathrm{\Delta }x}$ :
$\begin{array}{rl}{\frac{\mathrm{\Delta }z}{\mathrm{\Delta }x}|}_{\mathrm{\Delta }y=0}={\frac{\left(1\right)}{\mathrm{\Delta }x}|}_{\mathrm{\Delta }y=0}& ={\frac{\left(3\right)}{\mathrm{\Delta }x}|}_{\mathrm{\Delta }y=0}\\ =\frac{f\left({x}_{0}+\mathrm{\Delta }x,{y}_{0}\right)-f\left({x}_{0},{y}_{0}\right)}{\mathrm{\Delta }x}& =\frac{a\mathrm{\Delta }x+ϵ\left(\mathrm{\Delta }x,0\right)}{\mathrm{\Delta }x}\end{array}$
让 $\mathrm{\Delta }x\to 0$ ,方程的左侧变为:
$\underset{\mathrm{\Delta }x\to 0}{lim}\frac{f\left({x}_{0}+\mathrm{\Delta }x,{y}_{0}\right)-f\left({x}_{0},{y}_{0}\right)}{\mathrm{\Delta }x}=\frac{\partial f}{\partial x}$
这正是函数 $f$ 在点 $A\left({x}_{0},{y}_{0}\right)$ 处关于 $x$ 的偏导数定义,因此可以解出:$a=\frac{\partial f}{\partial x}$ ,
同理对于 $b:b=\frac{\partial f}{\partial y}$ .
现在我们可以将线性近似(3)重写为:
$\mathrm{\Delta }z=\frac{\partial f}{\partial x}\mathrm{\Delta }x+\frac{\partial f}{\partial y}\mathrm{\Delta }y+ϵ\left(\mathrm{\Delta }x,\mathrm{\Delta }y\right)$
方向导数和增长最快的方向
最后我们可以开始讨论如何找到增长最快的方向。假设我们想找到函数 $f\left(x,y\right)$ 在单位向量 $v=\left({v}_{x},{v}_{y}\right)$ 方向上的变化率。我们从点 $\left({x}_{0},{y}_{0}\right)$ 出发,沿向量 $v=\left({v}_{x},{v}_{y}\right)$ 的方向移动。也就是说我们现在在山上不只是往数轴方向走了,我们现在决定随便选一个方向乱走,看看往每个方向走能上多少山下多少山XD.
函数 $f\left(x,y\right)$ 在方向 $v$ 上的变化率称为方向导数。方向导数定义为:
${\mathrm{abla }}_{v}f\left(x,y\right)=\underset{t\to 0}{lim}\frac{f\left({x}_{0}+t{v}_{x},{y}_{0}+t{v}_{y}\right)-f\left({x}_{0},{y}_{0}\right)}{t}$
因为 $v$ 是给定方向,沿着方向 $v$ 的轨迹可以表示为:
$\mathrm{\Delta }x=t{v}_{x},\phantom{\rule{1em}{0ex}}\mathrm{\Delta }y=t{v}_{y}$
我们可以将上述方程改写为:
${\mathrm{abla }}_{v}f\left(x,y\right)=\underset{t\to 0}{lim}\frac{f\left({x}_{0}+\mathrm{\Delta }x,{y}_{0}+\mathrm{\Delta }y\right)-f\left({x}_{0},{y}_{0}\right)}{t}=\underset{t\to 0}{lim}\frac{\mathrm{\Delta }z}{t}$
我们把上面算出来的平面放进来,根据(3),我们可以改写上述方程为:
${\mathrm{abla }}_{v}f\left(x,y\right)=\underset{t\to 0}{lim}\frac{at{v}_{x}+bt{v}_{y}+ϵ\left(t{v}_{x},t{v}_{y}\right)}{t}=a{v}_{x}+b{v}_{y}+\underset{t\to 0}{lim}\frac{ϵ\left(t{v}_{x},t{v}_{y}\right)}{t}$
当 $t\to 0$ 时,我们已经证明了误差的可以忽略的,因此可以得到:
${\mathrm{abla }}_{v}f\left(x,y\right)=\frac{\partial f}{\partial x}{v}_{x}+\frac{\partial f}{\partial y}{v}_{y}.$
至此,我们就得到了 ${360}^{\circ }$ 无死角的无论你怎么走,我们都能算出你上下山的变化率了,最后一步,就是看看我们到底是往那个方向走,可以最快地上山。
结论
当方向向量 $v=\left({v}_{x},{v}_{y}\right)$ 与梯度向量 $\mathrm{abla }f=\left(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\right)$ 一致时,方向导数达到最大值:
${\mathrm{abla }}_{v}f\left(x,y\right)=\frac{\partial f}{\partial x}{v}_{x}+\frac{\partial f}{\partial y}{v}_{y}=\mathrm{dot}\left(\mathrm{abla }f,v\right)=|\mathrm{abla }f||v|\mathrm{cos}\theta$
其中 $\theta$ 是 $\mathrm{abla }f$ 和 $v$ 之间的夹角。换句话说,梯度向量指向函数增加最快的方向。
因此,当你站在山上并选择 $\theta ={0}^{\circ }$ 的方向时,你将以最快的速度上山。而当 $v=\left(-\frac{\partial f}{\partial x},-\frac{\partial f}{\partial y}\right),\theta ={180}^{\circ }$ 时,你将以最快的速度下山,这也是为什么在机器学习中,或者
在我们希望最小化函数的任务中,我们使用负梯度来在优化过程中更新权重。
同样的,如果你选择往垂直于梯度方向走,也就是 $\theta ={90}^{\circ }/-{90}^{\circ }$ 时,$|\mathrm{abla }f||v|\mathrm{cos}\theta =0$ 也就意味着函数值沿着这个方向走不会发生变化。这正是在为什么在拉格朗日优化 ${}^{+}$中,对于约束项的梯度方向一定是垂直于约束函数的轨迹的,因为对于约束 $g\left(x,y\right)=0$ 无论约束上的 $x,y$ 如何变化,函数值都是不变的,也就是说如果你在约束函数上沿着轨迹上走,那一定是沿着垂直于梯度的方向在走。
关于梯度与导数
刚开始接触梯度下降我总是用平面函数去理解,于是我陷入了一个非常容易混淆的误区,如果一个点的梯度是负的,那么这个梯度的反方向目标函数岂不是应该上升?哪来的梯度下降呢?
其实这句话就是因为对于梯度的定义不清晰,对于函数 $f\left({x}_{1},{x}_{2},\dots ,{x}_{n}\right)$ 而言,梯度是定义在 n 维空间的一个向量场,而不是每个点简单地进行偏导数组合!而对于每个点的这个对应的向量,就是函数值增加最快的方向,也就是说梯度是一个在变量空间里的向量。
回到—维的情况,梯度退化为导数,似乎表面上是是一个标量了,但是其实方向就隐藏在了这个标量的正负号里!+-对应了数轴的正负方向,这里就需要注意一个产生误区的地方。
导数:是沿着数轴方向,$f\left(x\right)$ 对应 $x$ 的变化率,是一个标量
梯度:本身作为一个向量,在变量空间中指向函数增加最快的方向。
所以在一维的情况下,如果导数是负的,那么梯度是沿着数轴的负方向的。那么梯度的反向就是函数值减小最快的方向,也就是数轴的正方向。
如果函数是可微的,可以通过平面局部近似函数,得到 $\mathrm{\Delta }z=a\mathrm{\Delta }x+b\mathrm{\Delta }y+ϵ\left(\mathrm{\Delta }x,\mathrm{\Delta }y\right)$ 。
并且 $a=\frac{\partial f}{\partial x},b=\frac{\partial f}{\partial y}$ 。
我们使用方向导数来确定函数在给定方向上的变化率,并利用 $\mathrm{\Delta }z$ 的近似来找到梯度向量(函数的偏导数),方向单位向量和方向导数(函数在给定方向的变化率)之间的关系
${\mathrm{abla }}_{v}f\left(x,y\right)=\frac{\partial f}{\partial x}{v}_{x}+\frac{\partial f}{\partial y}{v}_{y}$
-最后,我们发现当方向单位向量与梯度向量一致时,函数的变化率达到最大值,即梯度向量指向函数增加最快的方向。