多噪声标签学习:在含有错误标签的数据上训练鲁棒模型

FreeGuideOnline 最新 2026-06-27

什么是多噪声标签学习?

在监督学习中,我们通常假设数据集提供的标签是绝对正确的。但在真实世界的海量数据里,标签往往是低成本、弱监督方式获得的(如网络爬取、众包标注、自动规则生成等),标签噪声几乎是不可避免的。

多噪声标签学习(Learning with Noisy Labels) 研究的就是:如何在训练数据包含大量错误标签的情况下,依然训练出高性能、鲁棒的深度学习模型。它不仅关系到模型精度的天花板,更是 AI 走向低成本、大规模工业落地的关键支撑技术。


你将从本教程学到什么

  • 理解标签噪声的成因与数学定义
  • 掌握噪声标签影响模型的深层原因
  • 系统梳理五大类抗噪声训练方法
  • 了解常用的基准数据集与评估指标
  • 提供可直接运行的 PyTorch 代码骨架

标签噪声:定义与常见类型

在进入方法论之前,我们先从数学上理解噪声标签。设实例的真实标签为 $y$,我们观测到的标签为 $\tilde{y}$。噪声可以描述为条件概率 $P(\tilde{y} \mid y, x)$,其中 $x$ 是输入特征。

按依赖关系分类

  • 随机噪声 (Random Noise):$\tilde{y}$ 仅依赖于真实标签 $y$,与输入无关。
    例:对称翻转——猫有 20% 概率被标成狗,20% 概率标成汽车,各类别均匀混淆。

  • 类别依赖噪声 (Class-dependent Noise):某些类别更容易被误标为特定其他类别。
    例:老虎常被误标为猫,但很少被标成桌子。

  • 实例依赖噪声 (Instance-dependent Noise):$\tilde{y}$ 依赖于具体实例 $x$,是最困难也最常见的真实场景。
    例:低分辨率、遮挡严重的图像更可能被标错。

按噪声结构分类

  • 闭集噪声 (Closed-set):错误标签仍属于已知类别空间。
  • 开集噪声 (Open-set):错误标签指向已知类别之外的全新类别(在训练时未见过的噪声类)。

现实中的噪声通常是实例依赖 + 闭集/开集混合的,这要求算法必须对噪声模式有高度自适应性。


为什么噪声标签会导致模型崩溃?

神经网络同时具备记忆能力泛化能力。而标签噪声恰恰会诱导模型优先“记忆”错误——因为梯度下降会拼命最小化包括错误标签在内的训练损失。

核心矛盾:过拟合噪声

在标准交叉熵损失下,模型学习过程可以分为两个阶段:

  1. 简单模式学习期:快速拟合正确标签的高置信度样本。
  2. 记忆噪声期:模型开始强行拟合错误标签,导致测试精度骤降。

这就是著名的记忆效应 (Memorization Effect)。如果没有特殊干预,深层网络甚至可以在训练集上将含有大量噪声的标签拟合到接近 100% 的准确率,但其泛化能力会被彻底破坏。

解决这个矛盾,正是“多噪声标签学习”的核心使命。


五大主流抗噪声训练方法

以下方法均可互相组合,形成更强大的噪声鲁棒训练流程。为了便于实践,我们聚焦于深度神经网络训练的通用策略。

1. 鲁棒损失函数

直接修改损失函数,降低其对可疑高损失样本的敏感度。

典型方法:

  • 平均绝对误差 (MAE) / 广义交叉熵
    MAE 对待所有样本的梯度幅值相同,天然抗噪声,但收敛慢且对类别数不敏感。
    改进方案如 GCE (Generalized Cross Entropy),在一个盒式衰减系数 $q$ 下统一交叉熵与 MAE: $$ L_{GCE} = \frac{1 - p_y^q}{q} $$

  • 对称交叉熵 (Symmetric Cross Entropy, SCE)
    在交叉熵基础上增加一项“反向交叉熵” $-\sum_{k} \frac{1}{K} \log p_k$,鼓励模型对错误标签不那么自信。

  • 泰勒交叉熵 (Taylor Cross Entropy)
    利用高阶泰勒展开修正交叉熵,对高噪声满足度更高。

