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

6.7 非线性最小二乘问题算法

本节研究非线性最小二乘问题的算法.非线性最小二乘问题是一类特殊的无约束优化问题,它有非常广泛的实际应用背景.例如在统计中,我们经常建立如下带参数的模型:

b = ϕ ( a ; x ) + ε b=\phi(a;x)+\varepsilon b=ϕ(a;x)+ε

其中 a a a 为自变量, b b b 为响应变量,它们之间的关系由函数 ϕ ( ⋅ ; x ) \phi(\cdot;x) ϕ(;x) 决定且 x x x 是参数, ε \varepsilon ε 是噪声项,即观测都是有误差的. 我们的目的是要根据观测 ( a i , b i ) (a_i,b_i) (ai,bi),估计未知参数 x x x 的值. 若 ε \varepsilon ε 服从高斯分布,则使用 ℓ 2 \ell_{2} 2 范数平方是处理高斯噪声最好的方式:对 ℓ 2 \ell_2 2 范数平方损失函数

f ( x ) = 1 m ∑ i = 1 m ∥ b i − ϕ ( a i ; x ) ∥ 2 f(x)=\frac{1}{m}\sum_{i=1}^m\|b_i-\phi(a_i;x)\|^2 f(x)=m1i=1mbiϕ(ai;x)2

进行极小化即可求出未知参数 x x x 的估计. 而对 ℓ 2 \ell_{2} 2 范数平方损失函数求解极小值就是一个最小二乘问题.

最小二乘问题一般属于无约束优化问题,但由于问题特殊性,人们针对其结构设计了许多算法快速求解. 一般地,设 x ∗ x^* x 为最小二乘问题的解,根据最优解处残量 ∑ i = 1 m ∥ b i − ϕ ( a i ; x ) ∥ 2 \displaystyle\sum_{i=1}^m\|b_i-\phi(a_i;x)\|^2 i=1mbiϕ(ai;x)2 的大小,可以将最小二乘问题分为小残量问题大残量问题. 本节针对小残量问题介绍两种方法:高斯-牛顿算法和 LM 方法;而针对大残量问题简要地引入带结构的拟牛顿法.

6.7.1 非线性最小二乘问题

考虑非线性最小二乘问题的一般形式
f ( x ) = 1 2 ∑ j = 1 m r j 2 ( x ) ( 6.7.1 ) \begin{aligned}f(x)=\frac{1}{2}\sum_{j=1}^{m}r_{j}^{2}(x)\end{aligned}\qquad(6.7.1) f(x)=21j=1mrj2(x)(6.7.1)

其中 r j : R n → R r_j:\mathbb{R}^n\to\mathbb{R} rj:RnR 是光滑函数,并且假设 m ⩾ n m\geqslant n mn. 我们称 r j r_j rj 为残差. 为了表述问题的方便,定义残差向量 r : R n → R m r:\mathbb{R}^n\to\mathbb{R}^m r:RnRm
r ( x ) = ( r 1 ( x ) , r 2 ( x ) , ⋯   , r m ( x ) ) T \begin{aligned}r(x)=(r_1(x),r_2(x),\cdots,r_m(x))^\mathrm{T}\end{aligned} r(x)=(r1(x),r2(x),,rm(x))T

使用这一定义,函数 f ( x ) f(x) f(x) 可以写为 f ( x ) = 1 2 ∥ r ( x ) ∥ 2 2 f(x)=\displaystyle\frac{1}{2}\|r(x)\|_{2}^{2} f(x)=21r(x)22.

问题 (6.7.1) 是一个无约束优化问题,可以使用前面讲过的任何一种算法求解. 为此直接给出 f ( x ) f(x) f(x) 的梯度和海瑟矩阵
∇ f ( x ) = ∑ j = 1 m r j ( x ) ∇ r j ( x ) = J ( x ) T r ( x ) ( 6.7.2 a ) ∇ 2 f ( x ) = ∑ j = 1 m ∇ r j ( x ) ∇ r j ( x ) T + ∑ i = 1 m r i ( x ) ∇ 2 r i ( x ) = J ( x ) T J ( x ) + ∑ i = 1 m r i ( x ) ∇ 2 r i ( x ) ( 6.7.2 b ) \begin{aligned} &\nabla f(x) = \sum_{j=1}^m r_j(x)\nabla r_j(x) = J(x)^{\mathrm{T}}r(x)\qquad(6.7.2a)\\ &\nabla^{2}f(x) = \sum_{j=1}^m\nabla r_j(x)\nabla r_j(x)^\mathrm{T} + \sum_{i=1}^mr_i(x)\nabla^2 r_i(x) = J(x)^{\mathrm{T}}J(x)+\sum_{i=1}^{m}r_{i}(x)\nabla^{2}r_{i}(x)\qquad(6.7.2b) \end{aligned} f(x)=j=1mrj(x)rj(x)=J(x)Tr(x)(6.7.2a)2f(x)=j=1mrj(x)rj(x)T+i=1mri(x)2ri(x)=J(x)TJ(x)+i=1mri(x)2ri(x)(6.7.2b)

其中 J ( x ) ∈ R m × n J(x)\in\mathbb{R}^{m\times n} J(x)Rm×n 是向量值函数 r ( x ) r(x) r(x) 在点 x x x 处的雅可比矩阵: J ( x ) = [ ∇ r 1 ( x ) T ∇ r 2 ( x ) T ⋮ ∇ r m ( x ) T ] . J(x)=\begin{bmatrix}\nabla r_1(x)^\mathrm{T}\\\nabla r_2(x)^\mathrm{T}\\\vdots\\\nabla r_m(x)^\mathrm{T}\end{bmatrix}. J(x)= r1(x)Tr2(x)Trm(x)T . 这里指出, ∇ 2 f ( x ) \nabla^2f(x) 2f(x) 在形式上分为两部分,分别为 J ( x ) T J ( x ) J(x)^\mathrm{T}J(x) J(x)TJ(x) ∑ i = 1 m r i ( x ) ∇ 2 r i ( x ) \displaystyle\sum_{i=1}^mr_i(x)\nabla^2r_i(x) i=1mri(x)2ri(x). 处理这两部分的难度是截然不同的:注意到计算 ∇ f ( x ) \nabla f(x) f(x) 时需要 r ( x ) r(x) r(x) 的雅可比矩阵,因此海瑟矩阵的前一项是自然得到的,不需要进行额外计算;而海瑟矩阵的第二项则需要计算每个 ∇ 2 r i ( x ) \nabla^2r_i(x) 2ri(x), 这会导致额外计算量,因此很多最小二乘算法就是根据这个性质来设计的.

