最优化学习笔记:无约束优化算法(6)

6.6 信赖域算法

本节介绍信赖域算法.它和线搜索算法都是借助泰勒展开来对目标函数进行局部近似,但它们看待近似函数的方式不同.在线搜索算法中,我们先利用近似模型求出下降方向,然后给定步长;而在信赖域类算法中,我们直接在一个有界区域内求解这个近似模型,而后迭代到下一个点.因此信赖域算法实际上是同时选择了方向和步长

6.6.1 信赖域算法框架

我们对信赖域算法给一个直观的数学表达. 根据带拉格朗日余项的泰勒展开,
f ( x k + d ) = f ( x k ) + ∇ f ( x k ) T d + 1 2 d T ∇ 2 f ( x k + t d ) d f(x^{k}+d)=f(x^{k})+\nabla f(x^{k})^{\mathrm{T}}d+\frac{1}{2}d^{\mathrm{T}}\nabla^{2}f(x^{k}+td)d f(xk+d)=f(xk)+f(xk)Td+21dT2f(xk+td)d

其中 t ∈ ( 0 , 1 ) t\in(0,1) t(0,1) 为和 d d d 有关的正数. 和牛顿法相同,可以利用 f ( x ) f(x) f(x) 的一个二阶近似来刻画 f ( x ) f(x) f(x) 在点 x = x k x=x^k x=xk 处的性质:
m k ( d ) = f ( x k ) + ∇ f ( x k ) T d + 1 2 d T B k d ( 6.6.1 ) m_k(d)=f(x^k)+\nabla f(x^k)^\mathrm{T}d+\frac12d^\mathrm{T}B^kd\qquad(6.6.1) mk(d)=f(xk)+f(xk)Td+21dTBkd(6.6.1)

其中 B k B^k Bk 是对称矩阵. 并且要求 B k B^k Bk 是海瑟矩阵的近似矩阵,如果 B k B^k Bk 恰好是函数 f ( x ) f(x) f(x) 在点 x = x k x=x^k x=xk 处的海瑟矩阵,那么当 f ( x ) f(x) f(x) 充分光滑时, m k ( d ) m_k(d) mk(d) 的逼近误差是 O ( ∥ d ∥ 3 ) O(\|d\|^3) O(d3).

由于泰勒展开的局部性质,它仅仅对模长较小的 d d d 有意义. 当 d d d 过长时,模型 (6.6.1) 便不再能刻画 f ( x ) f(x) f(x) 的特征,为此需要对模型 (6.6.1) 添加约束. 我们仅在如下球内考虑 f ( x ) f(x) f(x) 的近似:
Ω k = { x k + d ∣ ∥ d ∥ ⩽ Δ k } \Omega_{k}=\{x^{k}+d\mid\lVert d\rVert\leqslant\Delta_{k}\} Ωk={xk+ddΔk}

其中 Δ k > 0 \Delta_k>0 Δk>0 是一个和迭代有关的参数. Ω k \Omega_k Ωk 为信赖域, Δ k \Delta_k Δk 为信赖域半径. 从命名方式也可看出,信赖域就是我们相信 m k ( d ) m_k(d) mk(d) 能很好地近似 f ( x ) f(x) f(x) 的区域,而 Δ k \Delta_k Δk 表示了这个区域的大小.因此信赖域算法每一步都需要求解如下子问题
min ⁡ d ∈ 1 n m k ( d ) , s.t. ∥ d ∥ ⩽ Δ k ( 6.6.2 ) \min\limits_{d\in\mathbb{1}^n}\quad m_k(d),\quad\text{s.t.}\|d\|\leqslant\Delta_k\qquad(6.6.2) d1nminmk(d),s.t.dΔk(6.6.2)
在这里插入图片描述

图 6.15 显示了子问题 (6.6.2) 的求解过程. 图中实线表示 f ( x ) f(x) f(x) 的等高线,虚线表示 m k ( d ) m_k(d) mk(d) 的等高线 (这里有关系 d = x − x k d=x-x^k d=xxk), d N k d_N^k dNk 表示求解无约束问题得到的下降方向 (若 B k B^k Bk 为海瑟矩阵则 d N k d_N^k dNk 为牛顿方向), d T R k d_{TR}^k dTRk 表示求解信赖域子问题得到的下降方向,可以看到二者明显是不同的. 信赖域算法正是限制了 d d d 的大小,使得迭代更加保守,因此可以在牛顿方向很差时发挥作用.
在子问题 (6.6.2) 中仍需要确定信赖域半径 Δ k \Delta_k Δk. 实际上,选取信赖域半径非常关键,它决定了算法的收敛性. 考虑到信赖域半径是“对模型 m k ( d ) m_k(d) mk(d) 相信的程度”, 如果 m k ( d ) m_k(d) mk(d) 对函数 f ( x ) f(x) f(x) 近似较好,就应该扩大信赖域半径,在更大的区域内使用这个近似,反之就应该减小信赖域半径重新计算.
引入如下定义来衡量 m k ( d ) m_k(d) mk(d) 近似程度的好坏
ρ k = f ( x k ) − f ( x k + d k ) m k ( 0 ) − m k ( d k ) ( 6.6.3 ) \rho_k=\frac{f(x^k)-f(x^k+d^k)}{m_k(0)-m_k(d^k)}\qquad(6.6.3) ρk=mk(0)mk(dk)f(xk)f(xk+dk)(6.6.3)

其中 d k d^k dk 为求解信赖域子问题得到的迭代方向. 根据 ρ k \rho_k ρk 的定义可知,它是函数值实际下降量与预估下降量 (即二阶近似模型下降量) 的比值. 如果 ρ k \rho_k ρk 接近 1, 说明用 m k ( d ) m_k(d) mk(d) 来近似 f ( x ) f(x) f(x) 是比较成功的,我们应该扩大 Δ k \Delta_k Δk;如果 ρ k \rho_k ρk 为非常小的正数甚至为负数,就说明我们过分地相信了二阶模型 m k ( d ) m_k(d) mk(d), 此时应该缩小 Δ k \Delta_k Δk. 使用这个机制可以动态调节 Δ k \Delta_k Δk, 让二阶模型 m k ( d ) m_k(d) mk(d) 的定义域处于一个合适的范围.
在这里插入图片描述

算法 6.8 给出完整的信赖域方法. 该算法虽然有一些参数,但是它对这些参数的取值并不敏感. 实际中可取 ρ ˉ 1 = 0.25 ,   ρ ˉ 2 = 0.75 \bar{\rho}_1=0.25,\ \bar{\rho}_2=0.75 ρˉ1=0.25, ρˉ2=0.75 以及 γ 1 = 0.25 ,   γ 2 = 2 \gamma_{1}=0.25,\ \gamma_{2}=2 γ1=0.25, γ2=2. 要注意,信赖域半径 Δ k \Delta_k Δk 不会无限增长,一是因为它有上界的控制,二是如果信赖域约束不起作用 (即二次模型最优值处于信赖域内), 我们也无需增加信赖域半径. 只有当 m k ( d ) m_k(d) mk(d) 近似足够好并且信赖域约束起作用时,才需要增加 Δ k \Delta_k Δk.

# 算法 6.8 信赖域算法
import numpy as np
def m_k(x, d):
    return f(x) + np.dot(grad_f(x), d) + 0.5 * np.dot(d, np.dot(hess_f(x), d))
