上一节笔记传送门:学弱猹:数值优化|笔记整理(2)——线搜索:步长选取条件的收敛性zhuanlan.zhihu.com
————————————————————————————————————
大家好!
我们在上一节花了很多篇幅介绍了线搜索中,步长选取条件的收敛性。那么在这一节,我们会开始关注线搜索中,如何实操中设计不同步长选取条件算法,并且还会关注线搜索中初始步长的选取。当然了,这些部分没有太多的理论性,因此不会占据太长的时间,所以我们可能还会介绍一下优化中的共轭梯度法。
那么我们开始吧。
目录回溯法多项式插值
Strong-Wolfe条件下的多项式插值
初始步长选取——BB步长
非单调下降迭代法简介
共轭梯度法线性情形
SourceJ. Nocedal, S. J. Wright, Numerical Optimization
J. Barzilai and J. M. Borwein, Two-Point Step Size Gradient Methods
回溯法多项式插值
我们在上一节主要介绍了线搜索算法的收敛性,同时我们给出了最速下降法(也叫梯度下降法)的一个算法模板。那么为什么这一节还要在这上面花篇幅呢?事实上我们把我们之前的话反过来说,就是优化具有很强的理论性,但是同样具有很强的实用性。也就是说,如果我们没有考虑到实际应用中所面对的问题,那么一样不能够算学好了优化。因此仅仅通过回溯法(backtracking)去寻找步长自然是不够的,我们还有一些其他的方法可以用来帮助我们选取步长。事实上我们只需要知道这些方法在实操中具有很好的效果就足够了,因为他们的理论比较超纲,掌握并没有太大的必要(事实上在优化中,这样的情况非常常见)。也因此在这一部分,虽然我们的内容量不如之前的理论那么多,也不会有理论部分那么详细,但是其最重要的部分在于实操,也因此在这一块,寻找数值例子和编程才是最重要的。
好的,我们回到我们的正题,也就是插值法。为什么使用插值法呢?这是使用了一个插值逼近的思想。假如说我们有一些点,那么通过这一些点就可以做插值,得到一条曲线。这一条曲线就可以算是插值函数。如果我们只有点本身的信息(比方说
),那么这就是拉格朗日插值,如果还会利用上这个点导数的信息,那么这就是埃尔米特插值(注意Hermite的开头字母H是不发音的)插值函数可以用来逼近我们的实际的函数曲线。
现在我们考虑我们构造的函数
,其中
为步长,
为当前迭代点,
为搜索方向。并且我们有了一个初始步长
(如果是我们的上一节所提到的A-G条件对应的步长,这个初始步长就是1)。那么这样的话实际上我们有了3个信息:
这是一个带有函数导数的值,所以通过埃尔米特插值,我们可以得到一个二次函数。我们也会用这个二次函数来近似我们的
在
上的行为。
有了插值函数之后,我们希望取插值函数所对应的最小值点作为我们的步长。这是因为我们的思想就是用插值函数来代替我们的原始的函数
,那么插值函数对应的最小值点,我们也认为是
的最小值点(当然一般来说,实际情况不是这样)。换句话说,我们的这个步长,可以使得我们的函数值局部上下降的最多,那我们自然就认为它容易满足步长选取条件。这就一定程度上降低了我们选取步长的困难。
下面这一张图直观地展示了我们的想法
当然这并没有结束,我们只是找到了一个合适的值,但是还要做一些处理。比方说如果我们是以回溯法作为步长选取条件,那么一般来说我们的下一个选取的步长是
(理解这里的=为计算机编程里的赋值),这里的
就是对应的选取步长的上下界,不清楚的可以参考第一节。
当然,我们不会那么好运,即使这样,我们的步长也有可能不会被接收。但是没有关系,因为这个时候,我们就又多了一个信息
,也就是说我们可以用来插值的点变成了4个,即
这样的话通过埃尔米特插值,我们就可以得到一个三次函数,这个三次函数我们也可以取最小值点,作为我们的步长
。
当然了,即使是使用三次函数,你也有可能失败。那么难道我们要开始使用四次函数了吗?其实不必,因为四次函数的最小值点无法再解析表示了。如果要数值上求解,其复杂度就远远超出了我们这里的要求。所以我们还是使用三次函数的插值,也就是说,我们**抛弃最开始的点
。**只考虑这四个点
然后通过三次插值,寻找最小值点,得到我们的步长
,以此类推即可。
我们坚持使用三次函数的原因就是我们可以直接通过表达式找到我们的最小值点。具体的可以看下面这张图,这张图的标记会和我们前面的说法不太一样,大家注意区分。
Strong-Wolfe条件下的多项式插值
我们在之前有讨论过在A-G条件下的多项式插值。那么对于Strong-Wolfe条件,因为多了一个不等式(在这里我们为了方便,记它为curvature条件),所以对应的算法就变得复杂了很多。但是如果我们能够说清楚Strong-Wolfe条件的算法,那么对于Weak-Wolfe条件自然也就不在话下。
和之前我们插值寻找点不同,这里我们的思路是先寻找区间。具体来说就是1. 找到存在步长的区间
2. 缩短区间