【机器学习&深度学习】典型的模型训练过程

发布于:2025-06-26 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

一、模型训练直观图

二、核心目标 

三、训练过程详解

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 关键特点

  1. 循环结构:核心训练过程形成闭环,持续迭代优化

  2. 双向箭头:前向传播(数据流动)与反向传播(梯度流动)方向相反

  3. 停止条件:当损失足够小时跳出循环

  4. 分离阶段:训练/测试/应用三个阶段清晰区分

这个流程图展示了机器学习"通过数据自动调整参数"的本质:模型通过反复试错(前向计算),评估错误(损失计算),然后修正错误(反向传播更新权重),最终获得预测能力。

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.bias

model = 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() + 1
    pred_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() 梯度下降(更新权重)
训练循环 模型训练迭代过程
损失值监测 损失值达标判断
新数据预测 模型测试与应用