← 返回模块
Q2.5.2.1beta 可读 · 未来免费校验通过内容版本 2026-05-26

梯度下降与线搜索

2.5.2 · 迭代法与正则化方法 · 数学与统计能力

周五下午两点,你在上海某私募的因子研究组里收到一张 12,000 × 600 的设计矩阵——600 个候选 alpha 因子在沪深300 成分股上 18 个月日频的横截面暴露。组合经理希望你下班前给一组系数,明早接入回测。你写下普通最小二乘(ordinary least squares, OLS)的闭式解 beta = np.linalg.solve(X.T @ X, X.T @ y),按下回车——进程吃掉 40GB 内存后被 kill。XXX^\top X 是 600 × 600,但其条件数(condition number)轻松突破 10810^8,直接求逆既不稳定又烧内存。你需要一个不依赖矩阵求逆、按梯度一步步逼近的迭代解法(iterative method)。

最陡下降方向

设目标 f:RnRf: \mathbb{R}^n \to \mathbb{R} 可微。在点 xkx_k 处沿单位向量 dd 的方向导数(directional derivative)为 f(xk)d\nabla f(x_k)^\top d,柯西-施瓦茨不等式给出

f(xk)d    f(xk)d,\nabla f(x_k)^\top d \;\ge\; -\|\nabla f(x_k)\| \cdot \|d\|,

等号在 d=f(xk)/f(xk)d = -\nabla f(x_k)/\|\nabla f(x_k)\| 时取到。也就是说,​​负梯度方向是当前点局部下降最快的方向​​——这就是「最陡下降」(steepest descent)的来源。配上一个步长 tk>0t_k > 0,便得到梯度下降的标准更新规则:

xk+1=xktkf(xk).x_{k+1} = x_k - t_k \nabla f(x_k).

三种步长

固定步长(fixed step)、精确线搜索(exact line search)、回溯线搜索(backtracking line search)是三种典型选择,对应三种「肯花多少代价换收敛保证」的权衡。

  • ​固定步长 tk=tt_k = t​​​:当梯度满足 LL-Lipschitz 条件 f(x)f(y)Lxy\|\nabla f(x) - \nabla f(y)\| \le L\|x-y\| 时,取 t1/Lt \le 1/L 可保证每步单调下降。代价是你得先估出 LL,估高了收敛慢,估低了直接发散。
  • ​精确线搜索 tk=argmintf(xktf(xk))t_k = \arg\min_t f(x_k - t \nabla f(x_k))​​​:只有当 ff 是二次型才能写出闭式解,一般非线性问题里没人用。
  • ​回溯线搜索(Armijo 充分下降条件)​​:先取一个较大的试探步长 tt,若不满足 Armijo 条件就把 tt 减半,直到满足为止。Armijo 条件写作
f(xk+tdk)    f(xk)+αtf(xk)dk,f(x_k + t\, d_k) \;\le\; f(x_k) + \alpha\, t\, \nabla f(x_k)^\top d_k,

其中 dk=f(xk)d_k = -\nabla f(x_k)α(0,1)\alpha \in (0, 1) 是「实际下降占一阶预测下降的最低比例」,工程上常取 α=0.25\alpha = 0.25。它要求你真正走出去的下降量至少有一阶模型预测量的 α\alpha 倍——这是把「迈一步」和「迈一大步」分开的常用闸门。

ff 是二次型,沿搜索方向的一维限制 ϕ(t)=f(xktf(xk))\phi(t) = f(x_k - t \nabla f(x_k)) 退化成开口向上的抛物线,精确线搜索就是该抛物线的解析极小点。下方滑块演示其形状——调节曲率 aa 与斜率 bb 即可读出极小位置:

Formula Explorer

0.5 * a * t^2 - b * t

收敛速率与条件数

f=minxf(x)f^* = \min_x f(x)κ=L/μ\kappa = L/\mu 为该问题的条件数,其中 μ\muff 的强凸常数(strong-convexity constant)。两类标准结论:

  • ​凸 + LL-Lipschitz 梯度​​(不强凸):固定步长 t=1/Lt = 1/L 给出​​次线性​​收敛 f(xk)fx0x2/(2tk)=O(1/k)f(x_k) - f^* \le \|x_0 - x^*\|^2 / (2tk) = O(1/k)。把误差砍到 10310^{-3} 需要约 103/ϵ010^3 / \epsilon_0 步。
  • ​​μ\mu-强凸 + LL-Lipschitz 梯度​​:精确线搜索给出​​线性​​收敛
f(xk)f    (κ1κ+1)2k(f(x0)f).f(x_k) - f^* \;\le\; \left( \frac{\kappa - 1}{\kappa + 1} \right)^{2k} \bigl( f(x_0) - f^* \bigr).

κ\kappa 越接近 1,每步几乎砍掉一个数量级;κ\kappa 越大,速率 ((κ1)/(κ+1))2((\kappa-1)/(\kappa+1))^2 越逼近 1,相当于线性收敛但每步只能蹭走 O(1/κ)O(1/\kappa) 比例的误差。

这一点对量化场景至关重要:500 只股票样本协方差矩阵(covariance matrix)在数据稀疏或共线性强时 κ\kappa 轻松突破 10410^4,在它上面做均值方差优化(mean-variance optimization, MVO)或最小方差组合求解时,梯度下降所需的步数被放大成千倍。条件数不是抽象的数值分析指标,它就是你今晚能不能算完的实际指标。

