本文开始介绍一种全新的优化方法——共轭梯度法。
最初,共轭梯度法是用来求解线性方程
问题描述
共轭梯度法并不适用于任意线性方程,它要求系数矩阵对称且正定。我们会在后面逐渐提到为什么会有这样苛刻的要求。
比较巧的是,在非线性优化问题中,所有的二阶方法的每次迭代都需要求解一个形如
之前,我们都默认直接对系数矩阵求逆,得到
具体如何实现呢?我们先额外构造一个二次函数
如果对该函数求导,并令导数为零,我们得到
你会发现,使得该函数导数为0的
寻找思路
如何求二次函数极值?可以用之前讲过的最速下降法、牛顿法之类的方法吗?
显然,牛顿法我们不用考虑了,因为刚才提到,求解线性方程其实是牛顿法的每次迭代都要面对的问题,所以它们不是一个层次上的问题。最速下降法倒是可以考虑,我们只需要求解当前位置的导数
对于一个简单的二次函数,最速下降法竟然走出这么蜿蜒曲折的路径,这要用在求解线性方程上,恐怕比直接矩阵求逆还要慢。
我们仍然以上图所示的二维目标函数为例,最好的结果是走出下面这条路径。
我们这样解读这条新的路径:整个路径只有两段,即两次迭代,对应着目标函数只有两维。第一次迭代从
重新审视这一路线,可以发现,每次迭代的前进方向是互相正交的,因为都是沿着坐标轴前进的。但最速下降法的搜索路径也是互相正交的,为什么就不行呢?如果我们把目标函数稍微旋转一下,就会发现问题的关键。
这是另一个二次函数,它与前面的二次函数很不一样,椭圆的轴不与坐标轴平行。(这里补充一点,之所以我们画出的二次函数的图形都是椭圆,是因为我们只考察系数矩阵为对称阵的情况。)此时,仍然沿着坐标轴搜索,这就是不折不扣的最速下降法了。这说明,能不能在两次迭代内达到极小值,与是否沿着坐标轴搜索没什么关系,关键在于椭圆的轴是否与搜索方向一致。在第一种情况中,椭圆的轴与坐标轴平行,搜索方向也和坐标轴平行,所以两次迭代即可。第二种情况中,椭圆的轴不与坐标轴平行,搜索方向依旧与坐标轴平行,所以两次迭代是不够的。这给了我们一些提示,如果我们先算出椭圆长短轴的方向,然后沿着这些方向去搜索,就能在两个迭代后达到极小值。
从上面的二维函数推广到N维函数,想象N维空间中的椭圆,我们仍然可以计算出每一维的轴向,然后沿着这些轴搜索,就能确保在N次迭代后达到极小值。那如何求椭圆的轴呢?很简单,椭圆的轴其实就是系数矩阵的特征向量,对
那么,有没有不求特征值,也能在N次迭代达到极小值点的方法呢?比如,能不能走出下面这样的路径。
第一次迭代前进的方向并不与椭圆的轴平行,在这种情况下,第二次迭代却能一次达到最优点。异想天开?当然不是,共轭梯度法就是要走出这样的路线。
我们用数学工具探究一下这种路径需要满足的条件。对于二次函数中的任意一个点来说,该点与函数极值点的连线正是牛顿法中每次迭代的线搜索方向。回顾线搜索与信赖域中的式(2.14),套用这里的系数矩阵,可以得到图中的向量
其中,最后两个梯度的乘积等于0是因为最速下降法的每次迭代方向都是垂直的。我们从二维例子中推出了一个看起来有些意义的结果,这个结果表明,连续的两次迭代的前进方法关于系数矩阵
接下来的问题是如何把这一结论推广到N维目标函数中去,我们先不关注证明,直接看一下结论。
共轭梯度法
对于一组向量
则称这组向量与对称正定矩阵
可见,刚才我们发现的正是共轭的性质,只不过,推广到高维空间后,任意两个向量之间都要关于
共轭向量的好处正如我们前面发现的,依次沿着每个向量优化,最终可以在N个迭代后达到极小值。书中有严格的证明,但我们无意在此着墨,我认为结合上面的例子便可以理解其中的思想。
现在的问题是,给定任意一个对称正定矩阵,如何求取一组共轭向量?
显然,
实际中,需要一种不依赖于矩阵分解,可以在每次迭代时以较小的代价计算出
满足式(5.4)的共轭向量有无数个,而我们只需要取其中的一个。在
在此基础上,结合数学归纳法,我们可以证明,令
其中
即可使得生成的所有
于是,整个共轭梯度法的流程整理如下
其中,用
实际中,为了降低计算量,一般会对式(5.13)稍做改动,得到下面的算法流程
这一版本的共轭梯度算法涉及的矩阵乘法和加法会更少一些。
收敛速度
优化算法的收敛速度是个值得关心的问题。前面提到了,共轭梯度法一定会在N次迭代内收敛到极值。但在N次迭代的过程中,收敛速度怎样呢?
我们用线搜索(二):收敛性和收敛速度中提到过的向量的矩阵范数来衡量共轭梯度法的收敛速度。比如,评估
其中,
如果矩阵
可以发现该多项式满足
此时有,
其中,第二行用特定的
这是个非常好的性质,它说明,共轭梯度法在N次迭代后收敛其实是最坏情况下的结果,当特征值存在重叠时,只需要更少的迭代次数就能收敛。
不过,以上还没有回答我们想要了解的问题,在迭代过程中,算法的收敛速度如何。下面的式子在一定程度上给出了回答(这里仍然省略证明)
在第
在7次迭代后就达到了比较小的值。这是因为除了5个较大的特征值,其它特征值都集中在一个聚类中。根据前面得出的结论,如果
如果我们进一步对式(5.34)放缩,可以得到一个更宽松的收敛性质
在该式中,收敛速度受
既然共轭梯度法的收敛速度如此依赖于特征值分布,我们理应做点什么,以改善那些特征值分布不佳的情况。
预处理策略
最容易想到,也是最有效的方法就是,对
针对
其中,新优化方程中的系数矩阵为
但问题的关键在于如何选择合适的
考虑预处理之后,式(5.23)转化为如下算法
从
总结
本文介绍了线性共轭梯度法,这是一种以迭代的方式求解线性方程的方法。这种方法的妙处在于,不需要矩阵分解和求逆,只需要上次迭代的步长和当前的梯度,即可计算下次的步长。计算量极低,且不占用额外的内存空间,适用于求解大规模的线性方程。
参考资料
Chapter 16 Preconditioning Illinois math course
上一篇:信赖域(二):确切方法
下一篇:共轭梯度法(二):非线性共轭梯度