使用建议:在闭集噪声比率不极端(<50%)时,GCE 和 SCE 实现简单且有效。

2. 样本选择与重加权

利用训练过程中的动态信息,识别出相对“干净”的样本,仅用这些样本更新模型,或为干净样本分配高权重。

核心思路:

  • 小损失准则 (Small-loss Trick)
    在训练的每个 epoch,对每个样本的前向损失进行排序,选择损失最小的 $R%$ 样本认为是干净样本,仅用这些样本计算梯度。代表性的 Co-teaching 系列算法正是基于此思想,并让两个网络互相为对方选择小损失样本。

  • 联合学习选择 (JoCoR)
    两个模型共享损失,用联合损失共识选择样本,避免因单模型偏差导致的噪声选择。

  • 基于置信度的重加权 (Self-Weighting)
    根据样本预测概率动态分配权重,高置信度样本获得更大学习率。

实现要点:记忆率 $R$ 通常采用衰减策略,即在训练初期保留较多样本(让模型先学习通用模式),之后逐步收紧仅保留真正干净的样本。

3. 标签校正

不直接抛弃噪声样本,而是试图“修正”它们的标签,让模型学到修正后的监督信号。

典型方法:

  • 自标签校正 (Self-Label Correction)
    以当前模型的预测作为软标签(或硬标签)替代原始噪声标签。例如 PENCIL 框架通过反向传播同时更新网络权重和标签分布。

  • 模型集成校正
    使用多个模型的平均预测来更新标签,兼具更稳定和更准确的校正效果。

  • 半监督视角校正
    将噪声标签视为一部分未标注数据,对高置信度样本做伪标签传播,即把问题转化为半监督学习。DivideMix 是典型方案:利用高斯混合模型将样本划分为干净集和噪声集,噪声集的标签被模型预测替代。

标签校正特别适合闭集噪声比率较高的场景,但需要警惕“确认偏差”(模型固执于自己的错误预测)。

4. 元学习

用一个小型、干净的元数据集(通常仅需几百张精准标注的样本)来“教导”模型如何从噪声数据中学习。

工作原理:

  • 外层优化:在元数据上计算损失,梯度通过元数据传播以更新主模型的权重或样本权重函数
  • MW-Net:学习一个隐式的加权函数,为批次内每个样本输出一个权重。
  • L2RW (Learning to Reweight):在每次迭代中,利用元梯度动态更新样本重要性权重,使得模型对噪声样本自动降权。

元学习方法在实例依赖噪声下表现出色,理论优雅,但加入元数据集也引入了额外成本。对于缺少干净标签的场景,可以由专家或高置信度算法自动构建元集。

5. 正则化与数据增强的高级应用

正则化手段可以有效阻碍模型拟合无规律的噪声标签,但需要巧妙设计。

  • 标签平滑 (Label Smoothing)
    将硬标签 $y$ 替换为 $(1-\epsilon) y + \epsilon/K$,减少过拟合于错误 hard 标签。

  • MixUp 及其变体
    随机插值输入和对应标签,对噪声进行隐式平滑和鲁棒性提升。在多种噪声基准测试中,MixUp 是简单有效的基础组件。

  • 早停 (Early Stopping) 与阶段策略
    抓住“模式学习先于噪声记忆”的特点,在测试精度趋于稳定时就停止训练。更高级的使用验证集引导自终止。

  • 对比学习预训练 (Contrastive Pre-training)
    先通过自监督学习获得对噪声鲁棒的特征表示,再在有限干净+大量噪声数据上微调,显著降低对标签的依赖。


实战篇:基准数据与评估指标

常用数据集

数据集 特点 噪声制作方式
CIFAR-10/100 经典图像分类 人工加噪声:对称翻转(随机噪声)或配对翻转(类别依赖),噪声比率可调 20%~90%
Clothing1M 1M 张电商服装图,标签来自周围文本,真实噪声约 38% 纯真实噪声,有少量干净子集用于测试和验证
WebVision 从 Flickr/Google 爬取的 240 万张图,高度现实噪声 真实网络噪声,是大规模噪声学习的标准基准
ANIMAL-10N 10 类动物,人类标注者故意错误标注,模拟实例依赖噪声 真实人类标注噪声

