钩子:当一次完整梯度要四个小时
某上海百亿私募的研究员准备把一套基于沪深300 成分股的多因子神经网络 α 信号搬上生产。训练集是过去 5 年的日频面板:约 180 万行样本 × 300 只成分股 × 80 个特征。前两课的工具一一被排除——海森矩阵(Hessian matrix, )装不进显存,L-BFGS 一次方向计算也要把整批数据过一遍。退到最朴素的全批量梯度下降(full-batch gradient descent):单步反向传播要约 4 小时,跑 1000 步等于让 GPU 工位空转半年。她改用批量大小(batch size) 的随机梯度下降(stochastic gradient descent, SGD),同一台机器一夜跑完,模型周一开盘前就能挂到 SSE 上证的实盘信号管线上。这一课要把这种「放弃精确梯度反而更快」的现象讲清楚。
一、从有限和目标到无偏估计
把训练目标写成有限和(finite sum):
其中 是第 个样本上的损失(loss)。完整梯度 一次要把全部 个样本过一遍反向传播; 上到百万量级,单步成本就不可接受。
关键观察很短:随机抽一个样本 ,把 当作 的无偏估计(unbiased estimator),因为
代价是把方差从零拔到 。SGD 更新写法与第一课的梯度下降完全一致:
差别在 已经是一个含噪向量(noisy vector),不再是确定性下降方向;轨迹会在最优解周围抖动,需要靠步长(learning rate) 衰减把噪声压下去。
二、收敛率:用 换
在凸性(convexity)与 Robbins–Monro 步长(、,经典选择 ;注意 不满足平方可和,对应另一种 凸收敛率分析)假设下,SGD 对轨迹平均 满足
在强凸(strongly convex)目标加上合适的步长衰减后,速率提升到 。对比第一课的确定性结论——凸 -光滑下 、强凸下线性收敛——SGD「每一步」上更慢;但单步只用 而非 的梯度评估,一个 epoch(一遍扫完全集)能走 步 SGD,相当于全批量「一步」。替换关系就在这。
下面的滑块演示 Robbins–Monro 衰减步长 在不同初值 下的形状,帮助你判断「初始步太大 vs 衰减太快」的折中位置:
Formula Explorer
t0 / sqrt(k)三、小批量:偏差—方差的折中
只取单样本,方差最大、轨迹最毛糙;取全样本,方差为零但回到原始成本。小批量 SGD 在两者之间:每步抽 个样本求平均
无偏性不变,方差按 缩小。实践含义直接:批量 翻倍,梯度噪声大致减半,于是可以把学习率 也大致翻倍。这就是「线性缩放规则」(linear scaling rule)——在硬件吞吐允许的范围内把 调大并同比调大 ,单 epoch 收敛速度大致不变,但每步能并行更多样本,挂在 GPU 上的训练时间随之缩短。该规则在极小批量与目标函数曲率剧烈变化时失效,需要回到经验调参(empirical tuning)。
四、自适应家族:六种迭代规则的对照
下表把 SGD 和五个常用变体压在一起看。 是衰减系数(decay coefficients), 是数值稳定项。
| 方法 | 更新核心 | 关键超参 | 何时拿来用 |
|---|---|---|---|
| SGD | 学习率 | 凸基线、教学对照、最终 fine-tune | |
| 动量(momentum) | ; | 长峡谷地形、梯度噪声拖训练时 | |
| Nesterov 加速 | 先按 预走一步再算梯度 | 光滑凸目标,可拿到 上界 | |
| AdaGrad | 累加历史平方梯度做逐坐标缩放 | 初始 | 稀疏特征、文本类任务 |
| RMSProp | AdaGrad 的指数加权版,避免步长过早衰减 | RNN 训练、曲率随训练变化时 | |
| Adam | 动量 + RMSProp + 偏差修正 | 现代深度学习默认起点 |
Adam 的核心写法是先维护一阶矩 与二阶矩 的指数加权,再做偏差修正:
PyTorch 与 TensorFlow 的默认实现都取 、、。一线 私募 在跑神经网络 α 模型时几乎不会先手调 SGD——Adam 是默认起点,只有当模型上线后发现泛化退化,才换回带动量的 SGD 做最后几 epoch 的微调。
五、在量化中的落点
把上面所有方法摆到一张地图:
- SGD 家族占主导:神经网络 α 模型(沪深300 成分股深度因子学习)、上证大票池上的大规模 logistic 回归信号、新闻情感与词嵌入模型。共同特征是 、参数维度 。
- 确定性方法仍胜出:低维平滑标定(Black–Scholes 隐含波动率 1-D 牛顿)、协方差矩阵(covariance matrix)的 Ledoit–Wolf 收缩参数选择、均值方差优化(mean-variance optimization, MVO)的小规模 QP——样本与参数都不大,前两课的工具更合适。
- 混合策略:先用 Adam 把神经网络训练到接近最优,再切到带动量的 SGD 做最后几 epoch;普通最小二乘(ordinary least squares, OLS)类的高维 信号则应进入下一课的正则化框架,而不是硬塞给 SGD。
六、练习
Exercise
你正在用 batch size 、学习率 训练一个沪深300 因子神经网络,单 epoch 走约 7000 步。出于显存约束,你计划把 改成 128。请回答:
- 按线性缩放规则,新的学习率应该取多少?说明该规则背后的偏差—方差直觉,并指出在什么情况下你会拒绝线性缩放。
- 写出动量法(momentum)的两行更新:给定当前 、上一时刻 、、,写出 与 的表达式(保留 、、 不做数值化)。
提示
提示
七、通往下一课:当目标不再光滑
到这里 SGD 及其自适应家族已能处理你在私募研究台上遇到的大多数光滑目标。下一课要打破「光滑」这条假设:当你给普通最小二乘加上 L1 罚项 ,目标在 处不可微,链式法则失效,纯梯度方法只能给出次梯度(subgradient),轨迹会卡在零附近反复抖动而不真正归零。解决方案是近端梯度法(proximal gradient method)与软阈值算子(soft-threshold operator)——它们把「梯度步 + 罚项最小化」压成一次闭式映射,让岭回归(ridge)与 Lasso 共享同一套迭代外壳。下节课会把这一机制从 OLS 推到 中证500、沪深300 上的因子动物园(factor zoo)稀疏选股问题,并把本模块四节课的工具链合拢。