6.7.2 高斯 – 牛顿算法

高斯-牛顿法是求解非线性最小二乘问题的经典方法,它可以看成是结合了线搜索的牛顿法的变形. 既然海瑟矩阵中有关 r i ( x ) r_i(x) ri(x) 的二阶导数项不易求出,高斯-牛顿法不去计算这一部分,直接使用 J ( x ) T J ( x ) J(x)^{\mathrm{T}}J(x) J(x)TJ(x) 作为海瑟矩阵的近似矩阵来求解牛顿方程. 用 J k J^k Jk 简记 J ( x k ) J(x^k) J(xk). 高斯-牛顿法产生的下降方向 d k d^k dk 满足

( J k ) T J k d k = − ( J k ) T r k ( 6.7.3 ) (J^k)^{\mathrm{T}}J^kd^k=-(J^k)^{\mathrm{T}}r^k\qquad(6.7.3) (Jk)TJkdk=(Jk)Trk(6.7.3)

上述方程正是法方程的形式,而由线性代数的知识可知,不管 J k J^k Jk 是否是满秩矩阵,方程 (6.7.3) 一定存在解,而解可以通过伪逆矩阵或最小二乘方法得到。实际上,该方程是如下线性最小二乘问题的最优性条件:
min ⁡ d 1 2 ∥ J k d + r k ∥ 2 \min_d\quad\frac{1}{2}\|J^kd+r^k\|^2 dmin21Jkd+rk2

在求解线性最小二乘问题时,只需要对 J k J^k Jk 做 QR 分解,因此矩阵 ( J k ) T J k (J^k)^{\mathrm{T}}J^k (Jk)TJk 无需计算出来.
在这里插入图片描述

高斯-牛顿法的框架如算法 6.10. 为了方便理解,我们将求解线性最小二乘问题的方法进行了展开. 高斯-牛顿法每一步的运算量是来自计算残差向量 r k r^k rk 和雅可比矩阵 J k J^k Jk, 和其他算法相比,它的计算量较小. 若 J k J^k Jk 是满秩矩阵,则高斯-牛顿法得到的方向 d k d^k dk 总是一个下降方向,这是因为
( d k ) T ∇ f ( x k ) = ( d k ) T ( J k ) T r k = − ∥ J k d k ∥ 2 < 0 (d^{k})^{\mathrm{T}}\nabla f(x^{k})=(d^{k})^{\mathrm{T}}(J^{k})^{\mathrm{T}}r^{k}=-\|J^{k}d^{k}\|^{2}<0 (dk)Tf(xk)=(dk)T(Jk)Trk=Jkdk2<0

这也是高斯-牛顿法的优点. 在此之前的牛顿法,并不总是保证 d k d^k dk 是下降方向. 而高斯-牛顿法使用一个半正定矩阵来近似牛顿矩阵,可以获得较好的下降方向.

# 算法 6.10 高斯-牛顿法
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100, 1)
noise = np.random.normal(0, 1, (100, 1))
para_true = np.array([3.0, 4.0])
y = para_true[0] * x**2 + para_true[1] * x + noise
def func(x, para):
    return para[0] * x**2 + para[1] * x
def jacobi(x, para):
    J = np.zeros((len(x), len(para)))
    J[:, 0] = x[:, 0]**2
    J[:, 1] = x[:, 0]
    return J
def gauss_newton(x, y, max_iter=10000):
    para = np.ones((2, 1))  # 参数初始化
    for i in range(max_iter):
        r = (y - func(x, para))  # 误差
        J = -jacobi(x, para)
        # QR分解
        Q, R = np.linalg.qr(J)
        # 计算下降方向
        d = -np.linalg.inv(R) @ Q.T @ r
        alpha = 0.01 # 步长
        para_next = para + alpha * d
        if np.linalg.norm(para_next - para) < 1e-6:  # 判断迭代终止条件
            break
        para = para_next

    return para

para_est = gauss_newton(x, y)
print("参数真实值:", para_true)
'''参数真实值: [3. 4.]'''
print("参数估计值:", para_est)
'''参数估计值: [[2.98661373]
 [4.12147949]]'''
# 绘制拟合曲线
plt.figure()
plt.scatter(x, y, color='red', label='Data points', s = 20)
x_range = np.linspace(-3, 3, 100)
y_fit = func(x_range, para_est)
plt.plot(x_range, y_fit, color='blue', label='Fitted curve')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

在这里插入图片描述

一个很自然的问题是:高斯-牛顿法使用了近似矩阵来求解牛顿方程,那么在什么情况下这个近似是合理的?直观上看,根据海瑟矩阵 (6.7.2b) 的表达式 ∇ 2 f ( x ) = J ( x ) T J ( x ) + ∑ i = 1 m r i ( x ) ∇ 2 r i ( x ) \nabla^{2}f(x) = J(x)^{\mathrm{T}}J(x)+\sum_{i=1}^{m}r_{i}(x)\nabla^{2}r_{i}(x) 2f(x)=J(x)TJ(x)+i=1mri(x)2ri(x),当 ( J k ) T J k (J^k)^{\mathrm{T}}J^k (Jk)TJk 这一部分起主导时,所使用的近似是有意义的. 一个充分条件就是在最优点 x ∗ x^* x r i ( x ∗ ) r_i(x^*) ri(x) 的值都很小. 此时高斯-牛顿法和牛顿法相近,它们也有很多相似的性质. 如果残差向量 r ( x ∗ ) r(x^*) r(x) 模长较大,则仅仅使用 ( J k ) T J k (J^k)^\mathrm{T}J^k (Jk)TJk 并不能很好地近似 ∇ 2 f ( x k ) \nabla^2f(x^k) 2f(xk), 此时高斯-牛顿法可能收敛很慢甚至发散.

