最速下降法/steepest descent,牛顿法/newton,共轭方向法/conjugate direction,共轭梯度法/conjugate gradient 及其他

转载须注明出处:http://www.codelast.com/

 

在最优化的领域中,这“法”那“法”无穷多,而且还“长得像”——名字相似的多,有时让人觉得很迷惑。

在自变量为一维的情况下,也就是自变量可以视为一个标量,此时,一个实数就可以代表它了,这个时候,如果要改变自变量的值,则其要么减小,要么增加,也就是“非左即右“,所以,说到“自变量在某个方向上移动”这个概念的时候,它并不是十分明显;而在自变量为n(n≥2)维的情况下,这个概念就有用了起来:假设自变量X为3维的,即每一个X是(x1, x2, x3)这样的一个点,其中x1,x2和x3分别是一个实数,即标量。那么,如果要改变X,即将一个点移动到另一个点,你怎么移动?可以选择的方法太多了,例如,我们可以令x1,x2不变,仅使x3改变,也可以令x1,x3不变,仅使x2改变,等等。这些做法也就使得我们有了”方向“的概念,因为在3维空间中,一个点移动到另一个点,并不是像一维情况下那样“非左即右”的,而是有“方向”的。在这样的情况下,找到一个合适的”方向“,使得从一个点移动到另一个点的时候,函数值的改变最符合我们预定的要求(例如,函数值要减小到什么程度),就变得十分有必要了。

文章来源:http://www.codelast.com/

前奏已经结束,下面进入正题。

1最速下降法(或:梯度法)

加注:我又写了一篇关于最速下降法的文章,更详细,请看这里

很形象,也许你的脑子里一闪而过的,就是:取可以让目标函数值最快速“下降”的方法?差不多是这么回事。严谨地说:以负梯度方向作为极小化方法的下降方向,这种方法就是最速下降法

为什么是负梯度方向使目标函数值下降最快?以前我也只是死记硬背,背出来的东西虽然有用,终究还是令人糊涂的。所以有必要写出它”为什么“的理由:

我们正在讨论的是”n维空间中的一个点移动到另一个点之后,目标函数值的改变情况“,因此,先直接写出代表最终的目标函数值的数学表达式:

dest function value taylor series

start point:代表第k个点的自变量(一个向量)。

direction:单位方向(一个向量),即 |d|=1。

step:步长(一个实数)。

gradient:目标函数在Xk这一点的梯度(一个向量)。

higher-order infinitesimal:α的高阶无穷小。

文章来源:http://www.codelast.com/

显然,这个数学表达式是用泰勒公式展开得到的,样子有点难看,所以对比一下自变量为一维的情况下的泰勒展开式

one dimension taylor series

就知道多维的情况下的泰勒展开式是怎么回事了。

在[1]式中,高阶无穷小可以忽略,因此,要使[1]式取到最小值,应使gradient multiplied by direction取到最小——这是两个向量的点积(数量积),何种情况下其值最小呢?来看两向量vector a and b的夹角θ的余弦是如何定义的:

cosθ

假设向量direction与负梯度negative gradient的夹角为θ,我们便可求出点积gradient multiplied by direction的值为:

value of gradient multiplied by direction

可见,θ为0时,上式取得最小值。也就是说,directionnegative gradient时,目标函数值下降得最快,这就是称负梯度方向为“最速下降”方向的由来了。

文章来源:http://www.codelast.com/

最速下降法的收敛性:对一般的目标函数是整体收敛的(所谓整体收敛,是指不会非要在某些点附近的范围内,才会有好的收敛性)。

最速下降法的收敛速度:至少是线性收敛的。

 

【2】牛顿法

上面的最速下降法只用到了梯度信息,即目标函数的一阶导数信息,而牛顿法则用到了二阶导数信息。

start point点处,对目标函数进行泰勒展开,并只取二阶导数及其之前的几项(更高阶的导数项忽略),得:

taylor seires at Xk

gradient:目标函数在Xk这一点的梯度(一个向量)。

Hesse matrix:目标函数在Xk这一点的Hesse矩阵(二阶导数矩阵),这里假设其是连续的。

由于极小值点必然是驻点,而驻点是一阶导数为0的点,所以,对 r(X) 这个函数来说,要取到极小值,我们应该分析其一阶导数。对X求一阶导数,并令其等于0:

当Gk的逆矩阵存在,也即Gk非奇异矩阵的时候,将上式两边都左乘Gk的逆矩阵Gk-1,得:

calculate next point

到了这一步,已经很明显了。这个式子表达了下一点的计算方法:Xk在方向d上按步长1(1×d = d)移动到点X。所以我们知道方向d怎么求了:

solve equation to get d

如果你觉得上式有点奇怪:为什么都得到了d的表达式,还要再弄出一个Gkd=-gk?那么我说:因为在实际应用中,d并不是通过Gk-1与gk相乘来计算出的(因为我们并不知道逆矩阵Gk-1是什么),而是通过解方程组Gkd=-gk求出的。这个解方程组的过程,其实也就可能是一个求逆矩阵的过程。关于解此方程组的方法,可以参考这一篇文章。关键时刻,概念清晰很重要。

有人说,那么方程组可能无解呢?没错,方程组可能是奇异的,在这种情况下,就需要用到其他的修正技术,来获取搜索方向了,本文不谈。

文章来源:http://www.codelast.com/

上面关于牛顿法的各种推导可能让你觉得杂乱无章,但实际上它们就是牛顿法的基本步骤:每一步迭代过程中,通过解线性方程组得到搜索方向,然后将自变量移动到下一个点,然后再计算是否符合收敛条件,不符合的话就一直按这个策略(解方程组→得到搜索方向→移动点→检验收敛条件)继续下去

