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

深度网络的训练:优化与正则化

2.6.3 · 神经网络 · 数学与统计能力

Hook:周三晚上的训练日志

上海一家中等规模私募的初级量化研究员小陈,把上一课刚学会的反向传播搬到了沪深300 选股因子模型(factor model)的 alpha 预测上。模型是一个深度 5、宽度 256 的多层感知机(multi-layer perceptron, MLP),约 33 万参数,输入是 60 个标准化后的截面风格因子,标签是次日截面超额收益。她直接用 numpy.random.randn(fan_in, fan_out) 初始化权重,损失函数取均方误差,优化器是学习率 η=0.01\eta = 0.01 的纯随机梯度下降。跑了 20 个 epoch 后,训练损失稳稳停在 0.984——基本等于「恒输出零」的平凡基线(constant predictor)的损失。再多跑梯度范数也只是越来越接近零。她把日志发到组内 Slack:「网络在装死,backprop 我手算过没问题。」第 2 课已经把梯度 gt=θLg_t = \nabla_\theta L 当作可计算的黑盒交给你,这一课要回答的是:从这条死掉的曲线出发,要按什么顺序加哪些模块,才能把它拉回一个有用的 alpha 模型。

一、SGD,以及它为什么带噪声

Bt\mathcal{B}_t 是第 tt 步从训练集均匀抽出的一批(mini-batch,典型大小 32–1024),小批量随机梯度下降(stochastic gradient descent, SGD)的更新写作

θt+1=θtηtgt,gt=θL(θt;Bt).\theta_{t+1} = \theta_t - \eta_t\, g_t, \qquad g_t = \nabla_\theta L(\theta_t; \mathcal{B}_t).

gtg_t 是全样本梯度的无偏估计,但带有两种噪声:​​抽样噪声​​来自每步重新抽出的 Bt\mathcal{B}_t,​​随机梯度噪声​​来自批内单样本梯度的方差。在 2.5.2 模块的凸 / 强凸假设下,这两项是收敛速率的负担;但在深度网络的非凸地形上,它们反而被普遍认为是 SGD ​隐式正则化​​(implicit regularization)的来源:经验证据表明小批量 SGD 找到的极小点比全批量梯度下降更平坦,样本外更稳定。这是「优化器即正则器」这个现代视角的第一笔证据,也是 2.6.1 凸框架里完全见不到的现象。

二、动量 SGD 与 Adam

裸 SGD 在病态曲率上会沿浅谷反复抖动,横向梯度互相抵消却跨不出去。动量 SGD(momentum SGD / heavy-ball)按系数 μ0.9\mu \approx 0.9 把过去梯度指数累计,即动量(momentum):

vt+1=μvt+gt,θt+1=θtηvt+1.v_{t+1} = \mu v_t + g_t, \qquad \theta_{t+1} = \theta_t - \eta\, v_{t+1}.

物理图像是球在损失曲面上滚动:窄谷里横向震荡互相抵消,纵向漂移得以累积。Adam(Kingma & Ba 2015)把这一思路推到逐参数自适应——同时维护一阶矩 mtm_t 与二阶矩 vtv_t、做偏差校正再除以 RMS 量级:

mt=β1mt1+(1β1)gt,vt=β2vt1+(1β2)gt2,m^t=mt/(1β1t),v^t=vt/(1β2t),θt+1=θtηm^t/(v^t+ϵ).\begin{aligned} m_t &= \beta_1 m_{t-1} + (1 - \beta_1) g_t, & v_t &= \beta_2 v_{t-1} + (1 - \beta_2)\, g_t^{\odot 2}, \\ \hat m_t &= m_t / (1 - \beta_1^t), & \hat v_t &= v_t / (1 - \beta_2^t), \\ \theta_{t+1} &= \theta_t - \eta\, \hat m_t / (\sqrt{\hat v_t} + \epsilon). \end{aligned}

默认参数 β1=0.9\beta_1 = 0.9β2=0.999\beta_2 = 0.999ϵ=108\epsilon = 10^{-8}。除以 v^t\sqrt{\hat v_t} 等于每个坐标按自己最近的 RMS 梯度做归一化——深度网络中不同层、不同特征的曲率常差几个数量级,Adam 的逐参数自适应正是为这种异质曲率(heterogeneous curvature)而设计。学习率本身通常再叠一层 warmup-then-cosine 调度;实务里 1cycle 是默认起点。

三、初始化:Glorot 与 He

小陈那条死曲线的真正起点不是优化器,而是 numpy.random.randn 默认输出标准正态分布(Gaussian distribution)的权重,方差恒为 1,完全不顾扇入扇出。LL 层线性 / tanh 网络若每层权重方差超过 1/nin1/n_\text{in},前向激活每过一层方差翻倍,LL 层下来就是 2L2^L 倍​​梯度爆炸​​;反之缩到接近零,反向梯度同步​​消失​​。Glorot & Bengio (2010) 在前向 + 反向同时保持方差近似不变的对称约束下,推出

Var(Wij(l))=2nin+nout.\mathrm{Var}(W^{(l)}_{ij}) = \frac{2}{n_\text{in} + n_\text{out}}.

ReLU 把一半输出强制归零,等效方差减半,需要把分子翻倍补偿——He et al. (2015) 的何恺明 / Kaiming 初始化对应

