现在的位置: 首页 > 综合 > 正文

最优化相关理论

2018年02月20日 ⁄ 综合 ⁄ 共 9871字 ⁄ 字号 评论关闭

发现一个特别好的将最优化基础的博客

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:

stagnation point calculation

当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出发,先推导出前几个搜索方向的计算方法,从而总结出若干规律,进而再得到通用的公式。下面我们就开始这样做。

在每一个迭代点处,新的搜索方向都是用前面的搜索方向与当前点的负梯度方向共轭化得到的。在初始点处,并没有“前面的搜索方向”,因此,初始点处的搜索方向d0简单地定为负梯度方向:

negative gradient direction

上面的式子中,将目标函数在X0点的梯度g(X0)写为g0,是为了表达简洁。同理,g(X1)也记为g1,等等。

第二个迭代到的点为X1,它与X0满足关系:

X1

这表明,点X1是在d0方向上,由X0点移动一定的距离得到的。移动的步长α0,则是通过精确线搜索的方法计算得到的,X1是一个极小值点,在点X1处,目标函数的一阶导数为零,即:

first derivative

所以一阶导数再乘以d0仍然为零:

the product of g1 & d0

这个式子,在紧接着的推导中马上要用到。我发现从[7]到[8]我真的太废话了,好吧,我承认我很啰嗦…

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

既然第一个搜索方向d0毫无难度地取了负梯度方向,那么我们就来看看下一个搜索方向d1怎么获取。从共轭梯度法的定义(或者说是原则)——新的搜索方向是用前面的搜索方向与当前点的负梯度方向共轭化得到的——来看,d1与d0(前面的搜索方向)有关,也与-g1(当前点的负梯度方向)有关,因此,只需要假定d1是-g1与d0的线性组合即可:

relationship of d1, -g1 & d0

其中,r0是一个实数。此外,由于每一个搜索方向与前面的搜索方向都是共轭的,因此,d1与d0还要满足共轭条件:

d1 & d0 are conjugated

但是r0到底是什么值呢?只有知道了r0,我们才能算出d1,从而继续算出d2,d3,……

由上面的式[8],可以联想到,是否在式[9]的左右两边分别乘以一些矩阵或向量,从而得到一个等式,以求出r0?对,就是在式[9]的两边均左乘d0TG,可推出:

value of r0

得到了r0,我们先记下它的形式,后面再使用。紧接着,来计算其他几个式子并由它们得到一些规律。

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

首先是在同一点处,搜索方向与梯度的点积dkTgk

dot product of direction vector & gradient vector

看出规律来了吗?dkTgk=-gkTgk?像这么回事。也就是说,在同一点处,搜索方向与梯度的点积等于负梯度与梯度的点积。所以我们估计d2Tg2,d3Tg3,……都是符合这个规律的。

其次是在某一点处的梯度与前面所有的梯度的点积gmTgn(m>n):

dot product of different gradient vectors

由前文所描述的共轭梯度法的理论基础T1,我们知道点X2,X3,……均为极小值点,因此,在这些点处,目标函数的梯度为零,即g(Xk)=0,所以有g2Td0=0,g2Td1=0,因此上面的[14],[15]式均为零:

dot product of different gradient vectors is zero

又看出一点规律没有?gmTgn=0(m>n)?像是这么回事。也就是说,在某一点处的梯度与前面所有梯度的点积为零。

由上面的特例的计算,我们可以总结出一些规律并用这些规律来得到通用的结论了。假设对所有的搜索方向和梯度,有如下规律:

summarized rules
再重复一遍以上四个式子的含义:同一点处的搜索方向与梯度的点积等于该点处的负梯度与梯度的点积,某一点处的梯度与前面所有搜索方向的点积为0,某一点处的梯度与前面所有梯度的点积为0,某一点处的搜索方向与前面所有搜索方向共轭。

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

前面我们单独地求出了d0和d1,现在要来看方向d的通用的表达式怎么求了。可以设:

general direction expression

 

