第七章:训练

学习目标

  • 理解训练的定义与核心流程
  • 掌握损失函数的概念与常见类型
  • 理解梯度下降算法的原理与三种变体
  • 理解反向传播的作用与机制
  • 了解学习率、Batch Size、Epoch等关键超参数

前置要求

第五章:深度学习概述(理解神经网络结构)、第二章:数学基础(理解导数和梯度概念)。

模型训练过程与梯度下降优化概念图
图7-1 模型训练过程:损失函数与梯度下降优化的迭代流程

什么是训练?

训练(Training)是让模型从数据中学习的过程。通过反复调整模型参数,使其能准确完成任务。

类比理解

训练就像学生做练习题:
做题 → 对照答案 → 发现错误 → 调整方法 → 再做题 → ...
循环直到正确率足够高

训练的核心流程

准备数据
初始化模型
前向传播
计算损失
反向传播
更新参数

关键概念详解

1. 损失函数(Loss Function)

损失函数衡量模型预测与真实答案的差距。损失越小,模型越好。

损失函数的数学公式

均方误差(MSE)——用于回归任务:

\[ \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \]

其中 \(y_i\) 是真实值,\(\hat{y}_i\) 是预测值,\(n\) 是样本数量。

交叉熵损失(Cross-Entropy)——用于分类任务:

\[ H(p, q) = -\sum_{i=1}^{C} p_i \log(q_i) \]

其中 \(p_i\) 是真实标签的概率分布(one-hot编码),\(q_i\) 是模型预测的概率,\(C\) 是类别数。

2. 优化器(Optimizer)

优化器决定如何更新模型参数来降低损失。

  • SGD:随机梯度下降,最基础
  • Adam:自适应学习率,效果稳定,最常用

3. 学习率(Learning Rate)

学习率控制每次参数更新的幅度。

  • 太大:不稳定,可能跳过最优解
  • 太小:训练太慢
  • 需要调优找到合适值

批量大小(Batch Size)

一次训练使用多少样本:
• 小批量:更频繁更新,内存占用小
• 大批量:更新更稳定,但内存占用大

4. Epoch、Batch、Iteration

这三个概念描述训练的循环过程,新手容易混淆,务必理解清楚:

概念 定义 例子
Epoch(轮次) 整个数据集被完整学习一遍 1000个样本全部训练完=1个Epoch
Batch(批次) 一次训练使用的样本数量 每次用32个样本训练=Batch Size=32
Iteration(迭代) 训练一个Batch需要的步骤 1000样本÷32=31.25≈32次迭代

具体计算示例

假设:
• 数据集有1000张图片
• Batch Size = 32(每次训练32张)
• 要训练10个Epoch

计算:
• 每个Epoch需要:1000 ÷ 32 = 31.25 ≈ 32次迭代
• 10个Epoch总共需要:32 × 10 = 320次迭代
• 模型参数更新320次

训练时通常会看到进度条显示:"Epoch 3/10, Batch 15/32"

为什么需要多个Epoch?

一次学习(1个Epoch)不足以让模型掌握知识,就像学生不能只看一遍课本就学会。需要多次重复学习,逐渐提高准确率。

  • Epoch太少:模型没学好,欠拟合
  • Epoch太多:模型"背熟了",过拟合(记住训练数据,不能泛化)
  • 合适Epoch:观察训练曲线,找到损失不再明显下降的点

5. 梯度下降(Gradient Descent)详解

梯度下降是训练模型的核心算法,用于找到让损失最小的参数值。

山坡类比

想象你站在山坡上,目标是到达最低点(山谷):
• 你看脚下,判断哪个方向最陡(梯度)
• 沿最陡方向往下走一步(参数更新)
• 重复:判断方向→走一步→判断方向→走一步
• 最终到达山谷(最优参数)

梯度就是山坡最陡的方向(函数变化最快的方向)
下降就是沿着这个方向往下走

梯度下降的三种方式

方式 每次使用的数据 特点 适用场景
批量梯度下降(BGD) 全部数据 方向准确,但计算慢 数据量小时使用
随机梯度下降(SGD) 单个样本 快但方向不稳定,易震荡 数据量大时使用
小批量梯度下降(Mini-batch SGD) 一小批样本(如32个) 平衡速度和稳定性,最常用 实际训练的主流方法
计算梯度
(损失函数对参数的导数)
确定方向
(梯度负方向)
更新参数
(参数 -= 学习率 × 梯度)
重复直到
损失足够小

梯度下降的关键公式

参数更新公式:

\[ \theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla L(\theta) \]

其中:
• \(\theta\) 是模型参数
• \(\eta\) 是学习率
• \(\nabla L(\theta)\) 是损失函数对参数的梯度

简单理解:新参数 = 旧参数 - 学习率 × 梯度
梯度告诉我们"往哪里走能降低损失",学习率告诉我们"走多远"。

