梯度与梯度下降法

声明: 本文有一部分本人自己的观点和理解, 不一定完全正确, 仅供参考. 如果发现错误或者有疑问的地方, 请指出, 谢谢!

方向导数

导数和偏导数的概念比较简单而且很多人接触过,这里不进行赘诉。

我们直接看方向导数。
对于多变量函数F(x,y,z)F(x, y, z), 我们想知道它在点P0P_0沿方向l\vec l 的变化率,用 FlP0\left. \frac {\partial F} {\partial {\vec l}} \right| _{P_0} 表示。这就是函数F在P点沿方向l\vec l 的方向导数。

如果你熟悉偏导数的话, 你可以看出来方向导数和偏导数很像。偏导数是函数在特定方向上(如x轴, y轴)的变化率。 方向导数是函数在任意方向上的变化率。方向导数可以理解为在任意方向上的偏导数。毕竟我们对于函数的研究不能仅仅局限在某几个方向。

方向导数公式
FlP0=limF(P)F(P0)PP0=FxP0cosα+FyP0cosβ+FzP0cosγ \begin{aligned} \left. \frac {\partial F} {\partial {\vec l}} \right| _{P_0} &= lim \frac {F(P) - F(P_0)} {|PP_0|}\\ &= \left. \frac {\partial F} {\partial x} \right| _{P_0} cos \alpha + \left. \frac {\partial F} {\partial y} \right| _{P_0} cos \beta + \left. \frac {\partial F} {\partial z} \right| _{P_0} cos \gamma \end{aligned}

其中cosαcos \alpha, cosβcos \beta, cosγcos \gamma 分别为l\vec l 与x, y, z 的方向余弦。

梯度

知道了方向导数,我们考虑一个问题:一个点有无数个方向,也就有无数个方向导数(前提是方向导数存在),那么我们最关心的是哪个?(总不能都关心吧,那也太花心了)答案是我们关心最大的方向导数。

最大的方向导数意为着沿着这个方向函数变化最快(函数的变化率最大)。

哪个方向的方向导数最大?

把方向导数的公式变换一下
FlP0=FxP0cosα+FyP0cosβ+FzP0cosγ=Gcosα,cosβ,cosγ=Gcos<G,l> \begin{aligned} \left. \frac {\partial F} {\partial {\vec l}} \right| _{P_0} &= \left. \frac {\partial F} {\partial x} \right| _{P_0} cos \alpha + \left. \frac {\partial F} {\partial y} \right| _{P_0} cos \beta + \left. \frac {\partial F} {\partial z} \right| _{P_0} cos \gamma \\ &= G *(cos \alpha, cos \beta, cos \gamma) \\ &= |G| cos<G, \vec l> \end{aligned}
其中G=(FxP0,FyP0,FzP0)G=(\left. \frac {\partial F} {\partial x} \right| _{P_0}, \left. \frac {\partial F} {\partial y} \right| _{P_0}, \left. \frac {\partial F} {\partial z} \right| _{P_0})
由向量的知识,我们知道当l\vec l与G同向时,即cos<G,l>=1cos<G, \vec l> =1时值最大。

梯度至此诞生

梯度的意义就是用来表示最大的方向导数。

gradF=(Fx,Fy,Fz) grad F = ( \frac {\partial F} {\partial x}, \frac {\partial F} {\partial y}, \frac {\partial F} {\partial z})

说明

  • 梯度是一个向量
  • 梯度的方向是最大方向导数的方向。
  • 梯度的大小是这个最大方向导数的值。

梯度下降法

梯度下降法就是利用梯度的性质求解函数最小值的方法.

[思考]: 对于一元函数我们求解函数最小值的方法有很多, 很多人比较喜欢的就是求导. 如果是多元函数求解最小值或者最大值, 我们还能如此简单的解决吗?该怎么求导? 求偏导吗?求哪个偏导?

显然这个问题不是简单的求导就可以解决的, 我们可以通过梯度下降法解决.

想一想, 梯度代表着什么? 表示最大方向导数的向量. 最大方向导数的代表着函数沿着这个方向增长最快, 如果我们反其道而行之, 是不是方向就是函数减小最快的方向. 如果我们每次都能沿着减小最快的方向逼近最小值, 我们是不是就可以最快的找到最小值(或者近似的最小值).

像这样:
梯度与梯度下降法

可以这样理解梯度下降法, 我们在当前点找到该点的梯度, 然后沿着梯度的负方向前进一段距离到达一个新的点, 然后再计算梯度, 前进一段距离. 一直这样重复下去, 直到找到最小值或者接近最小值.

公式:

θi+1=θiαgradF(θi) \theta_{i+1} = \theta_{i} - \alpha * grad F(\theta_{i})

其中θi\theta_{i} 为当前点, 可以是一个向量, 表示函数的多个自变量.θi+1\theta_{i+1}为下一个点, gradF(θi)grad F(\theta_{i})是当前点的梯度.α\alpha表示步长或者学习率(在深度学习中被称为学习率).

说明:

  1. 式中的α\alpha不能太大也不能太小.
  • 太小, 计算速度慢, 需要迭代很多次.
  • 太大, 可能会跳过最小值.

梯度与梯度下降法

2.由于我们每次更新点都会有一定的步长, 在这段距离中梯度是变化的, 我们在一个点找到的梯度不一定就是这一段的梯度, 所以我们不是一直沿着梯度的负方向前进的. 这一点有点像贪心算法, 基于这一点, 我们也不能让α\alpha太大.

梯度下降法的缺点

如果函数比较复杂, 存在很多局部最小值, 可能最后梯度下降找到的是局部最小值, 而不是全局最小值.

END

谢谢!