为什么可以这样表示方向d?乍一看,这个式子表示的含义是:当前点的搜索方向是当前点的负梯度方向与前面所有方向的线性组合——似乎很有道理,但是有什么理论依据可以让我们这样假设呢?其实,这是有线性代数理论支持的,但是这个证明涉及到更多的推导,所以这里就不扯过去了。前文所述的方向d1,也是这样假设之后再求出来的。我就是这样记忆的:当前点的搜索方向是当前点的负梯度方向与前面所有方向的线性组合。我觉得这种感觉很直观,并且也符合我心中的设想,而且事实上它也是对的,初学者就这样记住就好了。

[22]式不够直观,所以,我还是拿一个特例来演示:

an example of the general direction expression

这下够清晰了吧?

但是,如何救出[22]式中的每一个ri,m呢?我们会想到,式子的左边是一个方向向量,在共轭梯度法中,我们要保证某一点的搜索方向与前面所有搜索方向是G共轭的,因此,这提醒了我们,应该在[22]式两边均左乘一个式子,形成“G共轭”的表达式——等式两边均左乘的式子就是dnTG(n=0,1,…,m-1):

formula derivation of variable r

我认为在共轭梯度法的推导中,最令人费解的就是这个式子。恕我愚笨,我看了4本最优化的书才搞懂,每一本书不是这里略过去了,就是那里略过去了,总有让人坐过山车的跨越感,但想明白之后的感觉终究是很舒坦的,我在这里就要把它彻底写明白了。

首先要对一个概念非常清楚:在[24]式中,我们乘的dnTG,不是说我们要乘n个式子,而是说,对[22]式来说,当m选定以后,那么n就唯一选定了。例如,当m=4时,[22]式就是用来求d4的,此时,我们乘的dnTG就是d3TG:

an example of calculating variable r

写得如此详细的一个例子,看懂了吗?从这个例子中,我们知道,对n所取的任何值,在[24]式的求和式∑中,除最后一项外,其余所有项的值均为0——这是因为任何一个方向与前面所有方向都是G共轭的(参看G共轭的定义)。所以现在可以写出[24]式的结果了:

其中,r的写法很不直观——其实,对每一个方向d来说,[25]式中只含有一个r,不会像[24]式那样,由于有多个r,使得必须要用复杂的下标来区分,因此此处我们完全可以用rn来代替[25]式中那个怪怪的r的表达式:

expression of r

顺便将[27]式转换了一下,得到了[29]式,即 r 的计算方法——这就是我们日夜思念的式子啊,终于揭开面纱了!

待补全

共轭梯度法同样会有这样的问题:经过n步迭代之后,产生的新方向不再有共轭性。所以在实际运用中,也有很多修正方向的策略。其中一种策略是:经过n步迭代之后,取负梯度方向作为新的方向。

共轭梯度法的收敛性:比最速下降法的收敛性要好得多。

(1)DFP算法

下面,就从DFP算法来看看“拟牛顿”是如何实现的(DFP算法是以Davidon、Fletcher、Powell三位牛人的名字的首字母命名的)。

