AI

d2l 学习笔记:深度学习模型训练过程的数学原理

·15 分钟阅读·5684 字

从模型、损失、梯度与参数更新出发,梳理深度学习训练闭环及其数学依据

📋 目录

d2l 学习笔记:深度学习模型训练过程的数学原理

深度学习训练可以视为一个高维参数优化问题:给定训练数据与带参数的模型,通过反复计算预测、损失和梯度,不断调整参数,使模型输出逐渐接近真实目标。

其基本闭环为:

模型定义→前向传播→损失计算→反向传播→参数更新\boxed{ \text{模型定义} \rightarrow \text{前向传播} \rightarrow \text{损失计算} \rightarrow \text{反向传播} \rightarrow \text{参数更新} }

1. 训练问题的数学定义

设训练数据集为:

D={(x(i),y(i))}i=1n\mathcal{D}=\left\{\left(\boldsymbol{x}^{(i)},y^{(i)}\right)\right\}_{i=1}^{n}

其中:

  • x(i)\boldsymbol{x}^{(i)}:第 ii 个样本的输入特征;
  • y(i)y^{(i)}:第 ii 个样本的真实标签;
  • nn:训练样本数量。

模型使用参数 θ\boldsymbol{\theta} 建立输入到输出的映射:

y^=f(x;θ)\hat{y}=f(\boldsymbol{x};\boldsymbol{\theta})

训练的目标是寻找一组最优参数 θ∗\boldsymbol{\theta}^{*},使经验损失最小:

θ∗=arg⁡min⁡θL(θ)\boldsymbol{\theta}^{*} = \arg\min_{\boldsymbol{\theta}} L(\boldsymbol{\theta})

2. 模型结构与模型参数

模型结构规定了数据如何参与计算,模型参数则是在训练过程中需要学习的变量。以线性回归为例:

y^=wTx+b\hat{y}=\boldsymbol{w}^{\mathsf{T}}\boldsymbol{x}+b

其中:

  • 线性函数是模型结构;
  • w\boldsymbol{w} 和 bb 是模型参数;
  • θ=(w,b)\boldsymbol{\theta}=(\boldsymbol{w},b) 表示全部待优化参数。

训练不会改变线性回归的计算形式,而是不断更新 w\boldsymbol{w} 和 bb。神经网络同样遵循这一原则,只是模型结构和参数规模更加复杂。

3. 参数初始化

训练开始前,模型尚未获得适合当前任务的参数,因此需要设置初始值。例如:

w0=[0.01−0.02],b0=0\boldsymbol{w}_{0}= \begin{bmatrix} 0.01 \\ -0.02 \end{bmatrix}, \qquad b_{0}=0

初始预测通常与真实目标差距较大。后续训练通过损失函数衡量差距,并利用梯度逐步修正参数。

初始化方式会影响优化过程:

  • 全零初始化适用于部分简单模型,但会使神经网络中的对称神经元学习相同特征;
  • 较小的随机值可以打破参数对称性;
  • Xavier、Kaiming 等初始化方法用于控制深层网络中的信号与梯度尺度。

4. 前向传播

前向传播是使用当前参数,根据输入数据计算模型输出的过程:

y^=f(x;θ)\hat{y}=f(\boldsymbol{x};\boldsymbol{\theta})

对于包含 nn 个样本、每个样本具有 dd 个特征的批量数据:

X∈Rn×d,w∈Rd×1\boldsymbol{X}\in\mathbb{R}^{n\times d}, \qquad \boldsymbol{w}\in\mathbb{R}^{d\times 1}

线性回归的批量前向计算为:

y^=Xw+b\hat{\boldsymbol{y}}=\boldsymbol{X}\boldsymbol{w}+b

输出满足:

y^∈Rn×1\hat{\boldsymbol{y}}\in\mathbb{R}^{n\times 1}

前向传播只负责生成预测结果,不直接判断预测是否准确。

5. 损失函数与优化目标

损失函数用于量化预测值与真实值之间的差异。线性回归常使用平方损失:

ℓ(i)=12(y^(i)−y(i))2\ell^{(i)} = \frac{1}{2} \left(\hat{y}^{(i)}-y^{(i)}\right)^2