Var(Wij(l))=2nin.\mathrm{Var}(W^{(l)}_{ij}) = \frac{2}{n_\text{in}}.

把 He 初始化代回去重启,小陈的 5 层网络立刻能学,只是收敛仍然很慢。

四、批量归一化与 Dropout

提速需要解决「层输入分布随训练漂移」的问题。批量归一化(batch normalization, BN; Ioffe & Szegedy 2015)先按 mini-batch 对每个特征做标准化,再叠一层可学仿射:

x^i=(xiμB)/σB2+ϵ,yi=γx^i+β.\hat x_i = (x_i - \mu_\mathcal{B}) / \sqrt{\sigma_\mathcal{B}^2 + \epsilon}, \qquad y_i = \gamma \hat x_i + \beta.

BN 把层输入均值方差钉在 (0,1)(0, 1) 附近,允许学习率从 0.01 提到 0.1,并因批统计本身的抖动顺带做轻度噪声正则。加上 BN 之后,小陈的训练时间被压缩到原来的五分之一。

样本外的差距还得靠最后一步。Dropout(Srivastava et al. 2014)训练时按 Bernoulli 概率随机把隐藏单元乘 0,推理时再把激活乘 1/(1p)1/(1-p) 反向缩放以保持期望不变:

a~i=riai/(1p),riBernoulli(1p).\tilde a_i = r_i a_i / (1 - p), \qquad r_i \sim \mathrm{Bernoulli}(1 - p).

可以把它看作在指数级多的子网络上做近似贝叶斯模型平均。配合权重衰减(weight decay,即对参数加 L2 罚,等价于高斯先验下的 MAP——2.6.1-4 已推),你就拿到了完整工具箱:权重衰减、Dropout 是​​显式正则化​​,SGD 噪声、早停(early stopping)是​​隐式正则化​​,两类共同决定有效假设类的容量。AdamW(Loshchilov & Hutter 2019)把权重衰减从损失项抽出来直接作用在参数上,是为自适应优化器修正的版本——目前是 CN LLM 训练(Qwen / DeepSeek / Baichuan / GLM)的事实标准。

五、一张图看模块的边际贡献

把四条训练曲线叠在同一张纵轴(样本外 R2R^2)上:

每加一个模块,边际贡献都看得见:He 初始化把网络从「装死」拉到能学;BN 让 η\eta 抬一个量级;AdamW 处理逐层曲率异质;Dropout + 权重衰减把样本内 / 样本外 R2R^2 的差距从 0.05 收到 0.01。改变权重衰减强度 λ\lambda 时,有效容量随之收缩,与 2.6.1-2 偏差-方差曲线的 U 形完全一致。拖动下面的滑块看收缩因子如何随 λ\lambda 从 1 衰到 0:

Formula Explorer

1 / (1 + lambda)

六、把 Adam 跑一步

Exercise

设某权重 θ\theta 当前值 θ0=0.500\theta_0 = 0.500,Adam 状态 mt1=0.020m_{t-1} = 0.020vt1=0.0040v_{t-1} = 0.0040,本步 mini-batch 梯度 gt=0.100g_t = 0.100,t=10t = 10。取默认 β1=0.9\beta_1 = 0.9β2=0.999\beta_2 = 0.999ϵ=108\epsilon = 10^{-8}η=0.001\eta = 0.001

  1. 算出更新后的一阶矩 mtm_t、二阶矩 vtv_t
  2. 做偏差校正得到 m^t\hat m_tv^t\hat v_t
  3. 写出 θt+1\theta_{t+1} 的数值,保留三位有效数字。
提示
直接把数字代进 mt=0.90.020+0.10.100m_t = 0.9 \cdot 0.020 + 0.1 \cdot 0.100vt=0.9990.0040+0.0010.1002v_t = 0.999 \cdot 0.0040 + 0.001 \cdot 0.100^2。算到三位有效数字即可,不必带单位。
提示
偏差校正用 m^t=mt/(10.910)\hat m_t = m_t / (1 - 0.9^{10})v^t=vt/(10.99910)\hat v_t = v_t / (1 - 0.999^{10}),0.9100.3490.9^{10} \approx 0.349,0.999100.9900.999^{10} \approx 0.990。最后代入 θt+1=θ00.001m^t/(v^t+108)\theta_{t+1} = \theta_0 - 0.001 \cdot \hat m_t / (\sqrt{\hat v_t} + 10^{-8}),结果应落在 θ00.001\theta_0 - 0.001 附近。

七、通往下一课

到这里,小陈的沪深300 5 层 MLP 已经能在 50 个 epoch 内收敛,样本外 R2R^2 也站得住——「优化器即正则器」这条现代经验法则在她的工作流里第一次落地。但 MLP 把每个输入维度都视作彼此对称的扁平特征,对​​结构化数据​​这是浪费:行情图像有平移对称,日内分钟序列有时间递推。下一课把「加正确的归纳偏置(inductive bias)」当作下一档容量控制工具,引入 CNN(局部 + 权重共享)、RNN / LSTM(时间递推 + 门控)与 Transformer(内容路由的全连接自注意力),让有效假设类在不损失表达力的前提下进一步收紧。