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

随机与小批量优化方法

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

钩子:当一次完整梯度要四个小时

某上海百亿私募的研究员准备把一套基于沪深300 成分股的多因子神经网络 α 信号搬上生产。训练集是过去 5 年的日频面板:约 180 万行样本 × 300 只成分股 × 80 个特征。前两课的工具一一被排除——海森矩阵(Hessian matrix, HH)装不进显存,L-BFGS 一次方向计算也要把整批数据过一遍。退到最朴素的全批量梯度下降(full-batch gradient descent):单步反向传播要约 4 小时,跑 1000 步等于让 GPU 工位空转半年。她改用批量大小(batch size)B=512B = 512 的随机梯度下降(stochastic gradient descent, SGD),同一台机器一夜跑完,模型周一开盘前就能挂到 SSE 上证的实盘信号管线上。这一课要把这种「放弃精确梯度反而更快」的现象讲清楚。

一、从有限和目标到无偏估计

把训练目标写成有限和(finite sum):

f(x)=1Ni=1Nfi(x)f(x) = \frac{1}{N} \sum_{i=1}^{N} f_i(x)

其中 fif_i 是第 ii 个样本上的损失(loss)。完整梯度 f(x)=(1/N)ifi(x)\nabla f(x) = (1/N)\sum_i \nabla f_i(x) 一次要把全部 NN 个样本过一遍反向传播;NN 上到百万量级,单步成本就不可接受。

关键观察很短:随机抽一个样本 iki_k,把 gk=fik(xk)g_k = \nabla f_{i_k}(x_k) 当作 f(xk)\nabla f(x_k) 的无偏估计(unbiased estimator),因为

E[gkxk]=1Ni=1Nfi(xk)=f(xk)\mathbb{E}[g_k \mid x_k] = \frac{1}{N}\sum_{i=1}^{N} \nabla f_i(x_k) = \nabla f(x_k)

代价是把方差从零拔到 Var(fi)\mathrm{Var}(\nabla f_i)。SGD 更新写法与第一课的梯度下降完全一致:

xk+1=xktkgkx_{k+1} = x_k - t_k\, g_k

差别在 gkg_k 已经是一个含噪向量(noisy vector),不再是确定性下降方向;轨迹会在最优解周围抖动,需要靠步长(learning rate)tkt_k 衰减把噪声压下去。

二、收敛率:用 k\sqrt{k}NN

在凸性(convexity)与 Robbins–Monro 步长(tk=\sum t_k = \inftytk2<\sum t_k^2 < \infty,经典选择 tk=c/kt_k = c/k;注意 tk=O(1/k)t_k = O(1/\sqrt{k}) 不满足平方可和,对应另一种 O(1/k)O(1/\sqrt{k}) 凸收敛率分析)假设下,SGD 对轨迹平均 xˉk\bar x_k 满足

E[f(xˉk)f]=O ⁣(1k)\mathbb{E}[f(\bar x_k) - f^*] = O\!\left(\frac{1}{\sqrt{k}}\right)

在强凸(strongly convex)目标加上合适的步长衰减后,速率提升到 O(1/k)O(1/k)。对比第一课的确定性结论——凸 LL-光滑下 O(1/k)O(1/k)、强凸下线性收敛——SGD「每一步」上更慢;但单步只用 O(1)O(1) 而非 O(N)O(N) 的梯度评估,一个 epoch(一遍扫完全集)能走 NN 步 SGD,相当于全批量「一步」。替换关系就在这。

下面的滑块演示 Robbins–Monro 衰减步长 tk=t0/kt_k = t_0 / \sqrt{k} 在不同初值 t0t_0 下的形状,帮助你判断「初始步太大 vs 衰减太快」的折中位置:

Formula Explorer

t0 / sqrt(k)

三、小批量:偏差—方差的折中

只取单样本,方差最大、轨迹最毛糙;取全样本,方差为零但回到原始成本。小批量 SGD 在两者之间:每步抽 BB 个样本求平均

gk=1BjBkfj(xk)g_k = \frac{1}{B}\sum_{j \in \mathcal{B}_k} \nabla f_j(x_k)

无偏性不变,方差按 1/B1/B 缩小。实践含义直接:批量 BB 翻倍,梯度噪声大致减半,于是可以把学习率 tt 也大致翻倍。这就是「线性缩放规则」(linear scaling rule)——在硬件吞吐允许的范围内把 BB 调大并同比调大 tt,单 epoch 收敛速度大致不变,但每步能并行更多样本,挂在 GPU 上的训练时间随之缩短。该规则在极小批量与目标函数曲率剧烈变化时失效,需要回到经验调参(empirical tuning)。

四、自适应家族:六种迭代规则的对照

下表把 SGD 和五个常用变体压在一起看。β1,β2\beta_1, \beta_2 是衰减系数(decay coefficients),ϵ108\epsilon \approx 10^{-8} 是数值稳定项。

