信赖域方法:一种比梯度下降更稳健的自适应优化策略

📅 2026/8/2 23:30:58
信赖域方法:一种比梯度下降更稳健的自适应优化策略
1. 项目概述从“走一步看一步”到“谋定而后动”的优化哲学在工程计算、机器学习模型训练乃至金融资产配置中我们常常面临一个核心问题如何找到某个复杂函数的最优解比如让一个神经网络的损失函数降到最低或者让一个飞行器的气动外形阻力最小。最优化理论就是解决这类问题的数学工具箱。今天我们不聊那些耳熟能详的梯度下降法而是聚焦于一个更稳健、更“聪明”的策略——信赖域方法。你可以把优化过程想象成在一个大雾弥漫的山谷里寻找最低点。梯度下降法就像是你只相信脚下这一小片区域的坡度信息然后沿着最陡的下坡方向迈出一步至于这一步跨多大你需要额外设定一个“学习率”。这个方法简单直接但有个问题如果山谷地形很崎岖函数很“病态”你这一步可能迈得太小导致进展缓慢也可能迈得太大直接冲过了谷底甚至爬到了对面的山坡上。信赖域方法则采用了另一种思路。它承认我们对整个复杂函数的认知是有限的尤其是在远离当前位置的地方我们基于当前信息构建的简化模型比如一个二次函数可能完全不靠谱。因此它不会盲目地相信模型给出的“最优”方向走无限远而是先划出一个“可信赖”的区域——信赖域。在这个小区域内它认为简化模型是对真实函数足够好的近似。优化过程就变成了在当前的信赖域内找到简化模型的最优点然后评估这个新点是否真的让真实函数值下降并据此决定是否接受这一步以及如何调整信赖域的大小。这种方法的核心魅力在于其自适应性。它不再需要一个固定不变的步长学习率而是根据模型在当前区域的拟合质量动态地决定探索的步幅。模型预测得好就大胆扩大探索范围预测得差就收缩回来采取更保守的策略。这种“谋定而后动”的特性使得它在处理非线性程度高、曲率变化剧烈的优化问题时往往比传统的线搜索方法如梯度下降更加稳定和高效。接下来我们就深入拆解这一方法的数学原理、实现细节以及那些在教科书里不会写的实战心得。2. 核心思想与算法框架拆解2.1 基本数学模型局部近似与信赖域约束信赖域方法的核心是迭代。在第k次迭代时我们位于点 ( x_k )目标是找到下一个迭代点 ( x_{k1} x_k p_k )其中 ( p_k ) 是我们要求的步长或称位移。我们面对的真实目标函数 ( f(x) ) 可能非常复杂。为了在局部简化问题我们用一个更简单的模型函数 ( m_k(p) ) 来近似 ( f(x_k p) )。最常用的模型是二次模型 [ m_k(p) f_k g_k^T p \frac{1}{2} p^T B_k p ] 这里( f_k f(x_k) ) 是当前点的函数值。( g_k \nabla f(x_k) ) 是当前点的梯度向量它指明了函数最速上升的方向负梯度就是最速下降方向。( B_k ) 是一个对称矩阵用于近似目标函数在 ( x_k ) 处的Hessian矩阵二阶导数矩阵。它刻画了函数的曲率信息。如果 ( B_k ) 就是精确的Hessian ( \nabla^2 f(x_k) )那么这个二次模型就是 ( f ) 在 ( x_k ) 处的二阶泰勒展开。现在关键的限制来了我们并不相信这个模型 ( m_k(p) ) 在全局都有效。我们只相信在以 ( x_k ) 为中心、半径为 ( \Delta_k 0 ) 的一个球域内它是可靠的。这个球域就是信赖域。于是我们当前的子问题就变成了一个带约束的优化问题 [ \min_{p \in \mathbb{R}^n} m_k(p) f_k g_k^T p \frac{1}{2} p^T B_k p ] [ \text{subject to } | p | \le \Delta_k ] 这里 ( | \cdot | ) 通常是欧几里得范数2-范数但也可以是其他范数。这个约束条件直观地限制了步长 ( p ) 的大小不能超过信赖域半径 ( \Delta_k )。2.2 算法流程与自适应调节机制一个完整的信赖域算法迭代步骤如下构建模型在当前点 ( x_k )计算或更新梯度 ( g_k ) 和模型Hessian近似 ( B_k )。当前信赖域半径为 ( \Delta_k )。求解子问题求解上述的信赖域子问题得到一个试探步 ( p_k )。评估实际下降计算真实函数在试探点的下降量( \text{ared}_k f(x_k) - f(x_k p_k) ) 实际下降。评估预测下降计算模型预测的下降量( \text{pred}_k m_k(0) - m_k(p_k) - (g_k^T p_k \frac{1}{2} p_k^T B_k p_k) )。计算比率并更新计算比率 ( \rho_k \frac{\text{ared}_k}{\text{pred}_k} )。这个比率是算法自适应的“指挥棒”接受试探步如果 ( \rho_k ) 大于一个较小的正数通常 ( \eta_1 0.01 ) 或 0.1说明模型预测得不错实际下降可观则接受这一步( x_{k1} x_k p_k )。拒绝试探步如果 ( \rho_k ) 很小甚至为负说明模型预测严重偏离实际这一步要么没下降反而上升了。此时拒绝这一步( x_{k1} x_k )。调整信赖域半径根据 ( \rho_k ) 调整下一次迭代的信赖域半径 ( \Delta_{k1} )如果 ( \rho_k ) 很大例如 ( \eta_2 0.75 )说明模型在当前区域非常可靠我们可以更“大胆”一些在下一次扩大探索范围例如 ( \Delta_{k1} \min(2\Delta_k, \Delta_{\max}) )。如果 ( \rho_k ) 很小例如 ( \eta_1 0.1 )说明模型不可靠我们需要收缩信赖域采取更保守的策略例如 ( \Delta_{k1} 0.5 \Delta_k )。如果 ( \rho_k ) 介于两者之间则保持半径不变( \Delta_{k1} \Delta_k )。更新模型如果步被接受移动到新点 ( x_{k1} )并基于新点信息更新模型计算新的 ( g_{k1} ), ( B_{k1} )。如果步被拒绝则在同一点 ( x_k ) 用更小的信赖域半径重新求解子问题。这个“求解-评估-调整”的循环构成了信赖域方法自适应的核心。它不像线搜索那样执着于沿着某条射线找到“足够好”的点而是专注于在当前可信的区域内找到模型意义下的最优点并根据模型与实际的一致性来动态管理这个可信区域的大小。注意比率 ( \rho_k ) 的分母预测下降理论上应为正。如果求解子问题得当得到的 ( p_k ) 至少是模型的下降方向预测下降应为正。如果出现非正数通常意味着子问题求解或模型构建有误。3. 信赖域子问题的求解关键与技巧整个算法的计算成本很大程度上取决于第2步——信赖域子问题的求解。这是一个带球约束的可能非凸二次规划问题。它的求解质量直接影响到试探步的好坏和算法的效率。3.1 最优性条件与直观理解对于子问题 ( \min_{|p| \le \Delta} m(p) f g^T p \frac{1}{2} p^T B p )其解 ( p^* ) 满足著名的最优性条件KKT条件 存在一个标量 ( \lambda \ge 0 )使得( (B \lambda I) p^* -g )( \lambda (\Delta - | p^* |) 0 )( | p^* | \le \Delta ) 并且矩阵 ( (B \lambda I) ) 是半正定的。这个条件可以直观理解条件1这看起来很像求解无约束问题 ( \min_p m(p) ) 的方程 ( B p -g )但加上了一个“正则化项” ( \lambda I )。( \lambda ) 称为拉格朗日乘子。条件2互补松弛条件如果 ( | p^* | \Delta )即最优解落在信赖域内部那么必须有 ( \lambda 0 )。此时条件1退化为 ( B p^* -g )这就是无约束二次模型的最优解如果 ( B ) 正定就是牛顿步。如果 ( | p^* | \Delta )即最优解碰触到了信赖域的边界那么 ( \lambda ) 可以大于0。条件3就是信赖域约束本身。半正定要求保证了找到的解是局部极小点而不是鞍点或极大点。( \lambda ) 的物理意义它可以被看作是对模型Hessian矩阵 ( B ) 的一个修正。当 ( B ) 不是正定或者问题病态时直接求牛顿步( \lambda0 )可能指向一个糟糕的方向或者步长无限大。引入 ( \lambda 0 ) 使得 ( (B\lambda I) ) 变得正定相当于在原始模型上增加了一个惩罚项 ( \frac{\lambda}{2} |p|^2 )倾向于产生更短、更稳健的步长。( \lambda ) 越大步长越短方向越偏向最速下降方向负梯度方向。3.2 实用求解算法截断共轭梯度法Steihaug-Toint方法精确求解上述最优性条件需要迭代地求解 ( \lambda )计算量较大。在实践中对于大规模问题我们通常采用近似但高效的算法。其中最著名、应用最广的是截断共轭梯度法Truncated Conjugate Gradient, TCG也称为Steihaug-Toint 方法。它的思想非常巧妙我们直接用求解线性方程组的共轭梯度法CG来求解无约束子问题 ( B p -g )但在求解过程中加入信赖域约束的监视。算法步骤简述初始化( p_0 0 ), ( r_0 -g ), ( d_0 r_0 )。对于 ( j0,1,2,... ) 进行迭代 a. 如果 ( d_j^T B d_j \le 0 )说明沿着方向 ( d_j ) 模型是凸的曲率为非正继续走下去会使模型值无限减小。此时我们沿着方向 ( d_j ) 走到信赖域边界即可停止。计算 ( \tau ) 使得 ( | p_j \tau d_j | \Delta )令 ( p^* p_j \tau d_j ) 并返回。 b. 否则计算最优步长 ( \alpha_j (r_j^T r_j) / (d_j^T B d_j) )。 c. 计算试探点 ( p_{j1} p_j \alpha_j d_j )。 d. 如果 ( | p_{j1} | \ge \Delta )说明这一步会超出信赖域。同样计算 ( \tau ) 使得 ( | p_j \tau d_j | \Delta )令 ( p^* p_j \tau d_j ) 并返回。 e. 否则接受这一步( p_{j1} ) 成为当前点。更新残差 ( r_{j1} r_j - \alpha_j B d_j )。 f. 如果 ( | r_{j1} | ) 足够小满足了无约束问题的精度则返回 ( p_{j1} ) 作为近似解。 g. 计算新的共轭方向 ( d_{j1} r_{j1} \beta_j d_j )其中 ( \beta_j (r_{j1}^T r_{j1}) / (r_j^T r_j) )。如果迭代达到最大次数仍未返回则返回当前的 ( p )。这个方法的好处非常明显高效它只需要矩阵 ( B ) 与向量的乘积操作而不需要显式形成或分解 ( B )这对于大规模稀疏问题至关重要。自动满足约束算法在迭代过程中实时监控步长范数一旦触及边界就停止并给出边界上的解。隐含了正则化当遇到非正曲率方向步骤2a时它自动走向边界这对应于最优性条件中 ( \lambda 0 ) 的情况。实操心得在实现截断共轭梯度法时边界判断步骤2d的计算需要小心。通常我们维护一个二次方程 ( |p_j \tau d_j|^2 \Delta^2 ) 来求解 ( \tau )。要确保选取正的、较小的那个根以保证我们是从内部走向边界。3.3 模型Hessian矩阵 ( B_k ) 的选择模型的质量取决于 ( B_k )。常见的选择有精确Hessian( B_k \nabla^2 f(x_k) )。这能提供最精确的局部二阶信息收敛速度最快局部二阶收敛。但计算成本最高且不一定是正定的需要配合信赖域约束或修正如 ( B_k \lambda I )来保证子问题可解。拟牛顿法近似如BFGS, SR1这是最流行的选择。通过梯度信息迭代更新一个正定或保正定的矩阵 ( B_k )以近似Hessian。它不需要计算二阶导数且能保持超线性收敛速度。BFGS公式产生的矩阵总是正定的这简化了子问题的求解。高斯-牛顿矩阵用于非线性最小二乘对于形如 ( f(x) \frac{1}{2} \sum r_i(x)^2 ) 的问题可以用 ( B_k J_k^T J_k ) 来近似Hessian其中 ( J_k ) 是残差 ( r(x) ) 的雅可比矩阵。这通常是一个很好的正定近似。恒等矩阵最速下降( B_k I )。此时模型退化为线性模型子问题的解就是负梯度方向缩放到信赖域边界上。这相当于带信赖域约束的最速下降法。虽然简单但收敛速度慢线性收敛。在实际的优化库如SciPy, MATLAB的fminunc信任域算法中拟牛顿法特别是有限内存L-BFGS与信赖域的结合是处理中型到大型无约束优化问题的黄金标准。4. 算法实现细节与参数调优4.1 初始半径选择与更新策略算法的表现对初始信赖域半径 ( \Delta_0 ) 不太敏感但一个好的初始值能减少初期调整的迭代次数。一个常见的启发式方法是基于初始梯度和模型Hessian的范数 [ \Delta_0 \frac{|g_0|}{|B_0|} \quad \text{或} \quad \Delta_0 \min(0.1 |g_0|, 1.0) ] 如果对问题尺度一无所知简单设 ( \Delta_0 1.0 ) 或与 ( |x_0| ) 成比例也是一个起点。半径更新策略第6步中的参数 ( \eta_1, \eta_2, \gamma_1, \gamma_2 ) 通常有标准取值接受阈值 ( \eta_1 )通常取 0.01 到 0.1。这个值不能设得太高否则算法会过于保守很多有益的步都被拒绝。扩大阈值 ( \eta_2 )通常取 0.75 或 0.9。只有当模型预测非常准确时我们才扩大半径。收缩因子 ( \gamma_1 )通常取 0.25 到 0.5。当步被拒绝时半径收缩。扩大因子 ( \gamma_2 )通常取 1.5 到 2.5。当步被接受且预测很好时半径扩大。一个更稳健的更新策略是 [ \Delta_{k1} \begin{cases} \max(\gamma_1 \Delta_k, \Delta_{\min}) \text{if } \rho_k \eta_1 \text{ (很差)}\ \gamma_1 \Delta_k \text{if } \eta_1 \le \rho_k 0.5 \text{ (一般)}\ \Delta_k \text{if } 0.5 \le \rho_k \eta_2 \text{ (好)}\ \min(\gamma_2 \Delta_k, \Delta_{\max}) \text{if } \rho_k \ge \eta_2 \text{ (很好)} \end{cases} ] 同时通常设置一个最大半径 ( \Delta_{\max} ) 和最小半径 ( \Delta_{\min} ) 以避免数值问题。4.2 收敛性判断与停止准则一个成熟的优化算法必须有可靠的停止准则。对于信赖域方法通常同时检查以下几项梯度范数( | g_k | \le \epsilon_g )。这是最优性的一阶必要条件是最核心的判据。( \epsilon_g ) 根据问题精度要求设定如 ( 10^{-6} )。迭代点变化( | x_{k1} - x_k | \le \epsilon_x \max(1, | x_k |) )。当迭代点几乎不动时说明已找到局部极值点或无法再改进。函数值变化( |f_{k1} - f_k| \le \epsilon_f \max(1, |f_k|) )。函数值变化微小时停止。信赖域半径过小如果 ( \Delta_k \le \epsilon_{\Delta} ) 且步被拒绝可能表明算法卡在某个点无法在当前精度下取得进展。这可能意味着达到了机器精度极限或者遇到了数值噪声很强的区域。迭代次数/函数评估次数超限设置安全上限防止无限循环。注意事项不要只依赖梯度判据。在非常平坦的区域梯度可能很小但离真正的最优点还很远。结合步长和函数值变化判据更安全。另外当使用拟牛顿法时即使梯度还没达到阈值如果连续多次迭代函数值下降非常微小也可以考虑提前停止。4.3 与线搜索方法的对比与选型为了更清晰地理解信赖域方法的特点我们将其与经典的线搜索方法进行对比特性信赖域方法线搜索方法如梯度下降、牛顿法步长控制动态半径 ( \Delta_k ) 控制最大步长通过线搜索确定步长 ( \alpha_k )探索逻辑在“可信区域”内找模型最优解沿“固定方向”找满足条件的点如Armijo条件模型作用核心是模型步是模型的解方向由模型梯度、牛顿方向决定步长独立搜索Hessian非正定天然处理子问题求解自动正则化需要修正如修正Cholesky分解才能得到下降方向计算开销每步需解一个子问题如CG迭代每步可能需多次函数评估回溯搜索鲁棒性通常更强尤其对病态问题依赖于线搜索条件和方向质量收敛速度与牛顿/拟牛顿法结合可达超线性收敛同样取决于方向的选择如何选择对于高度非线性、曲率变化剧烈的问题信赖域方法通常更稳健因为它通过半径控制避免了过大的、破坏性的步长。对于大规模问题如果矩阵-向量乘很快截断共轭梯度法求解子问题非常高效信赖域方法是优选。对于中小规模、相对良态的问题线搜索牛顿法或拟牛顿法可能更简单直接代码实现也更直观。当精确Hessian计算昂贵但可用时信赖域方法能更好地利用其信息因为即使Hessian不定子问题也能求解。5. 实战应用案例与代码实现示意让我们考虑一个经典的非线性最小二乘问题——拟合一个指数衰减曲线来演示信赖域方法的应用。问题定义为给定数据点 ( (t_i, y_i) )寻找参数 ( x [a, b, c]^T ) 最小化残差平方和 [ f(x) \frac{1}{2} \sum_{i1}^{m} [y_i - (a \cdot e^{-b t_i} c)]^2 ] 其中 ( a, b, c ) 是待估参数。5.1 问题建模与导数计算首先定义残差向量 ( r(x) )其中第 ( i ) 个分量为 ( r_i(x) y_i - (a \cdot e^{-b t_i} c) )。 目标函数 ( f(x) \frac{1}{2} | r(x) |^2 )。 其梯度为( g(x) J(x)^T r(x) )其中雅可比矩阵 ( J(x) ) 的第 ( i ) 行为 [ \nabla r_i(x) [-e^{-b t_i}, \quad a t_i e^{-b t_i}, \quad -1] ] 对于Hessian矩阵我们可以使用高斯-牛顿近似它忽略残差二阶导的部分即 [ B(x) \approx J(x)^T J(x) ] 这个近似在残差 ( r_i ) 较小或模型接近线性时效果很好并且总是半正定的非常适合信赖域方法。5.2 Python代码实现框架使用SciPy在实际中我们很少从零实现完整的信赖域算法而是使用成熟的库。SciPy的scipy.optimize.minimize函数提供了基于信赖域的算法methodtrust-constr用于约束问题对于无约束问题其内部牛顿共轭梯度法也采用了信赖域思想。但为了理解我们可以展示如何利用高斯-牛顿模型和近似Hessian来构建问题。import numpy as np from scipy.optimize import minimize, Bounds import matplotlib.pyplot as plt # 1. 生成模拟数据 np.random.seed(42) t_data np.linspace(0, 5, 50) a_true, b_true, c_true 2.5, 1.3, 0.8 y_true a_true * np.exp(-b_true * t_data) c_true y_data y_true 0.1 * np.random.randn(len(t_data)) # 加入噪声 # 2. 定义残差、雅可比和目标函数 def residual(x, t, y): a, b, c x return y - (a * np.exp(-b * t) c) def jacobian(x, t): a, b, c x exp_bt np.exp(-b * t) J np.empty((len(t), 3)) J[:, 0] -exp_bt # dr/da J[:, 1] a * t * exp_bt # dr/db J[:, 2] -1.0 # dr/dc return J def objective(x): r residual(x, t_data, y_data) return 0.5 * np.dot(r, r) def gradient(x): r residual(x, t_data, y_data) J jacobian(x, t_data) return -J.T r # g -J^T * r注意我们定义的残差是 y - model # 3. 使用SciPy的信任域反射算法适用于边界约束或牛顿共轭梯度法 # 这里使用‘trust-constr’它可以处理我们定义的高斯-牛顿Hessian近似 from scipy.optimize import BFGS, SR1, HessianUpdateStrategy # 自定义Hessian近似高斯-牛顿矩阵 class GaussNewtonHessian: def __init__(self, t, y): self.t t self.y y def __call__(self, x): J jacobian(x, self.t) return J.T J # 返回高斯-牛顿近似矩阵 hess GaussNewtonHessian(t_data, y_data) # 初始猜测 x0 np.array([1.0, 0.5, 0.0]) # 调用优化器。注意trust-constr需要Hessian返回线性算子或矩阵。 # 对于大规模问题应实现为线性算子。这里我们使用BFGS作为替代演示更通用的流程。 result minimize(objective, x0, methodtrust-constr, jacgradient, hessBFGS(), # 使用BFGS拟牛顿近似而非精确高斯-牛顿 options{verbose: 2, maxiter: 200, gtol: 1e-8}) # 实际上对于非线性最小二乘SciPy推荐使用 least_squares 函数它内部使用了Levenberg-Marquardt算法一种特殊类型的信赖域方法。 print(f优化结果: a{result.x[0]:.4f}, b{result.x[1]:.4f}, c{result.x[2]:.4f}) print(f真实参数: a{a_true:.4f}, b{b_true:.4f}, c{c_true:.4f}) print(f迭代次数: {result.nit}, 函数调用次数: {result.nfev}) # 4. 可视化拟合结果 t_fine np.linspace(0, 5, 200) y_fit result.x[0] * np.exp(-result.x[1] * t_fine) result.x[2] plt.figure(figsize(10, 6)) plt.scatter(t_data, y_data, alpha0.7, labelNoisy Data) plt.plot(t_fine, y_fit, r-, linewidth2, labelfFit: a{result.x[0]:.3f}, b{result.x[1]:.3f}, c{result.x[2]:.3f}) plt.plot(t_fine, a_true*np.exp(-b_true*t_fine)c_true, k--, alpha0.5, labelTrue Model) plt.xlabel(Time (t)) plt.ylabel(Response (y)) plt.legend() plt.grid(True, alpha0.3) plt.title(Exponential Decay Fitting using Trust Region Method (via SciPy)) plt.show()在这个例子中我们没有手动实现信赖域循环而是利用了SciPy库的强大功能。methodtrust-constr算法内部实现了信赖域框架我们提供了目标函数、梯度和Hessian近似这里用了BFGS。算法会自动处理子问题求解、半径调整和收敛判断。实操心得对于非线性最小二乘问题更专业的工具是scipy.optimize.least_squares它实现了Levenberg-Marquardt算法。该算法可以看作是信赖域方法的一个特例其中模型是高斯-牛顿模型并且使用了一个特殊的参数 ( \lambda ) 来平滑地在最速下降方向和高斯-牛顿方向之间插值。其参数tr_solver可以指定求解子问题的方法如‘exact’或‘lsmr’本质上就是信赖域子问题的求解器。6. 常见陷阱、调试技巧与性能优化6.1 典型问题与排查清单即使使用了成熟的库理解和排查信赖域方法中的问题仍然很重要。现象可能原因排查与解决思路迭代震荡半径频繁缩放1. 模型质量差Hessian近似不准。2. 初始半径 ( \Delta_0 ) 设置不当。3. 接受阈值 ( \eta_1 ) 设得太高。1. 检查梯度实现是否正确用有限差分验证。2. 尝试更精确的Hessian或改用SR1更新能处理不定矩阵。3. 降低 ( \eta_1 )如从0.1调到0.01让算法更容易接受步。收敛速度极慢1. 问题本身条件数很差病态。2. 信赖域半径始终很小限制了大步长。3. 子问题求解精度不足。1. 考虑对变量进行缩放预处理使各维度量级相当。2. 检查是否因梯度计算有噪声导致 ( \rho_k ) 一直很小。可适当调低 ( \eta_2 ) 以促进半径增长。3. 提高截断共轭梯度法的收敛容差。在平坦区域停滞梯度已很小但函数值仍离最优较远。1. 检查停止准则是否过于依赖梯度容差 ( \epsilon_g )。可结合函数值和步长变化判断。2. 可能是遇到了“鞍点”或平坦高原。信赖域方法对此有一定逃逸能力但可尝试从不同初始点重启。函数值不降反增1. 梯度或Hessian实现有误。2. 子问题求解器返回了非下降方向理论上不应发生。1.首要任务用有限差分法严格验证梯度代码。这是最常见错误源。2. 检查截断共轭梯度法实现中边界触碰和负曲率处理逻辑是否正确。内存消耗过大使用完整拟牛顿矩阵如BFGS存储 ( B_k )变量维度 ( n ) 很大。切换到有限内存BFGSL-BFGS。L-BFGS不存储完整的 ( n \times n ) 矩阵而是存储最近m次迭代的向量对用这些信息近似Hessian作用。它与截断共轭梯度法是绝配。6.2 梯度验证绝对不能跳过的一步在实现任何基于导数的优化算法时梯度验证是强制性的。使用中心差分公式进行验证 [ \frac{\partial f}{\partial x_i} \approx \frac{f(x h e_i) - f(x - h e_i)}{2h} ] 其中 ( e_i ) 是第i个单位向量( h ) 取一个较小的值如 ( 10^{-6} )。计算你解析实现的梯度与有限差分梯度的相对误差 [ \text{error} \frac{| g_{\text{analytic}} - g_{\text{finite diff}} |}{| g_{\text{finite diff}} |} ] 对于光滑函数这个误差应该在 ( 10^{-7} ) 到 ( 10^{-9} ) 量级。如果误差大于 ( 10^{-5} )几乎可以肯定梯度实现有bug优化算法必然表现异常。6.3 预处理大幅提升性能的利器对于病态问题Hessian矩阵条件数很大优化算法会像在狭长的山谷中蜿蜒前行收敛极慢。预处理技术通过改变变量的尺度来改善问题的条件数。在信赖域方法中特别是使用截断共轭梯度法求解子问题时引入一个预处理矩阵 ( M )对称正定可以极大加速收敛。预处理的思想是求解一个等价问题 [ \min_{| \hat{p} | \le \Delta} \hat{m}_k(\hat{p}) f_k \hat{g}_k^T \hat{p} \frac{1}{2} \hat{p}^T \hat{B}_k \hat{p} ] 其中 ( \hat{p} M^{1/2} p ), ( \hat{g}_k M^{-1/2} g_k ), ( \hat{B}_k M^{-1/2} B_k M^{-1/2} )。一个好的预处理矩阵 ( M ) 应该近似于 ( B_k ) 的逆或者至少能捕捉其主特征值的分布。简单的对角预处理取 ( M ) 为Hessian对角线元素的绝对值即 ( M_{ii} |[B_k]_{ii}| \delta )其中 ( \delta ) 是一个小正数防止除零。这相当于对每个变量进行缩放使其二阶导数曲率的量级大致为1。在截断共轭梯度法中预处理体现在将原始的残差 ( r ) 替换为 ( z M^{-1} r )并用预处理后的内积进行运算。成熟的优化库如PETSc, SciPy都支持预条件器的设置。6.4 与其他高级技术的结合子空间方法对于超高维问题如 ( n 10^6 )即使使用CG迭代每步的矩阵-向量乘也可能很贵。子空间信赖域方法将搜索限制在一个低维子空间如由当前梯度和前几步方向张成的Krylov子空间内能显著降低成本。随机/增量方法在大规模机器学习中目标函数通常是大量样本损失之和。随机信赖域方法使用一个子集mini-batch的数据来估计梯度和Hessian-向量积从而降低每次迭代的成本。如何控制这种随机性带来的噪声是研究的热点。非单调信赖域传统的信赖域方法要求每一步函数值都下降单调。非单调版本允许偶尔的函数值上升以换取更全局的探索能力有时能帮助跳出浅层局部极小点。信赖域方法以其坚实的理论基础和优异的数值稳定性在最优化领域占据了重要地位。从经典的Levenberg-Marquardt算法到现代大规模机器学习中的优化器其思想无处不在。理解其“在可信的范围内寻找最优解”的核心哲学掌握其子问题求解和半径自适应调节的机制就能在面临复杂优化任务时多一份强大而稳健的工具选择。