接下来给出高斯-牛顿法的收敛性质. 通过上面的描述可以注意到,雅可比矩阵 J k J^k Jk 的非奇异性是一个很关键的因素,因此我们在这个条件下建立收敛性. 假设雅可比矩阵 J ( x ) J(x) J(x) 的奇异值一致地大于 0, 即存在 γ > 0 \gamma>0 γ>0 使得
∥ J ( x ) z ∥ ⩾ γ ∥ z ∥ , ∀   x ∈ N , ∀   z ∈ R n , ( 6.7.4 ) \|J(x)z\|\geqslant\gamma\|z\|,\quad\forall\:x\in\mathcal{N},\quad\forall\:z\in\mathbb{R}^n,\qquad(6.7.4) J(x)zγz,xN,zRn,(6.7.4)

其中 N \mathcal{N} N 是下水平集
L = { x ∣ f ( x ) ⩽ f ( x 0 ) } ( 6.7.5 ) \mathcal{L}=\{x\mid f(x)\leqslant f(x^{0})\}\qquad(6.7.5) L={xf(x)f(x0)}(6.7.5)

的一个邻域, x 0 x^0 x0 是算法的初始点,且假设 L \mathcal{L} L 是有界的.

在前面的假设下,有如下收敛性定理:

定理 6.17 (全局收敛性) 如果每个残差函数 r j r_{j} rj 在有界下水平集 (6.7.5) 的一个邻域 N \mathcal{N} N 内是利普希茨连续可微的,并且雅可比矩阵 J ( x ) J(x) J(x) N \mathcal{N} N 内满足一致满秩条件 (6.7.4), 而步长满足 Wolfe 准则 (6.1.4), 则对高斯-牛顿法得到的序列 { x k } \{x^k\} {xk}
lim ⁡ k → ∞ ( J k ) T r k = 0. \begin{aligned}\lim_{k\to\infty}(J^k)^\mathrm{T}r^k=0.\end{aligned} klim(Jk)Trk=0.

证明
在这里直接验证 Zoutendijk 条件成立即可.
首先,选择有界下水平集 L \mathcal{L} L 的邻域 N \mathcal{N} N 足够小,从而使得存在 L > 0 , β > 0 L>0,\beta>0 L>0,β>0, 对于任何 x , x ~ ∈ N x,\tilde{x}\in\mathcal{N} x,x~N 以及任意的 j = 1 , 2 , ⋯   , m j=1,2,\cdots,m j=1,2,,m, 以下条件被满足:
∥ r j ( x ) ∥ ⩽ β , ∥ ∇ r j ( x ) ∥ ⩽ β , ∣ r j ( x ) − r j ( x ~ ) ∣ ⩽ L ∥ x − x ~ ∥ , ∥ ∇ r j ( x ) − ∇ r j ( x ~ ) ∥ ⩽ L ∥ x − x ~ ∥ . \begin{aligned}\lVert r_j(x)\rVert&\leqslant\beta,\quad\lVert\nabla r_j(x)\rVert\leqslant\beta,\\\lvert r_j(x)-r_j(\tilde{x})\rvert&\leqslant L\lVert x-\tilde{x}\rVert,\quad\lVert\nabla r_j(x)-\nabla r_j(\tilde{x})\rVert\leqslant L\lVert x-\tilde{x}\rVert.\end{aligned} rj(x)∥rj(x)rj(x~)∣β,rj(x)∥β,Lxx~,rj(x)rj(x~)∥Lxx~.

那么对任意的 x ∈ L x\in\mathcal{L} xL 存在 β ~ \tilde{\beta} β~ 使得 ∥ J ( x ) ∥ = ∥ J ( x ) T ∥ ⩽ β ~ \|J(x)\|=\|J(x)^{\mathrm{T}}\|\leqslant\tilde{\beta} J(x)=J(x)Tβ~, 并且 ∇ f ( x ) = J ( x ) T r ( x ) \nabla f(x)=J(x)^\mathrm{T}r(x) f(x)=J(x)Tr(x) 是利普希茨连续函数.
那么 Zoutendijk 条件满足,成立: ∑ k = 0 ∞ cos ⁡ 2 θ k ∥ ∇ f ( x k ) ∥ 2 < + ∞ \sum_{k=0}^\infty \cos^2\theta_k\|\nabla f(x_k)\|^2<+\infty k=0cos2θk∥∇f(xk)2<+

其中 θ k \theta_k θk 是高斯-牛顿方向 d k d^k dk 与负梯度方向的夹角,则
cos ⁡ θ k = − ∇ f ( x k ) T d k ∥ d k ∥ ∥ ∇ f ( x k ) ∥ = ∥ J k d k ∥ 2 ∥ d k ∥ ∥ ( J k ) T J k d k ∥ ⩾ γ 2 ∥ d k ∥ 2 β ~ 2 ∥ d k ∥ 2 = γ 2 β ~ 2 > 0. \cos\theta_k=-\frac{\nabla f(x^k)^\text{T}d^k}{\|d^k\|\|\nabla f(x^k)\|}=\frac{\|J^kd^k\|^2}{\|d^k\|\|(J^k)^\text{T}J^kd^k\|}\geqslant\frac{\gamma^2\|d^k\|^2}{\tilde{\beta}^2\|d^k\|^2}=\frac{\gamma^2}{\tilde{\beta}^2}>0. cosθk=dk∥∥∇f(xk)f(xk)Tdk=dk∥∥(Jk)TJkdkJkdk2β~2dk2γ2dk2=β~2γ2>0.

根据推论 6.1(线搜索算法的收敛性) 即可得 ∇ f ( x k ) → 0. \nabla f(x^k)\to 0. f(xk)0.