病态二次型:zig-zag 的几何

f(x)=12xAxf(x) = \tfrac{1}{2} x^\top A xA=diag(1,κ)A = \mathrm{diag}(1, \kappa)。等高线是长短轴比为 κ\sqrt{\kappa} 的椭圆。

  • κ=1\kappa = 1A=IA = I,等高线为圆,精确线搜索一步即到原点。
  • κ=10\kappa = 10,初值 x0=(10, 1)x_0 = (10,\ 1),精确线搜索:
kkxkx_kf(xk)f(x_k)f(xk)/f(xk1)f(x_k) / f(x_{k-1})
0(10.00, 1.00)(10.00,\ 1.00)55.0055.00
1(8.18, 0.82)(8.18,\ -0.82)36.8236.820.6690.669
2(6.70, 0.67)(6.70,\ 0.67)24.6524.650.6700.670
3(5.48, 0.55)(5.48,\ -0.55)16.5116.510.6700.670
4(4.48, 0.45)(4.48,\ 0.45)11.0611.060.6700.670

理论速率 ((κ1)/(κ+1))2=(9/11)20.669\bigl((\kappa-1)/(\kappa+1)\bigr)^2 = (9/11)^2 \approx 0.669,与表中观测的下降比例完全吻合。注意第二坐标每步都翻转符号——这就是教科书上常画的「之字形」(zig-zag)轨迹:椭圆等高线把负梯度方向「掰歪」了,负梯度指向的不是椭圆的中心而是其本地圆切线,每一步都要在长轴方向上反复矫正。

κ\kappa 拉到 100100(合约要求 κ≈1 vs κ≈100 直接对照),取 x0=(100,1)x_0 = (100, 1)t=2/(κ+1)=2/101t = 2/(\kappa + 1) = 2/101,沿用上一节最优固定步:

kkκ=1\kappa = 1: f(xk)f(x_k)κ=100\kappa = 100: f(xk)f(x_k)
01.0005050.000
10.0004851.980
20.0004661.725
50.0004134.563
500.000683.398
2000.0001.694

速率退化为 (99/101)20.961(99/101)^2 \approx 0.961,把 ff 砍到 103f010^{-3} f_0 需要约 log(103)/log(0.961)174\log(10^{-3}) / \log(0.961) \approx 174 步;把 κ\kappa 拉到 10410^4,所需步数飙到约 1.7×1041.7 \times 10^4。​​这就是一阶梯度法在 κ\kappa 大时失效的真正原因​​——它只看「往哪个方向下降最快」,看不见「等高线被压扁了多少」。

一阶法的真实战场

在量化实践里,梯度下降不是替代闭式解的「玩具」,而是闭式解不可用时的唯一选择:

  • ​神经网络因子模型​​:把 50ETF / 300ETF 的高频量价特征喂进一个三层 MLP 预测下一分钟收益,损失对参数高度非线性,根本没有闭式解。
  • ​隐含波动率(implied volatility, IV)曲面校准​​:把 SABR 或 SVI 五参数模型同时拟合到 30 个行权价和 5 个到期日上的市价,最小化加权平方误差——一阶法(带回溯)是 Black-Scholes 反演的工业标配。
  • ​大规模均值方差优化​​:当组合维度 nn 上千时,O(n3)O(n^3) 的协方差矩阵直接求逆已经不实用,按一阶法迭代逼近最优组合权重往往是唯一可行的路线。

练习

Exercise

考虑 f(x1,x2)=x12+4x22f(x_1, x_2) = x_1^2 + 4 x_2^2,初值 x0=(2, 1)x_0 = (2,\ 1)^\top

  1. 用试探步长 t=0.1t = 0.1 算出一次梯度下降。
  2. 用 Armijo 规则(α=0.25\alpha = 0.25)判断是接受该步还是把步长减半。
提示
梯度 f(x)=(2x1, 8x2)\nabla f(x) = (2 x_1,\ 8 x_2)^\top,在 x0x_0f(x0)=(4, 8)\nabla f(x_0) = (4,\ 8)^\top,所以 x1=x0tf(x0)=(1.6, 0.2)x_1 = x_0 - t\, \nabla f(x_0) = (1.6,\ 0.2)
提示
代入 Armijo,d0=f(x0)d_0 = -\nabla f(x_0):右端 8+0.250.1(80)=6.08 + 0.25 \cdot 0.1 \cdot (-80) = 6.0f(x1)=2.72f(x_1) = 2.72,不等式成立——接受该步,无需减半。

课末过渡

到这里你已经能用 f-\nabla f 决定走向、用 Armijo 决定走多远、用 κ=L/μ\kappa = L/\mu 预判要走多少步。但 zig-zag 暴露了一阶方法的天花板——它对各向异性的等高线无能为力。下一课要把二阶曲率信息加进来:牛顿方向 dk=[2f(xk)]1f(xk)d_k = -[\nabla^2 f(x_k)]^{-1} \nabla f(x_k) 相当于在每一步本地把空间拉直,让椭圆变回圆,zig-zag 消失。代价是每步要解一个 n×nn \times n 的线性系统——这是「每步代价」换「总步数」的另一笔交易。