def trust_region_algorithm(x_0, Delta_0, Delta_max, eta, rho1_bar = 0.25, rho2_bar = 0.75, gamma1 = 0.25, gamma2 = 2, max_iter = 1000, tol = 1e-6):
    x = x_0
    Delta = Delta_0
    k = 0
    x_history = [x]
    while k < max_iter:
        dk = calculate_iterative_direction(x, Delta)  # 计算迭代方向
        mk_0 = m_k(x, np.zeros_like(x)) 
        mk_dk = m_k(x, dk)  
        rho_k = (f(x) - f(x + dk)) / (mk_0 - mk_dk)  # 计算下降率
        # 更新信赖域半径
        if rho_k < rho1_bar:
            Delta = gamma1 * Delta
        elif rho_k > rho2_bar and np.linalg.norm(dk) == Delta:
            Delta = min(gamma2 * Delta, Delta_max)
        else:
            Delta = Delta
        # 更新自变量
        if rho_k > eta:
            x = x + dk
        x_history.append(x)
        k += 1
        if np.linalg.norm(grad_f(x)) <= tol:
            break    
    return x_history, k

def calculate_iterative_direction(x_k, Delta_k):
    # 计算牛顿方向
    hessian = hess_f(x_k)
    grad = grad_f(x_k)
    # 求解线性方程组 Hessian * d_k = -grad
    d_k = np.linalg.solve(hessian, -grad)
    # 对牛顿方向进行修正,确保在信赖域范围内
    if np.linalg.norm(d_k) > Delta_k:
        d_k = (Delta_k / np.linalg.norm(d_k)) * d_k
    return d_k

def f(x):
    return x[0]**2 + 10 * x[1]**2
def grad_f(x):
    return np.array([2*x[0], 20*x[1]])
def hess_f(x):
    return np.array([[2, 0], [0, 20]])

x_0 = np.array([-10.0, -1.0])  # 初始点
Delta_0 = 1.0  # 初始半径
Delta_max = 10.0  # 最大半径
eta = 0.1
# 调用信赖域算法
trust_history, k = trust_region_algorithm(x_0, Delta_0, Delta_max, eta)
print("Optimal solution:", trust_history[-1])
'''Optimal solution: [0.00000000e+00 1.38777878e-17]'''
print("迭代次数:", k)
'''迭代次数: 5'''
# 绘制等高线图
x = np.linspace(-12, 12, 100)
y = np.linspace(-4, 4, 100)
X, Y = np.meshgrid(x, y)
Z = X**2 + 10*Y**2 
plt.figure(figsize=(10, 5))
plt.contour(X, Y, Z, levels=np.logspace(-2, 3, 20), cmap='jet')  # levels 参数控制等高线的密集程度
plt.plot([x[0] for x in trust_history], [x[1] for x in trust_history], markersize = 3, marker='o', markerfacecolor='none', linewidth=1, color='orange', label='trust_region_algorithm')
plt.plot([x[0] for x in M_Newton_history], [x[1] for x in M_Newton_history], markersize = 3, marker='o', markerfacecolor='none', linewidth=1, color='r', label='modified_newton')
plt.plot([x[0] for x in quasi_Newton_history], [x[1] for x in quasi_Newton_history], markersize = 3, marker='x', markerfacecolor='none', linewidth=1, color='b', label='Quasi-Newton')
plt.legend(loc='best', markerscale=1.5)  # 设置标签位置为最佳位置,调整图例的大小
plt.show() 

在这里插入图片描述

6.6.2 信赖域子问题求解

在多数实际应用中,信赖域子问题的解是无法显式写出的.为了求出迭代方向 d k d^k dk,需要设计算法快速或近似求解子问题 (6.6.2).

1. 迭代法
信赖域子问题是一个仅仅涉及二次函数的约束优化问题。下面的定理给出了子问题的最优解需要满足的条件:

定理 6.12 d ∗ d^* d 是信赖域子问题
min ⁡ m ( d ) = f + g T d + 1 2 d T B d , s . t . ∥ d ∥ ⩽ Δ ( 6.6.4 ) \begin{aligned}\min\quad m(d)=f+g^{\mathrm{T}}d+\frac{1}{2}d^{\mathrm{T}}Bd,\quad\mathrm{s.t.}\quad\lVert d\rVert\leqslant\Delta\end{aligned}\qquad(6.6.4) minm(d)=f+gTd+21dTBd,s.t.dΔ(6.6.4)

的全局极小解当且仅当 d ∗ d^* d 是可行的且存在 λ ⩾ 0 \lambda\geqslant0 λ0 使得
( B + λ I ) d ∗ = − g ( 6.6.5 a ) (B+\lambda I)d^{*}=-g\qquad(6.6.5a) (B+λI)d=g(6.6.5a)

λ ( Δ − ∥ d ∗ ∥ ) = 0 ( 6.6.5 b ) \lambda(\Delta-\|d^{*}\|)=0\qquad(6.6.5b) λ(Δd)=0(6.6.5b)

( B + λ I ) ⪰ 0 ( 6.6.5 c ) (B+\lambda I)\succeq0\qquad(6.6.5c) (B+λI)0(6.6.5c)

证明
‘必要性’(利用 KKT 条件来直接写出 d ∗ d^∗ d 所满足的关系)
问题(6.6.4)的拉格朗日函数为
L ( d , λ ) = f + g T d + 1 2 d T B d − λ 2 ( Δ 2 − ∥ d ∥ 2 ) , L(d,\lambda)=f+g^{\mathrm{T}}d+\frac{1}{2}d^{\mathrm{T}}Bd-\frac{\lambda}{2}(\Delta^{2}-\|d\|^{2}), L(d,λ)=f+gTd+21dTBd2λ(Δ2d2),

其中乘子 λ ⩾ 0 \lambda\geqslant 0 λ0. 根据 KKT 条件, d ∗ d^* d 是可行解,且
∇ d L ( d ∗ , λ ) = ( B + λ I ) d ∗ + g = 0. \nabla_{d}L(d^{*},\lambda)=(B+\lambda I)d^{*}+g=0. dL(d,λ)=(B+λI)d+g=0.

此外还有互补条件
λ 2 ( Δ 2 − ∥ d ∗ ∥ 2 ) = 0 , \frac\lambda 2(\Delta^2-\|d^*\|^2)=0, 2λ(Δ2d2)=0,

以上两式整理后就是 (6.6.5a) 式和 (6.6.5b) 式. 为了证明 (6.6.5c) 式,任取 d d d 满足 ∥ d ∥ = Δ \|d\|= \Delta d=Δ, 根据最优性,有
m ( d ) ⩾ m ( d ∗ ) = m ( d ∗ ) + λ 2 ( ∥ d ∗ ∥ 2 − ∥ d ∥ 2 ) . m(d)\geqslant m(d^*)=m(d^*)+\frac\lambda2(\|d^*\|^2-\|d\|^2). m(d)m(d)=m(d)+2λ(d2d2).

利用 (6.6.5a) 式消去 g g g, 代入上式整理可知
( d − d ∗ ) T ( B + λ I ) ( d − d ∗ ) ⩾ 0 , (d-d^{*})^{\mathrm{T}}(B+\lambda I)(d-d^{*})\geqslant 0, (dd)T(B+λI)(dd)0,

由任意性可知 B + λ I B+\lambda I B+λI 半正定.

‘充分性’
定义辅助函数
m ^ ( d ) = f + g T d + 1 2 d T ( B + λ I ) d = m ( d ) + λ 2 d T d , \hat{m}(d)=f+g^{\mathrm{T}}d+\frac12d^{\mathrm{T}}(B+\lambda I)d=m(d)+\frac\lambda2d^{\mathrm{T}}d, m^(d)=f+gTd+21dT(B+λI)d=m(d)+2λdTd,

由条件 (6.6.5c) 可知 m ^ ( d ) \hat{m}(d) m^(d) 关于 d d d 是凸函数. 根据条件 (6.6.5a), d ∗ d^* d 满足凸函数一阶最优性条件,结合定理 5.5 可推出 d ∗ d^* d m ^ ( d ) \hat{m}(d) m^(d) 的全局极小值点, 进而对任意可行解 d d d, 我们有
m ( d ) ⩾ m ( d ∗ ) + λ 2 ( ∥ d ∗ ∥ 2 − ∥ d ∥ 2 ) . m(d)\geqslant m(d^{*})+\frac{\lambda}{2}(\|d^{*}\|^{2}-\|d\|^{2}). m(d)m(d)+2λ(d2d2).