定理 6.17 的关键假设是一致满秩条件 (6.7.4). 实际上,若 J k J^k Jk 不满秩, 则更新方向 d k d_k dk 有无穷多个解. 如果对解的性质不提额外要求,则无法推出 cos ⁡ θ k \cos\theta_k cosθk 一致地大于零. 此时收敛性可能不成立.

( J k ) T J k (J^k)^{\mathrm{T}}J^k (Jk)TJk 在海瑟矩阵 (6.7.2b) 中占据主导部分时(当 ∑ i = 1 m r i ( x ) ∇ 2 r i ( x ) \sum_{i=1}^mr_i(x)\nabla^2r_i(x) i=1mri(x)2ri(x) 较小时),高斯-牛顿算法可能会有更快的收敛速度. 类似于牛顿法,我们给出高斯-牛顿法的局部收敛性.

定理 6.18 (局部收敛性) 设 r i ( x ) r_i(x) ri(x) 二阶连续可微, x ∗ x^* x 是最小二乘问题 (6.7.1) 的最优解,海瑟矩阵 ∇ 2 f ( x ) \nabla^2f(x) 2f(x) 和其近似矩阵 J ( x ) T J ( x ) J(x)^\mathrm{T}J(x) J(x)TJ(x) 均在点 x ∗ x^* x 的一个邻域内利普希茨连续,则当高斯-牛顿算法步长 α k \alpha_k αk 恒为 1 时,
∥ x k + 1 − x ∗ ∥ ⩽ C ∥ ( ( J ∗ ) T J ∗ ) − 1 H ∗ ∥ ∥ x k − x ∗ ∥ + O ( ∥ x k − x ∗ ∥ 2 ) ( 6.7.8 ) \|x^{k+1}-x^*\|\leqslant C\|((J^*)^\text{T}J^*)^{-1}H^*\|\|x^k-x^*\|+\mathcal{O}(\|x^k-x^*\|^2)\qquad(6.7.8) xk+1xC((J)TJ)1H∥∥xkx+O(xkx2)(6.7.8)

其中 H ∗ = ∑ i = 1 m r i ( x ∗ ) ∇ 2 r i ( x ∗ ) H^*=\displaystyle\sum_{i=1}^mr_i(x^*)\nabla^2r_i(x^*) H=i=1mri(x)2ri(x) 为海瑟矩阵 ∇ 2 f ( x ∗ ) \nabla^2f(x^*) 2f(x) 去掉 J ( x ∗ ) T J ( x ∗ ) J(x^*)^\mathrm{T}J(x^*) J(x)TJ(x) 的部分, C > 0 C>0 C>0 为常数.

证明
根据迭代公式,
x k + 1 − x k = x k + d k − x ∗ = ( ( J k ) T J k ) − 1 ( ( J k ) T J k ( x k − x ∗ ) + ∇ f ( x ∗ ) − ∇ f ( x k ) ) ( 6.7.9 ) x^{k+1}-x^k=x^k+d^k-x^*=((J^k)^\mathrm{T}J^k)^{-1}((J^k)^\mathrm{T}J^k(x^k-x^*)+\nabla f(x^*)-\nabla f(x^k))\qquad(6.7.9) xk+1xk=xk+dkx=((Jk)TJk)1((Jk)TJk(xkx)+f(x)f(xk))(6.7.9)

由泰勒展开,
∇ f ( x k ) − ∇ f ( x ∗ ) = ∫ 0 1 J T J ( x ∗ + t ( x k − x ∗ ) ) ( x k − x ∗ ) d t + ∫ 0 1 H ( x ∗ + t ( x k − x ∗ ) ) ( x k − x ∗ ) d t \nabla f(x^k)-\nabla f(x^*)=\int_0^1 J^\mathrm{T}J(x^*+t(x^k-x^*))(x^k-x^*)dt+\int_0^1 H(x^*+t(x^k-x^*))(x^k-x^*)dt f(xk)f(x)=01JTJ(x+t(xkx))(xkx)dt+01H(x+t(xkx))(xkx)dt

其中 J T J ( x ) J^\mathrm{T}J(x) JTJ(x) J T ( x ) J ( x ) J^\mathrm{T}(x)J(x) JT(x)J(x) 的简写, H ( x ) = ∇ 2 f ( x ) − J T J ( x ) H(x)=\nabla^2f(x)-J^{\mathrm{T}}J(x) H(x)=2f(x)JTJ(x) 为海瑟矩阵剩余部分. 将泰勒展开式代入(6.7.9)式右边,取范数进行估计,有
∥ ( J k ) T J k ( x k − x ∗ ) + ∇ f ( x ∗ ) − ∇ f ( x k ) ∥ ⩽ ∫ 0 1 ∥ ( J T J ( x k ) − J T J ( x ∗ + t ( x k − x ∗ ) ) ) ( x k − x ∗ ) ∥ d t + ∫ 0 1 ∥ H ( x ∗ + t ( x k − x ∗ ) ) ( x k − x ∗ ) ∥ d t ⩽ L 2 ∥ x k − x ∗ ∥ 2 + C ∥ H ∗ ∥ ∥ x k − x ∗ ∥ , \begin{aligned} &\|(J^{k})^{\mathrm{T}}J^{k}(x^{k}-x^{*})+\nabla f(x^{*})-\nabla f(x^{k})\| \\ &\leqslant\int_{0}^{1}\|(J^{\mathrm{T}}J(x^{k})-J^{\mathrm{T}}J(x^{*}+t(x^{k}-x^{*})))(x^{k}-x^{*})\|\mathrm{d}t+\int_0^1\|H(x^*+t(x^k-x^*))(x^k-x^*)\|\mathrm{d}t \\ &\leqslant\frac{L}{2}\|x^{k}-x^{*}\|^{2}+C\|H^{*}\|\|x^{k}-x^{*}\|, \end{aligned} (Jk)TJk(xkx)+f(x)f(xk)01(JTJ(xk)JTJ(x+t(xkx)))(xkx)dt+01H(x+t(xkx))(xkx)dt2Lxkx2+CH∥∥xkx,

