线搜索与信赖域
6.3 节里,学习率 \(\eta\) 是你拍脑袋定的常数:大了发散,小了爬不动。这一节让算法自己决定每一步迈多大。有两种思路:线搜索先定方向,再沿着这个方向试探走多远;信赖域先定"在多大范围内我信得过局部模型",再在这个范围里找最好的一步。两者背后是同一个问题:局部信息能信多远?
1为什么机器人需要它
2直觉:两种"小心"
你在浓雾中下山,手里只有脚下一小片的地形图(梯度,还可能有曲率)。有两种稳妥的走法。
线搜索:先选方向,再量步长。你认定了一个下坡方向,然后问:"沿这个方向走,走多远合适?"你先迈一大步,看看是不是真的降低了足够多的海拔;没有,就把步子减半再试(回溯)。关键是要定义"降低得足够多",那就是 Armijo 条件。
信赖域:先选半径,再选方向。你对地形图说:"这张图只在我周围 \(\Delta\) 米内可信。"然后在半径 \(\Delta\) 的圆盘内,找地形图预测的最低点。走完之后检查:实际降低的海拔,是地形图预测的几成?如果大致吻合,下次放大半径;如果差很多,缩小半径并撤销这一步。这个"实际/预测"的比值 \(\rho\) 是信赖域的核心。
3动手玩:什么样的步长算"好"
左图是 Rosenbrock 地形(和 6.3 节同一形状,代价乘 \(\tfrac12\),这样 6.6 节能写成 \(\tfrac12\|\mathbf r\|^2\))。拖动黄色的起点 \(\x_k\),从它出发沿负梯度方向有一条射线。右图把代价沿射线展开成一元函数 \(\varphi(\alpha)=f(\x_k+\alpha\mathbf p)\)(\(\mathbf p\) 是单位长度的下降方向,所以 \(\alpha\) 就是走的距离)。
两个条件把"好步长"夹出来:Armijo(充分下降)要求 \(\varphi(\alpha)\) 在黄色虚线(斜率为 \(c_1\varphi'(0)\) 的直线)之下;曲率条件要求此处的斜率 \(|\varphi'(\alpha)|\le c_2|\varphi'(0)|\),也就是"坡已经变缓了"。两个条件都满足就是(强)Wolfe 条件。
- 找一个满足 Armijo、却不满足曲率条件的 \(\alpha\)(提示:非常小的步长)。它为什么没有用?
- 把 \(\alpha\) 放进 Wolfe 区间(右图三行横条中最上面、标着"Wolfe"的那一行,也是左图射线上的粗绿段)。再把 \(c_2\) 调小到 0.15 左右(它必须大于 \(c_1\)):区间变窄了还是变宽了?
- 点"回溯",数一数被拒绝了几次,再换一个起点重来。
Armijo 防止"走过头":步子太大,函数值不降反升,或者降得不如线性预测。曲率条件防止"走得太保守":只要 \(\alpha\) 足够小,Armijo 总是满足,所以单靠 Armijo 会让算法退化成蚂蚁爬。回溯法只有 Armijo,却不会太保守,因为它是从大步长开始往小缩的,第一个被接受的步长已经够大了。
4三种步长策略赛跑:比的是"总计算量"
线搜索不是免费的:每次回溯试探要多算一次 \(f\)。公平的比较要看"总共评估了多少次函数和梯度",而不是迭代了多少次。下面三个方法都用最速下降方向 \(-\nabla f\):固定步长;回溯线搜索(Armijo,\(c_1=10^{-4}\),每次减半,初始步长用上一次的两倍);精确线搜索(每次沿射线把 \(\varphi\) 精确最小化,用黄金分割)。横轴是评估次数。
- 把固定步长 \(\eta\) 调大到让它发散,而回溯线搜索安然无恙。
- 让三个方法都用完 3000 次评估的预算,比较最终的 \(f-f^\star\) 和每次迭代的平均评估次数(精确线搜索约 35 次,回溯约 3 次):多花评估换来的"更准的步长"值得吗?
5信赖域:模型、半径与 \(\rho\)
信赖域用一个二次模型代替真实函数:\(m(\mathbf p)=f+\mathbf g^\top\mathbf p+\tfrac12\mathbf p^\top B\mathbf p\),其中 \(\mathbf g=\nabla f\),\(B\) 是 Hessian(或它的近似)。模型是 \(f\) 在 \(\x_k\) 处的二阶泰勒展开,离 \(\x_k\) 越远越不准。所以只在半径 \(\Delta\) 的圆盘内最小化它:
下图画出 \(f\) 的真实等高线(青色)和模型的等高线(紫色)。拖动起点 \(\x_k\) 和圆周上的手柄(或滑块)改变 \(\Delta\):小圆盘里两套等高线几乎重合,\(\rho\approx1\);半径越大,模型与真实函数分歧越大,\(\rho\) 下降。右下角的曲线是 \(\rho\) 随 \(\Delta\) 的变化:这就是算法调节半径时要读取的"信任度表"。
- 在 Rosenbrock 上把 \(\Delta\) 调到很小(\(<0.08\)):\(\rho\) 应接近 1,模型可信。
- 把 \(\Delta\) 加大,直到 \(\rho<0.25\):模型的预测已经离谱,这一步应当被缩小或拒绝。
- 切换到"鞍"地形:Hessian 有负特征值,模型的等高线是双曲线,最小点被推到圆周上。
6交锋:线搜索 Newton 与信赖域
现在把完整的算法跑起来。三个对手,都用精确的 Hessian:GD + 回溯;Newton + 回溯(Newton 方向 \(-H^{-1}\mathbf g\),若 \(H\) 不正定则退回 \(-\mathbf g\));信赖域(精确子问题;\(\rho<0.25\) 时 \(\Delta\leftarrow\tfrac14\|\mathbf p\|\),\(\rho>0.75\) 且步长顶到边界时 \(\Delta\leftarrow2\Delta\),\(\rho>0.1\) 才接受这一步)。三种地形:Rosenbrock、病态的二次函数(\(\kappa=100\))、以及起点恰好落在鞍点的稳定方向上的"鞍"。
- 在 Rosenbrock 上让三者都跑完:GD + 回溯 400 步都到不了,Newton 与信赖域只要二十来步。
- 在"鞍"地形里:GD 和 Newton 都停在鞍点 \((0,0)\)(梯度为零,但 \(f-f^\star=0.25\)),信赖域沿负曲率方向逃出,落入 \((0,\pm1)\)。
7再看数学
提示:悬停在带底色的符号上,FIG 3 中对应的元素(半径、模型、\(\rho\) 曲线)会被强调。
线搜索
迭代为 \(\x_{k+1}=\x_k+\alpha_k\mathbf p_k\),\(\mathbf p_k\) 是下降方向(\(\nabla f(\x_k)^\top\mathbf p_k<0\))。记 \(\varphi(\alpha)=f(\x_k+\alpha\mathbf p_k)\),\(\varphi'(0)=\nabla f_k^\top\mathbf p_k<0\)。给定 \(0<c_1<c_2<1\):
两者合称(强)Wolfe 条件。典型取值 \(c_1=10^{-4}\),\(c_2=0.9\)(Newton、拟牛顿)或 \(0.1\)(共轭梯度)。只要 \(\varphi\) 有下界,Wolfe 区间必然非空。回溯法只用 Armijo:取 \(\alpha\leftarrow\alpha_0\),当条件不满足时 \(\alpha\leftarrow\tau\alpha\)(常取 \(\tau=\tfrac12\))。由于 \(\varphi(\alpha)=\varphi(0)+\alpha\varphi'(0)+o(\alpha)\) 而 \(c_1<1\),足够小的 \(\alpha\) 一定满足 Armijo,所以回溯必定终止。
为什么这样就能收敛?著名的 Zoutendijk 定理说:若每一步都满足 Wolfe,且 \(f\) 下有界、梯度 Lipschitz 连续,则 \(\sum_k\cos^2\theta_k\,\|\nabla f_k\|^2<\infty\),其中 \(\theta_k\) 是 \(\mathbf p_k\) 与 \(-\nabla f_k\) 的夹角。因此只要方向不与负梯度"几乎垂直"(\(\cos\theta_k\ge\delta>0\)),就有 \(\|\nabla f_k\|\to0\)。线搜索把"步长怎么选"这个难题,化成了一个有保证的小问题。
信赖域
右边是精确解的充要条件(6.7 节的 KKT 条件的一个特例):若 \(B\succ0\) 且 Newton 步 \(-B^{-1}\mathbf g\) 在圆内,就取 Newton 步(\(\lambda=0\));否则解落在圆周上,对应一个 \(\lambda>0\),使得 \((B+\lambda I)\mathbf p=-\mathbf g\) 且 \(\|\mathbf p\|=\Delta\)。\(\lambda\) 越大,步越短、越接近 \(-\mathbf g\) 方向:这正是 6.6 节 Levenberg–Marquardt 的阻尼项。信赖域半径和 LM 阻尼是同一个旋钮的两种表示。
不必每次都精确求解。Cauchy 点是模型沿 \(-\mathbf g\) 方向在圆盘内的最小点:\(\mathbf p^C=-\tau\tfrac{\Delta}{\|\mathbf g\|}\mathbf g\),其中 \(\tau=1\)(若 \(\mathbf g^\top B\mathbf g\le0\))或 \(\tau=\min\!\big(1,\tfrac{\|\mathbf g\|^3}{\Delta\,\mathbf g^\top B\mathbf g}\big)\)。只要每步的模型下降不少于 Cauchy 点下降的一个固定比例,算法就有全局收敛保证;dogleg 法在 Cauchy 点与 Newton 点之间走一条折线,便宜又接近精确。
半径的更新由 \(\rho_k\) 决定(FIG 4 用的规则):
| 线搜索 | 信赖域 | |
|---|---|---|
| 先定什么 | 方向 \(\mathbf p_k\) | 半径 \(\Delta_k\) |
| 再定什么 | 沿方向的步长 \(\alpha_k\) | 圆盘内的最佳方向和长度 |
| Hessian 不正定 | 需要修正(或退回 \(-\mathbf g\)) | 天然可用,还能利用负曲率 |
| 每次失败的代价 | 多一次 \(f\) | 多解一个子问题(\(B\) 不变) |
8机器人中的它:每个控制周期的"关节步长上限"
实时 IK 控制器每个周期(比如 10 ms)要给出新的关节目标。关节速度上限(例如 2 rad/s)意味着每个周期关节最多能转 \(\Delta_{\max}=0.02\) rad。把这个物理限制直接当作信赖域半径:每个周期解一个信赖域子问题,步长天然不会超过关节能转的角度;算得好就放大,算得差就缩小。你得到的是一个自带速度限制、又不会因为步子太大而发散的逆运动学求解器。
下图中,两连杆臂从初始姿态出发追踪目标。右侧是关节空间,圆是各周期的信赖域;左侧是工作空间里的手臂。拖动目标,调节每周期最大转角 \(\Delta_{\max}\),看"收敛所需的控制周期数"怎样变化。起点处 Hessian 不定,纯 Newton 步根本不适用,信赖域则毫不在意。
- 先用 \(\Delta_{\max}\ge1\) rad 跑一遍,再用 \(\Delta_{\max}\le0.1\) rad 跑一遍:后者慢多少个周期?它换来了什么?(每周期的关节位移不超过上限,运动平滑。)
非线性最小二乘求解器(Ceres 的 LEVENBERG_MARQUARDT 与 DOGLEG 策略、g2o、GTSAM)默认使用信赖域,初始半径和最大半径是最常调的参数之一;视觉里程计在特征很少、几何退化时,信赖域能防止一步把位姿"炸飞"。模型预测控制 (MPC) 和轨迹优化中的"序列二次规划 (SQP)"也经常给每次迭代的变量变化加上边界(trust-region SQP)。凡是看到"每步最多改变这么多",背后几乎都是信赖域的想法。
9常见误区
Armijo 的前提是 \(\mathbf p\) 是下降方向(\(\mathbf g^\top\mathbf p<0\))。拟牛顿的近似 Hessian 若失去正定性,或 Newton 方向在非凸区域指向上坡,回溯会一直缩到 0 也找不到合格步长。实现里必须检查 \(\mathbf g^\top\mathbf p<0\),否则退回 \(-\mathbf g\) 或修正 Hessian。
Armijo 要求比较同一个函数在两点的值。小批量(6.4 节)里每次换一批数据,函数本身在变,条件的比较就失去意义。这是深度学习里通常用学习率日程而不是线搜索的原因之一。全批量(或固定批量)的问题才适合线搜索。
\(\rho>0\) 只说明函数确实下降了,不说明模型靠谱。\(\rho\) 很小但为正时接受这一步,下一步可能立刻出问题,所以接受门槛 \(\eta\) 通常取 0.1 左右,并且在 \(\rho<0.25\) 时就缩小半径。另一方面,\(\rho\gg1\)(实际下降远超预测)表示模型太保守,也值得扩大半径。
LM 通过调节阻尼 \(\lambda\) 间接控制步长;信赖域直接设定半径,再反推 \(\lambda\)。二者等价,但直接设半径更容易向物理量(关节最大转角、位姿最大变化)看齐,也更便于解释失败(FIG 5)。
10小练习
11延伸阅读
- J. Nocedal & S. Wright, Numerical Optimization, 2nd ed., Ch. 3 (line search: Armijo, Wolfe, backtracking, Zoutendijk) & Ch. 4 (trust region: Cauchy point, dogleg, exact solution) — 本节内容的标准教材,推导完整
- S. Boyd & L. Vandenberghe, Convex Optimization, Sec. 9.2 — 回溯线搜索与精确线搜索的收敛分析(可免费下载)
- A. R. Conn, N. I. M. Gould & Ph. L. Toint, Trust-Region Methods, SIAM, 2000 — 信赖域方法的权威专著
- S. Agarwal, K. Mierle et al., Ceres Solver documentation — "Solving" 一章描述了机器人领域最常用的信赖域与线搜索策略及其参数