由互补条件 (6.6.5b) 可知 λ ( Δ 2 − ∥ d ∗ ∥ 2 ) = 0 \lambda(\Delta^2-\|d^*\|^2)=0 λ(Δ2d2)=0, 代入上式消去 ∥ d ∗ ∥ 2 \|d^*\|^2 d2
m ( d ) ⩾ m ( d ∗ ) + λ 2 ( Δ 2 − ∥ d ∥ 2 ) ⩾ m ( d ∗ ) . m(d)\geqslant m(d^*)+\frac\lambda2(\Delta^2-\|d\|^2)\geqslant m(d^*). m(d)m(d)+2λ(Δ2d2)m(d).

定理 5.5 假设 f f f 是适当且凸的函数,则 x ∗ x^* x 为问题 min ⁡ x ∈ R n f ( x ) \min\limits_{x\in\mathcal{R}^n} f(x) xRnminf(x) 的一个全局极小点当且仅当 0 ∈ ∂ f ( x ∗ ) 0\in\partial f(x^*) 0f(x).

定理 6.12 提供了问题维数 n n n 较小时寻找 d ∗ d^* d 的一个方法. 根据 (6.6.5a) 式,最优解是以 λ \lambda λ 为参数的一族向量. 我们定义
d ( λ ) = − ( B + λ I ) − 1 g ( 6.6.6 ) d(\lambda)=-(B+\lambda I)^{-1}g\qquad(6.6.6) d(λ)=(B+λI)1g(6.6.6)

则只需要寻找合适的 λ \lambda λ 使得 (6.6.5b) 式和 (6.6.5c) 式成立即可.根据互补条件 (6.6.5b), 当 λ > 0 \lambda>0 λ>0 时必有 ∥ d ( λ ) ∥ = Δ \|d(\lambda)\|=\Delta d(λ)=Δ;根据半正定条件 (6.6.5c), λ \lambda λ 须大于等于 B B B 的最小特征值的相反数.
现在研究 ∥ d ( λ ) ∥ \|d(\lambda)\| d(λ) λ \lambda λ 变化的性质. 设 B B B 有特征值分解 B = Q Λ Q T B= Q\Lambda Q^\mathrm{T} B=QΛQT, 其中 Q = [ q 1 , q 2 , ⋯   , q n ] Q=[q_1,q_2,\cdots,q_n] Q=[q1,q2,,qn] 是正交矩阵, $\Lambda= D i a g Diag Diag( \lambda_1, \lambda_2, \cdots , \lambda_n) $ 是对角矩阵, λ 1 ⩽ λ 2 ⩽ ⋯ ⩽ λ n \lambda_1\leqslant\lambda_2\leqslant\cdots\leqslant\lambda_n λ1λ2λn B B B 的特征值. 为了方便,以下仅考虑 λ 1 ⩽ 0 \lambda_1\leqslant 0 λ10 λ 1 \lambda_1 λ1 是单特征根的情形. B + λ I B+\lambda I B+λI 有特征值分解 B + λ I = Q ( Λ + λ I ) Q T B+\lambda I=Q(\Lambda+\lambda I)Q^{\mathrm{T}} B+λI=Q(Λ+λI)QT. 对 λ > − λ 1 ⩾ 0 \lambda>-\lambda_1\geqslant 0 λ>λ10, 那么 d ( λ ) d(\lambda) d(λ) 的表达式为:
d ( λ ) = − Q ( Λ + λ I ) − 1 Q T g = − ∑ i = 1 n q i T g λ i + λ q i ( 6.6.7 ) d(\lambda)=-Q(\Lambda+\lambda I)^{-1}Q^{\mathrm{T}}g=-\sum_{i=1}^{n}\frac{q_{i}^{\mathrm{T}}g}{\lambda_{i}+\lambda}q_{i} \qquad(6.6.7) d(λ)=Q(Λ+λI)1QTg=i=1nλi+λqiTgqi(6.6.7)

这正是 d ( λ ) d(\lambda) d(λ) 的正交分解,由正交性可容易求出

∥ d ( λ ) ∥ 2 = ∑ i = 1 n ( q i T g ) 2 ( λ i + λ ) 2 ( 6.6.8 ) \|d(\lambda)\|^2=\sum_{i=1}^n\frac{(q_i^\mathrm{T}g)^2}{(\lambda_i+\lambda)^2}\qquad(6.6.8) d(λ)2=i=1n(λi+λ)2(qiTg)2(6.6.8)

根据 (6.6.8) 式可知当 λ > − λ 1 \lambda>-\lambda_1 λ>λ1 q 1 T g ≠ 0 q_1^\mathrm{T}g\neq0 q1Tg=0 时, ∥ d ( λ ) ∥ 2 \|d(\lambda)\|^2 d(λ)2 是关于 λ \lambda λ 的严格减函数,且有

lim ⁡ λ → ∞ ∥ d ( λ ) ∥ = 0 , lim ⁡ λ → − λ 1 + ∥ d ( λ ) ∥ = + ∞ . \lim\limits_{\lambda\to\infty}\|d(\lambda)\|=0,\quad\lim\limits_{\lambda\to-\lambda_1+}\|d(\lambda)\|=+\infty. λlimd(λ)=0,λλ1+limd(λ)=+∞.

根据连续函数介值定理, ∥ d ( λ ) ∥ = Δ \|d(\lambda)\|=\Delta d(λ)=Δ 的解必存在且唯一. 一个典型的例子如图 6.16 所示.
在这里插入图片描述

根据上面的分析,寻找 λ ∗ \lambda^* λ 已经转化为一个一元方程求根问题,可以使用牛顿法求解,在得到最优解 λ ∗ \lambda^* λ 后,根据 (6.6.5a) 式即可求出迭代方向 d ∗ d^* d.

此外,在上面的分析中假定了 q 1 T g ≠ 0 q_1^\mathrm{T}g\neq0 q1Tg=0, 在实际中这个条件未必满足. 当 q 1 T g = 0 q_1^\mathrm{T}g=0 q1Tg=0 时,(6.6.8) 式将没有和 λ 1 \lambda_1 λ1 相关的项. 此时未必存在 λ ∗ > − λ 1 \lambda^*>-\lambda_1 λ>λ1 使得 ∥ d ( λ ∗ ) ∥ = Δ \|d(\lambda^*)\|=\Delta d(λ)=Δ 成立. 记 M = lim ⁡ λ → − λ 1 + ∥ d ( λ ) ∥ M=\lim\limits_{\lambda\to-\lambda_1+}\|d(\lambda)\| M=λλ1+limd(λ), 当 M ⩾ Δ M\geqslant\Delta MΔ 时,仍然可以根据介值定理得出 λ ∗ ( > − λ 1 ) \lambda^*(>-\lambda_1) λ(>λ1) 的存在性;而当 M < Δ M<\Delta M<Δ 时,无法利用前面的分析求出 λ ∗ \lambda^* λ d ∗ d^* d, 此时信赖域子问题变得比较复杂.
实际上, q 1 T g = 0 q_1^\mathrm{T}g=0 q1Tg=0 M < Δ M<\Delta M<Δ 的情形被人们称为“困难情形(hard case)”. 此情形发生时,区间 ( − λ 1 , + ∞ ) (-\lambda_1,+\infty) (λ1,+) 中的点无法使得 (6.6.5b) 成立,而定理 6.12 的结果说明 λ ∗ ∈ [ − λ 1 , + ∞ ) \lambda^*\in[-\lambda_1,+\infty) λ[λ1,+), 因此必有 λ ∗ = − λ 1 \lambda^*=-\lambda_1 λ=λ1.