其中 L L L J T J ( x ) J^\mathrm{T}J(x) JTJ(x) 的利普希茨常数. 最后一个不等式是因为我们使用 H ∗ H^* H 来近似 H ( x ∗ + t ( x k − x ∗ ) ) H(x^*+t(x^k-x^*)) H(x+t(xkx)), 由连续性,存在 C > 0 C>0 C>0 以及点 x ∗ x^* x 的一个邻域 N \mathcal{N} N, 对任意的 x ∈ N x\in\mathcal{N} xN ∥ H ( x ) ∥ ⩽ C ∥ H ( x ∗ ) ∥ \|H(x)\|\leqslant C\|H(x^*)\| H(x)CH(x). 将上述估计代入 (6.7.9) 式即可得到(6.7.8)式.

定理 6.18 指出,如果 ∥ H ( x ∗ ) ∥ \|H(x^∗)\| H(x) 充分小,则高斯–牛顿法可以达到 Q-线性收敛速度;而当 ∥ H ( x ∗ ) ∥ = 0 \|H(x^∗)\|=0 H(x)=0 时,收敛速度是 Q-二次的.如果 ∥ H ( x ∗ ) ∥ \|H(x^∗)\| H(x) 较大,则高斯–牛顿法很可能会失效.

6.7.3 Levenberg-Marquardt 方法

1. 信赖域型 LM 方法
Levenberg-Marquardt (LM) 方法是由 Levenberg 在 1944 年提出的求解非线性最小二乘问题的方法.它本质上是一种信赖域型方法,主要应用场合是当矩阵 ( J k ) T J k (J^k)^\mathrm{T}J^k (Jk)TJk 奇异时,它仍然能给出一个下降方向.LM 方法每一步求解如下子问题:

min ⁡ d 1 2 ∥ J k d + r k ∥ 2 , s . t . ∥ d ∥ ⩽ Δ k ( 6.7.10 ) \min_d\quad\frac{1}{2}\lVert J^kd+r^k\rVert^2,\quad\mathrm{s.t.}\quad\lVert d\rVert\leqslant\Delta_k\qquad(6.7.10) dmin21Jkd+rk2,s.t.dΔk(6.7.10)

事实上,LM 方法将如下近似当作信赖域方法中的 m k m_k mk:

m k ( d ) = 1 2 ∥ r k ∥ 2 + d T ( J k ) T r k + 1 2 d T ( J k ) T J k d ( 6.7.11 ) m_{k}(d)=\frac{1}{2}\|r^{k}\|^{2}+d^{\mathrm{T}}(J^{k})^{\mathrm{T}}r^{k}+\frac{1}{2}d^{\mathrm{T}}(J^{k})^{\mathrm{T}}J^{k}d\qquad(6.7.11) mk(d)=21rk2+dT(Jk)Trk+21dT(Jk)TJkd(6.7.11)

该方法使用 B k = ( J k ) T J k B^k=(J^k)^{\mathrm{T}}J^k Bk=(Jk)TJk 来近似海瑟矩阵,这个取法是从高斯-牛顿法推广而来的. LM 方法并不直接使用海瑟矩阵来求解. 以下为了方便,省去迭代指标 k k k. 子问题 (6.7.10) 是信赖域子问题,上一节讨论过这个子问题的一些好的性质. 根据定理 6.12, 可直接得到如下推论:

推论 6.4 向量 d ∗ d^* d 是信赖域子问题
min ⁡ d 1 2 ∥ J d + r ∥ 2 , s.t. ∥ d ∥ ⩽ Δ \begin{aligned}\min_d\quad\frac{1}{2}\|Jd+r\|^2,\quad\text{s.t.}\quad\|d\|\leqslant\Delta\end{aligned} dmin21Jd+r2,s.t.dΔ

的解当且仅当 d ∗ d^* d 是可行解并且存在数 λ ⩾ 0 \lambda\geqslant 0 λ0 使得
( J T J + λ I ) d ∗ = − J T r ( 6.7.12 ) λ ( Δ − ∥ d ∗ ∥ ) = 0 ( 6.7.13 ) \begin{aligned}&(J^\mathrm{T}J+\lambda I)d^*=-J^\mathrm{T}r&\qquad(6.7.12)\\&\lambda(\Delta-\|d^*\|)=0&\qquad(6.7.13)\end{aligned} (JTJ+λI)d=JTrλ(Δd)=0(6.7.12)(6.7.13)

注意到 J T J J^\mathrm{T}J JTJ 是半正定矩阵,因此条件 (6.6.5c) 是自然成立的.
下面简要说明如何求解 LM 子问题 (6.7.10). 实际上,和信赖域子问题中的迭代法相同,我们先通过求根的方式来确定 λ \lambda λ 的选取,然后直接求得 LM 方程的迭代方向. 由于 LM 子问题的特殊性,可以不显式求出矩阵 J T J + λ I J^\mathrm{T}J+\lambda I JTJ+λI 的 Cholesky 分解(Cholesky分解是一种将对称正定矩阵分解为一个下三角矩阵和其转置的乘积的方法),而仍然是借助 QR 分解(QR分解是一种常用的矩阵分解方法,它将一个矩阵分解为一个正交矩阵(Q)与一个上三角矩阵®的乘积),进而无需算出 J T J + λ I J^\mathrm{T}J+\lambda I JTJ+λI.注意, ( J T J + λ I ) d = − J T r (J^\mathrm{T}J+\lambda I)d=-J^\mathrm{T}r (JTJ+λI)d=JTr 实际上是最小二乘问题
min ⁡ d ∥ [ J λ I ] d + [ r 0 ] ∥ ( 6.7.14 ) \left.\min_d\quad\left\|\begin{bmatrix}J\\\sqrt{\lambda}I\end{bmatrix}\right.d+\begin{bmatrix}r\\0\end{bmatrix}\right\|\quad(6.7.14) dmin [Jλ I]d+[r0] (6.7.14)