牛顿法的收敛性:对一般问题都不是整体收敛的(只有当初始点充分接近极小点时,才有很好的收敛性)。

牛顿法的收敛速度:二阶收敛。因此,它比最速下降法要快。

 

3】共轭方向法

加注:我又写了一篇关于共轭方向法的文章,更详细,请看这里
上面的方法,前、后两次迭代的方向并没有特别的相关要求,而共轭方向法则有了——它要求新的搜索方向与前面所有的搜索方向是共轭的。由于搜索方向是向量,所以也就是说,这些向量是满足共轭条件的:

conjugate condition

其中,m≠n,dm和dn分别为两个向量(搜索方向),G为对称正定矩阵。

对于“共轭”,我有一个自己“捏造”出来的说法,来帮助你记忆它的含义:看到“共轭”,就想到“共遏”,即“互相遏制”,这不,两个向量中间夹着一个矩阵互相发力,结果谁也占不到便宜——积为0。

共轭方向法也是只利用了目标函数的梯度信息,即一阶导数信息,不用计算Hesse矩阵,使得其计算量比牛顿法小很多。

但是,怎么在每一步迭代的过程中,都得到若干个两两共轭的搜索方向?Powell共轭方向集方法是一个选择,它可以构造出若干个两两共轭的方向。不过,它本身也有一些缺陷:在构造共轭方向的过程中,各方向会逐渐变得线性相关,这就达不到“共轭”的要求了。所以,有很多种对Powell算法进行修正的策略被人们应用到了实际场景中,现在说到Powell方法,应该或多或少都包含了那些修正策略吧(我的感觉)。

特别值得一提的是,在共轭方向法中,新搜索方向的确定,是要满足“下降”条件的,即方向与梯度之积<0:

descent property

是不是意味着目标函数值下降量越大,这个方向就越可取呢?不是。在人们已经发现的修正Powell算法的有效方法中,有一种方法是舍弃目标函数值下降最大的方向——这看似不合理的做法恰恰蕴含了合理的结果:放弃目标函数值下降最大的方向能更好地避免各方向线性相关。关于这一点,这里就不详述了。

一句话总结共轭方向法的过程:选定搜索方向d,使之满足共轭条件以及下降条件,在此搜索方向上通过精确线搜索确定移动的步长,然后将当前点移动到下一点,再重新选定搜索方向,周而复始,直到满足终止条件。

文章来源:http://www.codelast.com/

共轭方向法的收敛性:对二次函数,最多在n步(n为自变量的维数)内就可找到其极小值点。对一般的非二次函数,经适当修正后,也可以达到相同的效果。

共轭方向法的收敛速度:比最速下降法快,比牛顿法慢。

 

4】共轭梯度法

注意:下面那些长长的推导过程,其实是有部分错误的,当年我认为我弄懂了,其实到了某个推导步骤以后,我就理解错了,只不过我以为我对了,我即将在另一篇文章里写上我认为正确的推导,对不住大家了...
“共轭梯度法”是一种特殊的“共轭方向法”。既然叫共轭梯度法,它与梯度必然是有关系的。共轭方向法与梯度也有关系——共轭方向法利用了目标函数的梯度信息(梯度与方向的积满足“下降”条件)。共轭梯度法与此关系有所区别:用当前点的负梯度方向,与前面的搜索方向进行共轭化,以得到新的搜索方向

具体来说,这个新的搜索方向是怎么计算出来的呢?推导起来比较麻烦,下面就慢慢道来。

首先,需要说明共轭梯度法的一个理论基础(记为T1)在迭代过程中,我们会从初始点开始,在搜索方向上通过精确线搜索的方法,找到使目标函数值符合要求(例如,min f(X))的步长,然后将点移动到下一点。这样不断进行下去,就会得到很多个点。在N维空间Rn中,在每一个搜索方向上,都有无数个点,它们构成了一个轨迹(或者说一个集合),我们称之为线性流形——拿二维空间(二维平面)作比喻,就好像是一个点在二维平面上的移动形成的轨迹:

two-dimension track

只不过在高维空间中,我们想像不出这个轨迹的样子,不过这没关系,能引申上去就好了。

当目标函数是二次函数时,在这个线性流形中,每一个我们迭代到的点都是极小值点。在某些书中,你可能还会看到一种说法,称此线性流形为N维超平面,也是一个意思,不过概念太多了会让人很晕,尤其是在没有掌握足够的背景的情况下,往往不能判断一个概念与另一个概念是不是同一个意思,这样就导致理解受到影响,因此,在刚开始学习的时候,我觉得努力弄懂一个概念就好了。

这个理论基础在推导“如何获取共轭梯度法的搜索方向”的过程中会用到。

文章来源:http://www.codelast.com/

由于上面的理论基础是在目标函数为二次函数的情况下得到的,因此,在推导共轭梯度法的搜索方向的公式之前,我们先假定目标函数是二次函数:

 

quadratic function(x - multidimensional)

其中G为n阶对称正定矩阵。X为自变量(一个n维向量)。

如果觉得这个X为n维向量的函数形式有点怪的话,那么还是对比一下X为1维(可以视为一个标量)的函数形式,就很清楚了:

quadratic function(x - one dimension)

在下面的推导过程中,如果你遇到看上去很“别扭”的式子,只要按照这样的规则来对比就行了。

由于共轭梯度法就是与梯度相关的方法,因此我们必须要求[2]式的函数的梯度(即一阶导数):

gradient of dest function

现在,假设初始点为X0,我们从X0出发,先推导出前几个搜索方向

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值