Skip to content

第 3 章 模型训练

模型训练的基本流程:

text
输入数据 -> 模型预测 -> 计算损失 -> 反向传播求梯度 -> 优化器更新参数

本章整理训练模型时最核心的几个概念:损失函数、反向传播、梯度下降和常见优化器。

3.1 模型、参数和损失函数

模型负责把输入 x 映射成预测值 y^

y^=fθ(x)

其中 θ 表示模型参数。

损失函数用来衡量预测值 y^ 和真实值 y 的差距。训练模型就是寻找一组参数 θ,让训练集上的平均损失尽量小。

整体目标通常写成:

J(θ)=1mi=1mL(fθ(x(i)),y(i))

其中:

符号含义
L单个样本的损失
J整个训练集上的平均损失
m训练样本数量
θ模型参数

3.2 常见损失函数

不同任务使用不同损失函数。

均方误差

均方误差常用于回归任务:

L(y^,y)=12(y^y)2

对整个训练集:

J(θ)=12mi=1m(y^(i)y(i))2

前面的 12 是为了求导后抵消平方项带来的系数 2。

平均绝对误差

平均绝对误差也用于回归:

L(y^,y)=|y^y|

它比均方误差对极端误差不那么敏感,但在 0 点附近不可导,优化时没有均方误差那么方便。

二分类交叉熵

二分类中,模型输出通常表示样本属于正类的概率:

y^=P(y=1x)

二分类交叉熵:

L(y^,y)=[ylogy^+(1y)log(1y^)]

如果真实标签是 1,损失主要看 logy^;如果真实标签是 0,损失主要看 log(1y^)

多分类交叉熵

多分类中,模型通常先输出每个类别的 logit,再通过 Softmax 变成概率:

y^k=ezkr=1Kezr

其中 K 是类别数,y^k 是模型预测样本属于第 k 类的概率。

这里 zk 是模型对第 k 类输出的 logit,也就是还没有归一化的类别分数;r 只是分母求和时使用的类别下标。

如果标签用 one-hot 向量表示,单个样本的多分类交叉熵为:

L(y^,y)=k=1Kyklogy^k

因为 one-hot 标签中只有真实类别的位置为 1,其他位置为 0,所以上式等价于:

L=logy^c

其中 c 表示真实类别。模型分给真实类别的概率越低,损失越大。

3.3 前向传播和反向传播

前向传播负责把输入样本代入模型,得到预测值,再把预测值和真实标签放进损失函数中计算误差。

反向传播负责计算损失函数对每个参数的梯度:

Jθj

梯度表示:参数 θj 发生微小变化时,损失函数会怎样变化。

反向传播主要依赖链式法则。假设:

z=g(x),y=f(z)

那么:

dydx=dydzdzdx

复杂模型可以看成很多函数组合。反向传播就是从损失开始,沿计算图从后往前应用链式法则,把梯度传回每个参数。

需要区分:

概念作用
前向传播计算预测和损失
反向传播计算梯度
优化器根据梯度更新参数

PyTorch、TensorFlow 会自动完成反向传播,但本质仍然是链式法则。

3.4 梯度下降

有了梯度以后,就可以更新参数。梯度下降的基本更新公式是:

θjθjαJ(θ)θj

向量形式:

θθαθJ(θ)

其中 α 是学习率。

部分含义
θJ(θ)损失上升最快的方向
负号沿损失下降方向更新
α每次更新的步长

学习率太小,训练很慢;学习率太大,损失可能震荡甚至发散。

常见现象:

现象可能原因
损失下降很慢学习率太小
损失上下震荡学习率太大
损失变成非数值学习率过大、梯度爆炸、对 0 取对数、除以 0、数值溢出
训练几乎不动学习率太小、梯度消失、模型实现错误

3.5 梯度估计方式

梯度下降的区别主要在于:每次用多少样本估计梯度。

批量梯度下降

批量梯度下降(Batch Gradient Descent, BGD)每次使用全部训练样本:

g=1mi=1mθL(fθ(x(i)),y(i))θθαg

特点:

  • 梯度方向稳定。
  • 每次更新成本高。
  • 数据量很大时训练慢。

随机梯度下降

随机梯度下降(Stochastic Gradient Descent, SGD)每次只使用一个样本:

g=θL(fθ(x(i)),y(i))

特点:

  • 每次更新很快。
  • 梯度噪声大。
  • 损失曲线震荡明显。

严格来说,SGD 是单样本更新。但实际深度学习中说 SGD,很多时候指 mini-batch SGD。

