Hook:周三晚上的训练日志
上海一家中等规模私募的初级量化研究员小陈,把上一课刚学会的反向传播搬到了沪深300 选股因子模型(factor model)的 alpha 预测上。模型是一个深度 5、宽度 256 的多层感知机(multi-layer perceptron, MLP),约 33 万参数,输入是 60 个标准化后的截面风格因子,标签是次日截面超额收益。她直接用 numpy.random.randn(fan_in, fan_out) 初始化权重,损失函数取均方误差,优化器是学习率 的纯随机梯度下降。跑了 20 个 epoch 后,训练损失稳稳停在 0.984——基本等于「恒输出零」的平凡基线(constant predictor)的损失。再多跑梯度范数也只是越来越接近零。她把日志发到组内 Slack:「网络在装死,backprop 我手算过没问题。」第 2 课已经把梯度 当作可计算的黑盒交给你,这一课要回答的是:从这条死掉的曲线出发,要按什么顺序加哪些模块,才能把它拉回一个有用的 alpha 模型。
一、SGD,以及它为什么带噪声
设 是第 步从训练集均匀抽出的一批(mini-batch,典型大小 32–1024),小批量随机梯度下降(stochastic gradient descent, SGD)的更新写作
是全样本梯度的无偏估计,但带有两种噪声:抽样噪声来自每步重新抽出的 ,随机梯度噪声来自批内单样本梯度的方差。在 2.5.2 模块的凸 / 强凸假设下,这两项是收敛速率的负担;但在深度网络的非凸地形上,它们反而被普遍认为是 SGD 隐式正则化(implicit regularization)的来源:经验证据表明小批量 SGD 找到的极小点比全批量梯度下降更平坦,样本外更稳定。这是「优化器即正则器」这个现代视角的第一笔证据,也是 2.6.1 凸框架里完全见不到的现象。
二、动量 SGD 与 Adam
裸 SGD 在病态曲率上会沿浅谷反复抖动,横向梯度互相抵消却跨不出去。动量 SGD(momentum SGD / heavy-ball)按系数 把过去梯度指数累计,即动量(momentum):
物理图像是球在损失曲面上滚动:窄谷里横向震荡互相抵消,纵向漂移得以累积。Adam(Kingma & Ba 2015)把这一思路推到逐参数自适应——同时维护一阶矩 与二阶矩 、做偏差校正再除以 RMS 量级:
默认参数 、、。除以 等于每个坐标按自己最近的 RMS 梯度做归一化——深度网络中不同层、不同特征的曲率常差几个数量级,Adam 的逐参数自适应正是为这种异质曲率(heterogeneous curvature)而设计。学习率本身通常再叠一层 warmup-then-cosine 调度;实务里 1cycle 是默认起点。
三、初始化:Glorot 与 He
小陈那条死曲线的真正起点不是优化器,而是 numpy.random.randn 默认输出标准正态分布(Gaussian distribution)的权重,方差恒为 1,完全不顾扇入扇出。 层线性 / tanh 网络若每层权重方差超过 ,前向激活每过一层方差翻倍, 层下来就是 倍梯度爆炸;反之缩到接近零,反向梯度同步消失。Glorot & Bengio (2010) 在前向 + 反向同时保持方差近似不变的对称约束下,推出
ReLU 把一半输出强制归零,等效方差减半,需要把分子翻倍补偿——He et al. (2015) 的何恺明 / Kaiming 初始化对应
把 He 初始化代回去重启,小陈的 5 层网络立刻能学,只是收敛仍然很慢。
四、批量归一化与 Dropout
提速需要解决「层输入分布随训练漂移」的问题。批量归一化(batch normalization, BN; Ioffe & Szegedy 2015)先按 mini-batch 对每个特征做标准化,再叠一层可学仿射:
BN 把层输入均值方差钉在 附近,允许学习率从 0.01 提到 0.1,并因批统计本身的抖动顺带做轻度噪声正则。加上 BN 之后,小陈的训练时间被压缩到原来的五分之一。
样本外的差距还得靠最后一步。Dropout(Srivastava et al. 2014)训练时按 Bernoulli 概率随机把隐藏单元乘 0,推理时再把激活乘 反向缩放以保持期望不变:
可以把它看作在指数级多的子网络上做近似贝叶斯模型平均。配合权重衰减(weight decay,即对参数加 L2 罚,等价于高斯先验下的 MAP——2.6.1-4 已推),你就拿到了完整工具箱:权重衰减、Dropout 是显式正则化,SGD 噪声、早停(early stopping)是隐式正则化,两类共同决定有效假设类的容量。AdamW(Loshchilov & Hutter 2019)把权重衰减从损失项抽出来直接作用在参数上,是为自适应优化器修正的版本——目前是 CN LLM 训练(Qwen / DeepSeek / Baichuan / GLM)的事实标准。
五、一张图看模块的边际贡献
把四条训练曲线叠在同一张纵轴(样本外 )上:
每加一个模块,边际贡献都看得见:He 初始化把网络从「装死」拉到能学;BN 让 抬一个量级;AdamW 处理逐层曲率异质;Dropout + 权重衰减把样本内 / 样本外 的差距从 0.05 收到 0.01。改变权重衰减强度 时,有效容量随之收缩,与 2.6.1-2 偏差-方差曲线的 U 形完全一致。拖动下面的滑块看收缩因子如何随 从 1 衰到 0:
Formula Explorer
1 / (1 + lambda)六、把 Adam 跑一步
Exercise
设某权重 当前值 ,Adam 状态 、,本步 mini-batch 梯度 ,。取默认 、、、。
- 算出更新后的一阶矩 、二阶矩 。
- 做偏差校正得到 、。
- 写出 的数值,保留三位有效数字。
提示
提示
七、通往下一课
到这里,小陈的沪深300 5 层 MLP 已经能在 50 个 epoch 内收敛,样本外 也站得住——「优化器即正则器」这条现代经验法则在她的工作流里第一次落地。但 MLP 把每个输入维度都视作彼此对称的扁平特征,对结构化数据这是浪费:行情图像有平移对称,日内分钟序列有时间递推。下一课把「加正确的归纳偏置(inductive bias)」当作下一档容量控制工具,引入 CNN(局部 + 权重共享)、RNN / LSTM(时间递推 + 门控)与 Transformer(内容路由的全连接自注意力),让有效假设类在不损失表达力的前提下进一步收紧。