2. 截断共轭梯度法
下面再介绍一种信赖域子问题的求解方法. 既然信赖域子问题的解不易求出,则求出其近似解. Steihaug 在 1983 年对共轭梯度法进行了改造,使其成为能求解子问题的算法. 此算法能够应用在大规模问题中,是一种非常有效的信赖域子问题的求解方法. 由于子问题 (6.6.2) 和一般的二次极小化问题相差一个约束,如果先不考虑其中的约束 ∥ d ∥ ⩽ Δ \|d\|\leqslant\Delta dΔ 而直接使用共轭梯度法求解,在迭代过程中应该能找到合适的迭代点作为信赖域子问题的近似解. 这就是截断共轭梯度法的基本思想.
为了介绍截断共轭梯度法,先简要回顾一下标准共轭梯度法的迭代过程. 对于二次极小化问题
min ⁡ s q ( s ) = d e f g T s + 1 2 s T B s \min_s\quad q(s)\stackrel{\mathrm{def}}{=}g^\mathrm{T}s+\frac12s^\mathrm{T}Bs sminq(s)=defgTs+21sTBs

给定初值 s 0 = 0 , r 0 = g , p 0 = − g s^0=0,r^0=g,p^0=-g s0=0,r0=g,p0=g, 共轭梯度法的迭代过程为
α k + 1 = ∥ r k ∥ 2 ( p k ) T B p k s k + 1 = s k + α k p k r k + 1 = r k + α k B p k β k = ∥ r k + 1 ∥ 2 ∥ r k ∥ 2 p k + 1 = − r k + 1 + β k p k \begin{aligned} \alpha_{k+1}& =\frac{\|r^k\|^2}{(p^k)^\text{T}Bp^k}\\ s^{k+1}& =s^k+\alpha_kp^k\\ r^{k+1}& =r^{k}+\alpha_{k}Bp^{k}\\ \beta_{k}& =\frac{\|r^{k+1}\|^2}{\|r^k\|^2}\\ p^{k+1}& =-r^{k+1}+\beta_{k}p^{k} \end{aligned} αk+1sk+1rk+1βkpk+1=(pk)TBpkrk2=sk+αkpk=rk+αkBpk=rk2rk+12=rk+1+βkpk

其中迭代序列 { s k } \{s^k\} {sk} 最终的输出即为二次极小化问题的解,算法的终止准则是判断 ∥ r k ∥ \|r^k\| rk 是否足够小.

截断共轭梯度法则是给标准的共轭梯度法增加了两条终止准则,并对最后一步的迭代点 s k s^k sk 进行修正来得到信赖域子问题的解. 考虑到矩阵 B B B 不一定是正定矩阵,在迭代过程中可能会产生如下三种情况:
(1) ( p k ) T B p k ⩽ 0 (p^k)^{\mathrm{T}}Bp^k\leqslant 0 (pk)TBpk0, 即 B B B 不是正定矩阵. 由于共轭梯度法不能处理非正定的线性方程组,遇到这种情况应该立即终止算法. 但根据这个条件也找到了一个负曲率方向,此时只需要沿着这个方向走到信赖域边界即可.
(2) ( p k ) T B p k > 0 (p^k)^{\mathrm{T}}Bp^k>0 (pk)TBpk>0 ∥ s k + 1 ∥ ⩾ Δ \|s^{k+1}\|\geqslant\Delta sk+1Δ, 这表示若继续进行共轭梯度法迭代,则点 s k + 1 s^{k+1} sk+1 将处于信赖域之外或边界上,此时必须马上停止迭代,并在 s k s^k sk s k + 1 s^{k+1} sk+1 之间找一个近似解.
(3) ( p k ) T B p k > 0 (p^k)^{\mathrm{T}}Bp^k>0 (pk)TBpk>0 ∥ r k + 1 ∥ \|r^{k+1}\| rk+1 充分小,这表示若共轭梯度法成功收敛到信赖域内. 子问题 (6.6.2) 和不带约束的二次极小化问题是等价的.
从上述终止条件来看截断共轭梯度法仅仅产生了共轭梯度法的部分迭代点,这也是该方法名字的由来.

算法 6.9 给出截断共轭梯度法的迭代过程,其中的三个判断分别对应了之前叙述的三种情况. 在不加限制时,下一步迭代点总是为 s k + 1 = s k + α k p k s^{k+1}=s^k+\alpha_k p^k sk+1=sk+αkpk. 当情况 (1) 发生时,只需要沿着 p k p^k pk 走到信赖域边界;当情况 (2) 发生时,由于 ∥ s k ∥ < Δ , ∥ s k + α k p k ∥ ⩾ Δ \|s^k\|<\Delta,\|s^k+\alpha_kp^k\|\geqslant\Delta sk<Δ,sk+αkpkΔ, 由连续函数介值定理可得 τ \tau τ 必定存在且处于区间 ( 0 , α k ] (0,\alpha_k] (0,αk] 内.
在这里插入图片描述

# 算法 6.9 截断共轭梯度法(Steihaug-CG)
import numpy as np
# from scipy.optimize import newton
def Steihaug_CG(B, g, Delta, epsilon = 1e-6):
    s = np.zeros_like(g)
    r = g
    p = -g
    k = 0
    while np.linalg.norm(g) > epsilon:
        if np.dot(p, np.dot(B, p)) <= 0:
            # 使用牛顿法求解方程
            # tau= newton(np.linalg.norm(s + tau * p) - Delta, 0, args=(s, p, Delta))
            # 求根公式求解
            tau = np.max([0, (-2*np.dot(s, p) + np.sqrt(4*np.dot(s, p)**2 - 4*np.dot(p, p)*(np.dot(s, s) - Delta**2))) / (2*np.dot(p, p))])
            s = s + tau * p
            return s
        alpha_k = np.linalg.norm(r)**2 / np.dot(p, np.dot(B, p))
        s = s + alpha_k * p
        if np.linalg.norm(s) >= Delta:
            # 使用牛顿法求解方程
            # tau= newton(np.linalg.norm(s + tau * p) - Delta, 0, args=(s, p, Delta))
            # 求根公式求解
            tau = np.max([0, (-2*np.dot(s, p) + np.sqrt(4*np.dot(s, p)**2 - 4*np.dot(p, p)*(np.dot(s, s) - Delta**2))) / (2*np.dot(p, p))])
            s = s + tau * p
            return s
        r_next = r + alpha_k * np.dot(B, p)
        if np.linalg.norm(r) < epsilon * np.linalg.norm(g):
            return s
        beta_k = np.linalg.norm(r_next)**2 / np.linalg.norm(r)**2
        p = -r_next + beta_k * p
        r = r_next
        k += 1
    return s

def m_k(x, d):
    return f(x) + np.dot(grad_f(x), d) + 0.5 * np.dot(d, np.dot(hess_f(x), d))
def cg_trust_region_algorithm(x_0, Delta_0, Delta_max, eta, rho1_bar = 0.25, rho2_bar = 0.75, gamma1 = 0.25, gamma2 = 2, max_iter = 1000, tol = 1e-6):
    x = x_0
    Delta = Delta_0
    k = 0
    x_history = [x]
    while k < max_iter:
        dk = Steihaug_CG(hess_f(x), grad_f(x), Delta, epsilon = 1e-6)  # 计算迭代方向
        mk_0 = m_k(x, np.zeros_like(x)) 
        mk_dk = m_k(x, dk)  
        rho_k = (f(x) - f(x + dk)) / (mk_0 - mk_dk)  # 计算下降率

        if rho_k < rho1_bar:
            Delta = gamma1 * Delta
        elif rho_k > rho2_bar and np.linalg.norm(dk) == Delta:
            Delta = min(gamma2 * Delta, Delta_max)
        else:
            Delta = Delta

        if rho_k > eta:
            x = x + dk
        x_history.append(x)
        k += 1
        if np.linalg.norm(grad_f(x)) <= tol:
            break    
    return x_history, k

def f(x):
    return x[0]**2 + 10 * x[1]**2
def grad_f(x):
    return np.array([2*x[0], 20*x[1]])
