一、开场:从艺术走向科学
1.1 本章的动机
从很多人的训练习惯看,深度学习常常像”艺术大于科学”。但今天我想把这些方法凑成一个体系,让知道它们到底在解决什么问题。
1.2 深度训练的本质
深度网络训练本质上是一个高维、非凸优化问题(high-dimensional non-convex optimization):
- 非凸意味着局部极小值、鞍点、平坦区都会出现。
- 非线性层叠让梯度传播、曲面几何、参数耦合变得复杂。
把训练技巧统一归到几类:优化算法、数据预处理、规范化、参数初始化、正则化。核心观点是:很多看起来五花八门的方法,本质上都在处理同几类困难。
二、优化算法:从 SGD 到 AdamW、Muon
2.1 随机梯度下降(Stochastic Gradient Descent, SGD)
SGD 是所有优化器的 baseline。建议训练一个新模型时,最好先用 SGD 跑一遍,看看最朴素方法能到哪里,再谈更复杂的优化器。
设目标函数为 $L(\theta)$,mini-batch 梯度为 $g_t=\nabla_\theta L_t(\theta_t)$,则 SGD 更新为:
\[\theta_{t+1}=\theta_t-\eta_t g_t\]几个关键经验:
- 小 batch 有噪声,但噪声不一定是坏事。它有助于摆脱鞍点。
- batch 越大,梯度估计越稳定,学习率通常也可以更大。
- 学习率必须退火。训练后期如果学习率还很大,参数会在噪声主导下随机游走。
2.2 动量法(Momentum)
SGD 的一个问题是:如果某个方向上梯度长期一致,单步更新太慢;如果曲面狭长,更新又会左右抖动。于是引入动量:
\[v_t=\beta v_{t-1}+(1-\beta)g_t,\qquad \theta_{t+1}=\theta_t-\eta v_t\]从物理直觉来看:历史梯度相当于”速度”,当前梯度像”力”,长期一致的方向会不断累积惯性,因此:
- 可以更快穿过平坦区;
- 可以跨过一些小坑洼;
- 对高曲率方向的来回震荡会被抑制。
比喻:带动量的优化像石头下山,惯性足够时,不会被一路上的小坑全都卡住。
2.3 AdaGrad 与 RMSProp
不同参数的历史梯度尺度差异很大,因此它们不该共享完全相同的学习率。
AdaGrad 的基本思路是:对每个参数分别统计历史梯度平方和:
\[G_t = \sum_{\tau=1}^t g_\tau^2\]更新变为:
\[\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{G_t+\varepsilon}}\,g_t\]这意味着:
- 历史上梯度大的参数,后面更新要保守;
- 历史上几乎没怎么更新的参数,后面可以走大一点。
但 AdaGrad 的问题也很明显:$G_t$ 单调增长,后期分母越来越大,学习率会衰减得过头,最后几乎训不动。
于是 RMSProp 用指数滑动平均替代简单累加:
\[s_t=\rho s_{t-1}+(1-\rho)g_t^2\] \[\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{s_t+\varepsilon}}\,g_t\]这样模型更关注最近阶段的梯度尺度,而不是把很久以前的历史无限累加进去。
2.4 Adam:动量与自适应学习率的结合
可以认为:Momentum 关注的是梯度方向的长期趋势,RMSProp 关注的是梯度幅值的长期尺度,那最自然的想法就是把两者叠起来,于是得到 Adam:
\[m_t=\beta_1 m_{t-1}+(1-\beta_1)g_t\] \[v_t=\beta_2 v_{t-1}+(1-\beta_2)g_t^2\]再做偏置修正:
\[\hat m_t=\frac{m_t}{1-\beta_1^t},\qquad \hat v_t=\frac{v_t}{1-\beta_2^t}\]最终更新:
\[\theta_{t+1}=\theta_t-\eta \frac{\hat m_t}{\sqrt{\hat v_t}+\varepsilon}\]Adam 的优点是启动快、调参相对省心,因此在深度学习框架里非常常见。
2.5 AdamW:把权重衰减从 Adam 里解耦
一个很容易被忽略的点:L2 正则项直接塞进 Adam 的目标函数里,并不等价于我们直觉里的 weight decay。
因为 Adam 会用 $\sqrt{\hat v_t}$ 去缩放梯度,如果把 L2 正则也混在梯度里,那么不同参数受到的衰减强度会被这种自适应缩放一起改变,结果很反直觉:
- 调整得最剧烈的参数,衰减反而可能被弱化;
- 原本就很小、几乎没更新过的参数,反而被额外压得更狠。
于是 AdamW 的核心思想就是:把”梯度更新”和”参数衰减”分开做。
\[\theta_{t+1}=\theta_t-\eta \frac{\hat m_t}{\sqrt{\hat v_t}+\varepsilon}-\eta\lambda\theta_t\]第一项交给 Adam,第二项单独做 weight decay。认为这是一种非常好的模块化思想。
2.6 Muon:对矩阵更新做正交化
一种更近的思路是Muon。它不是再去发明一套全新动量公式,而是针对矩阵型权重的更新方向做正交化处理,希望让更新方向更有效率、更稳定。
提到它会用类似 Newton-Schulz 的迭代近似去求更新矩阵的正交化版本,本质直觉是:
- 很多有效的更新方向应该尽量彼此独立、彼此正交;
- 对矩阵更新做正交化,有助于减少不同方向之间的无谓耦合。
总结:从 SGD 到 AdamW、Muon,看起来招数很多,但本质上无非是在解决两件事:方向怎么更准,步子怎么更稳。
三、海森矩阵、病态问题与数据预处理
3.1 什么叫病态问题
需要理解病态问题(ill-conditioned problem)。直观上,如果损失曲面像一个非常狭长的峡谷,那么:
- 某些方向曲率特别大;
- 某些方向曲率特别小;
- 梯度下降会在陡峭方向来回震荡,在平缓方向推进很慢。
影响优化难度的关键量是海森矩阵 $H$ 的特征值分布。通常用条件数(condition number)衡量:
\[\kappa(H)=\frac{\lambda_{\max}(H)}{\lambda_{\min}(H)}\]条件数越大,问题越病态,优化越困难。
3.2 为什么数据预处理能改善优化
从线性模型切入,说明在不少情况下,输入数据协方差矩阵的几何结构会直接反映到优化曲面的海森矩阵上。换句话说:
- 数据分布拉得越歪,优化曲面越容易狭长;
- 数据预处理做得越好,条件数越可能下降。
3.3 白化(Whitening)与标准化(Standardization)
最彻底的预处理是白化(Whitening)。若输入协方差矩阵为
\[\Sigma = U\Lambda U^\top\]则白化变换可以写成:
\[z=\Lambda^{-1/2}U^\top(x-\mu)\]理想情况下,变换后满足:
\[\operatorname{Cov}(z)=I\]白化的几何意义是把椭圆状分布拉成球形,使梯度更直接地指向最优点。
相比之下,标准化(standardization)更简单:
\[z=\frac{x-\mu}{\sigma}\]它只做按维度减均值、除标准差,不消除维度间相关性,所以没有白化那么彻底,但速度快、代价小、通常已经足够实用。
建议:做数据预处理时,标准化几乎是无脑该开的默认项;白化更强,但成本也更高。
四、规范化方法:BN 与 LN
4.1 为什么还要在网络内部做规范化
即使输入做过预处理,深层网络内部每一层的表示分布仍然会不断漂移。把这种现象称为内部协方差偏移(internal covariate shift)。其后果是:后层一直在适应前层分布变化,优化更加困难。
4.2 批量归一化(Batch Normalization, BN)
BN 的做法是:对一个 mini-batch 内、同一特征维度的激活做标准化:
\[\hat x = \frac{x-\mu_B}{\sqrt{\sigma_B^2+\varepsilon}}\]再加上可学习的缩放和平移:
\[y=\gamma \hat x+\beta\]BN 的作用:
- 稳定中间层分布;
- 降低后续优化问题的条件数;
- 允许更大学习率;
- 具备一点正则化效果。
4.3 层归一化(Layer Normalization, LN)
与 BN 不同,LN 是对单个样本内部的特征维度做归一化,而不是跨样本统计。因此:
- BN 更适合卷积网络、大 batch 训练;
- LN 更适合 batch 小、序列长、Transformer 这类场景。
4.4 规范化的位置与注意事项
注意:规范化不是想放哪就放哪。尤其配合 ReLU 时,如果先把激活截断,再做标准化,标准化又可能重新引入负值,破坏原本想要的非线性形状。因此实践上通常会把归一化放在更合适的线性变换之后、非线性之前或配合预激活结构使用。
五、参数初始化:让信息前传后传都顺畅
5.1 初始化的两个目标
参数初始化并不是”随机填一下”。它至少要满足两个条件:
- 打破对称性:同一层参数不能全设成一样,否则所有神经元学到完全相同的东西。
- 保持信号尺度稳定:前向传播不能层层放大/缩小,反向传播也不能层层炸掉/消失。
总结:通俗地说,好的初始化就是让前向和反向的信息流都尽量畅通无阻。
5.2 Xavier 初始化(Xavier Initialization)
针对 sigmoid/tanh 一类相对对称的激活函数,经典做法是让权重方差与输入、输出维度共同匹配,例如:
\[\operatorname{Var}(W)=\frac{2}{\text{fan\_in}+\text{fan\_out}}\]或者使用对应的均匀分布版本。
它的目标是尽量让每层输出方差与输入方差处于同一量级。
5.3 Kaiming 初始化(Kaiming Initialization)
对于 ReLU,由于负半轴被截断,激活会天然丢掉一半能量,因此需要更大的初始方差补偿:
\[\operatorname{Var}(W)=\frac{2}{\text{fan\_in}}\]这就是 Kaiming 初始化的核心直觉。建议:如果你用 ReLU,默认就该想到 Kaiming 初始化。
5.4 正交初始化(Orthogonal Initialization)
可以认为:Xavier 和 Kaiming 往往是按元素独立采样,但矩阵整体未必”几何上健康”。如果矩阵各方向不是正交的,就可能导致不同方向范数变化不一致,破坏稳定性。
正交初始化的思路是:先随机得到一个矩阵,再通过 QR/SVD 等方式取其正交部分,使得
\[W^\top W \approx I \quad \text{或} \quad WW^\top \approx I\]其直觉是:线性变换尽量保持向量长度和方向独立性。
5.5 偏置的初始化
偏置项通常初始化为 0 或一个很小的正数。提到,如果结合 ReLU,有时偏置设成一个小正数会更友好,因为它能减少一开始神经元大量落在完全失活区的概率。
六、正则化:控制复杂度与训练稳定性
6.1 L1/L2 与权重衰减
经典正则项回顾:
\[L_{\text{total}} = L_{\text{task}} + \lambda \|\theta\|_2^2\]L2 正则鼓励参数别长得太大,本质上是在控制模型复杂度、防止过拟合。同时需要注意:在现代框架里,如果你用的是 Adam 类优化器,通常更推荐直接使用 AdamW 风格的 decoupled weight decay。
6.2 梯度裁剪(Gradient Clipping)
训练过程中,某些局部区域曲率会非常陡,导致某一步梯度异常大,从而把参数直接打飞。梯度裁剪就是在这种情况下保护训练稳定性。
常见两类方法:
- 按分量截断:把每个梯度分量裁到区间 $[a,b]$。
- 按范数裁剪:若 $|g|_2 > \tau$,则缩放为
通常更推荐按范数裁剪,因为它尽量保持原来的更新方向不变。
关键:梯度裁剪基本上是该开的。很多训练炸掉,并不是模型不行,而是某一步异常梯度把整个优化轨迹带偏了。
6.3 随机失活(Dropout)
Dropout 的做法是在训练时以一定概率屏蔽非输出层神经元,相当于让模型在不同子网络之间共享参数。它能减少神经元共适应,提升泛化。
6.4 早停(Early Stopping)
训练并不是跑满最大 epoch 就最好。早停的做法是:
- 划出验证集;
- 持续监控验证指标或验证损失;
- 一旦长期不再改善,就提前终止训练。
这本质上也是正则化,因为它防止模型在训练集上继续记忆噪声。
6.5 数据增强(Data Augmentation)
定义如下:数据增强不是凭空造样本,而是在保持语义不变的前提下,对现有样本做扰动、变换或加噪声。
图像里常见的增强包括:
- 旋转、翻转、平移、缩放;
- 噪声扰动;
- 亮度、对比度变化。
它本质上是在向模型注入一种不变性先验:这些变化不应该改变标签。
6.6 标签平滑(Label Smoothing)与知识蒸馏(Knowledge Distillation)
可以认为:one-hot 标签配交叉熵很容易让模型过度自信。标签平滑的做法是把原本 0/1 的标签,改成带少量概率质量的软标签。例如对 $K$ 分类问题:
- 正类从 $1$ 变成 $1-\alpha$;
- 其余类分配 $\alpha/(K-1)$。
这能缓解模型的 over-confidence,也能对标注错误更鲁棒。
进一步地,更强的”软标签”来源其实是蒸馏:用大模型输出的概率分布去训练小模型。因为教师模型给出的不是生硬的 0/1,而是类别间更丰富的相似度信息。
6.7 多任务学习(Multi-task Learning)
如果多个任务之间能相互促进,那么共享表示、联合训练本身就是一种正则化。原因在于多个目标会互相牵制,防止模型为某一个单独任务过度拟合。但这也带来新的超参数问题:不同任务损失怎么加权。
七、本章的实用结论
7.1 推荐的默认训练思路
综合整节课,实践导向如下:
- 先用 SGD 跑 baseline,看最基础性能。
- 数据预处理优先做标准化,必要时再考虑更强的白化。
- 用 ReLU 时优先考虑 Kaiming 初始化。
- 网络内部根据架构选择 BN/LN。
- 默认使用 AdamW 一类成熟优化器。
- 训练时打开梯度裁剪、合理正则、验证集监控。
- 图像任务数据增强是标准操作;小模型场景蒸馏值得重点考虑。
7.2 本章核心主线
核心思路是:这些方法虽然名字很多,但底层逻辑高度统一:
- 优化算法在解决”方向怎么更准、步子怎么更稳”;
- 预处理与规范化在解决”曲面几何太差、条件数太大”;
- 初始化在解决”信息能不能顺畅传播”;
- 正则化在解决”模型会不会过度拟合、训练会不会不稳定”。
核心观点:只要把这四类问题想清楚,深度网络训练就不再是玄学,而是可以分析、可以解释、可以系统设计的工程问题。