训练集上的平均损失为:

L(θ)=1n∑i=1n12(f(x(i);θ)−y(i))2L(\boldsymbol{\theta}) = \frac{1}{n} \sum_{i=1}^{n} \frac{1}{2} \left( f(\boldsymbol{x}^{(i)};\boldsymbol{\theta})-y^{(i)} \right)^2

由于预测结果依赖参数,损失本质上也是参数的函数。训练过程因此可以写成:

min⁡θL(θ)\min_{\boldsymbol{\theta}}L(\boldsymbol{\theta})

不同任务会采用不同损失函数。例如,回归任务常使用均方误差,分类任务常使用交叉熵。

6. 梯度与参数更新方向

仅知道当前损失不足以决定参数如何调整,还需要知道损失对参数变化的敏感程度。该信息由梯度表示:

∇θL\nabla_{\boldsymbol{\theta}}L

对于单个参数 ww:

∂L∂w\frac{\partial L}{\partial w}

其符号反映局部变化方向:

  • 当 ∂L∂w>0\frac{\partial L}{\partial w}>0 时,增大 ww 会使损失上升;
  • 当 ∂L∂w<0\frac{\partial L}{\partial w}<0 时,增大 ww 会使损失下降;
  • 梯度方向是损失局部增长最快的方向,负梯度方向则是局部下降最快的方向。

梯度下降据此更新参数:

θt+1=θt−η∇θL(θt)\boxed{ \boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_{t} - \eta\nabla_{\boldsymbol{\theta}}L(\boldsymbol{\theta}_{t}) }

其中 η\eta 为学习率:

  • 学习率过大,参数可能越过低损失区域,甚至导致训练发散;
  • 学习率过小,参数更新幅度有限,训练收敛较慢;
  • 实际训练常配合学习率调度策略动态调整 η\eta。

7. 反向传播与链式法则

反向传播用于从损失出发,沿计算图反向计算每个参数的梯度。其数学基础是复合函数求导的链式法则。

以单样本线性回归为例:

y^=wTx+b\hat{y}=\boldsymbol{w}^{\mathsf{T}}\boldsymbol{x}+b L=12(y^−y)2L=\frac{1}{2}(\hat{y}-y)^2

损失对权重的梯度为:

∂L∂w=∂L∂y^∂y^∂w=(y^−y)x\frac{\partial L}{\partial \boldsymbol{w}} = \frac{\partial L}{\partial \hat{y}} \frac{\partial \hat{y}}{\partial \boldsymbol{w}} = (\hat{y}-y)\boldsymbol{x}

损失对偏置的梯度为:

∂L∂b=y^−y\frac{\partial L}{\partial b} = \hat{y}-y

链式法则把两类影响连接起来:

  1. 中间变量如何影响损失;
  2. 参数如何影响中间变量。

深层神经网络包含更多复合函数,但反向传播的核心仍是沿计算图重复应用链式法则。

8. 小批量随机梯度下降

使用整个训练集计算一次精确梯度称为批量梯度下降。当数据规模较大时,这种方式计算成本高、参数更新频率低。因此,深度学习通常使用小批量随机梯度下降。

设一个小批量样本集合为 B\mathcal{B},其平均损失为:

LB(θ)=1∣B∣∑i∈Bℓ(i)(θ)L_{\mathcal{B}}(\boldsymbol{\theta}) = \frac{1}{|\mathcal{B}|} \sum_{i\in\mathcal{B}} \ell^{(i)}(\boldsymbol{\theta})

参数更新为:

θt+1=θt−η∇θLB(θt)\boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_{t} - \eta \nabla_{\boldsymbol{\theta}} L_{\mathcal{B}}(\boldsymbol{\theta}_{t})

当小批量样本以适当方式随机抽取时,其梯度是全量梯度的近似估计:

EB[∇LB(θ)]≈∇L(θ)\mathbb{E}_{\mathcal{B}} \left[ \nabla L_{\mathcal{B}}(\boldsymbol{\theta}) \right] \approx \nabla L(\boldsymbol{\theta})

小批量训练在以下因素之间取得平衡:

  • 计算效率与硬件并行能力;
  • 梯度估计的稳定性;
  • 参数更新频率;
  • 内存或显存占用。

