第 03 讲《监督学习:数据、标签、Loss与训练循环》

模型不是看一眼就会:一文搞懂监督学习、标签、Loss 与训练循环

第 03 讲《监督学习:数据、标签、Loss与训练循环》

整理说明:本文基于 B 站视频《第03讲〈监督学习:数据、标签、Loss与训练循环〉》的公开信息、课程课件主线,并结合 PyTorch 训练循环常见写法进行原创化整理。本文不是逐字稿,重点是把"模型如何通过做题、对答案、改参数来学习"整理成科研小白能照着学、照着跑、照着排错的教程。

上一讲我们讲清楚了一件事:模型看到的不是照片,而是一组排列好的数字,也就是张量。

那今天继续往前走。

有了输入张量以后,模型到底是怎么学会的?

很多新手第一次训练模型时,会有一个很朴素的想法:我把图片丢进去,模型看一遍,不就应该会了吗?

但真实情况不是这样。

模型一开始就像刚进考场的新手。你给它看猫,它可能说是狗;你给它看缺陷图,它可能说正常;你让它框目标,它可能框到背景上。

它不是看一眼就懂,而是反复经历一个过程:

做题 → 对答案 → 算错多少 → 改参数 → 再做题

这就是监督学习的训练循环。


01 本讲只解决一个问题

神经网络怎样通过"做题---对答案---改参数"来学习?

把训练看成学生做题,就很清楚:

训练环节 学生做题类比 深度学习术语
输入样本 题目 x、图片张量、特征
标签 标准答案 y、类别、边界框
预测 学生写的答案 y_pred
Loss 错了多少分 损失函数
梯度 往哪改更接近答案 grad
参数更新 修改做题方法 optimizer step
验证观察 换一张新试卷检查 validation

所以别再把训练想成"模型自己神秘变聪明"。

训练就是一次又一次地让模型做题,然后用标签告诉它错在哪里,再用 Loss 和梯度推动参数往更好的方向改。


02 先把 6 个词说清楚

概念 一句话解释 小白理解
训练集 用于计算 Loss 并更新模型参数的数据 平时刷的练习册
验证集 训练过程中观察泛化能力的数据 模拟考试
测试集 最终评估真实性能的数据 期末验收
标签 Label 监督学习中的参考答案 标准答案
Loss 把预测错误转成可优化的数值 错题分
学习率 每次参数更新走多大一步 改错时下笔力度

这里最重要的是前三个集合不要混:

一句话记住:

训练集用来学,验证集用来挑,测试集用来验。

如果你把验证集也拿去训练,验证结果就会失真;如果你反复用测试集调参,测试集也不再是公正的最终考试。


03 一次训练循环到底发生了什么?

一次完整训练循环可以拆成 6 步:

  1. 输入样本:取一批图片或特征作为模型输入。
  2. 前向预测:模型用当前参数产生预测结果。
  3. 计算 Loss:比较预测和标签的差异。
  4. 反向传播:计算每个参数对 Loss 的影响方向。
  5. 优化更新:按梯度和学习率修改参数。
  6. 验证观察:用未参与更新的数据判断是否泛化。

这 6 步就是你以后看训练代码的主线。