的最优性条件.此问题的系数矩阵带有一定结构,每次改变 λ \lambda λ 进行试探时,有关 J J J 的块是不变的,因此无需重复计算 J J J 的 QR 分解. 具体来说,设 J = Q R J=QR J=QR J J J 的 QR 分解,其中 Q ∈ R m × n , R ∈ R n × n Q\in\mathbb{R}^{m\times n},R\in\mathbb{R}^{n\times n} QRm×n,RRn×n. 我们有
[ J λ I ] = [ Q R λ I ] = [ Q 0 0 I ] [ R λ I ] \begin{bmatrix}J\\\sqrt{\lambda}I\end{bmatrix}=\begin{bmatrix}QR\\\sqrt{\lambda}I\end{bmatrix}=\begin{bmatrix}Q&0\\0&I\end{bmatrix}\begin{bmatrix}R\\\sqrt{\lambda}I\end{bmatrix} [Jλ I]=[QRλ I]=[Q00I][Rλ I]

矩阵 [ R λ I ] \begin{bmatrix}R\\\sqrt{\lambda}I\\\end{bmatrix} [Rλ I] 含有较多零元素,可以使用 Householder 变换或 Givens 变换来完成此矩阵的 QR 分解. 如果矩阵 J J J 没有显式形式,只能提供矩阵乘法,则仍然可以用截断共轭梯度法,即算法 6.9(截断共轭梯度法) 来求解子问题 (6.7.10).

补充:QR 分解
QR 分解是一种重要的矩阵分解方法,通常用于解决线性方程组、最小二乘问题以及特征值计算等数值计算任务。它将一个矩阵分解为一个正交矩阵(Q)与一个上三角矩阵®的乘积。QR 分解有多种形式。
Householder 变换:
Householder 变换通过一系列反射操作将矩阵转化为上三角形式。每次变换都是通过一个特殊的 Householder 矩阵来实现,该矩阵是一个正交矩阵,并且将一个向量反射到另一个向量上。通过一系列的 Householder 变换,可以将矩阵转化为上三角形式,从而实现 QR 分解。
Givens 变换:
Givens 变换通过一系列的旋转操作将矩阵转化为上三角形式。在 Givens 变换中,每次旋转操作都是基于一个特定的 Givens 矩阵,该矩阵是一个二维旋转矩阵,用于将一个特定的位置上的两个元素变为零。

LM 方法的收敛性也可以直接从信赖域方法的收敛性得出,我们直接给出收敛性定理.

定理 6.19 假设常数 η ∈ ( 0 , 1 4 ) \eta\in\left(0,\displaystyle\frac{1}{4}\right) η(0,41), 下水平集 L \mathcal{L} L 是有界的且每个 r i ( x ) r_i(x) ri(x) 在下水平集 L \mathcal{L} L 的一个邻域 N \mathcal{N} N 内是利普希茨连续可微的. 假设对于任意的 k k k, 子问题 (6.7.10) 的近似解 d k d_k dk 满足
m k ( 0 ) − m k ( d k ) ⩾ c 1 ∥ ( J k ) T r k ∥ min ⁡ { Δ k , ∥ ( J k ) T r k ∥ ∥ ( J k ) T J k ∥ } m_k(0)-m_k(d^k)\geqslant c_1\|(J^k)^\mathrm{T}r^k\|\min\Big\{\Delta_k,\frac{\|(J^k)^\mathrm{T}r^k\|}{\|(J^k)^\mathrm{T}J^k\|}\Big\} mk(0)mk(dk)c1(Jk)Trkmin{Δk,(Jk)TJk(Jk)Trk}

其中 c 1 > 0 c_1>0 c1>0 ∥ d k ∥ ⩽ γ Δ k , γ ⩾ 1 \|d^k\|\leqslant\gamma\Delta_k,\gamma\geqslant1 dkγΔk,γ1, 则

lim ⁡ k → ∞ ∇ f ( x k ) = lim ⁡ k → ∞ ( J k ) T r k = 0 \lim\limits_{k\to\infty}\nabla f(x^k)=\lim\limits_{k\to\infty}(J^k)^\text{T}r^k=0 klimf(xk)=klim(Jk)Trk=0

2. LMF 方法
信赖域型 LM 方法本质上是固定信赖域半径 Δ \Delta Δ, 通过迭代寻找满足条件 (6.7.12) 的乘子 λ \lambda λ, 每一步迭代需要求解线性方程组
( J T J + λ I ) d = − J T r (J^\mathrm{T}J+\lambda I)d=-J^\mathrm{T}r (JTJ+λI)d=JTr

这个求解过程在 LM 方法中会占据相当大的计算量,计算代价较大.

在 LM 方法中,由于 ( J k ) T J k ≻ 0 (J^k)^\mathrm{T}J^k\succ 0 (Jk)TJk0, 那么有 − λ 1 < 0 -\lambda_1<0 λ1<0,此时有 λ > − λ 1 \lambda>-\lambda_1 λ>λ1, 因此若 λ \lambda λ 越大, d d d 的模长越小. 这就意味着 Δ \Delta Δ 的大小被 λ \lambda λ 隐式地决定,直接调整 λ \lambda λ 的大小就相当于调整了信赖域半径 Δ \Delta Δ 的大小. 因此,我们可构造基于 λ \lambda λ 更新的 LM 方法.由于 LM 方程 (6.7.12) 和信赖域子问题的关系由 Fletcher 在 1981 年给出,因此基于 λ \lambda λ 更新的 LM 方法也被称为 LMF 方法,即每一步求解子问题:

min ⁡ d 1 2 ∥ J d + r ∥ 2 2 + λ ∥ d ∥ 2 2 \min_d\quad\displaystyle\frac{1}{2}\|Jd+r\|_2^2+\lambda\|d\|_2^2 dmin21Jd+r22+λd22

在 LMF 方法中,设第 k k k 步产生的迭代方向为 d k d^k dk, 根据信赖域算法的思想,我们需要计算目标函数的预估下降量和实际下降量的比值 ρ k \rho_k ρk, 来确定下一步信赖域半径的大小. 这一比值很容易通过公式 (6.6.3) 计算,其中 f ( x ) f(x) f(x) m k ( d ) m_k(d) mk(d) 分别取为 (6.7.1) 式和 (6.7.11) 式. 即 ρ k = f ( x k ) − f ( x k + d k ) m k ( 0 ) − m k ( d k ) \rho_k=\displaystyle\frac{f(x^k)-f(x^k+d^k)}{m_k(0)-m_k(d^k)} ρk=mk(0)mk(dk)f(xk)f(xk+dk), f ( x ) = 1 2 ∑ j = 1 m r j 2 ( x ) f(x)=\displaystyle\frac{1}{2}\sum_{j=1}^mr_j^2(x) f(x)=21j=1mrj2(x), m k ( d ) = 1 2 ∥ r k ∥ 2 + d T ( J k ) T r k + 1 2 d T ( J k ) T J k d m_{k}(d)=\displaystyle\frac{1}{2}\|r^{k}\|^{2}+d^{\mathrm{T}}(J^{k})^{\mathrm{T}}r^{k}+\frac{1}{2}d^{\mathrm{T}}(J^{k})^{\mathrm{T}}J^{k}d mk(d)=21rk2+dT(Jk)Trk+21dT(Jk)TJkd. 计算 ρ k \rho_k ρk 后,我们根据 ρ k \rho_{k} ρk 的大小来更新 λ k \lambda_k λk. 当乘子 λ k \lambda_k λk 增大时,信赖域半径会变小,反之亦然. 所以 λ k \lambda_k λk 的变化策略应该和信赖域算法中 Δ k \Delta_k Δk 的恰好相反.
接下来就给出了 LMF 算法的框架. 通过比较得知 LMF 方法 (算法 6.11) 和信赖域算法 6.8 的结构非常相似. 算法 6.11 对 γ 1 \gamma_1 γ1, γ 2 \gamma_2 γ2 等参数并不敏感. 但根据信赖域方法的收敛定理 6.15, 参数 η \eta η 可以取大于 0 的值来改善收敛结果.
在这里插入图片描述

和 LM 方法相比,LMF 方法每一次迭代只需要求解一次 LM 方程,从而极大地减少了计算量,在编程方面也更容易实现.所以 LMF 方法在求解最小二乘问题中是很常见的做法.

# 算法 6.11 LMF 方法
import numpy as np
import matplotlib.pyplot as plt
def lmf(x, y, para0, lambda0, eta, rho1_bar = 0.25, rho2_bar = 0.75, gamma1 = 0.1, gamma2 = 2.0, max_iter=1000):
    para = para0
    lambda_k = lambda0
    k = 0
    para_history = [para]
    while k < max_iter:
        r = y - func(x, para)
        J_k = -jacobi(x, para)
        d = -np.linalg.solve((J_k.T).dot(J_k) + lambda_k * np.eye(len(para)), (J_k.T).dot(r))
        rho_k = (np.linalg.norm(r)**2 - np.linalg.norm(r + J_k.dot(d))**2) / (0.5 * np.linalg.norm(r)**2)
        
        if rho_k < rho1_bar:
            lambda_k = gamma2 * lambda_k
        elif rho_k > rho2_bar:
            lambda_k = gamma1 * lambda_k
        else:
            lambda_k = lambda_k
        
        if rho_k > eta:
            para_next = para + d
        
        if np.linalg.norm(para_next - para) < 1e-6:
            break
        
        para = para_next
        para_history.append(para)
        k = k + 1
    return para_history, k 

# 生成随机数据
np.random.seed(0)
x = np.random.randn(100, 1)
noise = np.random.normal(0, 1, (100, 1))
para_true = np.array([3.0, 4.0])
y = para_true[0] * x**2 + para_true[1] * x + noise
def func(x, para):
    return para[0] * x**2 + para[1] * x
def jacobi(x, para):
    J = np.zeros((len(x), len(para)))
    J[:, 0] = x[:, 0]**2
    J[:, 1] = x[:, 0]
    return J
para0 = np.ones((2, 1))  # 参数初始化
lambda0 = 1.0
eta = 0.1

para_hist, k = lmf(x, y, para0, lambda0, eta)
print("参数真实值:", para_true)
'''参数真实值: [3. 4.]'''
print("参数估计值:", para_hist[-1])
'''参数估计值: [[2.98142607]
 [4.09219555]]'''
print("迭代次数:", k)
'''迭代次数: 1'''
print(para_hist)
'''[array([[1.],
       [1.]]), array([[2.98142607],
       [4.09219555]])]'''
# 绘制拟合曲线
plt.figure()
plt.scatter(x, y, color='red', label='Data points', s=20)
x_range = np.linspace(-3, 3, 100)
y_fit = func(x_range, para_est)
plt.plot(x_range, y_fit, color='blue', label='Fitted curve')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

在这里插入图片描述

6.7.4 大残量问题的拟牛顿法

在大残量问题中,海瑟矩阵 ∇ 2 f ( x ) \nabla^2f(x) 2f(x) 的第二部分的作用不可忽视,仅仅考虑 ( J k ) T J k (J^k)^\mathrm{T}J^k (Jk)TJk 作为第 k k k 步的海瑟矩阵近似则会带来很大误差. 在这种情况下高斯-牛顿法和 LM 方法很可能会失效. 我们可以将最小二乘问题 (6.7.1) 当成一般的无约束问题,并使用之前讨论过的牛顿法和拟牛顿法求解. 但对于很多问题来说,各个残量分量的海瑟矩阵 ∇ 2 r i ( x ) \nabla^2r_i(x) 2ri(x) 不易求出,使用牛顿法会有很大开销;而直接使用拟牛顿法对海瑟矩阵 ∇ 2 f ( x ) \nabla^2f(x) 2f(x) 进行近似又似乎忽略了最小二乘问题的特殊结构.
海瑟矩阵表达式 ∇ 2 f ( x ) = J ( x ) T J ( x ) + ∑ i = 1 m r i ( x ) ∇ 2 r i ( x ) \nabla^{2}f(x) = J(x)^{\mathrm{T}}J(x)+\sum\limits_{i=1}^{m}r_{i}(x)\nabla^{2}r_{i}(x) 2f(x)=J(x)TJ(x)+i=1mri(x)2ri(x) (6.7.2b) 说明了 ∇ 2 f ( x ) \nabla^2f(x) 2f(x) 由两部分组成:一部分容易得出,但不精确;另一部分较难求得,但在计算中又必不可少. 对于容易部分可以直接保留高斯-牛顿矩阵 J T J J^\mathrm{T}J JTJ, 而对于较难部分则可以利用拟牛顿法来进行近似. 这就是我们求解大残量问题的基本思路,它同时考虑了最小二乘问题的海瑟矩阵结构和计算量,是一种混合的近似方法.

具体来说,我们使用 B k B^k Bk 来表示 ∇ 2 f ( x k ) \nabla^2f(x^k) 2f(xk) 的近似矩阵,即$
Bk=(Jk)\mathrm{T}Jk+T^k,$ 其中 T k T^k Tk 是海瑟矩阵第二部分 ∑ j = 1 m r j ( x k ) ∇ 2 r j ( x k ) \displaystyle\sum_{j=1}^mr_j(x^k)\nabla^2r_j(x^k) j=1mrj(xk)2rj(xk) 的近似. 问题的关键在于如何构造矩阵 T k T^k Tk, 建立拟牛顿法时,构造拟牛顿格式主要分为两步:一是找出拟牛顿条件,二是根据拟牛顿条件来构造拟牛顿矩阵的低秩更新. 在这里我们使用相似的过程,但注意 T k T^k Tk 仅仅是拟牛顿矩阵 B k B^k Bk 的一部分,它不太可能满足割线条件 (6.5.3)(将其中的 B k + 1 B^{k+1} Bk+1 替换成 T k + 1 T^{k+1} Tk+1).我们的目标是让 T k + 1 T^{k+1} Tk+1 和海瑟矩阵的第二部分尽量相似,即
T k + 1 ≈ ∑ j = 1 m r j ( x k + 1 ) ∇ 2 r j ( x k + 1 ) . T^{k+1}\approx\sum_{j=1}^mr_j(x^{k+1})\nabla^2r_j(x^{k+1}). Tk+1j=1mrj(xk+1)2rj(xk+1).

s k = x k + 1 − x k s^k=x^{k+1}-x^k sk=xk+1xk,由一阶泰勒展开得知, T k + 1 T^{k+1} Tk+1 应该尽量保留原海瑟矩阵的性质,即

T k + 1 s k ≈ ( ∑ j = 1 m r j ( x k + 1 ) ∇ 2 r j ( x k + 1 ) ) s k = ∑ j = 1 m r j ( x k + 1 ) ( ∇ 2 r j ( x k + 1 ) ) s k ≈ ∑ j = 1 m r j ( x k + 1 ) ( ∇ r j ( x k + 1 ) − ∇ r j ( x k ) ) = ( J k + 1 ) T r k + 1 − ( J k ) T r k + 1 . \begin{aligned} T^{k+1}s^{k}& \approx\left(\sum_{j=1}^{m}r_{j}(x^{k+1})\nabla^{2}r_{j}(x^{k+1})\right)s^{k} \\ &=\sum_{j=1}^{m}r_{j}(x^{k+1})\left(\nabla^{2}r_{j}(x^{k+1})\right)s^{k} \\ &\approx\sum_{j=1}^{m}r_{j}(x^{k+1})(\nabla r_{j}(x^{k+1})-\nabla r_{j}(x^{k})) \\ &=(J^{k+1})^{\mathrm{T}}r^{k+1}-(J^{k})^{\mathrm{T}}r^{k+1}. \end{aligned} Tk+1sk(j=1mrj(xk+1)2rj(xk+1))sk=j=1mrj(xk+1)(2rj(xk+1))skj=1mrj(xk+1)(rj(xk+1)rj(xk))=(Jk+1)Trk+1(Jk)Trk+1.

y ^ k = ( J k + 1 ) T r k + 1 − ( J k ) T r k + 1 \hat{y}^k=(J^{k+1})^{\mathrm{T}}r^{k+1}-(J^k)^{\mathrm{T}}r^{k+1} y^k=(Jk+1)Trk+1(Jk)Trk+1, 则 T k T^k Tk 满足的拟牛顿条件为

T k + 1 s k = y ^ k . ( 6.7.15 ) T^{k+1}s^k=\hat{y}^k.\qquad(6.7.15) Tk+1sk=y^k.(6.7.15)

在这里注意 y ^ k \hat{y}^k y^k 不是原有的 y k . y^k. yk.
有了拟牛顿条件后,可以用之前的方法构造拟牛顿格式了。
Dennis, Gay 和 Welsch 给出的一种更新格式为: T k + 1 = T k + ( y # − T k s k ) y T + y ( y # − T k s k ) T y T s k − ( y # − T k s k ) T s k ( y T s ) 2 y y T ( 6.7.16 ) T^{k+1}=T^k+\displaystyle\frac{(y^{\#}-T^ks^k)y^\mathrm{T}+y(y^{\#}-T^ks^k)^\mathrm{T}}{y^\mathrm{T}s^k}-\frac{(y^{\#}-T^ks^k)^\mathrm{T}s^k}{(y^\mathrm{T}s)^2}yy^\mathrm{T}\qquad(6.7.16) Tk+1=Tk+yTsk(y#Tksk)yT+y(y#Tksk)T(yTs)2(y#Tksk)TskyyT(6.7.16)

其中 s k = x k + 1 − x k y = ( J k + 1 ) T r k + 1 − ( J k ) T r k y # = ( J k + 1 ) T r k + 1 − ( J k ) T r k + 1 \begin{aligned} &s^k=x^{k+1}-x^k\\& y=(J^{k+1})^\mathrm{T}r^{k+1}-(J^k)^\mathrm{T}r^k\\& y^{\#}=(J^{k+1})^\mathrm{T}r^{k+1}-(J^k)^\mathrm{T}r^{k+1} \end{aligned} sk=xk+1xky=(Jk+1)Trk+1(Jk)Trky#=(Jk+1)Trk+1(Jk)Trk+1.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值