9. 一次训练迭代与一个 Epoch

9.1. 一次训练迭代

一次迭代通常包含以下步骤:

  1. 从数据集中读取一个小批量 (XB,yB)(\boldsymbol{X}_{\mathcal{B}},\boldsymbol{y}_{\mathcal{B}});
  2. 前向传播,计算 y^B=f(XB;θ)\hat{\boldsymbol{y}}_{\mathcal{B}}=f(\boldsymbol{X}_{\mathcal{B}};\boldsymbol{\theta});
  3. 计算小批量损失 LBL_{\mathcal{B}};
  4. 反向传播,计算 ∇θLB\nabla_{\boldsymbol{\theta}}L_{\mathcal{B}};
  5. 使用优化器更新参数;
  6. 清理或重置梯度,为下一次迭代做准备。

9.2. 一个 Epoch

模型完整遍历一次训练集称为一个 Epoch。若训练集包含 NN 个样本,小批量大小为 BB,则每个 Epoch 的迭代次数约为:

⌈NB⌉\left\lceil\frac{N}{B}\right\rceil

例如,训练集包含 1,000,0001{,}000{,}000 个样本,批量大小为 1,0001{,}000,则每个 Epoch 约进行 1,0001{,}000 次参数更新。

多个 Epoch 使模型能够反复利用训练数据,但训练轮次过多也可能造成过拟合,因此通常需要结合验证集指标判断训练状态。

10. PyTorch 中的实现对应

数学概念PyTorch 实现作用
模型函数 f(x;θ)f(\boldsymbol{x};\boldsymbol{\theta})nn.Module定义计算结构
参数 θ\boldsymbol{\theta}model.parameters()保存待学习变量
前向传播 y^\hat{y}model(X)计算预测结果
损失函数 LLloss_fn(y_hat, y)衡量预测误差
梯度 ∇L\nabla Lloss.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\boldsymbol{X} \rightarrow f(\boldsymbol{X};\boldsymbol{\theta}) \rightarrow L \rightarrow \nabla_{\boldsymbol{\theta}}L \rightarrow \boldsymbol{\theta}-\eta\nabla_{\boldsymbol{\theta}}L

PyTorch 默认会累加参数梯度,因此通常在每次反向传播前调用 optimizer.zero_grad()。若需要梯度累积,则可以有意减少清零频率。

11. 从线性回归到深度神经网络

线性回归只包含一次仿射变换:

y^=XW+b\hat{\boldsymbol{y}}=\boldsymbol{X}\boldsymbol{W}+\boldsymbol{b}

多层神经网络则组合了多个仿射变换与非线性激活函数:

h1=σ(XW1+b1)\boldsymbol{h}_{1} = \sigma(\boldsymbol{X}\boldsymbol{W}_{1}+\boldsymbol{b}_{1}) h2=σ(h1W2+b2)\boldsymbol{h}_{2} = \sigma(\boldsymbol{h}_{1}\boldsymbol{W}_{2}+\boldsymbol{b}_{2}) y^=f(X;θ)\hat{\boldsymbol{y}} = f(\boldsymbol{X};\boldsymbol{\theta})

模型结构虽然变得复杂,但训练闭环保持不变:

Forward→Loss→Backward→Update\boxed{ \text{Forward} \rightarrow \text{Loss} \rightarrow \text{Backward} \rightarrow \text{Update} }

线性回归展示了这一闭环的最小实现;深层网络、卷积网络和 Transformer 都是在同一优化框架中引入更复杂的参数化函数。

12. 核心理解

深度学习模型训练可以归纳为以下要点:

  1. 模型是参数化函数:模型结构规定计算方式,参数决定具体映射关系。
  2. 损失定义优化目标:损失函数把预测质量转化为可计算的标量。
  3. 梯度提供局部方向:反向传播利用链式法则高效计算各参数梯度。
  4. 优化器负责更新参数:梯度下降及其变体根据梯度和学习率调整参数。
  5. 小批量是工程折中:以有限计算成本获得对全量梯度的近似估计。
  6. 训练是重复闭环:通过多个迭代和 Epoch,参数逐渐进入较低损失区域。

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro