文章目录
优化算法
下降迭代算法
前言
可能有很多刚开始学优化的同学还对一些知识还不太了解,那就先从一些基本的概念开始说起吧。
优化中,基本问题就是求解一个目标函数的最值,例如最小值。
那么,如何求解这个目标函数的最小值呢,很多函数无法通过数学公式直接得到解析解,或是求解的代价很大,因此更合理的方式是通过一系列的下降迭代算法来获取一个误差在可接受范围内的数值解
x
∗
x^*
x∗
今天首先要讲的就是无约束优化算法。
要求
首先,迭代产生的一系列点 { x i } \{x_i\} {xi}需要满足下降性和收敛性,因此,下降迭代算法可以分解为以下几个问题:
- 寻找初始点 x 0 x_0 x0
- 确定下降方向 d k l d^kl dkl
- 寻求在
d
k
d^k
dk 方向的搜索步长
t
k
t^k
tk,使其满足
x k + 1 = x k + t k d k f ( x k + 1 ) < f ( x k ) t k : f ( x k + t k d k ) = m i n f ( x k + t d k ) x^{k+1} = x^k + t^k d^k \qquad f(x^{k+1}) < f(x^k) \\ t^k: \quad f(x^k+t^kd^k) = min\ f (x^k + td^k) xk+1=xk+tkdkf(xk+1)<f(xk)tk:f(xk+tkdk)=min f(xk+tdk) - 根据criterion判断是否达到极小点
收敛准则(criterion)
下列三种可选择一种进行使用,各有优劣
- ∣ ∣ ∇ f ( x ) ∣ ∣ < ε 1 ||\nabla f(x)|| < \varepsilon_1 ∣∣∇f(x)∣∣<ε1
- ∣ ∣ x k − x k + 1 ∣ ∣ ≤ ε 2 ∣ ∣ x k − x k + 1 ∣ ∣ ∣ ∣ x k ∣ ∣ ≤ ε 2 ′ ||x^k - x^{k+1}|| \leq \varepsilon_2 \qquad \frac{||x^{k} - x^{k+1}||}{||x^{k}||}\leq \varepsilon_2' ∣∣xk−xk+1∣∣≤ε2∣∣xk∣∣∣∣xk−xk+1∣∣≤ε2′
- ∣ ∣ f ( x k ) − f ( x k + 1 ) ∣ ∣ ∣ ∣ f ( x k ) ∣ ∣ ≤ ε 3 \frac{||f(x^{k}) - f(x^{k+1})||}{||f(x^{k})||}\leq \varepsilon_3 ∣∣f(xk)∣∣∣∣f(xk)−f(xk+1)∣∣≤ε3
线搜索
- 牛顿法
t i + 1 = t i − y ′ ( t i ) y ′ ′ ( t i ) t^{i+1} = t^{i} - \frac{y'(t^i)}{y''(t^i)} ti+1=ti−y′′(ti)y′(ti)
当 y y y 为二次型时只需要一次迭代就能达到最优目标
每次计算需要一阶和二阶导数,计算量大
其中的导数可以使用有限差商来近似(割线法) - 此外还有一些如区域缩减法、多项式拟合等方法,在此不做介绍
基本无约束优化算法
最速下降法(梯度)
- 函数的某一点上的负梯度方向是此函数的函数值下降最快的方向
- 取当前迭代点的负梯度方向作为下降方向(做单位化处理)
- 步长一般寻求最优步长或定步长试探,以求得可接受点
- 给定步长
t
‾
\overline t
t,若得到的点满足下降性则完成一次步长试探,否则,取
α
t
‾
→
t
‾
,
0
<
α
<
1
\alpha \overline t \to \overline t, \ 0 < \alpha < 1
αt→t, 0<α<1 反复直到满足下降性
{ d k = − ∇ f ( x k ) / ∣ ∣ ∇ f ( x k ) ∣ ∣ x k + 1 = x k + t k d k \left\{ \begin{aligned} & d^k = -\nabla f(x^k) / ||\nabla f(x^k)|| \\ & x^{k+1} = x^k + t^k d^k \end{aligned} \right. {dk=−∇f(xk)/∣∣∇f(xk)∣∣xk+1=xk+tkdk
- 给定步长
t
‾
\overline t
t,若得到的点满足下降性则完成一次步长试探,否则,取
α
t
‾
→
t
‾
,
0
<
α
<
1
\alpha \overline t \to \overline t, \ 0 < \alpha < 1
αt→t, 0<α<1 反复直到满足下降性
优缺点
- 方法简单,单次迭代所需的计算量和存储量少
- 有全局收敛性,对初始点要求不高
- 收敛缓慢,后面呈锯齿形收敛
- 鲁棒性不强,对小的扰动可能不稳定,影响算法收敛
改良方法
步长改良
由上述推导以及上图可得,由于最速下降法选择了最优的步长,且跟随梯度方向,因此每一步之间都是垂直的,导致后续的锯齿形收敛并且速度极慢。
因此,若是设置步长因子
α
\alpha
α 使得
α
t
k
→
t
k
\alpha t^k \to t^k
αtk→tk,则能够避免垂直慢速收敛的情况,部分代码如下:
% update the x position
% This is step length without \alpha
% xk1 = xk + tk * dk;
% modify the step to avoid vertical condition
% Here we set the \alpha = 0.9
xk1 = xk + 0.9 * tk * dk;
对于同一个问题
未使用步长改良时:
迭代21次,耗时4.0366s
使用步长改良时:
迭代10次,耗时2.3305s
牛顿法
由Taylor展开可得:
f
(
x
k
+
Δ
k
)
=
f
(
x
k
)
+
Δ
k
T
∇
f
(
x
k
)
+
1
2
Δ
k
T
H
(
x
k
)
Δ
f(x^k + \Delta k) = f(x^k) + \Delta k^T \nabla f(x^k) + \frac{1}{2}\Delta k^T H(x^k)\Delta
f(xk+Δk)=f(xk)+ΔkT∇f(xk)+21ΔkTH(xk)Δ
所以可求出:
x
k
+
1
=
x
k
−
[
H
(
x
k
)
]
−
1
∇
f
(
x
k
)
x^{k+1} = x^k - [H(x^k)]^{-1} \nabla f(x^k)
xk+1=xk−[H(xk)]−1∇f(xk)
- 其中,牛顿法的步长 t k = 1 t^k = 1 tk=1
- 对于Hesse阵 H H H,要求非奇异且正定
优缺点
- 收敛快,至少二阶收敛
- 对于二次凸函数,一步收敛
- 如果选择的起始点 x 0 x^0 x0 距离 x ∗ x^* x∗ 不远,则迭代收敛快(极小点附近会呈现二次函数性质)
- 要求 f ( x ) f(x) f(x) 二次可微,且每次迭代都需要计算函数的二阶导数矩阵并且求逆矩阵,计算困难并且计算量大
- 若是 x 0 x^0 x0 距离 KaTeX parse error: Expected 'EOF', got '&' at position 2: x&̲* 较远,则迭代有可能发散
牛顿法改良
阻尼牛顿法
- 增加沿牛顿方向的一维搜索
t k : m i n f ( x k − t [ H ( x k ) ] − 1 ∇ f ( x k ) ) t^k: \ min\ f(x^k - t[H(x^k)]^{-1}\nabla f(x^k)) tk: min f(xk−t[H(xk)]−1∇f(xk)) - 可以看做对最速下降法的纠正,使之不仅利用了函数的一阶导数信息,也利用了函数的二阶信息,将下降方向通过 Hesse 阵进行了适当的偏转,加快了收敛
Levenberg-Marquardt Method (Hesse奇异)
d k = − [ β k Q k + H ( x k ) ] − 1 ∇ f ( x k ) t k : m i n f ( x k + t k d k ) d^k = -[\beta_k Q^k + H(x^k)]^{-1}\nabla f(x^k) \\ t^k: \ min \ f(x^k + t^k d^k) dk=−[βkQk+H(xk)]−1∇f(xk)tk: min f(xk+tkdk)
- 其中, β k \beta_k βk非负, Q k Q^k Qk 为给定的正定矩阵
- β k \beta_k βk 足够小,则变为正常牛顿法
- β k \beta_k βk 足够大,则 Q k Q^k Qk 起作用,若 Q k = I Q^k=I Qk=I 则转变为最速下降法
实现代码时,可令
G
=
H
(
x
k
)
+
β
Q
G = H(x^k) + \beta Q
G=H(xk)+βQ
若
G
−
1
G^{-1}
G−1 存在则继续,否则,
α
β
→
β
,
α
>
1
\alpha\beta \to \beta, \alpha > 1
αβ→β,α>1
其中
α
\alpha
α是人为设定的参数
Code
所有详细的代码可参考我的Github,会不断更新,将Matlab Code传至Github
optimization-algorithms