【机器学习深度学习】典型的模型训练过程
目录
一、模型训练直观图
二、核心目标
三、训练过程详解
3.1 训练阶段
1、准备起点:输入数据 + 初始参数权重
2、模型尝试预测:变换计算 (前向传播)
3、检查错误:计算损失值
4、学习的关键:反向传播 + 梯度下降法 (调整权重)
5、循环迭代:模型训练迭代过程
6、停止条件:损失值达标
3.2 训练完成
7、模型测试
8、模型应用
四、图解流程总结
4.1 流程图说明
4.2 关键特点
4.3 关键点记住
五、训练模型代码示例
5.1 执行代码
5.2 运行结果
5.3 图示结果
5.4 关键点对应关系
一、模型训练直观图
二、核心目标
让模型学会从“输入数据”准确预测“输出结果”。
三、训练过程详解
3.1 训练阶段
1、准备起点:输入数据 + 初始参数权重
-
输入数据: 这是模型学习的“教材”。例如:一堆猫和狗的图片(特征:像素值、颜色等)。
-
参数权重: 模型内部的“调节旋钮”。训练开始时,这些权重是随机初始化的(就像给模型一个随机的猜测起点)。这些权重决定了输入数据如何被组合、转换。
2、模型尝试预测:变换计算 (前向传播)
-
模型使用当前的权重参数,对输入的一批数据进行计算。
-
这个计算过程(可能是复杂的数学公式或神经网络层)将输入数据“变换”成一个预测输出。
-
例子: 模型看到一张图片(输入),经过当前权重计算后,输出一个预测:“这张图有70%概率是猫,30%概率是狗”。
3、检查错误:计算损失值
-
真实标签: 每个输入数据对应的正确答案(Ground Truth)。例子: 刚才那张图其实是一只猫(标签是“猫”)。
-
损失值: 一个衡量预测输出与真实标签之间差距(错误程度)的数值。常见的损失函数如均方误差(回归)、交叉熵(分类)。
-
例子: 模型预测“猫70%,狗30%”,真实是“猫100%”。损失函数会计算出一个值(比如0.36),表示这个预测的“错误成本”。目标就是让这个损失值尽可能小!
4、学习的关键:反向传播 + 梯度下降法 (调整权重)
-
反向传播: 这是模型“反思错误”的过程。算法会从输出层向输入层反向计算,精确地找出每一个权重参数对最终的损失值应该负多大责任。它计算的是损失值相对于每个权重的梯度。
-
梯度下降法: 利用计算出的梯度信息来更新权重参数。
-
梯度: 指向损失值增加最快的方向。
-
下降: 我们要让损失值减小,所以更新权重时,要沿着梯度的反方向移动一小步。
-
学习率: 一个超参数,控制每次更新权重时移动的“步长”有多大。太小学习慢,太大可能跳过最优解。
-
-
核心动作:
新权重 = 旧权重 - 学习率 * 梯度
-
结果: 经过这次更新,模型在下一次遇到类似输入时,预测结果应该更接近真实标签(损失值应该更小)。
5、循环迭代:模型训练迭代过程
-
步骤 2 -> 3 -> 4 会在一批又一批的数据上反复进行。
-
每一次完整的循环(遍历完所有训练数据一次)称为一个 Epoch。
-
在一个 Epoch 中,数据通常被分成更小的批次(Batch) 进行训练(步骤2-4在Batch上进行)。
-
随着迭代的进行,模型的权重参数被不断调整优化,损失值总体趋势是逐渐下降的。
6、停止条件:损失值达标
-
训练不会无限进行下去。停止条件通常包括:
-
损失值降低到某个可接受的阈值以下。
-
损失值在连续几个 Epoch 内不再显著下降(收敛)。
-
达到预设的最大 Epoch 数。
-
-
此时,我们认为模型在训练数据上已经“学得差不多了”,权重参数基本稳定。
3.2 训练完成
7、模型测试
-
使用训练阶段从未见过的新数据(测试集)来评估训练好的模型的真实泛化能力。
-
计算模型在测试集上的损失值或准确率等指标。这才是模型性能的真实反映,避免模型只是“死记硬背”了训练数据(过拟合)。
8、模型应用
-
当模型通过测试,性能满足要求后,就可以投入实际使用。
-
输入新的、未知的数据,模型利用训练好的权重参数进行计算,输出预测结果。
四、图解流程总结
4.1 流程图说明
1、训练初始化:
输入数据(特征)
随机初始化权重参数
2、前向传播(Forward Propagation):
数据通过模型计算
生成预测输出
# 伪代码示例 predictions = model(input_data, weights)
3、损失计算:
比较预测输出与真实标签
计算损失值(如均方误差、交叉熵等)
loss = loss_function(predictions, true_labels)
4、停止条件判断:
检查损失是否达标(足够小)
或达到最大迭代次数
5、反向传播(Backpropagation):
计算损失对每个权重的梯度
确定权重调整方向和幅度
gradients = calculate_gradients(loss, weights)
6、权重更新:
使用梯度下降法更新权重
学习率控制更新步长
weights = weights - learning_rate * gradients
7、迭代循环:
重复前向传播→损失计算→反向传播→权重更新
直到损失达标
8、模型部署:
使用测试集评估模型性能
部署模型进行实际预测
4.2 关键特点
循环结构:核心训练过程形成闭环,持续迭代优化
双向箭头:前向传播(数据流动)与反向传播(梯度流动)方向相反
停止条件:当损失足够小时跳出循环
分离阶段:训练/测试/应用三个阶段清晰区分
这个流程图展示了机器学习"通过数据自动调整参数"的本质:模型通过反复试错(前向计算),评估错误(损失计算),然后修正错误(反向传播更新权重),最终获得预测能力。
4.3 关键点记住
-
前向传播: 输入 -> 权重计算 -> 输出预测。
-
损失函数: 量化预测与真实的差距。
-
反向传播: 找出每个权重对损失应负的责任(计算梯度)。
-
梯度下降: 沿着减少损失的方向更新权重(梯度反方向)。
-
迭代: 反复进行前向、计算损失、反向传播、更新权重。
-
测试与应用分离: 训练好的模型必须用新数据测试和应用,确保学到的知识是通用的。
这个过程就像教一个学生:给他题目(输入)和初始思路(权重),他尝试解题(预测),老师批改对错(计算损失),分析错误原因(反向传播),学生根据反馈修正思路(梯度下降更新权重),不断练习(迭代),直到考试合格(损失达标),然后参加真正的考试(模型测试)并最终工作(模型应用)。
五、训练模型代码示例
5.1 执行代码
这个示例完整展示了机器学习模型训练的整个生命周期,从数据准备到模型应用,每一步都有清晰的代码实现和可视化展示。
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np# ==== 解决中文显示问题 ====
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体
plt.rcParams['axes.unicode_minus'] = False # 显示负号# =====================
# 1. 准备数据(输入数据 + 真实标签)
# =====================
# 创建 y = 2x + 1 的线性数据,加入随机噪声
np.random.seed(42)
x = np.linspace(0, 5, 100)
y = 2 * x + 1 + np.random.normal(0, 0.5, 100)# 转换为PyTorch张量
inputs = torch.tensor(x, dtype=torch.float32).unsqueeze(1)
labels = torch.tensor(y, dtype=torch.float32).unsqueeze(1)# =====================
# 2. 初始化模型参数(权重和偏置)
# =====================
class LinearRegression(nn.Module):def __init__(self):super().__init__()# 随机初始化权重参数 (类似 y = wx + b)self.weights = nn.Parameter(torch.randn(1))self.bias = nn.Parameter(torch.randn(1))def forward(self, x):# 前向传播计算:变换计算return self.weights * x + self.biasmodel = LinearRegression()
print(f"初始参数: w={model.weights.item():.3f}, b={model.bias.item():.3f}")# =====================
# 3. 设置训练参数
# =====================
learning_rate = 0.01 # 学习率
epochs = 100 # 训练轮数
loss_function = nn.MSELoss() # 均方误差损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 梯度下降优化器# 记录训练过程
loss_history = []# =====================
# 4. 训练迭代过程
# =====================
for epoch in range(epochs):# 前向传播:计算预测输出predictions = model(inputs)# 计算损失值loss = loss_function(predictions, labels)loss_history.append(loss.item())# 反向传播:计算梯度loss.backward()# 梯度下降法:调整权重optimizer.step()# 清空梯度optimizer.zero_grad()# 每10轮打印进度if (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')# =====================
# 5. 检查训练结果
# =====================
print(f"\n训练后参数: w={model.weights.item():.3f}, b={model.bias.item():.3f}")
print(f"真实参数: w=2.0, b=1.0")# 可视化训练过程
plt.figure(figsize=(12, 4))# 损失曲线
plt.subplot(1, 2, 1)
plt.plot(loss_history)
plt.title('训练损失变化')
plt.xlabel('迭代次数')
plt.ylabel('损失值')
plt.grid(True)# 拟合结果
plt.subplot(1, 2, 2)
plt.scatter(x, y, label='原始数据', alpha=0.6)
plt.plot(x, model(inputs).detach().numpy(), 'r-', lw=2, label='拟合直线')
plt.title('线性回归拟合结果')
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()# =====================
# 6. 模型测试与应用
# =====================
# 测试新数据
test_x = torch.tensor([1.5, 3.5, 4.8], dtype=torch.float32).unsqueeze(1)
predictions = model(test_x)print("\n模型测试:")
for i in range(len(test_x)):true_y = 2 * test_x[i].item() + 1pred_y = predictions[i].item()print(f"输入 x={test_x[i].item():.1f}, 预测值={pred_y:.2f}, 真实值={true_y:.2f}")
5.2 运行结果
输出效果
初始参数: w=-0.205, b=0.783
Epoch [10/100], Loss: 1.3883
Epoch [20/100], Loss: 0.2775
Epoch [30/100], Loss: 0.2533
Epoch [40/100], Loss: 0.2485
Epoch [50/100], Loss: 0.2445
Epoch [60/100], Loss: 0.2409
Epoch [70/100], Loss: 0.2376
Epoch [80/100], Loss: 0.2346
Epoch [90/100], Loss: 0.2318
Epoch [100/100], Loss: 0.2293训练后参数: w=1.917, b=1.229
真实参数: w=2.0, b=1.0模型测试:
输入 x=1.5, 预测值=4.10, 真实值=4.00
输入 x=3.5, 预测值=7.94, 真实值=8.00
输入 x=4.8, 预测值=10.43, 真实值=10.60
5.3 图示结果
5.4 关键点对应关系
代码部分 | 流程图步骤 |
---|---|
model(inputs) | 变换计算(前向传播) |
loss_function() | 计算损失值 |
loss.backward() | 反向传播(计算梯度) |
optimizer.step() | 梯度下降(更新权重) |
训练循环 | 模型训练迭代过程 |
损失值监测 | 损失值达标判断 |
新数据预测 | 模型测试与应用 |