def hess_f(x):
    return np.array([[2, 0], [0, 20]])

x_0 = np.array([-10.0, -1.0])  # 初始点
Delta_0 = 1.0  # 初始半径
Delta_max = 10.0  # 最大半径
eta = 0.1
# 调用信赖域算法
cg_trust_history, k = cg_trust_region_algorithm(x_0, Delta_0, Delta_max, eta)
print("Optimal solution:", cg_trust_history[-1])
'''Optimal solution: [ 0.00000000e+00 -3.33066907e-16]'''
print("迭代次数:", k)
'''迭代次数: 6'''
# 绘制等高线图
x = np.linspace(-12, 12, 100)
y = np.linspace(-4, 4, 100)
X, Y = np.meshgrid(x, y)
Z = X**2 + 10*Y**2 
plt.figure(figsize=(10, 5))
plt.contour(X, Y, Z, levels=np.logspace(-2, 3, 20), cmap='jet')  # levels 参数控制等高线的密集程度
plt.plot([x[0] for x in cg_trust_history], [x[1] for x in cg_trust_history], markersize = 4, marker='x', markerfacecolor='none', linewidth=1, color='green', label='cg_trust_region_algorithm')
plt.plot([x[0] for x in trust_history], [x[1] for x in trust_history], markersize = 4, marker='o', markerfacecolor='none', linewidth=1, color='orange', label='trust_region_algorithm')
plt.legend(loc='best', markerscale=1.5)  # 设置标签位置为最佳位置,调整图例的大小
plt.show() 

在这里插入图片描述

截断共轭梯度法的迭代序列 { s k s^k sk} 有非常好的性质,实际上我们可以证明如下定理:

定理 6.13 q ( s ) q(s) q(s) 是任意外迭代步信赖域子问题的目标函数,令 { s j } \{s^j\} {sj} 是由截断共轭梯度算法产生的迭代序列,则在算法终止前 q ( s j ) q(s^j) q(sj) 是严格单调递减的,即
q ( s j + 1 ) < q ( s j ) ( 6.6.9 ) q(s^{j+1})<q(s^j)\qquad(6.6.9) q(sj+1)<q(sj)(6.6.9)

并且 ∥ s j ∥ \|s^j\| sj 是严格单调递增的,即
0 = ∥ s 0 ∥ < ∥ s 1 ∥ < ⋯ < ∥ s j + 1 ∥ < ⋯ ⩽ Δ ( 6.6.10 ) 0=\|s^0\|<\|s^1\|<\cdots<\|s^{j+1}\|<\cdots\leqslant\Delta\qquad(6.6.10) 0=s0<s1<<sj+1<Δ(6.6.10)

证明
设迭代在第 t t t 步终止. 根据算法 6.9,在终止条件之前, ( p j ) T B p j > 0 , j < t (p^j)^\mathrm{T}Bp^j>0, j<t (pj)TBpj>0,j<t 是一直成立的. 此时的算法就是共轭梯度法,而容易证明 (6.6.9) 式和 (6.6.10) 式.又 q ( s ) q(s) q(s) 在点 s j s^j sj 处的梯度是 r j r^j rj,根据共轭梯度迭代性质 ( r j ) T p i = 0 , i < j (r^j)^\mathrm{T}p^i=0,i<j (rj)Tpi=0,i<j,所以
( r j ) T p j = ( r j ) T ( − r j + β j − 1 p j − 1 ) = − ∥ r j ∥ 2 < 0 , (r^j)^\mathrm{T}p^j=(r^j)^\mathrm{T}(-r^j+\beta_{j-1}p^{j-1})=-\|r^j\|^2<0, (rj)Tpj=(rj)T(rj+βj1pj1)=rj2<0,

p j p^j pj 是下降方向. 而 α j \alpha_j αj 的选取恰好为精确线搜索的步长,因此有 q ( s j + 1 ) < q(s^{j+1})< q(sj+1)< q ( s j ) . q(s^j). q(sj). 此外由 s j s^j sj 的定义,
s j = ∑ i = 0 j − 1 α i p i , α i > 0. s^{j}=\sum_{i=0}^{j-1}\alpha_{i}p^{i},\quad\alpha_{i}>0. sj=i=0j1αipi,αi>0.

再根据共轭梯度法的性质,有
( p j ) T s j = ∑ i = 0 j − 1 α i ( p j ) T p i = ∑ i = 0 j − 1 α i ∥ r j ∥ 2 ∥ r i ∥ 2 ∥ p i ∥ 2 > 0. (p^j)^{\mathrm{T}}s^j=\sum_{i=0}^{j-1}\alpha_i(p^j)^{\mathrm{T}}p^i=\sum_{i=0}^{j-1}\alpha_i\frac{\|r^j\|^2}{\|r^i\|^2}\|p^i\|^2>0. (pj)Tsj=i=0j1αi(pj)Tpi=i=0j1αiri2rj2pi2>0.

结合以上表达式可得
∥ s j + 1 ∥ 2 = ∥ s j + α j p j ∥ 2 = ∥ s j ∥ 2 + 2 α j ( p j ) T s j + α j 2 ∥ p j ∥ 2 > ∥ s j ∥ 2 . \|s^{j+1}\|^2=\|s^j+\alpha_j p^j\|^2=\|s^j\|^2+2\alpha_j(p^j)^\mathrm{T}s^j+\alpha_j^2\|p^j\|^2>\|s^j\|^2. sj+12=sj+αjpj2=sj2+2αj(pj)Tsj+αj2pj2>sj2.

实际上,我们还可进一步说明截断共轭梯度算法的输出 s s s 满足如下关系:
q ( s ) ⩽ q ( s t ) , ∥ s t ∥ ⩽ ∥ s ∥ , q(s)\leqslant q(s^{t}),\quad\|s^{t}\|\leqslant\|s\|, q(s)q(st),sts,

其中 t t t 为算法终止时的迭代数. 这只需要分别讨论三种终止条件即可.
(1) 若 ( p t ) T B p t ⩽ 0 (p^t)^\mathrm{T}Bp^t\leqslant 0 (pt)TBpt0, 则 p t p^t pt 是负曲率方向,沿着负曲率方向显然有 q ( s ) ⩽ q ( s t ) q(s)\leqslant q(s^t) q(s)q(st). 注意到此时 ∥ s ∥ = Δ \|s\|=\Delta s=Δ, 因此有 ∥ s t ∥ ⩽ ∥ s ∥ = Δ \|s^t\|\leqslant\|s\|=\Delta sts=Δ.
(2) 若 ( p t ) T B p t > 0 (p^t)^\mathrm{T}Bp^t>0 (pt)TBpt>0 ∥ s t + 1 ∥ ⩾ Δ \|s^{t+1}\|\geqslant\Delta st+1Δ, 根据最速下降法的性质, q ( s t + α p t ) q(s^t+\alpha p^t) q(st+αpt) 关于 α ∈ ( 0 , α t ] \alpha\in(0,\alpha_t] α(0,αt] 单调下降,根据 τ \tau τ 的取法显然有 q ( s ) ⩽ q ( s t ) q(s)\leqslant q(s^t) q(s)q(st). 此时依然有 ∥ s ∥ = Δ \|s\|=\Delta s=Δ, 因此 ∥ s t ∥ ⩽ ∥ s ∥ = Δ \|s^t\|\leqslant\|s\|=\Delta sts=Δ 仍成立.
(3) 若 ( p t ) T B p t > 0 (p^t)^{\mathrm{T}}Bp^t>0 (pt)TBpt>0 ∥ r t + 1 ∥ ⩽ ε ∥ r 0 ∥ \|r^{t+1}\|\leqslant\varepsilon\|r^0\| rt+1εr0, 此时算法就是共轭梯度法,结论自然成立.

