凸优化系列二:确定步长一维搜索算法

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.精确一维搜索与非精确一维搜索

在上一篇文章中,我们提到第k次的迭代公式为:
x k + 1 = x k + α k d k x_{k+1} = x_k + \alpha_kd_k xk+1=xk+αkdk
其中, α k \alpha_k αk表示步长。接下来我们讨论一下怎么确定步长。
我们令
φ ( α k ) = f ( x k + α k d k ) \varphi(\alpha_k) = f(x_k + \alpha_k d_k) φ(αk)=f(xk+αkdk)
假设我们从点 x k x_k xk出发,沿着方向 d k d_k dk进行搜索,确定 φ ( α k ) \varphi(\alpha_k) φ(αk)值最小,这个过程就叫一维搜索。注意我们在这个搜索过程中假设 x k x_k xk d k d_k dk都已经确定,只有 α k \alpha_k αk未知。

如果能直接求出这个最优解 α k \alpha_k αk,那么我们这个 α k \alpha_k αk就被称为最优步长,这种方法被称为最优一维搜索,或者说精确一维搜索。
但是实际情况往往是问题比较复杂,数据维度也很高,直接求精确的最优步长 α k \alpha_k αk可能比较困难,这个时候往往会选择不精确一维搜索来进行代替。
不精确的一维搜索也可以成为近似一维搜索。通常的方法是选择合适的 α k \alpha_k αk,使得目标函数有一定的下降量,即 f ( x k + α k d k ) < f ( x k ) f(x_k + \alpha_kd_k) < f(x_k) f(xk+αkdk)<f(xk)。或者说,只需要找到一个步长,使得目标函数有一定的下降量就可以了。

2.精确一维搜索之试探法

精确一维搜索主要包括试探法(区间搜索法)与函数逼近法。
其中,常用的试探法又包括进退法,黄金分割法,二分法等。

2.1进退法

算法的步骤如下:
1.确定搜索的起点与初始步长。
2.以起点开始以初始步长向前试探。如果函数值变大,改变步长方向。
3.如果函数值下降,维持原来的试探方向,并将步长加倍。

算法的大致流程如下
在这里插入图片描述

2.2 黄金分割法

0.618法,又叫黄金分割法,是优选法的一种。它在试验时,把试点安排在黄金分割点上来寻找最佳点。而生产生活中,我们常常取其近似值0.618,因此得名。0.618法是最常用的单因素单峰目标函数优选法之一。(参考文献1)
用0.618法寻找最佳点时,虽然不能保证在有限次内准确找出最佳点,但随着试验次数的增加,最佳点被限定在越来越小的范围内,即存优范围会越来越小。用存优范围与原始范围的比值来衡量一种试验方法的效率,这个比值叫精度。用0.618法确定试点时,每一次实验都把存优范围缩小为原来的0.618.因此,n次试验后的精度为:
δ n = 0.61 8 n − 1 \delta_n = 0.618^{n-1} δn=0.618n1

具体的算法细节可以查阅更为详细的文献与参考资料。

2.3 二分法

具体原理与黄金分割类似。

3.精确一维搜索之函数逼近法

如果原函数具有比较好的解析性质,那么可以使用函数逼近(插值)的方法。

3.1 牛顿法

牛顿法的思路就是利用某一点的函数值,一阶导数值,二阶导数值构造二次插值函数。牛顿法最大的优势就是收敛速度快,具有局部二阶收敛的速度。

f ( x ) f(x) f(x) x k x_k xk点处泰勒展开
f ( x ) = f ( x k ) + f ′ ( x k ) ( x − x k ) + f ′ ′ ( x k ) 2 ! ( x − x k ) 2 + o ( x − x k ) 2 f(x) = f(x_k) + f'(x_k)(x-x_k) + \frac{f''(x_k)}{2!}(x - x_k)^2 + o(x-x_k)^2 f(x)=f(xk)+f(xk)(xxk)+2!f(xk)(xxk)2+o(xxk)2

要求上面函数的极值,由高等数学的知识,易知 f ′ ( x ) = 0 f'(x) = 0 f(x)=0,那么有
f ′ ( x k ) + f ′ ′ ( x k ) ( x − x k ) = 0 f'(x_k) + f''(x_k)(x - x_k) = 0 f(xk)+f(xk)(xxk)=0
求解可知
x = x k − f ′ ( x k ) f ′ ′ ( x k ) x = x_k - \frac{f'(x_k)}{f''(x_k)} x=xkf(xk)f(xk)

对应到一维搜索中,步长 α \alpha α的迭代方式为:
α k + 1 = α k − f ′ ( α k ) f ′ ′ ( α k ) \alpha_{k+1} = \alpha_k - \frac{f'(\alpha_k)}{f''(\alpha_k)} αk+1=αkf(αk)f(αk)
每次更新该点,然后迭代查找即可。

3.2 插值法

可以有相应的二次插值,三次插值方法,具体可以查看参考文献2关于插值方法的描述。

4.不精确搜索

由于实际问题的复杂性,使用精确一维搜索往往要付出很高的代价,还不一定能得到比较好的结果。后来慢慢发现,只要遵循一定的规律,算法就很可能达到收敛。

4.1 Armijo-Goldstein准则

Armijo-Goldstein准则的核心思想有两个:
1.目标函数值应该有足够的下降
2.一维搜索的步长 α \alpha α不应该太小。

这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值,因此,让目标函数函数值“下降”是我们努力的方向,所以1正是想要保证这一点。
同理,2也类似:如果一维搜索的步长 α \alpha α太小了,那么我们的搜索类似于在原地打转,可能也是在浪费时间和精力。(参考文献3)

所以最后Armijo准则的表达式为两个式子:
f ( x k + α k d k ) ≤ f ( x k ) + α k ρ g k T d k f(x_k + \alpha_k d_k) \le f(x_k) + \alpha_k \rho g_k^Td_k f(xk+αkdk)f(xk)+αkρgkTdk
f ( x k + α k d k ) ≥ f ( x k ) + α k ( 1 − ρ ) g k T d k f(x_k + \alpha_k d_k) \ge f(x_k) + \alpha_k (1 - \rho) g_k^Td_k f(xk+αkdk)f(xk)+αk(1ρ)gkTdk
其中, 0 < ρ < 1 / 2 0 \lt \rho \lt 1/2 0<ρ<1/2

为什么上面两个式子就可以满足我们的要求,可以阅读参考文献3,或者查阅相关最优化理论的教材。

4.2 Wolfe-Powell准则

Armijo-Goldstein准则可能会把最优步长因子排除在可接受区间外,因此Wolfe-Powell准则做了相关的改进。
Wolfe-Powell准则也是有两个表达式。第一个表达式与Armijo-Goldstein准则的第一个表达式相同,而第二个表达式为:
∇ f ( x k + α k d k ) T d k ≥ σ g k T d k , σ ∈ ( ρ , 1 ) \nabla f(x_k + \alpha_k d_k)^Td_k \ge \sigma g_k^T d_k, \quad \sigma \in (\rho, 1) f(xk+αkdk)TdkσgkTdk,σ(ρ,1)

上面式子的几何解释为:在可接受点处的切线斜率大于等于初始斜率的 σ \sigma σ倍!

参考文献:
1.https://zh.wikipedia.org/wiki/黄金分割法
2.https://blog.csdn.net/bitcarmanlee/article/details/86556744
3.https://www.codelast.com/原创用人话解释不精确线搜索中的armijo-goldstein准则及wo/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值