python 复制代码
for epoch in range(num_epochs):
    model.train()
    for x, y in train_loader:
        pred = model(x)
        loss = loss_fn(pred, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    model.eval()
    # 在验证集上观察效果

科研小白第一次看训练代码,不要一行一行死背。你要问:

  1. 哪一行做预测?
  2. 哪一行算 Loss?
  3. 哪一行清空梯度?
  4. 哪一行反向传播?
  5. 哪一行更新参数?
  6. 哪一段是在验证集上观察?

能回答这 6 个问题,你就已经抓住了训练循环的骨架。


04 epoch、batch、learning rate 怎么记?

术语 含义 类比
epoch 模型完整看完训练集一次 整本练习册做一遍
batch 每次前向和反向计算的一小组样本 一次做几道题
learning rate 每次参数更新走多大一步 改错时改多大幅度

举个例子:

假设训练集有 1000 张图,batch=10

那么模型每次拿 10 张图算一次 Loss、更新一次参数;完整看完 1000 张图,需要 100 次更新,这叫 1 个 epoch。

如果训练 50 个 epoch,就是整本练习册做 50 遍。

但注意:

epoch 不是越多越好,batch 不是越大越好,learning rate 也不是随便填。

epoch 太少可能没学会,太多可能过拟合;batch 太大可能显存不够,太小训练会抖;learning rate 太大可能震荡,太小可能学得很慢。


05 θ ← θ - α∇L 到底是什么意思?

这一讲唯一需要抓住的公式是:

text 复制代码
θ ← θ - α∇L

别被符号吓到,它翻译成人话就是:

参数等于旧参数,减去一小步能让 Loss 下降的方向。

符号 含义 小白理解
θ 模型参数 模型当前的做题方法
L Loss 错了多少
∇L 梯度 往哪改能少错
α 学习率 每次改多大步

如果用爬山类比:

Loss 是海拔,训练目标是往低处走;梯度告诉你哪里下坡;学习率决定你一步迈多远。

步子太大,可能越过低谷来回震荡;步子太小,走半天还在原地附近。


06 Loss 下降,模型就一定变好吗?

不一定。

这是很多新手最容易误会的地方。

训练 Loss 下降,只说明模型在训练集上的错误变小了。它可能真的学到了规律,也可能只是把训练样本记住了。

曲线现象 可能含义 先检查什么
训练 Loss 和验证 Loss 都下降 正常学习 继续观察指标和错例
训练 Loss 下降,验证 Loss 上升 可能过拟合 数据量、正则化、增强、epoch
Loss 一直很高 可能欠拟合或数据有问题 模型容量、学习率、标签
Loss 剧烈震荡 训练不稳定 学习率、batch、异常样本
训练 Loss 很低但效果差 可能标签/指标/验证集问题 标签质量、指标、数据分布

所以文章看到这里,一定记住:

训练 Loss 只是体温计,不是最终诊断书。

你还要看验证集、测试集、指标、预测图和错例。


07 标签质量为什么这么重要?

监督学习里的标签,就是老师给模型的标准答案。

如果标准答案错了,模型会很认真地学错。

比如商品缺陷检测中,图片里明明有一个小划痕,但标注人员漏标了。对模型来说,这张图的监督信号就是:这里没有缺陷。

模型不会知道"老师可能漏标了"。它只会把漏标缺陷当作背景学进去。

检测任务尤其要注意:

标签问题 结果风险
漏标 模型把目标当背景
错标 模型学错类别
框偏移 定位能力变差
框太松 模型不知道目标边界
类别不一致 同一物体学成多个答案
类别极不平衡 少数类召回率很差

很多时候模型效果差,不是模型不够先进,而是老师给的答案不干净。

所以做 YOLO26 数据集时,第一轮不要急着训练大模型。先随机抽 50 张图,看标签是否贴合目标、类别是否一致、有没有漏标。


08 实操教程:用最小例子看参数如何被 Loss 推着更新

下面这段代码不用数据集,也不用图片。它只做一件事:

让模型从一堆点里学出一条直线。

真实规律是:

text 复制代码
y = 2x + 1

模型一开始不知道 w=2b=1,它会通过 Loss 一点点把参数学出来。

新建 01_numpy_tiny_training_loop.py

python 复制代码
import numpy as np

rng = np.random.default_rng(0)
x = np.linspace(-1, 1, 50)
y = 2 * x + 1 + rng.normal(0, 0.05, size=x.shape)

w = 0.0
b = 0.0
lr = 0.1

for epoch in range(101):
    y_pred = w * x + b
    loss = np.mean((y_pred - y) ** 2)

    grad_w = np.mean(2 * (y_pred - y) * x)
    grad_b = np.mean(2 * (y_pred - y))

    w -= lr * grad_w
    b -= lr * grad_b

    if epoch % 20 == 0:
        print(f"epoch={epoch:03d} loss={loss:.4f} w={w:.3f} b={b:.3f}")

你会看到 w 慢慢靠近 2,b 慢慢靠近 1,Loss 逐渐下降。

这就是训练循环最小版本:

  1. 做预测:y_pred = w * x + b
  2. 算 Loss:均方误差
  3. 算梯度:grad_wgrad_b
  4. 更新参数:w -= lr * grad_w
  5. 重复很多轮

别小看这个例子。CNN、YOLO26 当然更复杂,但训练思想还是这条线。


09 实操教程:PyTorch 训练循环模板

下面给一个 PyTorch 版最小模板,适合小白以后改成自己的分类任务。

新建 02_pytorch_train_loop_template.py

python 复制代码
import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset, random_split

torch.manual_seed(0)

x = torch.randn(600, 2)
y = (x[:, 0] + x[:, 1] > 0).long()

dataset = TensorDataset(x, y)
train_set, val_set = random_split(dataset, [500, 100])
train_loader = DataLoader(train_set, batch_size=32, shuffle=True)
val_loader = DataLoader(val_set, batch_size=64)

model = nn.Sequential(
    nn.Linear(2, 16),
    nn.ReLU(),
    nn.Linear(16, 2),
)

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

for epoch in range(20):
    model.train()
    train_loss = 0.0
    for xb, yb in train_loader:
        pred = model(xb)
        loss = loss_fn(pred, yb)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        train_loss += loss.item() * xb.size(0)
    train_loss /= len(train_loader.dataset)

    model.eval()
    correct = 0
    with torch.no_grad():
        for xb, yb in val_loader:
            pred = model(xb)
            correct += (pred.argmax(dim=1) == yb).sum().item()
    val_acc = correct / len(val_loader.dataset)

    print(f"epoch={epoch:02d} train_loss={train_loss:.4f} val_acc={val_acc:.3f}")

你要重点看这 5 行:

python 复制代码
optimizer.zero_grad()
loss.backward()
optimizer.step()
model.eval()
torch.no_grad()
代码 作用
zero_grad() 清空上一轮梯度
backward() 反向传播,计算梯度
step() 根据梯度更新参数
eval() 切换到验证/推理模式
no_grad() 验证时不计算梯度,节省显存

这就是 PyTorch 训练循环的基本骨架。


10 训练异常时,按这张表排查

异常现象 优先检查 常见原因
Loss 不下降 输入、标签、学习率 标签错、学习率太小、模型太弱
Loss 变成 NaN 学习率、数据异常 学习率太大、数值爆炸
训练好验证差 泛化能力 过拟合、数据分布不一致
验证集特别好但上线差 数据泄漏 验证/测试不独立
某些类别很差 类别分布 样本太少、漏标、类别不一致
检测框偏移 检测标签 框坐标或归一化错误

排查顺序建议:

  1. 先看数据能不能正确读取。
  2. 再看标签是否可信。
  3. 再看预测和标签能不能对应。
  4. 再看 Loss 是否正常下降。
  5. 再看验证集和训练集是否分布一致。
  6. 最后再考虑换模型、调结构。

科研小白最容易反过来:一出问题就换模型。更稳的做法是先查数据和标签。


11 学完本讲,你要能回答 6 个问题

  1. 训练集、验证集、测试集分别做什么?
  2. 一次训练循环包含哪 6 个步骤?
  3. Loss 是什么,为什么它能推动模型学习?
  4. 为什么训练 Loss 下降不等于实际效果一定提升?
  5. epoch、batch、learning rate 分别是什么意思?
  6. 为什么标签质量差时,模型会认真学错?

如果你能把这 6 个问题讲给别人听,第 03 讲就不是"看过了",而是真的学进去了。


12 最后总结

本讲最重要的一句话:

监督学习就是让模型反复"做题---对答案---算错分---改参数"。

完整训练闭环是:

输入样本 → 前向预测 → 计算 Loss → 反向传播 → 优化更新 → 验证观察

后面学 YOLO26 时,只要遇到训练问题,就回到这条链路检查:

数据进来了吗?标签对吗?Loss 算得合理吗?梯度能回传吗?学习率合适吗?验证集真的独立吗?

如果这篇文章帮你把监督学习想清楚了,建议先关注、收藏,也可以转给正在被 Loss 曲线折磨的同学。

评论区留言:Loss。下一篇继续整理第 04 讲:单神经元与逻辑回归,看看最小的可学习单元如何从输入产生预测。


参考资料

  1. B 站视频:《第03讲〈监督学习:数据、标签、Loss与训练循环〉》
    https://www.bilibili.com/video/BV1Ttjg6XEaP/
  2. PyTorch Optimizing Model Parameters
    https://docs.pytorch.org/tutorials/beginner/basics/optimization_tutorial.html
  3. PyTorch Automatic Differentiation with torch.autograd
    https://docs.pytorch.org/tutorials/beginner/basics/autogradqs_tutorial.html
  4. Ultralytics YOLO Train 文档
    https://docs.ultralytics.com/modes/train/
相关推荐
甲维斯1 小时前
GLM5.2超过Opus4.8Think,全球第二了!
前端·人工智能·ai编程
你是个什么橙1 小时前
Python入门学习2:Python 基础语法全解析——从代码结构到输入输出
开发语言·python·学习
宝贝儿好1 小时前
【LLM】第二章:HuggingFace入门学习
人工智能·深度学习·神经网络·学习·算法·自然语言处理
早点睡啊1 小时前
详解Loop Engineering,AI 编程从提示词走向循环系统
人工智能
我是小bā吖1 小时前
Claude Code 模型接入阿里云 AI 网关并统计不同使用者的模型用量
网络·人工智能·阿里云
天风之翼1 小时前
AI 全栈开发实战(9):用户设置与 API Key 管理——账号安全与用量统计
人工智能
秋波。未央1 小时前
Java Agent 开发 · Day 1 学习笔记(含作业完整标准答案)
java·笔记·学习
小撒的私房菜1 小时前
Multi-Agent 里谁来指挥?我用一个调度员,让多个 Agent 开始协作
人工智能·后端·agent
不喝水就会渴1 小时前
【共创季稿事节】HarmonyOS 7.0 时代的新基建 :DevEco CLI + Claude Code,鸿蒙 AI 开发的黄金搭档
人工智能·华为·harmonyos