梯度下降的Python代码示例

下面用一维函数演示梯度下降的基本过程:

import numpy as np

# 定义损失函数: f(x) = x^2 + 2x + 1 = (x+1)^2
# 最小值在 x = -1 处,最小值为 0
def loss_function(x):
    return x**2 + 2*x + 1

# 损失函数的导数(梯度)
def gradient(x):
    return 2*x + 2

# 梯度下降参数
learning_rate = 0.1   # 学习率
x = 3.0               # 初始值(随机初始化)
epochs = 30           # 迭代次数

print("梯度下降过程:")
for epoch in range(epochs):
    grad = gradient(x)          # 计算梯度
    x = x - learning_rate * grad  # 更新参数
    loss = loss_function(x)
    if epoch % 5 == 0 or epoch == epochs - 1:
        print(f"  Epoch {epoch:2d}: x = {x:.6f}, loss = {loss:.6f}")

print(f"\n最终结果: x = {x:.6f}, loss = {loss_function(x):.6f}")
# 输出: 最终结果: x = -1.000000, loss = 0.000000

为什么学习率很重要?

学习率决定每一步走多远:

  • 学习率太大:一步跨太大,可能跳过最低点,来回震荡,无法收敛
  • 学习率太小:一步太小,下山太慢,训练时间很长
  • 合适的学习率:稳定下降,较快到达最优

学习率调优技巧

• 初始值通常:0.001(Adam默认)、0.01(SGD默认)
• 观察训练曲线:损失震荡→学习率太大;损失下降慢→学习率太小
• 可以动态调整:训练前期大学习率(快速下降),后期小学习率(精细调整)
• 常用策略:学习率衰减、余弦退火

6. 反向传播(Backpropagation)补充

反向传播是计算梯度的核心技术。它从输出层向输入层逐层计算每个参数对损失的影响。

为什么叫"反向"?

前向传播:数据从输入→隐藏层→输出(计算预测值)
反向传播:误差从输出→隐藏层→输入(计算梯度)

因为梯度计算是从输出层开始的,沿着网络结构"反向"传播误差信息,告诉每层"你哪里做错了,该怎么调整"。这就是神经网络的"自我纠错"过程。

训练的常见问题

问题 现象 原因 解决方法
过拟合(Overfitting) 训练数据表现好,新数据表现差 模型太复杂,"背熟"了训练数据 更多数据、正则化、Dropout、早停
欠拟合(Underfitting) 训练数据和新数据都表现差 模型太简单,无法学习数据规律 增加模型复杂度、更多训练时间
梯度消失 深层网络底层参数几乎不更新 多层网络中梯度逐层衰减 ReLU激活函数、Batch Normalization、残差连接
梯度爆炸 梯度值变得极大,参数更新不稳定 梯度在反向传播中逐层放大 梯度裁剪、合适的初始化方法

推荐视频

如果你觉得文字讲解不够直观,推荐观看以下视频:

反向传播

作者:3Blue1Brown

为什么推荐:动画演示反向传播算法

点击观看

本章小结

  1. 训练是通过反复前向传播和反向传播来调整模型参数,使损失函数最小化的过程。
  2. 损失函数衡量预测与真实的差距:回归任务用MSE,分类任务用交叉熵。
  3. 梯度下降是参数更新的核心算法,公式为 \(\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla L(\theta)\)。
  4. 学习率、Batch Size和Epoch是影响训练效果的关键超参数,需要根据具体任务调优。
  5. 常见训练问题包括过拟合(模型太复杂)、欠拟合(模型太简单)和梯度消失/爆炸(深层网络问题)。

练习题

  1. 在梯度下降中,如果学习率设置过大,最可能出现什么问题?

    A. 训练速度太慢
    B. 损失函数来回震荡,无法收敛
    C. 模型欠拟合
    D. 梯度消失

    答案:B。学习率太大会导致每步跨距过大,在最优点附近来回震荡,无法收敛到最小值。

  2. 以下哪个公式正确表达了梯度下降的参数更新规则?

    A. \(\theta_{\text{new}} = \theta_{\text{old}} + \eta \cdot \nabla L\)
    B. \(\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla L\)
    C. \(\theta_{\text{new}} = \theta_{\text{old}} \times \eta \cdot \nabla L\)
    D. \(\theta_{\text{new}} = \eta \cdot \nabla L\)

    答案:B。梯度下降沿梯度的负方向更新参数,即减去学习率乘以梯度。

  3. 模型在训练集上准确率99%,但在测试集上只有60%,这属于什么问题?

    A. 欠拟合
    B. 过拟合
    C. 梯度消失
    D. 学习率太大

    答案:B。训练集表现好但测试集表现差是典型的过拟合现象,模型"背熟"了训练数据但无法泛化到新数据。