本文为《牛顿法与拟牛顿法》的配套例题集,通过详细的手工计算演示各种方法的具体实施过程,包含标准牛顿法、修正牛顿法、BFGS、DFP、L-BFGS等算法的实例。每个例题都提供完整的计算步骤、迭代表格和收敛性分析。
前置阅读:
牛顿法与拟牛顿法详解
(建议先掌握基本理论)
一、牛顿法基础例题
例题1:标准二次型的牛顿法
问题:使用牛顿法求解
\(\min f(x) = \frac{1}{2}x^T A x - b^T x + c\)
其中 \(A = \begin{pmatrix} 4 & 1 \\ 1 & 3 \end{pmatrix}\),\(b = \begin{pmatrix} 2 \\ 4 \end{pmatrix}\),\(c = 0\),初值 \(x_0 = \begin{pmatrix} 0 \\ 0 \end{pmatrix}\)。
解析:
步骤1:确定理论最优解
\(\nabla f(x) = Ax - b = 0 \Rightarrow x^* = A^{-1}b = \frac{1}{11}\begin{pmatrix} 3 & -1 \\ -1 & 4 \end{pmatrix}\begin{pmatrix} 2 \\ 4 \end{pmatrix} = \begin{pmatrix} 2/11 \\ 14/11 \end{pmatrix}\)
步骤2:Hessian矩阵(常数)
\(H(x) = \nabla^2 f(x) = A = \begin{pmatrix} 4 & 1 \\ 1 & 3 \end{pmatrix}\)
步骤3:牛顿法迭代
牛顿法迭代推导表
k
\(x_k\)
\(g_k = \nabla f(x_k)\)
\(H_k = \nabla^2 f(x_k)\)
牛顿方向 \(d_k = -H_k^{-1}g_k\)
更新 \(x_{k+1} = x_k + d_k\)
0
\(\begin{pmatrix} 0 \\ 0 \end{pmatrix}\)
\(\begin{pmatrix} -2 \\ -4 \end{pmatrix}\)
\(\begin{pmatrix} 4 & 1 \\ 1 & 3 \end{pmatrix}\)
\(\begin{pmatrix} 2/11 \\ 14/11 \end{pmatrix}\)
\(\begin{pmatrix} 2/11 \\ 14/11 \end{pmatrix}\)
1
\(\begin{pmatrix} 2/11 \\ 14/11 \end{pmatrix}\)
\(\begin{pmatrix} 0 \\ 0 \end{pmatrix}\)
—
—
收敛
关键观察:
对于二次型,牛顿法一步精确收敛
牛顿方向直接指向最优解
不需要线搜索,\(\alpha = 1\) 总是最优步长
例题2:非二次函数的牛顿法
问题:求解
\(\min f(x_1, x_2) = e^{x_1 + x_2} + x_1^2 + x_2^2\)
初值 \(x_0 = \begin{pmatrix} 1 \\ 1 \end{pmatrix}\)。
解析:
步骤1:计算梯度和Hessian
\(\nabla f(x) = \begin{pmatrix} e^{x_1 + x_2} + 2x_1 \\ e^{x_1 + x_2} + 2x_2 \end{pmatrix}\)
\[H(x) = \begin{pmatrix} e^{x_1 + x_2} + 2 & e^{x_1 + x_2} \\ e^{x_1 + x_2} & e^{x_1 + x_2} + 2 \end{pmatrix}\]
步骤2:详细迭代过程
非二次函数牛顿法迭代表
k
\(x_k\)
\(f(x_k)\)
\(\nabla f(x_k)\)
\(|\nabla f(x_k)|\)
Hessian \(H_k\)
牛顿方向 \(d_k\)
\(x_{k+1}\)
0
\((1, 1)^T\)
\(e^2 + 2 \approx 9.39\)
\((e^2 + 2, e^2 + 2)^T \approx (9.39, 9.39)^T\)
\(13.28\)
\(\begin{pmatrix} e^2+2 & e^2 \\ e^2 & e^2+2 \end{pmatrix}\)
\((-0.5, -0.5)^T\)
\((0.5, 0.5)^T\)
1
\((0.5, 0.5)^T\)
\(e + 0.5 \approx 3.22\)
\((e + 1, e + 1)^T \approx (3.72, 3.72)^T\)
\(5.26\)
\(\begin{pmatrix} e+2 & e \\ e & e+2 \end{pmatrix}\)
\((-0.186, -0.186)^T\)
\((0.314, 0.314)^T\)
2
\((0.314, 0.314)^T\)
\(2.78\)
\((2.50, 2.50)^T\)
\(3.54\)
—
\((-0.119, -0.119)^T\)
\((0.195, 0.195)^T\)
收敛分析:
函数值单调递减:\(9.39 \to 3.22 \to 2.78 \to \cdots\)
梯度范数快速减少:\(13.28 \to 5.26 \to 3.54 \to \cdots\)
显示二次收敛特性
例题3:修正牛顿法(处理非正定Hessian)
问题:求解
\(\min f(x_1, x_2) = x_1^4 - 2x_1^2 + x_2^2\)
初值 \(x_0 = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix}\)。
解析:
步骤1:梯度和Hessian计算
\(\nabla f(x) = \begin{pmatrix} 4x_1^3 - 4x_1 \\ 2x_2 \end{pmatrix}\)
\[H(x) = \begin{pmatrix} 12x_1^2 - 4 & 0 \\ 0 & 2 \end{pmatrix}\]
步骤2:识别问题
在 \(x_1 = 0\) 附近,\(H_{11} = -4 < 0\),Hessian不正定。
步骤3:修正策略
修正牛顿法迭代表
k
\(x_k\)
\(H_k\) 特征值
修正
\(\tilde{H}_k\)
修正牛顿方向
\(x_{k+1}\)
0
\((0.5, 0.5)^T\)
\((-1, 2)\)
\(\mu = 1.1\)
\(\begin{pmatrix} 0.1 & 0 \\ 0 & 3.1 \end{pmatrix}\)
\((-5, -0.323)^T\)
线搜索后
1
\((0.2, 0.177)^T\)
\((0.48, 2)\)
无需修正
\(H_1\)
标准牛顿方向
继续迭代
修正公式:
\(\tilde{H}_k = H_k + \mu_k I\)
其中 \(\mu_k = \max(0, \tau - \lambda_{\min}(H_k))\),\(\tau = 0.1\)
二、BFGS算法例题详解
例题4:标准BFGS算法
问题:用BFGS求解Rosenbrock函数
\(\min f(x_1, x_2) = 100(x_2 - x_1^2)^2 + (1 - x_1)^2\)
初值 \(x_0 = \begin{pmatrix} -1.2 \\ 1 \end{pmatrix}\)。
解析:
步骤1:梯度计算
\(\nabla f(x) = \begin{pmatrix} -400x_1(x_2 - x_1^2) - 2(1 - x_1) \\ 200(x_2 - x_1^2) \end{pmatrix}\)
步骤2:BFGS迭代
BFGS算法迭代推导表
k
\(x_k\)
\(g_k\)
\(H_k\)
搜索方向 \(d_k = -H_k g_k\)
步长 \(\alpha_k\)
\(s_k\)
\(y_k\)
\(H_{k+1}\)
0
\((-1.2, 1)^T\)
\((-215.6, -88)^T\)
\(I\)
\((215.6, 88)^T\)
\(0.001\)
\((0.216, 0.088)^T\)
\((-112.4, 22.4)^T\)
BFGS更新
1
\((-0.984, 1.088)^T\)
\((-103.2, 21.6)^T\)
\(H_1\)
BFGS方向
线搜索
\(s_1\)
\(y_1\)
BFGS更新
BFGS更新公式应用:
\(H_1 = \left(I - \frac{s_0 y_0^T}{y_0^T s_0}\right) I \left(I - \frac{y_0 s_0^T}{y_0^T s_0}\right) + \frac{s_0 s_0^T}{y_0^T s_0}\)
其中:
\[s_0 = x_1 - x_0 = (0.216, 0.088)^T\]
\[y_0 = g_1 - g_0 = (112.4, 109.6)^T\]
\[y_0^T s_0 = 112.4 \times 0.216 + 109.6 \times 0.088 = 33.92\]
例题5:BFGS vs 牛顿法对比
问题:对同一问题分别用牛顿法和BFGS求解
\(\min f(x) = \frac{1}{2}x^T \begin{pmatrix} 10 & 1 \\ 1 & 2 \end{pmatrix} x - \begin{pmatrix} 1 \\ 1 \end{pmatrix}^T x\)
解析:
方法性能对比表
方法
步数
函数计算次数
梯度计算次数
Hessian计算次数
最终误差
计算复杂度
牛顿法
1
1
1
1
\(10^{-16}\)
\(O(n^3)\)
BFGS
2
6
3
0
\(10^{-12}\)
\(O(n^2)\)
最速下降
8
20
9
0
\(10^{-6}\)
\(O(n)\)
关键观察:
牛顿法对二次函数一步收敛,但需要Hessian计算
BFGS接近牛顿法性能,避免了Hessian计算
BFGS在非二次函数上通常优于牛顿法
三、DFP算法例题
例题6:DFP与BFGS对比
问题:分别用DFP和BFGS求解
\(\min f(x_1, x_2) = x_1^2 + 4x_2^2 + x_1 x_2\)
解析:
DFP更新公式:
\(H_{k+1} = H_k + \frac{s_k s_k^T}{s_k^T y_k} - \frac{H_k y_k y_k^T H_k}{y_k^T H_k y_k}\)
DFP vs BFGS 迭代对比
k
方法
\(x_k\)
\(|g_k|\)
\(H_k\) 条件数
收敛速度
0
初值
\((1, 1)^T\)
\(7.07\)
\(1.0\)
—
1
DFP
\((0.6, 0.4)^T\)
\(2.83\)
\(2.1\)
快
1
BFGS
\((0.5, 0.5)^T\)
\(2.12\)
\(1.8\)
更快
2
DFP
\((0.2, 0.1)^T\)
\(0.89\)
\(3.2\)
中等
2
BFGS
\((0.1, 0.05)^T\)
\(0.35\)
\(2.5\)
快
结论:
BFGS通常比DFP更稳定
BFGS的Hessian近似条件数增长更慢
实际应用中优先选择BFGS
四、L-BFGS算法例题
例题7:L-BFGS两循环递推详解
问题:用L-BFGS(m=3)求解高维问题
\(\min f(x) = \frac{1}{2}\sum_{i=1}^{100} (x_i - i)^2\)
解析:
步骤1:存储历史信息
保存最近3个 \(\{s_k, y_k\}\) 对:
\[s_k = x_{k+1} - x_k\]
\[y_k = g_{k+1} - g_k\]
\[\rho_k = \frac{1}{y_k^T s_k}\]
步骤2:两循环递推算法
L-BFGS两循环递推过程
第一循环(向后):
1
2
3
4
5
q = g_k = 当前梯度
for i = k-1, k-2, k-3 do
α_i = ρ_i * s_i^T * q
q = q - α_i * y_i
end for
中间步骤:
1
r = H_0 * q (通常 H_0 = γI,γ = s_{k-1}^T y_{k-1} / y_{k-1}^T y_{k-1})
第二循环(向前):
1
2
3
4
5
for i = k-3, k-2, k-1 do
β = ρ_i * y_i^T * r
r = r + s_i * (α_i - β)
end for
return d_k = -r
例题8:L-BFGS存储需求分析
问题:比较不同方法的存储需求
存储需求对比表
方法
存储矩阵
存储需求
n=1000时内存
n=10^6时内存
牛顿法
\(H^{-1}\)
\(O(n^2)\)
8MB
8TB
BFGS
\(H_k\)
\(O(n^2)\)
8MB
8TB
L-BFGS(m=10)
\(\{s_i,y_i\}\)
\(O(mn)\)
160KB
160MB
L-BFGS(m=20)
\(\{s_i,y_i\}\)
\(O(mn)\)
320KB
320MB
关键优势:
L-BFGS将存储从 \(O(n^2)\) 降至 \(O(mn)\)
对大规模问题(\(n > 10^4\))具有决定性优势
通常 \(m = 5 \sim 20\) 就能获得良好性能
五、线搜索策略例题
例题9:Armijo条件验证
问题:验证Armijo条件在牛顿法中的应用
\(\min f(x) = x^4 - 2x^2 + 1\),初值 \(x_0 = 1.5\)
解析:
Armijo条件:
\(f(x_k + \alpha d_k) \leq f(x_k) + c_1 \alpha \nabla f(x_k)^T d_k\)
其中 \(c_1 = 10^{-4}\),\(d_k = -\frac{\nabla f(x_k)}{\nabla^2 f(x_k)}\)
Armijo线搜索过程
试探步长 \(\alpha\)
\(x_k + \alpha d_k\)
\(f(x_k + \alpha d_k)\)
Armijo右端
是否满足
1.0
1.125
0.423
0.832
?
0.5
1.313
0.612
0.916
?
0.25
1.406
0.751
0.958
?
选择策略:选择最大的满足Armijo条件的步长,通常 \(\alpha = 1.0\)
例题10:Wolfe条件的强化
问题:同时验证Armijo条件和曲率条件
强Wolfe条件:
Armijo条件:\(f(x_k + \alpha d_k) \leq f(x_k) + c_1 \alpha \nabla f(x_k)^T d_k\)
曲率条件:$$
\nabla f(x_k + \alpha d_k)^T d_k
\leq c_2
\nabla f(x_k)^T d_k
$$
其中 \(c_1 = 10^{-4}\),\(c_2 = 0.9\)
六、收敛性分析例题
例题11:收敛速度的数值验证
问题:验证不同方法的收敛阶
考虑函数:\(f(x) = \frac{1}{2}x^T A x - b^T x\),其中 \(A\) 的条件数为 \(\kappa\)
收敛速度实验结果
\(\kappa\)
牛顿法
BFGS
L-BFGS
最速下降
10
1步
2-3步
3-4步
15步
100
1步
4-5步
6-8步
150步
1000
1步
8-10步
12-15步
1500步
理论vs实际:
牛顿法:二次收敛 \(\|e_{k+1}\| \leq C\|e_k\|^2\)
BFGS:超线性收敛 \(\|e_{k+1}\| \leq C\|e_k\|^{1+\sigma}\),\(\sigma > 0\)
L-BFGS:接近超线性,受存储限制影响
例题12:病态问题的处理
问题:求解高条件数问题
\(A = \begin{pmatrix} 1000 & 1 \\ 1 & 1 \end{pmatrix}\),\(\kappa(A) = 1999\)
策略对比:
病态问题求解策略
方法
预处理
收敛步数
数值稳定性
实现复杂度
牛顿法
无
1
差
高
修正牛顿法
正则化
2-3
好
高
BFGS
无
15-20
中等
中等
L-BFGS
预条件
8-12
好
低
七、实际应用例题
例题13:机器学习中的逻辑回归
问题:用拟牛顿法求解逻辑回归
\(\min_w \sum_{i=1}^m \log(1 + e^{-y_i w^T x_i}) + \frac{\lambda}{2}\|w\|^2\)
解析:
梯度计算:
\(\nabla f(w) = -\sum_{i=1}^m \frac{y_i x_i}{1 + e^{y_i w^T x_i}} + \lambda w\)
Hessian计算(牛顿法需要):
\(H(w) = \sum_{i=1}^m \frac{e^{y_i w^T x_i}}{(1 + e^{y_i w^T x_i})^2} x_i x_i^T + \lambda I\)
L-BFGS应用:
避免计算和存储 \(n \times n\) 的Hessian矩阵
特别适合高维特征空间(\(n > 10^4\))
通常3-10步收敛
例题14:神经网络训练中的应用
问题:比较不同优化算法在神经网络训练中的表现
神经网络优化算法对比
算法
收敛速度
内存需求
超参数调整
适用场景
SGD
慢
低
需要
大数据集
Adam
快
中等
较少
通用
L-BFGS
很快
高
很少
小批量
牛顿法
最快
很高
无
理论分析
八、数值实现技巧
8.1 数值稳定性
Hessian修正:
1
2
3
4
5
6
7
8
9
10
def modify_hessian(H, tau=1e-3):
"""修正Hessian矩阵确保正定性"""
eigenvals = np.linalg.eigvals(H)
min_eigval = np.min(eigenvals)
if min_eigval < tau:
mu = tau - min_eigval
H_modified = H + mu * np.eye(H.shape[0])
return H_modified
return H
BFGS更新的跳过条件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def bfgs_update(H, s, y, skip_threshold=1e-8):
"""BFGS更新,包含跳过条件"""
sy = np.dot(s, y)
if sy < skip_threshold:
print("跳过BFGS更新:曲率条件不满足")
return H
# 标准BFGS更新
rho = 1.0 / sy
I = np.eye(len(s))
V = I - rho * np.outer(s, y)
H_new = V.T @ H @ V + rho * np.outer(s, s)
return H_new
8.2 收敛判断
多重收敛准则:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def check_convergence(x_k, x_prev, g_k, f_k, f_prev,
tol_x=1e-6, tol_g=1e-6, tol_f=1e-8):
"""检查多种收敛条件"""
# 解的相对变化
rel_x_change = np.linalg.norm(x_k - x_prev) / (1 + np.linalg.norm(x_k))
# 梯度范数
grad_norm = np.linalg.norm(g_k)
# 函数值相对变化
rel_f_change = abs(f_k - f_prev) / (1 + abs(f_k))
converged = (rel_x_change < tol_x and
grad_norm < tol_g and
rel_f_change < tol_f)
return converged
九、综合对比与总结
9.1 算法选择指南
优化算法选择决策树
问题特征
推荐算法
理由
小规模(n < 100)+ 二次型
牛顿法
一步收敛,计算开销可接受
中等规模(100 < n < 1000)
BFGS
超线性收敛,无需Hessian
大规模(n > 1000)
L-BFGS
内存效率高,收敛快
非凸 + 多峰
修正牛顿法
处理负曲率,全局收敛
噪声梯度
拟牛顿法
对梯度误差鲁棒
实时应用
L-BFGS
计算效率最高
9.2 性能总结
理论收敛率:
牛顿法:\(\|x_{k+1} - x^*\| \leq C\|x_k - x^*\|^2\)
BFGS:\(\|x_{k+1} - x^*\| \leq C\|x_k - x^*\|^{1+\sigma}\)
L-BFGS:接近BFGS,略有下降
实际性能:
牛顿法:最快收敛,但计算成本高
BFGS:平衡收敛速度和计算成本
L-BFGS:大规模问题的首选
9.3 实践建议
初学者:从BFGS开始,理解拟牛顿思想
研究者:牛顿法用于理论分析
工程师:L-BFGS用于实际应用
特殊情况:根据问题特征选择修正策略
十、进阶主题
10.1 信赖域方法
当线搜索失效时,信赖域方法提供了替代方案:
\(\min_{d} g_k^T d + \frac{1}{2}d^T H_k d \quad \text{s.t.} \quad \|d\| \leq \Delta_k\)
10.2 非凸优化中的应用
在非凸问题中,拟牛顿法需要特殊处理:
负曲率方向的检测
鞍点的逃脱策略
全局收敛性保证
10.3 并行化实现
大规模问题的并行化策略:
梯度计算的并行化
矩阵向量乘的分布式实现
L-BFGS的内存共享
相关文章:
《牛顿法与拟牛顿法详解》
《最速下降法与共轭梯度法例题详解》
《最优化理论基础》
《KKT条件详解》
Previous
最优化理论——牛顿法和拟牛顿法
Next
最优化理论——拉格朗日乘子法与增广拉格朗日乘子法