第七章:训练
学习目标
- 理解训练的定义与核心流程
- 掌握损失函数的概念与常见类型
- 理解梯度下降算法的原理与三种变体
- 理解反向传播的作用与机制
- 了解学习率、Batch Size、Epoch等关键超参数
前置要求
第五章:深度学习概述(理解神经网络结构)、第二章:数学基础(理解导数和梯度概念)。
什么是训练?
训练(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、残差连接 |
| 梯度爆炸 | 梯度值变得极大,参数更新不稳定 | 梯度在反向传播中逐层放大 | 梯度裁剪、合适的初始化方法 |
本章小结
- 训练是通过反复前向传播和反向传播来调整模型参数,使损失函数最小化的过程。
- 损失函数衡量预测与真实的差距:回归任务用MSE,分类任务用交叉熵。
- 梯度下降是参数更新的核心算法,公式为 \(\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla L(\theta)\)。
- 学习率、Batch Size和Epoch是影响训练效果的关键超参数,需要根据具体任务调优。
- 常见训练问题包括过拟合(模型太复杂)、欠拟合(模型太简单)和梯度消失/爆炸(深层网络问题)。
练习题
-
在梯度下降中,如果学习率设置过大,最可能出现什么问题?
A. 训练速度太慢
B. 损失函数来回震荡,无法收敛
C. 模型欠拟合
D. 梯度消失答案:B。学习率太大会导致每步跨距过大,在最优点附近来回震荡,无法收敛到最小值。
-
以下哪个公式正确表达了梯度下降的参数更新规则?
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。梯度下降沿梯度的负方向更新参数,即减去学习率乘以梯度。
-
模型在训练集上准确率99%,但在测试集上只有60%,这属于什么问题?
A. 欠拟合
B. 过拟合
C. 梯度消失
D. 学习率太大答案:B。训练集表现好但测试集表现差是典型的过拟合现象,模型"背熟"了训练数据但无法泛化到新数据。