方法更新核心关键超参何时拿来用
SGDxk+1=xktgkx_{k+1} = x_k - t\, g_k学习率 tt凸基线、教学对照、最终 fine-tune
动量(momentum)vk=βvk1+gkv_{k} = \beta v_{k-1} + g_kxk+1=xktvkx_{k+1} = x_k - t\, v_kβ0.9\beta \approx 0.9长峡谷地形、梯度噪声拖训练时
Nesterov 加速先按 βvk1\beta v_{k-1} 预走一步再算梯度β\beta光滑凸目标,可拿到 O(1/k2)O(1/k^2) 上界
AdaGrad累加历史平方梯度做逐坐标缩放初始 tt稀疏特征、文本类任务
RMSPropAdaGrad 的指数加权版,避免步长过早衰减β20.99\beta_2 \approx 0.99RNN 训练、曲率随训练变化时
Adam动量 + RMSProp + 偏差修正t103t \approx 10^{-3}现代深度学习默认起点

Adam 的核心写法是先维护一阶矩 mkm_k 与二阶矩 vkv_k 的指数加权,再做偏差修正:

mk=β1mk1+(1β1)gk,vk=β2vk1+(1β2)gk2,m^k=mk1β1k,v^k=vk1β2k,xk+1=xktm^kv^k+ϵ\begin{aligned} m_k &= \beta_1 m_{k-1} + (1-\beta_1)\, g_k, \\ v_k &= \beta_2 v_{k-1} + (1-\beta_2)\, g_k^{\,2}, \\ \hat m_k &= \frac{m_k}{1-\beta_1^{\,k}}, \quad \hat v_k = \frac{v_k}{1-\beta_2^{\,k}}, \\ x_{k+1} &= x_k - t\, \frac{\hat m_k}{\sqrt{\hat v_k} + \epsilon} \end{aligned}

PyTorch 与 TensorFlow 的默认实现都取 β1=0.9\beta_1 = 0.9β2=0.999\beta_2 = 0.999t=103t = 10^{-3}。一线 私募 在跑神经网络 α 模型时几乎不会先手调 SGD——Adam 是默认起点,只有当模型上线后发现泛化退化,才换回带动量的 SGD 做最后几 epoch 的微调。

五、在量化中的落点

把上面所有方法摆到一张地图:

  • ​SGD 家族占主导​​:神经网络 α 模型(沪深300 成分股深度因子学习)、上证大票池上的大规模 logistic 回归信号、新闻情感与词嵌入模型。共同特征是 N105N \ge 10^5、参数维度 p104p \ge 10^4
  • ​确定性方法仍胜出​​:低维平滑标定(Black–Scholes 隐含波动率 1-D 牛顿)、协方差矩阵(covariance matrix)的 Ledoit–Wolf 收缩参数选择、均值方差优化(mean-variance optimization, MVO)的小规模 QP——样本与参数都不大,前两课的工具更合适。
  • ​混合策略​​:先用 Adam 把神经网络训练到接近最优,再切到带动量的 SGD 做最后几 epoch;普通最小二乘(ordinary least squares, OLS)类的高维 p>np > n 信号则应进入下一课的正则化框架,而不是硬塞给 SGD。

六、练习

Exercise

你正在用 batch size B=256B = 256、学习率 t=103t = 10^{-3} 训练一个沪深300 因子神经网络,单 epoch 走约 7000 步。出于显存约束,你计划把 BB 改成 128。请回答:

  1. 按线性缩放规则,新的学习率应该取多少?说明该规则背后的偏差—方差直觉,并指出在什么情况下你会拒绝线性缩放。
  2. 写出动量法(momentum)的两行更新:给定当前 gkg_k、上一时刻 vk1v_{k-1}β=0.9\beta = 0.9t=8×104t = 8 \times 10^{-4},写出 vkv_kxk+1x_{k+1} 的表达式(保留 gkg_kvk1v_{k-1}xkx_k 不做数值化)。
提示
线性缩放规则的形式是「批量缩放因子等于学习率缩放因子」。把 BB 减半相当于把梯度噪声方差放大一倍,因此步长也应当相应减小一半,使有效信噪比不变。
提示
动量法记忆梯度的指数加权和。先写 vk=0.9vk1+gkv_k = 0.9\, v_{k-1} + g_k,再用 xk+1=xktvkx_{k+1} = x_k - t\, v_k 更新参数。代入 t=8×104t = 8 \times 10^{-4} 即可,无需化简;核对 vkv_kvk1v_{k-1} 同维。

七、通往下一课:当目标不再光滑

到这里 SGD 及其自适应家族已能处理你在私募研究台上遇到的大多数光滑目标。下一课要打破「光滑」这条假设:当你给普通最小二乘加上 L1 罚项 λβ1\lambda \|\beta\|_1,目标在 βi=0\beta_i = 0 处不可微,链式法则失效,纯梯度方法只能给出次梯度(subgradient),轨迹会卡在零附近反复抖动而不真正归零。解决方案是近端梯度法(proximal gradient method)与软阈值算子(soft-threshold operator)——它们把「梯度步 + 罚项最小化」压成一次闭式映射,让岭回归(ridge)与 Lasso 共享同一套迭代外壳。下节课会把这一机制从 OLS 推到 中证500、沪深300 上的因子动物园(factor zoo)稀疏选股问题,并把本模块四节课的工具链合拢。