d2l 学习笔记:深度学习模型训练过程的数学原理
深度学习训练可以视为一个高维参数优化问题:给定训练数据与带参数的模型,通过反复计算预测、损失和梯度,不断调整参数,使模型输出逐渐接近真实目标。
其基本闭环为:
模型定义→前向传播→损失计算→反向传播→参数更新
1. 训练问题的数学定义
设训练数据集为:
D={(x(i),y(i))}i=1n
其中:
- x(i):第 i 个样本的输入特征;
- y(i):第 i 个样本的真实标签;
- n:训练样本数量。
模型使用参数 θ 建立输入到输出的映射:
y^=f(x;θ)
训练的目标是寻找一组最优参数 θ∗,使经验损失最小:
θ∗=argθminL(θ)
2. 模型结构与模型参数
模型结构规定了数据如何参与计算,模型参数则是在训练过程中需要学习的变量。以线性回归为例:
y^=wTx+b
其中:
- 线性函数是模型结构;
- w 和 b 是模型参数;
- θ=(w,b) 表示全部待优化参数。
训练不会改变线性回归的计算形式,而是不断更新 w 和 b。神经网络同样遵循这一原则,只是模型结构和参数规模更加复杂。
3. 参数初始化
训练开始前,模型尚未获得适合当前任务的参数,因此需要设置初始值。例如:
w0=[0.01−0.02],b0=0
初始预测通常与真实目标差距较大。后续训练通过损失函数衡量差距,并利用梯度逐步修正参数。
初始化方式会影响优化过程:
- 全零初始化适用于部分简单模型,但会使神经网络中的对称神经元学习相同特征;
- 较小的随机值可以打破参数对称性;
- Xavier、Kaiming 等初始化方法用于控制深层网络中的信号与梯度尺度。
4. 前向传播
前向传播是使用当前参数,根据输入数据计算模型输出的过程:
y^=f(x;θ)
对于包含 n 个样本、每个样本具有 d 个特征的批量数据:
X∈Rn×d,w∈Rd×1
线性回归的批量前向计算为:
y^=Xw+b
输出满足:
y^∈Rn×1
前向传播只负责生成预测结果,不直接判断预测是否准确。
5. 损失函数与优化目标
损失函数用于量化预测值与真实值之间的差异。线性回归常使用平方损失:
ℓ(i)=21(y^(i)−y(i))2
训练集上的平均损失为:
L(θ)=n1i=1∑n21(f(x(i);θ)−y(i))2
由于预测结果依赖参数,损失本质上也是参数的函数。训练过程因此可以写成:
θminL(θ)
不同任务会采用不同损失函数。例如,回归任务常使用均方误差,分类任务常使用交叉熵。
6. 梯度与参数更新方向
仅知道当前损失不足以决定参数如何调整,还需要知道损失对参数变化的敏感程度。该信息由梯度表示:
∇θL
对于单个参数 w:
∂w∂L
其符号反映局部变化方向:
- 当 ∂w∂L>0 时,增大 w 会使损失上升;
- 当 ∂w∂L<0 时,增大 w 会使损失下降;
- 梯度方向是损失局部增长最快的方向,负梯度方向则是局部下降最快的方向。
梯度下降据此更新参数:
θt+1=θt−η∇θL(θt)
其中 η 为学习率:
- 学习率过大,参数可能越过低损失区域,甚至导致训练发散;
- 学习率过小,参数更新幅度有限,训练收敛较慢;
- 实际训练常配合学习率调度策略动态调整 η。
7. 反向传播与链式法则
反向传播用于从损失出发,沿计算图反向计算每个参数的梯度。其数学基础是复合函数求导的链式法则。
以单样本线性回归为例:
y^=wTx+b
L=21(y^−y)2
损失对权重的梯度为:
∂w∂L=∂y^∂L∂w∂y^=(y^−y)x
损失对偏置的梯度为:
∂b∂L=y^−y
链式法则把两类影响连接起来:
- 中间变量如何影响损失;
- 参数如何影响中间变量。
深层神经网络包含更多复合函数,但反向传播的核心仍是沿计算图重复应用链式法则。
8. 小批量随机梯度下降
使用整个训练集计算一次精确梯度称为批量梯度下降。当数据规模较大时,这种方式计算成本高、参数更新频率低。因此,深度学习通常使用小批量随机梯度下降。
设一个小批量样本集合为 B,其平均损失为:
LB(θ)=∣B∣1i∈B∑ℓ(i)(θ)
参数更新为:
θt+1=θt−η∇θLB(θt)
当小批量样本以适当方式随机抽取时,其梯度是全量梯度的近似估计:
EB[∇LB(θ)]≈∇L(θ)
小批量训练在以下因素之间取得平衡:
- 计算效率与硬件并行能力;
- 梯度估计的稳定性;
- 参数更新频率;
- 内存或显存占用。
9. 一次训练迭代与一个 Epoch
9.1. 一次训练迭代
一次迭代通常包含以下步骤:
- 从数据集中读取一个小批量 (XB,yB);
- 前向传播,计算 y^B=f(XB;θ);
- 计算小批量损失 LB;
- 反向传播,计算 ∇θLB;
- 使用优化器更新参数;
- 清理或重置梯度,为下一次迭代做准备。
9.2. 一个 Epoch
模型完整遍历一次训练集称为一个 Epoch。若训练集包含 N 个样本,小批量大小为 B,则每个 Epoch 的迭代次数约为:
⌈BN⌉
例如,训练集包含 1,000,000 个样本,批量大小为 1,000,则每个 Epoch 约进行 1,000 次参数更新。
多个 Epoch 使模型能够反复利用训练数据,但训练轮次过多也可能造成过拟合,因此通常需要结合验证集指标判断训练状态。
10. PyTorch 中的实现对应
| 数学概念 | PyTorch 实现 | 作用 |
|---|
| 模型函数 f(x;θ) | nn.Module | 定义计算结构 |
| 参数 θ | model.parameters() | 保存待学习变量 |
| 前向传播 y^ | model(X) | 计算预测结果 |
| 损失函数 L | loss_fn(y_hat, y) | 衡量预测误差 |
| 梯度 ∇L | loss.backward() | 执行自动微分 |
| 参数更新 | optimizer.step() | 应用优化算法 |
| 梯度清零 | optimizer.zero_grad() | 避免不同迭代的梯度累加 |
标准训练循环如下:
for X, y in dataloader:
optimizer.zero_grad()
y_hat = model(X)
loss = loss_fn(y_hat, y)
loss.backward()
optimizer.step()
其数学流程可以概括为:
X→f(X;θ)→L→∇θL→θ−η∇θL
PyTorch 默认会累加参数梯度,因此通常在每次反向传播前调用 optimizer.zero_grad()。若需要梯度累积,则可以有意减少清零频率。
11. 从线性回归到深度神经网络
线性回归只包含一次仿射变换:
y^=XW+b
多层神经网络则组合了多个仿射变换与非线性激活函数:
h1=σ(XW1+b1)
h2=σ(h1W2+b2)
y^=f(X;θ)
模型结构虽然变得复杂,但训练闭环保持不变:
Forward→Loss→Backward→Update
线性回归展示了这一闭环的最小实现;深层网络、卷积网络和 Transformer 都是在同一优化框架中引入更复杂的参数化函数。
12. 核心理解
深度学习模型训练可以归纳为以下要点:
- 模型是参数化函数:模型结构规定计算方式,参数决定具体映射关系。
- 损失定义优化目标:损失函数把预测质量转化为可计算的标量。
- 梯度提供局部方向:反向传播利用链式法则高效计算各参数梯度。
- 优化器负责更新参数:梯度下降及其变体根据梯度和学习率调整参数。
- 小批量是工程折中:以有限计算成本获得对全量梯度的近似估计。
- 训练是重复闭环:通过多个迭代和 Epoch,参数逐渐进入较低损失区域。
关联文档