最速下降法(又称梯度法,或Steepest Descent),是无约束最优化领域中最简单的算法,单独就这种算法来看,属于早就“过时”了的一种算法。但是,它的理念是其他某些算法的组成部分,或者说是在其他某些算法中,也有最速下降法的“影子”。因此,我们还是有必要学习一下的。
我很久以前已经写过一篇关于最速下降法的文章了,但是这里我还打算再写一篇,提供更多一些信息,让大家可以从更简单生动的方面去理解它。
『1』名字释义
最速下降法只使用目标函数的一阶导数信息——从“梯度法”这个名字也可见一斑。并且,它的本意是取目标函数值“最快下降”的方向作为搜索方向。于是我们就想知道这个问题的答案:沿什么方向,目标函数
f(x)
的值下降最快呢?
『2』函数值下降最快的方向
先说结论:沿负梯度方向
d=−gk
,函数值下降最快。
下面就来推导一下。
将目标函数
f(x)
在点
xk
处泰勒展开(这是我们惯用的“伎俩”了)——
f(x)=f(xk)+αgTkdk+o(α)
高阶无穷小
o(α)
可忽略,由于我们定义了步长
α>0
,因此,当
gTkdk<0
时,
f(x)<f(xk)
,即函数值是下降的。此时
dk
就是一个下降方向。
但是
dk
具体等于什么的时候,可使目标函数值下降最快呢?
文章来源:http://www.codelast.com/
由Cauchy-Schwartz不等式(柯西-许瓦兹不等式)可得:
∣∣dTkgk∣∣≤∥dk∥∥gk∥
当且仅当
dk=gk
时,等号成立,
dTkgk
最大(>0)。
所以
dk=−gk
时,
dTkgk
最小(<0),
f(x)
下降量最大。
所以
−gk
是最快速下降方向。
『3』缺点
它真的“最快速”吗?答案是否定的。
事实是,它只在局部范围内具有“最速”性质。
对整体求解过程而言,它的下降非常缓慢。
『4』感受一下它是如何“慢”的
先来看一幅图(直接从维基百科上弄过来的,感谢Wiki):
![](https://i-blog.csdnimg.cn/blog_migrate/94b7d1cf6aeb8c33bb5ce8cc9878aea7.png)
文章来源:http://www.codelast.com/
这幅图表示的是对一个目标函数的寻优过程,图中锯齿状的路线就是寻优路线在二维平面上的投影。
这个函数的表达式是:
f(x1,x2)=(1−x1)2+100⋅(x2−x12)2
它叫做Rosenbrock function(罗森布罗克方程),是个非凸函数,在最优化领域,它通常被用来作为一个最优化算法的performance test函数。
我们来看一看它在三维空间中的图形:
![Rosenbrock function 3D](https://i-blog.csdnimg.cn/blog_migrate/edae1198cbfc2f85b0bbfb56d992884a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/1bfab7e6835b60f5456881410356ad36.jpeg)
它在三维空间中的图形是这样的:
![](https://i-blog.csdnimg.cn/blog_migrate/c61b664606198848855d2d76572c60e6.jpeg)
『5』为什么“慢”的分析
上面花花绿绿的图确实很好看,我们看到了那些寻优过程有多么“惨烈”——太艰辛了不是么?
但不能光看热闹,还要分析一下——为什么会这样呢?
由 精确line search满足的一阶必要条件,得:
∇f(xk+αkdk)Tdk=0 ,即 gTk+1dk=0
故由最速下降法的 dk=−gk 得:
gTk+1dk=gTk+1(−gk)=−gTk+1gk=−dTk+1dk=0⇒ dTk+1dk=0
即:相邻两次的搜索方向是相互直交的(投影到二维平面上,就是锯齿形状了)。
对精确的line search(线搜索),有一个重要的定理:
这个定理表明,当前点在 dk 方向上移动到的那一点( xk+αkdk )处的梯度,与当前点的搜索方向 dk 的点积为零。
其中, αk 是称之为“步长”的一个实数,它是通过line search算法求出来的。
为什么会有这样的结论?我们来看看。
对每一个line search过程来说,搜索方向
dk
已经已经是确定的了(在最优化算法中,如何找出一个合适的
dk
不是line search干的事情)。所以,在一个确定的
dk
上,要找到一个合适的
αk
,使得
ϕ(α)=f(xk+αdk)
这个函数满足
f(xk+αkdk)<f(xk)
,这就是line search的目的。说白了,就是要找到
αk
使
ϕ(α)
的函数函数值变小。
文章来源:http://www.codelast.com/
但是,要小到什么程度呢?假设小到有可能的“最小”,即:
ϕ(αk)=f(xk+αkdk)=minα>0f(xk+αdk)=minα>0ϕ(α)
那么,我们称这样的line search为“精确的line search”——你看,这名字好贴切:我们精确地找到了函数值最小的那个点。
既然
xk+αkdk
是函数值最小的那个点,那么,在该点处的一阶导数(即梯度)为零,所以我们对上式求导(
α
是自变量,
xk
和
dk
为常量):
ϕ′(αk)=[f(xk+αkdk)]′⋅(0+1⋅dk)=[f(xk+αkdk)]′dk=∇f(xk+αkdk)Tdk=0
这就是我们前面说的定理了。
文章来源: http://www.codelast.com/
如果你非要问,为什么 dTk+1dk=0 就表明这两个向量是相互直交的?那么我就耐心地再解释一下:
由两向量夹角的公式:
![](https://i-blog.csdnimg.cn/blog_migrate/7a803928c20c2fd31f51b0bebba7f6f4.png)
=> θ=π2
两向量夹角为90度,因此它们直交。
『6』优点
这个被我们说得一无是处的最速下降法真的就那么糟糕吗?其实它还是有优点的:程序简单,计算量小;并且对初始点没有特别的要求;此外,许多算法的初始/再开始方向都是最速下降方向(即负梯度方向)。
文章来源:http://www.codelast.com/
『7』收敛性及收敛速度
最速下降法具有整体收敛性——对初始点没有特殊要求。
采用精确线搜索的最速下降法的收敛速度:线性。