小批量梯度下降

小批量梯度下降(Mini-batch Gradient Descent)每次使用一小批样本。设 batch 为 B

g=1|B|iBθL(fθ(x(i)),y(i))

特点:

  • 比单样本 SGD 稳定。
  • 比批量梯度下降更新频繁。
  • 适合 GPU 并行计算。
  • 是深度学习最常用的训练方式。

三者对比:

方法每次用多少样本梯度噪声单次计算成本更新频率
批量梯度下降全部样本
随机梯度下降1 个样本
小批量梯度下降一批样本中等中等中等

3.6 常见优化器

优化器决定如何使用梯度更新参数。

最朴素的梯度下降只看当前梯度,更复杂的优化器会利用历史梯度、自适应学习率或权重衰减。

本节统一使用以下符号:

符号含义
t当前更新步数
gtt 步计算得到的梯度
vtMomentum 中的速度项;Adam 中的二阶矩估计
stAdaGrad 和 RMSProp 中的梯度平方累计量
mtAdam 中的一阶矩估计
ϵ防止分母为 0 的小常数
β,ρ,β1,β2控制历史信息保留比例的系数
λAdamW 中的权重衰减系数

SGD

SGD 使用当前 batch 的梯度直接更新参数:

θθαgt

优点是简单、计算开销小;缺点是对学习率敏感,在狭长损失曲面中容易震荡。

Momentum

Momentum 在 SGD 基础上加入历史方向。

维护一个速度项:

vt=βvt1+(1β)gt

更新参数:

θθαvt

其中 β 是动量系数,常见取值如 0.9

Momentum 的作用:

情况效果
梯度方向连续一致加速下降
梯度方向来回摆动抵消震荡
损失曲面狭长更容易沿主方向前进

Momentum 对梯度做指数加权移动平均,用历史梯度方向平滑当前更新。

AdaGrad

AdaGrad 为每个参数维护历史梯度平方和:

st=st1+gt2

更新:

θθαst+ϵgt

它会让历史梯度大的参数学习率变小,适合稀疏特征。但 st 只增不减,后期学习率可能过小。

RMSProp

RMSProp 使用梯度平方的指数加权平均:

st=ρst1+(1ρ)gt2

更新:

θθαst+ϵgt

它缓解了 AdaGrad 后期学习率持续变小的问题。

Adam

Adam 同时使用一阶矩和二阶矩。

一阶矩是梯度的移动平均,类似 Momentum:

mt=β1mt1+(1β1)gt

二阶矩是梯度平方的移动平均,类似 RMSProp:

vt=β2vt1+(1β2)gt2

更新大致为:

θθαvt+ϵmt

实际 Adam 还会做偏差修正。Adam 收敛通常较快,对学习率相对不那么敏感,但不代表一定比 SGD 泛化更好。

AdamW

AdamW 是 Adam 的常用改进。它把权重衰减从 Adam 的自适应梯度更新中解耦出来:

θθαmtvt+ϵαλθ

这样权重衰减直接作用在参数上。现代 Transformer 和大模型训练中常用 AdamW。

3.7 优化器区别

优化器核心思想主要优点注意点
SGD当前梯度直接更新简单、稳定对学习率敏感
Momentum累积历史梯度方向加速、减少震荡需要设置动量系数
AdaGrad每个参数自适应学习率适合稀疏特征学习率可能衰减过快
RMSProp梯度平方移动平均缓解 AdaGrad 后期变慢多一个衰减系数
AdamMomentum + RMSProp收敛快,使用广泛泛化不一定总优
AdamWAdam + 解耦权重衰减适合深度模型仍要调学习率和权重衰减

简单理解:

  • 梯度下降解决“往哪个方向更新”。
  • 学习率解决“每次走多远”。
  • Momentum 解决“不要只看当前一步”。
  • RMSProp / Adam 解决“不同参数更新幅度应该不同”。
  • AdamW 解决“Adam 中权重衰减更清晰地作用在参数上”。

3.8 训练时需要观察什么

训练时不能只看最终准确率。至少要观察:

  • 训练损失是否下降。
  • 验证损失是否下降。
  • 学习率是否合适。
  • 梯度是否过大或过小。
  • 损失是否变成非数值。

如果训练损失不下降,优先检查损失函数、学习率、数据标签、梯度和模型实现。

如果训练损失下降但验证损失上升,通常说明模型开始过拟合。对应处理方法见模型评估和正则化章节。

Powered by VitePress