前面说了,Hesse矩阵在拟牛顿法中是不计算的,拟牛顿法是构造与Hesse矩阵相似的正定矩阵,这个构造方法,使用了目标函数的梯度(一阶导数)信息和两个点的“位移”(Xk-Xk-1来实现。有人会说,是不是用Hesse矩阵的近似矩阵来代替Hesse矩阵,会导致求解效果变差呢?事实上,效果反而通常会变好。有人又会问为什么?那么就简要地说一下——

牛顿法的原理可知如下几个等式:

newton

若最后一个等式子的最左边 < 0,即,就是直观概念上的“沿方向d上,目标函数值下降”的表达。而在逐步寻找最优解的过程中,我们是要求目标函数值下降的,因此,应该有-(X-Xi)A(X-Xi)
< 0,也即 
(X-Xi)A(X-Xi) > 0。这表明矩阵A是正定的。而在远离极小值点处,Hesse矩阵一般不能保证正定,使得目标函数值不降反升。而拟牛顿法可以使目标函数值沿下降方向走下去,并且到了最后,在极小值点附近,可使构造出来的矩阵与Hesse矩阵“很像”了,这样,拟牛顿法也会具有牛顿法的二阶收敛性。

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

由于涉及到Hesse矩阵(二阶导数矩阵),我们当然要从目标函数 f(X) 的泰勒展开式说开去。与最优化理论中的很多问题一样,在这里,我们依然要假设目标函数可以用二次函数进行近似(实际上很多函数都可以用二次函数很好地近似):

taylor expansion of f(X)

忽略高阶无穷小部分,只看前面的3项,其中A为目标函数的Hesse矩阵(二阶导数矩阵)。此式两边对X求导得:

于是,当 X=Xi 时,将[2]式两边均左乘(Ai+1)-1,有:

上式左右两边近似相等,但如果我们把它换成等号,并且用另一个矩阵H来代替上式中的A-1,则得到:

quasi-newton function

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

这个方程,就是拟牛顿方程,其中的矩阵H,就是Hesse矩阵的逆矩阵的一个近似矩阵。但是,从初始的H0开始,如何得到每一步迭代过程中需要的H1,H2,……呢?在迭代过程中生成的矩阵序列H0,H1,H2,……中,每一个矩阵Hi+1,都是由前一个矩阵Hi修正得到的,这个修正方法有很多种,这里只说DFP算法的修正方法。设:

matrix H

然后又有问题:矩阵E怎么求?再设:

matrix E

其中,m和n均为实数,v和w均为N维向量。将[6]代入[5]式,再将[5]式代入[4]式,可得:

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

[8]式与[7]式完全相同,只不过用简化的记号重写了一下。如果求出了m,n,v,w,就可以知道[6]式怎么求,从而进一步知道[5]式怎么求,从而我们的问题就彻底解决了。符合[7]这个方程的v,w可能有很多,但是我们有没有可能找到v,w的一个“特例”,使之符合这个等式呢?仔细观察一下,是可以找到的:[7]式的右边两个向量相减的结果,是一个n×1的向量,因此,等式左边的计算结果当然也是一个n×1的向量(每一项都是一个n×1的向量),所以我们把[7]式写成了[8]式的样子,可以看到,其中的第二、第三项中的括号里的向量的点积均为实数,这里,可以使第一个括号中的mvTqi值为1,使第二个括号中的nwTqi值为-1,这样的话,v只要取si,w只要取Hiqi,就可以使[8]式成立了。的确,这种带有一点猜测性质的做法,确实可以让我们找到一组适合的m,n,v,w值。

所以,我们得到的m,n,v,w值如下:

m,n,v,w

现在我们几乎大功告成了:将[8]~[11]代入[6]式,然后再将[6]代入[5]式,就得到了Hesse矩阵的逆矩阵的近似阵H的计算方法:

function to calculate H

在上面的推导过程中,有人可能觉得有点无厘头:为什么[6]式要那样假设,是怎么想到的?我能给出的答案是:这一点我也没想明白。如果你知道,请告诉我,非常感谢。某些书上经常写类似于“很显然,XXX”之类的话,从一个定理直接得出了一个让人摸不着头脑的结论,而作为我这样比较笨的人来说,我觉得写书的很多专家们认为“很显然”的东西一点也不“显然”,甚至于有时候,我觉得那就像凤姐突然变成了范冰冰一样——一下子变出来了一个漂亮的结论,难以相信。所以这也是为什么我花费了很多时间,来把一些“很显然”的东西记下来,写明白的原因了。对于大多数牛人,他们需要的当然不是这种思维跨度这么小的文章,而是那种从地球可以一下子飞到火星的文章。所以,我写的东西不适合于水平高的人看,我只期望能帮助一小部分人就知足了。

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

说到这里,那么到底什么是DFP算法呢?上面的矩阵H的计算方法就是其核心,下面再用简单的几句话描述一下DFP算法的流程:

已知初始正定矩阵H0,从一个初始点开始(迭代),用式子 function to calculate search direction in DFP 来计算出下一个搜索方向,并在该方向上求出可使目标函数极小化的步长α,然后用这个步长,将当前点挪到下一个点上,并检测是否达到了程序中止的条件,如果没有达到,则用上面所说的[13]式的方法计算出下一个修正矩阵H,并计算下一个搜索方向……周而复始,直到达到程序中止条件。

有人会说,上面那些乱七八糟的都是搞什么啊,猜来猜去的就折腾出了一个公式,然后就确定这公式能用了?就不怕它在迭代的时候根本无法寻找到目标函数的极小值?正因为有这些疑问,所以在这里,还要提及一个非常重要的问题:我们通过带有猜测性质的做法,得到了矩阵H的计算公式,但是,这个修正过的矩阵,能否保持正定呢?前面已经说了,矩阵H正定是使目标函数值下降的条件,所以,它保持正定性很重要。可以证明,矩阵H保持正定的充分必要条件是:

condition to keep matrix H positive definite

并且,在迭代过程中,这个条件也是容易满足的。此结论的证明并不复杂,但是为了不影响本文的主旨,这里就没有必要写出来了。总之,我觉得作为一个最优化的学习者来说,首先要关注的是不是这些细节问题,而是先假设这些算法都适用,然后等积累到一定程度了,再去想“为什么能适用”的问题。

 

(2)BFGS算法

在上面的DFP算法的推导中,我们得到了矩阵H的计算公式,而BFGS算法和它有点像,但是比它形式上复杂一点。尽管它更复杂,但是在BFGS算法被Broyden,Fletcher,Goldfarb,Shanno四位牛人发明出来到现在的40多年时间里,它仍然被认为是最好的拟牛顿算法。历史总是这样,越往后推移,人们要超越某种技术所需的时间通常就越长。但是我们很幸运地可以站在巨人的肩膀上,从而可以在使用前人已经发明的东西的基础上感叹一声:这玩意太牛了。

好吧,又扯远了…… 回到中心主题,看看在BFGS算法中,与上面的[13]式一样的矩阵H是如何计算的:

matrix H in BFGS

在[14]式中,最后一项(深蓝色的部分)就是BFGS比DFP多出来的东西。其中,w为一个n×1的向量。我们看到,由于向量w的表达式太长,所以没有把它直接写在[14]式中,而是单独列在了[15]式里。

可能[14]式一看就让人头晕,所以先来弱弱地解释一下这个式子的计算结果(如果你觉得好雷人,那么请直接无视):wwT是一个n×1的向量与一个1×n的向量相乘,结果为一个n×n的矩阵,而[14]式中最后一项里,除了wwT之外的那一部分是(1×n)向量、n×n矩阵、n×1向量相乘,结果为一实数,因此[14]式最后一项结果为一个n×n矩阵,这与[14]式等号左边的矩阵H为n×n矩阵一致。这一点没有问题了。

在目标函数为二次型(“在数学中,二次型是一些变量上的二次齐次多项式”)时,无论是DFP还是BFGS——也就是说,无论[14]式中有没有最后一项——它们均可以使矩阵H在n步之内收敛于A-1

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

延伸阅读:BFGS有一个变种(我不知道这样称呼是否正确),叫作“Limited-memory
BFGS
”,简称“L-BFGS”或“LM-BFGS”(这里的“LM”与Levenberg-Marquard算法没有关系),从它的名字上看,你肯定能猜到,使用L-BFGS算法来编写程序时,它会比BFGS算法占用的内存小。从前面的文章中,我们知道,BFGS在计算过程中要存储一个n×n的矩阵,当维数n很大的时候,这个内存占用量会很大——例如,在10万维的情况下,假设矩阵H中的元素以double来存储,那么,内存占用即为100000×100000×8÷1024÷1024÷1024≈74.5(GB),这太惊人了,一般的服务器几乎无法承受。所以,使用L-BFGS来降低内存使用量在某些情况下是非常有意义的。

关于L-BFGS的英文解释,请点击这个Wiki链接。由于我还没有深入学习L-BFGS,所以没办法在这里详细叙述了。

至于后面的部分,还是觉得袁亚湘老师的书比较好懂写

抱歉!评论已关闭.