定理 6.13 其实可以从以下的观点来看:记 d ( Δ ) d(\Delta) d(Δ) 为信赖域子问题当信赖域半径取 Δ \Delta Δ 时的解,在这里让 Δ \Delta Δ 从 0 开始变化,则 d ( Δ ) d(\Delta) d(Δ) 的轨迹就是一条单参数曲线. 算法 6.9 实际上是使用由共轭梯度法迭代点列 { s j } \{s^j\} {sj} 确定的折线来逼近这条曲线,并将该折线与信赖域交集中距信赖域中心的最远点作为信赖域子问题的近似解. 根据定理 6.13,由于目标函数的单调递减性,截断共轭梯度法可以保证子问题的求解精度自动满足信赖域方法的收敛条件,从而保证理论与数值上有更好的效果.

6.6.3 收敛性分析

1. 柯西点
为了估计求解每个信赖域子问题得到的函数值改善情况,引入柯西点的定义.

定义 6.6 (柯西点) 设 m k ( d ) m_k(d) mk(d) f ( x ) f(x) f(x) 在点 x = x k x=x^k x=xk 处的二阶近似,常数 τ k \tau_k τk 为如下优化问题的解:
min ⁡ m k ( − τ ∇ f ( x k ) ) s . t . ∥ τ ∇ f ( x k ) ∥ ⩽ Δ k , τ ⩾ 0 \begin{aligned}\min\quad&m_k(-\tau\nabla f(x^k))\\\mathrm{s.t.}\quad&\|\tau\nabla f(x^k)\|\leqslant\Delta_k,\tau\geqslant0\end{aligned} mins.t.mk(τf(xk))τf(xk)Δk,τ0

则称 x C k = d e f x k + d C k x_C^k\overset{\mathrm{def}}{=}x^k+d_C^k xCk=defxk+dCk柯西点,其中 d C k = − τ k ∇ f ( x k ) d_C^k=-\tau_k\nabla f(x^k) dCk=τkf(xk).

根据柯西点的定义,它实际上是对 m k ( d ) m_k(d) mk(d) 进行了一次精确线搜索的梯度法,不过这个线搜索是考虑了信赖域约束的. 图 6.17 直观地解释了柯西点的含义.
在这里插入图片描述

实际上,给定 m k ( d ) m_k(d) mk(d), 柯西点可以显式计算出来. 为了方便用 g k g^k gk 表示 ∇ f ( x k ) \nabla f(x^k) f(xk), 根据 τ k \tau_k τk 的定义,其表达式为

