大模型教我成为大模型算法工程师之day8: 优化器与训练技巧
本文系统介绍了深度学习模型训练中的优化器演进与关键技术。从基础SGD到Momentum、Adam/AdamW优化器的原理对比,解析了学习率调度策略(Warmup和余弦退火)的重要性。深入讲解了归一化技术(BN/LN/RMSNorm)的作用机制及适用场景,并阐述了Dropout、Weight Decay等正则化方法的原理。文章通过形象类比和代码示例,帮助读者理解这些"炼丹"技巧如
Day 8: 优化器与训练技巧
摘要:设计好了神经网络架构只是第一步,如何让它“学”好则是另一个关键挑战。本文深入探讨深度学习中的优化器演进(从SGD到AdamW)、学习率调度策略、关键的归一化技术(BN、LN、RMSNorm)以及防止过拟合的正则化手段。
1. 优化器 (Optimizers)
优化器的作用是根据计算出的梯度来更新模型的权重,以最小化损失函数。
1.1 SGD 与 Momentum
SGD (Stochastic Gradient Descent) 是最基础的优化算法,每次只随机抽取一部分样本(Batch)计算梯度并更新。
θ t + 1 = θ t − η ⋅ ∇ J ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla J(\theta_t) θt+1=θt−η⋅∇J(θt)
其中 η \eta η 是学习率。
通俗解释:梯度震荡
想象你在滑雪下山,地形是一个狭长的峡谷,左右坡度很陡,但沿着峡谷向下的坡度很缓。
- SGD的困境:你站在峡谷一侧,SGD只看脚下,觉得“左边好陡”,于是用力向右冲;冲到对面后又觉得“右边好陡”,于是用力向左冲。结果就是你在峡谷两壁之间来回“剧烈横跳”(震荡),大部分力气花在左右移动上,沿着峡谷向下前进的速度反而很慢。
- Momentum的作用:引入“动量”模拟惯性。当你左右横跳时,惯性会抵消一部分横向的力,保留更多纵向(沿峡谷走向)的速度,让你能平滑地滑向谷底。
Momentum (动量):为了解决SGD在由于梯度方向震荡导致收敛慢的问题,引入了“动量”概念,模拟物理中的惯性。
v t + 1 = γ v t + η ∇ J ( θ t ) v_{t+1} = \gamma v_t + \eta \nabla J(\theta_t) vt+1=γvt+η∇J(θt)
θ t + 1 = θ t − v t + 1 \theta_{t+1} = \theta_t - v_{t+1} θt+1=θt−vt+1
动量项 γ \gamma γ 通常设为 0.9。
1.2 Adam (Adaptive Moment Estimation)
Adam 结合了 Momentum (一阶动量) 和 RMSProp (二阶动量/自适应学习率) 的优点。它为每个参数计算独立的自适应学习率。
- 一阶动量 (均值): m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t mt=β1mt−1+(1−β1)gt
- 二阶动量 (方差): v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2
- 偏差修正: m ^ t = m t / ( 1 − β 1 t ) \hat{m}_t = m_t / (1-\beta_1^t) m^t=mt/(1−β1t), v ^ t = v t / ( 1 − β 2 t ) \hat{v}_t = v_t / (1-\beta_2^t) v^t=vt/(1−β2t)
- 更新: θ t + 1 = θ t − η m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−ηv^t+ϵm^t
1.3 AdamW
AdamW 是目前大模型训练的主流选择。它解决了 Adam 中权重衰减(L2正则)实现不正确的问题。在 AdamW 中,权重衰减(Weight Decay)直接应用于权重更新步骤,而不是混入梯度计算中,从而实现了与学习率的解耦。
💻 代码实践:PyTorch优化器选择
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(10, 2)
# 1. SGD with Momentum
optimizer_sgd = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 2. Adam
optimizer_adam = optim.Adam(model.parameters(), lr=0.001)
# 3. AdamW (推荐用于Transformer/大模型)
optimizer_adamw = optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
2. 学习率调度 (Learning Rate Schedulers)
恒定的学习率往往无法达到最优解。通常策略是:前期Warmup(预热)以稳定梯度,后期Decay(衰减)以精细收敛。
2.1 Warmup
在训练初期,由于梯度变化剧烈,使用较大的学习率容易导致模型不稳定。Warmup 策略是在最初的几步(如前5% steps)将学习率从 0 线性增加到预设的最大值。
2.2 Cosine Annealing (余弦退火)
学习率随训练步数按余弦函数曲线下降。相比于阶梯式下降(Step Decay),余弦退火更加平滑,且往往能获得更好的泛化能力。
💻 代码实践:Scheduler
from transformers import get_cosine_schedule_with_warmup
# 假设总步数为 1000,预热步数为 100
optimizer = optim.AdamW(model.parameters(), lr=1e-3)
scheduler = get_cosine_schedule_with_warmup(
optimizer,
num_warmup_steps=100,
num_training_steps=1000
)
# 在训练循环中
# optimizer.step()
# scheduler.step()
3. 归一化技术 (Normalization)
归一化旨在解决 Internal Covariate Shift (ICS) 问题,使各层输入的分布保持稳定,从而加速收敛并允许使用更大的学习率。
通俗解释:Internal Covariate Shift
把深度网络看作一个“流水线工厂”。第 2 层(工人B)习惯处理第 1 层(工人A)传过来的“标准件”。
但随着训练进行,工人 A 的参数在变,传给 B 的产品特性(数据分布)也在不停地变。工人 B 就不得不一直重新适应 A 的变化,导致整个工厂效率极低。
归一化(BN/LN) 就像在 A 和 B 之间放了一个“质检员”,不管 A 产出什么,都强行把它标准化(均值0方差1)再给 B。这样 B 就能稳定工作了。
| 方法 | 适用场景 | 维度 (Input: N, C, H, W) | 描述 |
|---|---|---|---|
| Batch Norm (BN) | CNN (CV任务) | 对 N, H, W 归一化 | 依赖 Batch Size,训练/推理行为不同 |
| Layer Norm (LN) | RNN/Transformer (NLP) | 对 C, H, W 归一化 | 独立于 Batch Size,对序列长度不敏感 |
| RMSNorm | LLM (如 LLaMA) | 同 LN | LN 的简化版,去除了均值中心化,仅保留缩放,计算更高效 |
RMSNorm 公式
相比 LayerNorm,RMSNorm (Root Mean Square Layer Normalization) 省略了减去均值的步骤:
x ˉ i = x i RMS ( x ) g i , where RMS ( x ) = 1 n ∑ j = 1 n x j 2 + ϵ \bar{x}_i = \frac{x_i}{\text{RMS}(x)} g_i, \quad \text{where } \text{RMS}(x) = \sqrt{\frac{1}{n} \sum_{j=1}^n x_j^2 + \epsilon} xˉi=RMS(x)xigi,where RMS(x)=n1j=1∑nxj2+ϵ
4. 正则化 (Regularization)
为了防止模型过拟合(在训练集表现好,测试集表现差),需要引入正则化。
4.1 Dropout
在训练过程中,随机将一部分神经元的输出置为 0。这相当于训练了无数个子网络的集成,迫使网络不过分依赖某些特定的特征。
类比理解:
Dropout 的机制与 随机森林 (Random Forest) 非常相似。
- 训练时:每次随机关掉一部分神经元,相当于每次都在训练一个不同的“残缺版”子网络。
- 推理时:所有神经元全开,相当于把这成百上千个子网络的预测结果做了“加权平均”。
这种隐式的集成学习 (Ensemble Learning) 有效降低了模型的方差,提升了泛化能力。
注:现代大模型训练中,为防止破坏特征,有时会减少Dropout的使用或仅在特定位置使用。
4.2 Weight Decay (L2 正则)
在损失函数中加入权重的平方和惩罚项: L = L d a t a + λ ∣ ∣ w ∣ ∣ 2 L = L_{data} + \lambda ||w||^2 L=Ldata+λ∣∣w∣∣2。这限制了权重的大小,防止模型过于复杂。
4.3 数据增强 (Data Augmentation)
通过对训练数据进行变换(如图片的翻转、裁剪、颜色变换,文本的掩码、回译等)来增加数据多样性,是提升模型鲁棒性最直接有效的方法。
5. 总结
在深度学习训练中,“炼丹”技巧往往和模型架构一样重要:
- 优化器:首选 AdamW,它是目前 CV 和 NLP 领域的通用选择。
- 学习率:配合 Warmup + Cosine Decay 策略,能显著提升收敛效果。
- 归一化:CNN 用 BN,Transformer/RNN 用 LN 或 RMSNorm。
- 正则化:合理使用 Weight Decay 和 Dropout 防止过拟合。
掌握这些组件的原理与搭配,是训练高性能模型的基础。
参考资料
更多推荐



所有评论(0)