评估指标

  • 测试精度 (Test Accuracy):在严格干净的测试集上评估才是“鲁棒性”的最终度量。
  • 噪声转移后的标注精度 (Label Correction Accuracy):衡量校正后标签与真实标签的一致率,用于分析方法校正能力。
  • 噪声检测 AUC:评估算法区分干净/噪声样本的能力,在样本选择方法中至关重要。

代码骨架:用 DivideMix 在 CIFAR-10 上训练抗噪声模型

以下提供一个简化的 PyTorch 核心思路,帮助你快速理解标签校正+半监督方法的整合。完整版可构建训练循环并即插即用。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
import numpy as np
from sklearn.mixture import GaussianMixture

# 假设 model_A, model_B 是两个结构相同的网络
# train_loader 包含噪声标签
# clean_criterion: 用于样本划分的小损失标准
# class_criterion: 用于校正标签的半监督损失

for epoch in range(num_epochs):
    # 1. 前向传播,计算每个样本的损失 (用 CE)
    losses = []
    with torch.no_grad():
        for images, labels in train_loader:
            logits = model_A(images)
            loss = nn.CrossEntropyLoss(reduction='none')(logits, labels)
            losses.extend(loss.cpu().numpy())

    # 2. 使用 GMM 根据损失将数据集划为干净/噪声
    losses = np.array(losses).reshape(-1, 1)
    gmm = GaussianMixture(n_components=2, max_iter=10, tol=1e-2, 
                          reg_covar=5e-4)
    gmm.fit(losses)
    prob = gmm.predict_proba(losses)
    clean_idx = (prob[:, 0] < prob[:, 1])  # 假设低损失为干净集

    # 3. 构建干净与噪声两个数据子集
    clean_dataset = Subset(train_dataset, np.where(clean_idx)[0])
    noisy_dataset = Subset(train_dataset, np.where(~clean_idx)[0])

    # 4. 对干净样本计算标准交叉熵,对噪声样本计算标签校正后的损失
    # (这里混合使用模型 A 和 B 的预测进行协同训练,保持多样性)
    for (img_clean, label_clean), (img_noise, label_noise) in zip(clean_loader, noisy_loader):
        # ... 实现 co-refurbishment 与 MixMatch 风格增强
        # 1) 对干净样本:标准 CE
        # 2) 对噪声样本:使用另一模型的预测生成伪标签,用一致性损失
        pass

    optimizer.step()

关键提示:真正实现时需加入 Co-training(模型 A 为 B 选择样本,B 为 A 选择样本)、MixMatch 增强及指数移动平均等技巧,才能达到论文报告的性能。


方法选择指南与前沿展望

根据你的场景选择起点

场景 推荐方法组合
噪声比率未知且较低(<30%) 鲁棒损失函数(GCE/SCE)+ MixUp 数据增强
噪声比率高(>50%) DivideMix 类半监督标签校正框架
拥有极少量干净数据(1%~5%) 元学习 (L2RW) 或半监督预训练 + 微调
大规模真实网络噪声 对比学习预训练 + 样本选择 + 标签平滑
计算资源受限 单网络 + 小损失筛选 + 早停

当前挑战与方向

  • 长尾分布 + 噪声标签:头部类易记忆噪声,尾部类样本少难以区分干净与否。
  • 开集噪声:如何识别并彻底拒绝未知类别的噪声样本,而不强行归类。
  • 无源域数据 (Source-free):只提供噪声数据,无法访问干净验证集,如何自适应地设置超参(如选择比率)。
  • 可解释性与审计:模型究竟学到了怎样的噪声-干净边界?需要更具解释性的工具。

多噪声标签学习正从“容忍错误”走向“利用错误、校准错误”,并与自监督学习、基础模型相互促进。掌握这些核心方法论,你将能在海量低成本数据上构建强大且可信的 AI 系统。


本教程持续更新,如果你有任何问题或希望看到更多细分主题,欢迎在评论区提出。抗噪声路上,我们一起把脏数据变成沃土。