τ k = { Δ k ∥ g k ∥ , ( g k ) T B k g k ⩽ 0 min ⁡ { ∥ g k ∥ 2 ( g k ) T B k g k , Δ k ∥ g k ∥ } , 其他 \tau_k=\begin{cases}\displaystyle\frac{\Delta_k}{\|g^k\|},&(g^k)^\text{T}B^kg^k\leqslant0\\\min\left\{\displaystyle\frac{\|g^k\|^2}{(g^k)^\text{T}B^kg^k},\frac{\Delta_k}{\|g^k\|}\right\}, &其他\end{cases} τk= gkΔk,min{(gk)TBkgkgk2,gkΔk},(gk)TBkgk0其他

以上的分析表明,柯西点是信赖域子问题 (6.6.2) 的一个可行点,但在实际计算中人们一般不会将柯西点作为下一步迭代点的近似. 这是由于求柯西点本质上为一个带截断步长的最速下降法,它并没有充分利用海瑟矩阵 B k B^k Bk 的信息.即便如此,人们还是可以将柯西点作为信赖域子问题算法的一个评判标准,即要求子问题算法产生的迭代点至少比柯西点要好.若迭代点取为柯西点,二次模型的目标函数值依然是下降的.实际上,有如下引理:

引理 6.3 (柯西点的下降量) 设 d C k d_C^k dCk 为求解柯西点产生的下降方向,则
m k ( 0 ) − m k ( d C k ) ⩾ 1 2 ∥ g k ∥ min ⁡ { Δ k , ∥ g k ∥ ∥ B k ∥ 2 } ( 6.6.11 ) m_{k}(0)-m_{k}(d_{C}^{k})\geqslant\frac{1}{2}\|g^{k}\|\min\left\{\Delta_{k},\frac{\|g^{k}\|}{\|B^{k}\|_{2}}\right\}\qquad(6.6.11) mk(0)mk(dCk)21gkmin{Δk,Bk2gk}(6.6.11)

证明
( g k ) T B k g k ≤ 0 (g^{k})^{T}B^{k}g^{k}\leq0 (gk)TBkgk0,
m k ( 0 ) − m k ( d c k ) = f − m k ( − Δ k ∥ g k ∥ g k ) = ( g k ) T Δ k ∥ g k ∥ g k − 1 2 Δ k ∥ g k ∥ ( g k ) T B k Δ k ∥ g k ∥ g k ≥ Δ k ∥ g k ∥ ( g k ) T g k = Δ k ∥ g k ∥ ≥ ∥ g k ∥ min ⁡ { Δ k , ∥ g k ∥ ∥ B k ∥ } \begin{aligned} &m_{k}(0)-m_{k}\left(d_{c}^{k}\right)=f-m^{k}\left(-\frac{\Delta^{k}}{\left\|g^{k}\right\|}g^{k}\right) \\ &=(g^{k})^{T}\frac{\Delta_{k}}{\|g^{k}\|}g^{k}-\frac{1}{2}\frac{\Delta_{k}}{\|g^{k}\|}(g^{k})^{T}B^{k}\frac{\Delta_{k}}{\|g^{k}\|}g^{k} \\ &\geq\frac{\Delta_{k}}{\|g^{k}\|}(g^{k})^{T}g^{k}=\Delta_{k}\left\|g^{k}\right\|\geq\|g^{k}\|\min\left\{\Delta_{k},\frac{\|g^{k}\|}{\|B^{k}\|}\right\} \end{aligned} mk(0)mk(dck)=fmk(gkΔkgk)=(gk)TgkΔkgk21gkΔk(gk)TBkgkΔkgkgkΔk(gk)Tgk=Δk gk gkmin{Δk,Bkgk}

( g k ) T B k g k > 0 (g^{k})^{T}B^{k}g^{k} > 0 (gk)TBkgk>0 ∥ g k ∥ 3 Δ k ( g k ) T B k g k ≤ 1 \displaystyle\frac{\|g^{k}\|^3}{\Delta_{k}(g^{k})^{T}B^{k}g^{k}} \leq 1 Δk(gk)TBkgkgk31,
m k ( 0 ) − m k ( d c k ) = f − m k ( − ∥ g k ∥ 2 ( g k ) T B k g k g k ) = ( g k ) T ∥ g k ∥ 2 ( g k ) T B k g k g k − 1 2 ∥ g k ∥ 2 ( g k ) T B k g k ( g k ) T B k ∥ g k ∥ 2 ( g k ) T B k g k g k = ∥ g k ∥ 4 ( g k ) T B k g k − 1 2 ∥ g k ∥ 4 ( g k ) T B k g k = 1 2 ∥ g k ∥ 4 ( g k ) T B k g k ≥ 1 2 ∥ g k ∥ 2 ∥ B k ∥ ≥ 1 2 ∥ g k ∥ min ⁡ { Δ k , ∥ g k ∥ ∥ B k ∥ } \begin{aligned} &m_k(0)-m_k(d_c^k)=f-m_k\left(-\frac{\|g_k\|^2}{(g^{k})^{T}B^{k}g_k}g_k\right) \\ &= (g^{k})^{T}\frac{\|g^{k}\|^2}{(g^{k})^{T}B^{k}g^k}g^{k} - \frac{1}{2}\frac{\|g^{k}\|^2}{(g^{k})^{T}B^{k}g_k}(g^{k})^{T}B^{k}\frac{\|g^{k}\|^2}{(g^{k})^{T}B^{k}g_k}g^{k} \\ &= \frac{\|g^k\|^4}{(g^{k})^{T}B^kg^k} - \frac{1}{2}\frac{\|g^k\|^4}{(g^{k})^{T}B^kg^k} = \frac{1}{2}\frac{\|g^k\|^4}{(g^{k})^{T}B^kg^k} \\&\geq \frac{1}{2}\frac{\|g^k\|^2}{\|B_k\|} \geq \frac{1}{2}\|g^k\|\min\left\{\Delta_k,\frac{\|g^k\|}{\|B^k\|}\right\} \end{aligned} mk(0)mk(dck)=fmk((gk)TBkgkgk2gk)=(gk)T(gk)TBkgkgk2gk21(gk)TBkgkgk2(gk)TBk(gk)TBkgkgk2gk=(gk)TBkgkgk421(gk)TBkgkgk4=21(gk)TBkgkgk421Bkgk221gkmin{Δk,Bkgk}

( g k ) T B k g k > 0 (g^{k})^{T}B^{k}g^{k}>0 (gk)TBkgk>0 ∥ g k ∥ 3 Δ k ( g k ) T B k g k > 1 \displaystyle\frac{\|g^{k}\|^{3}}{\Delta_{k}(g^{k})^{T}B^{k}g^{k}}>1 Δk(gk)TBkgkgk3>1,
m k ( 0 ) − m k ( d c k ) = f − m k ( − Δ k ∥ g k ∥ g k ) = ( g k ) T Δ k ∥ g k ∥ g k − 1 2 Δ k ∥ g k ∥ ( g k ) T B k Δ k ∥ g k ∥ g k = Δ k ∥ g k ∥ − 1 2 Δ k 2 ∥ g k ∥ 2 ( g k ) T B k g k = Δ k ∥ g k ∥ − 1 2 ( Δ k ∥ g k ∥ ) Δ k ( g k ) T B k g k ∥ g k ∥ 3 ≥ Δ k ∥ g k ∥ − 1 2 Δ k ∥ g k ∥ = 1 2 Δ k ∥ g k ∥ ≥ 1 2 ∥ g k ∥ min ⁡ { Δ k , ∥ g k ∥ ∥ B k ∥ } \begin{aligned} &m_{k}(0)-m_{k}(d_{c}^{k})=f-m_{k}\left(-\frac{\Delta_{k}}{\|g^{k}\|}g^{k}\right) \\ &=(g^{k})^{T}\frac{\Delta_{k}}{\|g^{k}\|}g^{k}-\frac{1}{2}\frac{\Delta_{k}}{\|g^{k}\|}(g^{k})^{T}B^{k}\frac{\Delta_{k}}{\|g^{k}\|}g^{k} \\ &=\Delta_{k}\left\|g^{k}\right\|-\frac{1}{2}\frac{\Delta_{k}^{2}}{\left\|g^{k}\right\|^{2}}(g^{k})^{T}B^{k}g^{k}=\Delta_{k}\left\|g^{k}\right\|-\frac{1}{2}\left(\Delta_{k}\left\|g^{k}\right\|\right)\frac{\Delta_{k}(g^{k})^{T}B^{k}g^{k}}{\left\|g^{k}\right\|^{3}} \\ &\geq\Delta_{k}\left\|g^{k}\right\|-\frac{1}{2}\Delta_{k}\left\|g^{k}\right\|=\frac{1}{2}\Delta_{k}\left\|g^{k}\right\|\geq\frac{1}{2}\left\|g^{k}\right\|\operatorname*{min}\left\{\Delta_{k},\frac{\left\|g^{k}\right\|}{\left\|B^{k}\right\|}\right\} \end{aligned} mk(0)mk(dck)=fmk(gkΔkgk)=(gk)TgkΔkgk21gkΔk(gk)TBkgkΔkgk=Δk gk 21gk2Δk2(gk)TBkgk=Δk gk 21(Δk gk )gk3Δk(gk)TBkgkΔk gk 21Δk gk =21Δk gk 21 gk min{Δk,Bk gk }

而前一小节介绍的子问题求解方法 (如迭代法,截断共轭梯度,Dogleg 方法) 得到的迭代方向 d k d^k dk 均满足
m k ( 0 ) − m k ( d k ) ⩾ c 2 ( m k ( 0 ) − m k ( d C k ) ) m_{k}(0)-m_{k}(d^{k})\geqslant c_{2}(m_{k}(0)-m_{k}(d_{C}^{k})) mk(0)mk(dk)c2(mk(0)mk(dCk))

这也就意味着估计式

m k ( 0 ) − m k ( d k ) ⩾ 1 2 c 2 ∥ g k ∥ min ⁡ { Δ k , ∥ g k ∥ ∥ B k ∥ 2 } ( 6.6.12 ) m_{k}(0)-m_{k}(d^{k})\geqslant\frac{1}{2}c_{2}\|g^{k}\|\operatorname*{min}\left\{\Delta_{k},\frac{\|g^{k}\|}{\|B^{k}\|_{2}}\right\}\qquad(6.6.12) mk(0)mk(dk)21c2gkmin{Δk,Bk2gk}(6.6.12)

在很多情况下都会成立。

2. Dogleg 方法
对柯西点的改进,首推 Dogleg 方法。
考虑 B k B_k Bk 正定的情况,当 m k ( d ) m_k(d) mk(d) 的极小值位于信赖域内时,步长就是牛顿法的解,我们记作 d B = − B k − 1 ∇ f ( x k ) d^B=-{B^k}^{-1}\nabla f(x^k) dB=Bk1f(xk) 。当这个点是信赖域子问题的可行解时,显然 d ∗ = d B d^*=d^B d=dB
Dogleg 方法提供了一种良好的近似,使得我们可以轻松计算出针对任意信赖域半径的最佳步长。下图展示了 Dogleg 是如何对真实的最佳步长进行近似的。
在这里插入图片描述

图中 “Optimal trajectory" 即为真实的最佳步长,它是一条曲线,曲线方程我们无从得知。它的特点是,当信赖域半径很小时,比较接近于柯西点方向,当信赖域半径比较大时,比较接近于无约束的柯西点与 d B d^B dB 的连线方向。根据这个规律,我们只需要计算出无约束的 d U d^U dU d B d^B dB, 就能得到两个线段,这就是近似的最佳步长所在的线段。我们把这条折线叫做 Dogleg,因为它看起来像一条狗腿。
在到达 d B d^B dB 之前,沿着 Dogleg 前进,步长的大小是单调递增的,同时 m k ( d ) m_k(d) mk(d) 是单调下降的。因此信赖域边界与 Dogleg 至多有一个交点。在 Dogleg 方法的每次送代中,只需要计算给定信赖域半径 Δ \Delta Δ 对应的最佳步长,然后按照式(6.6.3)判断是否满足要求,是则进入下一个迭代,否则缩小 Δ \Delta Δ 再次计算。
子问题: min ⁡ m k ( d ) , s . t . ∥ d ∥ ≤ Δ k \min m_k(d),\qquad s.t. \|d\|\leq \Delta_k minmk(d),s.t.∥dΔk
DogLeg 方法求解 d k d_k dk.
d B = − B − 1 g . d U = − g T g g T B g g . d^B=-B^{-1}g.\quad d^U=-\frac{g^Tg}{g^TBg}g. dB=B1g.dU=gTBggTgg.

d k = { τ d U 0 ≤ τ ≤ 1 d U + ( τ − 1 ) ( d B − d U ) 1 ≤ τ ≤ 2 d_k=\begin{cases}\quad\tau d^U & 0 \leq\tau\leq 1\\ d^U+(\tau-1)(d^B-d^U) & 1 \leq\tau\leq 2\end{cases} dk={τdUdU+(τ1)(dBdU)0τ11τ2

其中 τ ∈ [ 0 , 2 ] \tau\in[0,2] τ[0,2]

Dogleg 法的基本思想是在当前点处,通过计算最速下降方向和牛顿方向,然后根据这两个方向的信息来选择一个合适的步长和方向进行迭代。具体来说,Dogleg 法会计算一个试探点,然后根据试探点的情况来更新当前点,并继续迭代直到满足停止条件。

3. 全局收敛性
回顾信赖域算法 6.8,我们引入了一个参数 η \eta η 来确定是否应该更新迭代点.这分为两种情况:当 η \eta η = 0 时,只要原目标函数有下降量就接受信赖域迭代步的更新;当 η \eta η > 0 时,只有当改善量 ρ k \rho_k ρk 达到一定程度时再进行更新.在这两种情况下得到的收敛性结果是不同的,我们分别介绍这两种结果.

η \eta η = 0 的条件下有如下收敛性定理:

定理 6.14 (全局收敛性 1) 设近似海瑟矩阵 B k B^k Bk 有界,即 ∥ B k ∥ 2 ⩽ M , ∀ k , f ( x ) \|B^k\|_2\leqslant M, \forall k, f(x) Bk2M,k,f(x) 在下水平集 L = { x ∣ f ( x ) ⩽ f ( x 0 ) } \mathcal{L}=\{x\mid f(x)\leqslant f(x^0)\} L={xf(x)f(x0)} 上有下界,且 ∇ f ( x ) \nabla f(x) f(x) L \mathcal{L} L 的一个开邻域内利普希茨连续. 若 d k d^k dk 为信赖域子问题的近似解且满足 (6.6.12) 式,算法 6.8 选取参数 η = 0 \eta=0 η=0, 则
lim inf ⁡ k → ∞ ∥ ∇ f ( x k ) ∥ = 0 \liminf_{k\to\infty}\|\nabla f(x^k)\|=0 kliminf∥∇f(xk)=0

x k x^k xk 的聚点中包含稳定点.

在数学中,“聚点”通常指的是集合中的一点,该点周围存在无限多的集合元素。具体来说:
对于集合 A A A 中的点 p p p, 如果对于任意给定的 p p p 的邻域 (包含 p p p 的某个开集), 都存在集合 A A A 中与 p p p 不同的点,则称 p p p A A A 的聚点。
如果一个点是集合的聚点,那么这个点可以被集合中的序列中的点无限接近。
在拓扑学和实分析中,聚点是一个重要的概念,用于描述集合中点的密集程度。

定理 6.14 表明若无条件接受信赖域子问题的更新,则信赖域算法仅仅有子序列的收敛性,迭代点序列本身不一定收敛.下面的定理则说明选取 η > 0 \eta>0 η>0 可以改善收敛性结果.

定理 6.15 (全局收敛性 2) 在定理 6.14 的条件下,若信赖域算法选取参数 η > 0 \eta>0 η>0, 且信赖域子问题近似解 d k d^k dk 满足 (6.6.12) 式,则
lim ⁡ k → ∞ ∥ ∇ f ( x k ) ∥ = 0. \lim_{k\to\infty}\|\nabla f(x^{k})\|=0. klim∥∇f(xk)=0.

和牛顿类算法不同,信赖域算法具有全局收敛性,因此它对迭代初值选取的要求比较弱. 而牛顿法的收敛性极大地依赖初值的选取.

3. 局部收敛性
在构造信赖域子问题时利用了 f ( x ) f(x) f(x) 的二阶信息,它在最优点附近应该具有牛顿法的性质. 特别地,当近似矩阵 B k B^k Bk 取为海瑟矩阵 ∇ 2 f ( x k ) \nabla^2f(x^k) 2f(xk) 时,根据信赖域子问题的更新方式,二次模型 m k ( d ) m_k(d) mk(d) 将会越来越逼近原函数 f ( x ) f(x) f(x), 最终信赖域约束 ∥ d ∥ ⩽ Δ k \|d\|\leqslant\Delta_k dΔk 将会失效. 此时信赖域方法将会和牛顿法十分接近,而根据定理 6.6, 牛顿法有 Q-二次收敛的性质,这个性质很自然地会继承到信赖域算法上.
和牛顿法不同的是,在信赖域迭代算法中,我们并不知道迭代点列是否已经接近最优点. 即使信赖域半径约束已经不起作用,如果 B k B^k Bk 没有取为海瑟矩阵 ∇ 2 f ( x k ) \nabla^2f(x^k) 2f(xk) 或者信赖域子问题没有精确求解, d k d^k dk 一般也不会等于牛顿方向 d N k d_N^k dNk, 但是它们的误差往往是越来越小的. 我们有如下定理:

定理 6.16 f ( x ) f(x) f(x) 在最优点 x = x ∗ x=x^* x=x 的一个邻域内二阶连续可微,且 ∇ f ( x ) \nabla f(x) f(x) 利普希茨连续,在最优点 x ∗ x^* x 处二阶充分条件成立,即 ∇ 2 f ( x ∗ ) ≻ 0 \nabla^2 f(x^*)\succ0 2f(x)0. 若迭代点列 { x k } \{x^k\} {xk} 收敛到 x ∗ x^* x, 且在迭代中选取 B k B^k Bk 为海瑟矩阵 ∇ 2 f ( x k ) \nabla^2f(x^k) 2f(xk), 则对充分大的 k k k, 任意满足 (6.6.12) 式的信赖域子问题算法产生的迭代方向 d k d^k dk 均满足
∥ d k − d N k ∥ = o ( ∥ d N k ∥ ) ( 6.6.13 ) \|d^{k}-d_{N}^{k}\|=o(\|d_{N}^{k}\|)\qquad(6.6.13) dkdNk=o(dNk)(6.6.13)

其中 d N k d_N^k dNk 为第 k k k 步迭代的牛顿方向且满足假设 ∥ d N k ∥ ⩽ Δ k 2 \|d_N^k\|\leqslant\displaystyle\frac{\Delta_k}2 dNk2Δk.

定理 6.16 说明若信赖域算法收敛,则当 k k k 充分大时,信赖域半径的约束终将失效,且算法产生的迭代方向将会越来越接近牛顿方向.

根据定理 6.16 很容易得到收敛速度的估计.

推论 6.3 (信赖域算法的局部收敛速度) 在定理 6.16 的条件下,信赖域算法产生的迭代序列 { x k x^k xk} 具有 Q-超线性收敛速度.
证明
根据牛顿法收敛性定理,对牛顿方向, ∥ x k − d N k − x ∗ ∥ = O ( ∥ x k − x ∗ ∥ 2 ) , \|x^k-d_N^k-x^*\|=\mathcal{O}(\|x^k-x^*\|^2), xkdNkx=O(xkx2),

因此得到估计 ∥ d N k ∥ = O ( ∥ x k − x ∗ ∥ 2 ) \|d_N^k\|=\mathcal{O}(\|x^k-x^*\|^2) dNk=O(xkx2), 又根据牛顿法的局部收敛性定理, ∥ x k + d k − x ∗ ∥ ⩽ ∥ x k + d N k − x ∗ ∥ + ∥ d k − d N k ∥ = o ( ∥ x k − x ∗ ∥ 2 ) + o ( ∥ d N k ∥ ) = o ( ∥ x k − x ∗ ∥ ) . \|x^k+d^k-x^*\|\leqslant\|x^k+d_N^k-x^*\|+\|d^k-d_N^k\|=o(\|x^k-x^*\|^2)+o(\|d_N^k\|)=o(\|x^k-x^*\|). xk+dkxxk+dNkx+dkdNk=o(xkx2)+o(dNk)=o(xkx).

这说明信赖域算法是Q-超线性收敛的.

可以看出,若在迭代后期 d k = d N k d^k=d_N^k dk=dNk 能得到满足,则信赖域算法是 Q-二次收敛的. 很多算法都会有这样的性质,例如前面提到的截断共轭梯度法. 因此在实际应用中,截断共轭梯度法是最常用的信赖域子问题的求解方法,使用此方法能够同时兼顾全局收敛性和局部 Q-二次收敛性.

参考教材:《最优化:建模、算法与理论》
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值