走进一家手工点心工厂。品控流水线每天要给上千盒点心贴口味标签——芝麻、豆沙、莲蓉、奶黄。老师傅手速飞快,可一天下来总有十几盒贴错:明明是芝麻馅,贴上了豆沙签;新来的小工失误率更高。如果你要让学徒通过“标签→口味”学会分辨点心,这些错贴的标签会让他越学越糊涂。这就是机器学习里“标签噪声”的日常投影:训练数据中的标签(y)本该是标准答案,却可能被人为标错。今天这篇文章,我们聊聊如何在“标签不可靠”时把模型练好——先承认噪声存在(概率建模),摸清错误规律(噪声转移矩阵),设计不过度反应的评分规则(鲁棒损失函数),请两位复核员互相把关(Co-teaching),用群众投票的方式把可疑标签挑出来(置信学习),最后定期复盘迭代。

岗位关联

标签噪声是工业级数据落地的头号敌人。掌握清洗与鲁棒训练方法,你就能在众包标注、爬虫数据、低质量数据集上依然训练出高性能模型,这也是数据工程师进阶算法工程师的必考能力。

目录
  1. 可视化演示
  2. 一、先承认标签会贴错:认识标签噪声
  3. 二、给错误规律画一张表:噪声转移矩阵
  4. 三、设计一条不较真的评分规则:鲁棒损失函数
  5. 四、请两位复核员:Co-teaching
  6. 五、让群众投票说话:置信学习
  7. 六、复盘迭代:评估与调优
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示噪声转移矩阵估计、Co-teaching双网络互筛选和置信学习标签清洗三种核心方法,切换模式观察不同的标签噪声处理策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

噪声转移矩阵估计 噪声转移矩阵T(i,j)描述真实类别i被误标为类别j的概率 对角线为正确标注概率,非对角线为噪声概率 T(i,j)=P(y*=j|y=i) 通过估计转移矩阵可修正损失函数补偿噪声影响

一、先承认标签会贴错:认识标签噪声

品控经理老周最初不承认流水线会贴错标签。直到学徒学出来的分类结果乱成一团,他抽查才发现问题:标签噪声一直在污染训练数据。机器学习和点心工厂一样,第一步不是急着清洗,而是正视“标签可能出错”这个事实。

在监督学习里,我们通常假设每个样本 x 都对应一个真实类别 y。可实际标注过程中,y 会以一定概率变成另一个值,记作带噪标签 ỹ。来源多种多样:众包平台标注员水平参差、自动标注脚本有 bug、类别边界本身模糊(比如“奶茶”和“奶绿”)。这些错误统称为标签噪声,它们会让模型把“看走眼”学成规律,丧失泛化能力——也就是在没见过的新数据上表现变差。

噪声可以粗分为两类。对称噪声像随机乱贴标签,错误以相同概率均匀翻转到任意其他类别;非对称噪声则集中发生在相似类别之间,比如把“芝麻”标成“豆沙”——都是黑黑圆圆的,容易混淆。后者更贴近真实场景,也更容易被“摸清规律”。

老周把“标签会贴错”写成了工厂安全守则第一条。模型训练也一样:先承认噪声存在,后面的转移矩阵、鲁棒损失、清洗方法才有了用武之地。

P(y~=i∣x)=∑j=1KP(y~=i∣y=j)⋅P(y=j∣x)\displaystyle P(\tilde{y}=i|x) = \sum_{j=1}^{K} P(\tilde{y}=i \mid y=j) \cdot P(y=j|x)
这个公式是标签噪声建模的基石:我们看到的标签 ỹ,是由“真实类别 y” 经过一道“出错传送带”后得到的。
  1. 真实类别概率P(y=j|x) 表示样本 x 真实属于第 j 类的概率,这是未被污染前的“正确答案”。
    P(y=j∣x)P(y=j|x)
  2. 转移概率P(ỹ=i|y=j) 表示真实类别 j 的标签被错标成 i 的概率,刻画流水线的“出错习惯”。
    P(y~=i∣y=j)P(\tilde{y}=i \mid y=j)
  3. 遍历求和把 j 从 1 到 K 的所有真实类别逐一累加,每个真实类别都可能“贡献”出观测标签 i。
    ∑j=1K\sum_{j=1}^{K}
  4. 观测标签分布最终得到 P(ỹ=i|x),这是训练时模型实际看到的标签分布,也是后续一切修正的出发点。
    P(y~=i∣x)P(\tilde{y}=i|x)

二、给错误规律画一张表:噪声转移矩阵

老周盯着出错记录发现,新员工小范不是乱贴——他九成错误都发生在把“芝麻”贴成“豆沙”,而“莲蓉”几乎从不出错。这不是随机事故,而是有规律的坏习惯。把坏习惯画成表格,就能提前修正。

噪声转移矩阵 T 就是这张“坏习惯表”。T_ij 表示真实类别 i 的标签被标成 j 的概率。它是个 K×K 方阵:对角线上的值代表“贴对”的概率,非对角线代表“贴错”的概率。拿到这张表,既能知道哪些类别最容易互相混淆(便于重点排查),也能用来构造校正后的损失函数。

怎么得到这张表?如果有带真实标签的验证集,可以直接统计混淆频率;如果连验证集都不可靠,可以用置信学习在带噪数据上间接估算。工程上还可以利用模型预测与标签的差异来动态估计矩阵,这正是很多鲁棒训练算法的起点。

有了“坏习惯表”,老周就能在小范贴完标签后做一次系统修正。模型同理:用 T 把观测标签的“习惯性错误”反推回去,从而在训练时向正确的方向更新。

Tij=P(y~=j∣y=i),∑j=1KTij=1\displaystyle T_{ij} = P(\tilde{y}=j \mid y=i), \qquad \sum_{j=1}^{K} T_{ij} = 1
每一行都是“真实类别 i 的所有可能去向”的概率分布:贴对了多少、错贴成哪些类别,行和必须是 1。
  1. 矩阵元素T 的第 i 行第 j 列,表示真实为 i 的标签被贴成 j 的概率。
    TijT_{ij}
  2. 行和归一对固定真实类别 i,所有可能的观测标签概率之和恒等于 1。
    ∑j=1KTij=1\sum_{j=1}^{K} T_{ij} = 1
  3. 对角线语义T_ii 是正确标注概率,越接近 1 说明这个类别的标签越可信。
    Tii=P(y~=i∣y=i)T_{ii} = P(\tilde{y}=i \mid y=i)
  4. 非对角线语义T_ij(i≠j)是各类混淆概率,非对称场景下这些值会明显集中在易混类别上。
    Tij(i≠j)T_{ij} \quad (i \ne j)

三、设计一条不较真的评分规则:鲁棒损失函数

老周发现,与其事后追着修正每个错贴标签,不如换一套评分规则——让整套打分机制不再因为个别错贴而剧烈震荡。就像一张满分 100 的考卷,某道选择题题干印错了,不该让整张卷子分数失真。

深度学习中最常用的交叉熵损失(衡量模型预测与标签差距的指标)对噪声极其敏感:当模型在错标样本上“正确地”预测了错误标签时,交叉熵会给出很大的惩罚,逼着模型疯狂记忆噪声。于是研究者提出“对称损失”:它满足“所有类别的损失加起来是常数”的性质,从而保证标签翻转时期望损失不变。

广义交叉熵(GCE)把交叉熵和平均绝对误差(MAE)统一到一个家族。参数 q 在 0 到 1 之间调节:q 越接近 0,行为越像交叉熵,拟合能力强但抗噪弱;q 越接近 1,行为越像 MAE,抗噪强但拟合能力弱。实际使用中取 q=0.7 左右常能兼顾两者。

老周把评分规则从“错一题扣 10 分”改成“错一题最多扣 5 分”,个别贴错的标签再也掀不起大浪。损失函数设计也是同一道理:不较真,才不会被噪声绑架。

LGCE(f(x),y)=1−fy(x)qq,q∈(0,1]\displaystyle L_{\mathrm{GCE}}(f(x), y) = \frac{1 - f_y(x)^q}{q}, \quad q \in (0,1]
f_y(x) 是模型认为样本属于真实类别 y 的概率。q 控制“较真”程度,q 越大对错误标签越宽容。
  1. 预测概率f_y(x) 是模型输出中第 y 类的概率,取值在 0 到 1 之间,反映模型的把握程度。
    fy(x)f_y(x)
  2. 幂次调节f_y(x)^q 把概率做 q 次幂缩放,q 越大,低概率区域被压缩得越狠。
    fy(x)qf_y(x)^q
  3. 取差归一(1 − ·)/q 保证损失值在合理范围,q=1 时恰好退化为 MAE。
    1−fy(x)qq\frac{1 - f_y(x)^q}{q}
  4. 极端情形q→0 时该式收敛于交叉熵的形式,由此连接起“敏感”与“鲁棒”两个世界。
    lim⁡q→01−fy(x)qq\lim_{q \to 0} \frac{1 - f_y(x)^q}{q}

四、请两位复核员:Co-teaching

老周决定上双保险——请两位复核员 A 和 B 坐在流水线两端。A 挑出自己最有把握“标签没贴错”的样品让 B 学习,B 也把自己最有把握的样品交给 A 学习。两人培训方法不同、看问题的角度不同,所以不会同时被同一张错标签带偏。

Co-teaching 的核心直觉是“小损失样本更可能干净”。模型对干净样本学得快、损失低;对噪声样本记忆慢、损失高。每轮训练中,两个网络各自独立计算所有样本的损失,选出损失最小的 R(T)% 样本,作为“可信数据集”送给对方网络训练,而不是训练自己——这是它与简单自训练最本质的区别。

保留率 R(T) 不是固定值,而是随轮次 T 动态变化:训练早期模型对噪声还不敏感,可以保留较多样本;随着训练推进,模型越来越能区分噪声,保留率逐步退火,最终接近 1−ε,其中 ε 是噪声率。两个网络采用不同初始化,确保筛选出的样本具有互补性。

两位复核员虽然单独都会犯错,但“我挑的你训练、你挑的我训练”的互筛机制,让错标签在交叉把关中无处遁形。这就是 Co-teaching 用最简单的方式守住数据质量的故事。

Dˉ=arg⁡min⁡D′: ∣D′∣=R(T)∣D∣  ∑(x,y)∈D′ℓ(f(x),y)\displaystyle \bar{D} = \arg\min_{D': \, |D'| = R(T)|D|} \; \sum_{(x,y) \in D'} \ell(f(x), y)
公式表达的是“从全部样本中挑出总损失最小的一批”,这批样本被视为相对干净的「可信集」。
  1. 损失函数ℓ(f(x), y) 表示模型对单个样本的损失,损失小代表模型对该样本“有把握”。
    ℓ(f(x),y)\ell(f(x), y)
  2. 候选子集D' 是原始数据集 D 的一个子集,大小被固定为 R(T)|D|。
    ∣D′∣=R(T)∣D∣|D'| = R(T)|D|
  3. 最小化目标argmin 在满足大小约束的所有子集中,找到总损失和最小的那个子集。
    arg⁡min⁡D′∑(x,y)∈D′ℓ(f(x),y)\arg\min_{D'} \sum_{(x,y) \in D'} \ell(f(x), y)
  4. 动态保留率R(T) 随轮次 T 从 1 向 1−ε 退火,训练后期只保留小损失样本。
    R(T)→1−εR(T) \to 1 - \varepsilon

五、让群众投票说话:置信学习

单纯靠一个人判断总有盲区。老周想了个办法:不直接问“哪个标签错了”,而是把所有贴着“豆沙”标签的样品摆一桌让大家投票。如果一堆贴着“豆沙”的样品,绝大多数人吃起来都说像“芝麻”,那这批标签就非常可疑。

置信学习(Confident Learning)把模型当作“品尝者”。先用交叉验证训练模型,得到每个样本的预测概率;然后统计对每个标签类 ỹ,有多少样本模型高置信地认为属于另一个类 y*——这些样本就是潜在的“错贴标签”。相比于直接设阈值砍人,它更讲究“用群体的统计规律来定罪”。

具体做法是构造计数矩阵 C,记录“标注为 ỹ 但模型认为更像 y*”的样本数量。判定阈值取该类所有样本的平均预测置信度。随后对计数矩阵做行归一化,估算出真实噪声样本数量,并据此清洗或修正标签。工业界成熟的 cleanlab 库正是这一思想的工程实现。

不用“一个人说了算”——计数矩阵加平均阈值就像一场匿名投票,把老周一个人发现不了的错标签全揪了出来。清洗完毕,数据集就从“带毒状态”恢复成干净状态。

Cy~,y∗=∑i:y~i=y~1(p^y∗(xi)≥ty~),n^y~→y∗=Cy~,y∗∑jCy~,j⋅ny~\displaystyle C_{\tilde{y}, y^{*}} = \sum_{i: \tilde{y}_i = \tilde{y}} \mathbb{1}\Big( \hat{p}_{y^{*}}(x_i) \ge t_{\tilde{y}} \Big), \qquad \hat{n}_{\tilde{y} \to y^{*}} = \frac{C_{\tilde{y}, y^{*}}}{\sum_{j} C_{\tilde{y}, j}} \cdot n_{\tilde{y}}
前一半统计“嫌疑犯数量”,后一半把它换算成“真实噪声数量”——群众投票结果就这样变成了可执行的清洗清单。
  1. 阈值设定对每个标注类 ỹ,取该类所有样本的平均预测置信度作为判定门槛。
    ty~=1ny~∑i:y~i=y~p^y~(xi)t_{\tilde{y}} = \frac{1}{n_{\tilde{y}}} \sum_{i: \tilde{y}_i = \tilde{y}} \hat{p}_{\tilde{y}}(x_i)
  2. 指示函数括号内条件成立取 1,否则取 0,相当于一张“是/否”选票。
    1(p^y∗(xi)≥ty~)\mathbb{1}\big( \hat{p}_{y^{*}}(x_i) \ge t_{\tilde{y}} \big)
  3. 逐样本累加对所有标注为 ỹ 的样本求和,得到计数矩阵元素。
    Cy~,y∗=∑i:y~i=y~1(⋅)C_{\tilde{y}, y^{*}} = \sum_{i: \tilde{y}_i = \tilde{y}} \mathbb{1}(\cdot)
  4. 行归一化把第 ỹ 行的计数除以整行之和,得到“这类标签中实际属于 y*”的比例。
    Cy~,y∗∑jCy~,j\frac{C_{\tilde{y}, y^{*}}}{\sum_{j} C_{\tilde{y}, j}}
  5. 换算总量比例乘以该标注类的样本总数 n_ỹ,得到应修正/清洗的样本数量估计。
    n^y~→y∗=(比例)⋅ny~\hat{n}_{\tilde{y} \to y^{*}} = (\text{比例}) \cdot n_{\tilde{y}}

六、复盘迭代:评估与调优

改完流程,老周每周五开复盘会:这周清洗掉多少标签?有没有误伤无辜?保留率定多少合适?他意识到,清洗不是一锤子买卖,而是一个可以反复迭代的过程。

Co-teaching 的保留率 R(T) 应随训练轮次逐渐退火到 1−ε,其中 ε 是估计的噪声率。噪声率高,最终保留的样本就少;噪声率低,则可以保留更多。迭代式清洗的做法是“训练 → 清洗 → 再训练 → 再清洗”的循环:每一轮模型都更自信,清洗出来的结果也越可靠。

评估清洗效果要同时盯住两个指标:一是召回率,即真实噪声样本被找出多少;二是误清洗率,即干净样本被冤枉多少。尤其要注意:测试集必须保持原始标注分布,绝不能“顺手”在测试集上清洗,否则评估结果失真,掩盖模型在真实噪声环境下的表现。

复盘会上,老周用抽查小样估算误伤率,让整条流水线在“清理噪声”和“保存信息”之间找到平衡。清洗与训练本来就不是两件事,而是一个不断对话的闭环。

lim⁡T→∞R(T)=1−ϵ\displaystyle \lim_{T \to \infty} R(T) = 1 - \epsilon
这条极限关系揭示了 Co-teaching 退火策略的依据:训练收敛时,保留样本比例应当恰好等于数据集中干净样本的比例。
  1. 保留率随轮次变化R(T) 是第 T 轮保留的训练样本比例,训练早期接近 1。
    R(T)R(T)
  2. 噪声率上限ε 是数据集的标签噪声率,是清洗与训练前需要估计的关键参数。
    ϵ\epsilon
  3. 收敛极限T 趋于无穷时,保留率收敛到 1−ε,恰好留下干净样本。
    lim⁡T→∞R(T)\lim_{T \to \infty} R(T)
  4. 工程意义该式指导我们按“先多留、后少留”的节奏调整每轮筛选比例,兼顾早期学习与后期精筛。
    1−ϵ1 - \epsilon

AI 应用场景

众包标注平台的质量筛查

阶段:数据准备与清洗

解决的问题:众包平台上标注员水平参差,返回的标签常常带 5%–20% 噪声。传统做法靠人工抽检,费时费力且抽检率低。采用置信学习统计计数矩阵、估算噪声标签数量,再配合 Co-teaching 训练鲁棒模型,可在无人干预的情况下自动圈定可疑标注。

具体案例:某自动驾驶数据标注平台收到 10 万张道路图片的“行人/车辆/信号灯”三类标签。利用 cleanlab 清洗后发现约 8% 标签可疑,其中夜间图像的错误率高达 15%。平台将可疑样本退回人工复核后,模型准确率提升 6 个百分点。

工业视觉质检的鲁棒模型训练

阶段:模型训练与优化

解决的问题:工厂产线上的自动标注脚本偶尔会把“划痕”标成“脏污”,这类非对称噪声集中在相似缺陷类别之间。用噪声转移矩阵量化混淆规律,再配合广义交叉熵损失训练,即使部分标签错了,质检模型也不会把“划痕”记忆成“脏污”。

具体案例:某面板厂使用 MAE 对称损失替换交叉熵后,在标签噪声约 15% 的产线数据上,缺陷分类准确率从 82% 提升到 89%,几乎追平人工复核后训练的模型。

医疗影像标注修正

阶段:数据治理与模型迭代

解决的问题:医疗影像标注依赖高年资医生,成本极高,而低年资医生标注噪声率高、且常集中在疑难病灶上。用置信学习对历史标注做“群体投票”,再按噪声转移矩阵修正标签,能显著降低高年资医生的复核负担。

具体案例:某团队整理胸部 X 光片历史标注时,用置信学习识别出约 12% 疑似错误标签。抽样复核后确认其中八成确实标错,修正后的数据集使肺炎检测模型的 AUC 从 0.87 提升到 0.92。

Python 演示

python63 行
import numpy as npfrom sklearn.datasets import make_classificationfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score # 制造标签噪声: 随机翻转部分样本的类别def inject_noise(y, noise_rate=0.2, seed=42):    rng = np.random.RandomState(seed)    y_noisy = y.copy()    n_noise = int(len(y) * noise_rate)    idx = rng.choice(len(y), n_noise, replace=False)    for i in idx:        candidates = [c for c in np.unique(y) if c != y[i]]        y_noisy[i] = rng.choice(candidates)    return y_noisy # 教学版置信学习: 用类别平均置信度做阈值# 只剔除"低置信且模型预测与标签矛盾"的样本def confident_cleaning(X, y_noisy, proba):    clean_mask = np.ones(len(y_noisy), dtype=bool)    preds = proba.argmax(axis=1)    for c in np.unique(y_noisy):        cls_idx = np.where(y_noisy == c)[0]        t = proba[cls_idx, c].mean()   # 置信学习阈值        suspect = cls_idx[(proba[cls_idx, c] < t) & (preds[cls_idx] != c)]        clean_mask[suspect] = False    return clean_mask def main():    X, y = make_classification(n_samples=600, n_features=8,                               n_informative=5, n_classes=2,                               random_state=42)    y_noisy = inject_noise(y, noise_rate=0.2)    Xtr, Xte, ytr, yte, ytr_true, yte_true = train_test_split(        X, y_noisy, y, test_size=0.3, random_state=42)     # 普通模型: 直接用带噪标签训练    model_raw = LogisticRegression(max_iter=500)    model_raw.fit(Xtr, ytr)    acc_raw = accuracy_score(yte_true, model_raw.predict(Xte))     # 上界: 用真实干净标签训练    model_oracle = LogisticRegression(max_iter=500)    model_oracle.fit(Xtr, ytr_true)    acc_oracle = accuracy_score(yte_true, model_oracle.predict(Xte))     # 清洗后训练: 先用模型看置信度, 剔除疑似噪声再重训    model_conf = LogisticRegression(max_iter=500)    model_conf.fit(Xtr, ytr)    proba_tr = model_conf.predict_proba(Xtr)    clean_mask = confident_cleaning(Xtr, ytr, proba_tr)    model_refit = LogisticRegression(max_iter=500)    model_refit.fit(Xtr[clean_mask], ytr[clean_mask])    acc_cleaned = accuracy_score(yte_true, model_refit.predict(Xte))     print(f"普通训练: acc = {acc_raw:.3f}")    print(f"清洗后训练: acc = {acc_cleaned:.3f}")    print(f"干净标签上界: acc = {acc_oracle:.3f}")    print(f"剔除样本占比: {1.0 - clean_mask.mean():.3f}") if __name__ == "__main__":    main()
目的:演示“先训练一个模型获得置信度,再按置信学习思想清洗带噪标签,最后用干净子集重训”的完整闭环。
  1. y_noisy = inject_noise(y, noise_rate=0.2)生成带噪标签,模拟真实场景中约 20% 的标注错误。
  2. t = proba[cls_idx, c].mean()对每个类别取平均预测置信度作为阈值,对应正文中的 t_ỹ。
  3. suspect = cls_idx[(proba[cls_idx, c] < t) & (preds[cls_idx] != c)]只标记“低置信且预测与标签矛盾”的样本为可疑噪声,避免误伤。
  4. clean_mask[suspect] = False把可疑样本从训练集中屏蔽,生成清洗后的遮罩。
  5. model_refit.fit(Xtr[clean_mask], ytr[clean_mask])用干净子集重新训练模型。
  6. print(f"清洗后训练: acc = {acc_cleaned:.3f}")输出清洗后准确率,直观对比清洗带来的收益。

常见误区

误区有噪声就多删一点,样本删得越多,数据越干净,模型效果一定越好。反正低置信样本都是错的。

正解过度清洗会误伤难样本和稀有类别样本。这些样本预测置信度天然偏低,容易被当成噪声删除,导致类别分布偏移。置信学习之所以用“行归一化计数矩阵”而不是“简单按置信度砍头”,就是要在“清洗噪声”和“保留信息”之间做统计校准,而不是一刀切。

为何常见:直觉上“脏东西要清干净”,但忽略了模型自己的判断也会错,盲目的清洗等于让不完善的模型做独裁者。

误区噪声转移矩阵 T 需要一个带真实标签的验证集才能统计出来。现实项目通常没有干净标注,所以这个方法根本用不了。

正解验证集频率统计只是估计 T 的一种途径。置信学习可以直接在带噪数据上通过交叉验证概率来估算计数矩阵,再反推转移矩阵;Co-teaching 则干脆不需要显式的 T,靠双网络互筛就完成了隐式修正。没有干净验证集,依然有路可走。

为何常见:教科书通常先从“给定 T”出发推导鲁棒损失,很多人就误以为 T 必须在训练前已知。

误区数据不干净,什么噪声都一样,用同样的清洗方法处理即可。

正解标签噪声只影响 y,不影响输入 x——图片本身是真的,只是答案贴错了。特征噪声则指输入本身被污染(如摄像头坏点、传感器漂移)。前者用损失修正、样本筛选、双网络互筛来处理,后者通常需要滤波或异常检测。把两者混为一谈,会在实际数据治理中选错工具。

为何常见:它们都叫“噪声”,又经常同时出现在低质量数据集里,让人误以为是一件事。

误区清洗让数据更干净,那测试集也应该清洗一遍,这样评估出来的指标才“好看”,更能体现模型真实水平。

正解测试集代表模型部署时真实遇到的数据分布。如果在测试集上清洗掉“疑似噪声”,就等于人为降低了任务难度,评估结果会虚高。正确的做法是保留测试集原貌(或使用独立干净标注),只用清洗策略改进训练集。虚假的高分会让模型上线后原形毕露。

为何常见:人总是希望评估结果好看,尤其是发现测试集里确实有标注错误时,“顺手修一下”的诱惑很难抵挡。

面试题

Q1. 标签噪声通常指的是什么?

单选题 · easy

  • A.输入特征存在缺失或异常
  • B.样本标注与真实类别不符← 正确答案
  • C.模型初始化中的随机扰动
  • D.采集环境干扰导致的数据抖动

答案:B。标签噪声专指 y 层面出错——样本本身没问题,但贴上去的标签与真实类别不一致。A 和 D 描述的是特征噪声,C 描述的是模型随机性,都与“标签错误”无关。就像点心没坏,只是贴纸贴错了。

Q2. 对称噪声与不对称噪声的关键区别是?

单选题 · easy

  • A.前者只作用于少数类
  • B.前者任意翻转,后者集中易混类← 正确答案
  • C.后者发生概率必然更高
  • D.两者在实际表现上无差异

答案:B。对称噪声把标签以相同概率随机翻转到任意其他类,像随机乱贴;非对称噪声集中在相似类别之间,像把芝麻标成豆沙。二者在实际数据集中的分布完全不同,处理策略也不同,A、C、D 均不符合定义。

Q3. 噪声转移矩阵中 T_ij 表示什么?

单选题 · easy

  • A.模型将类别 i 预测为 j 的概率
  • B.真实 i 的标签被标注成 j 的概率← 正确答案
  • C.标签从 j 翻转成 i 的概率
  • D.类别 i 在整个数据集的出现率

答案:B。T_ij 是真实类别为 i 的标签被错误标注成 j 的概率,行代表真实类别,列代表观测到的标签。A 说的是模型预测而非标注过程,C 把下标顺序搞反了,D 是类别先验频率。

Q4. 为什么交叉熵损失在标签噪声下表现脆弱?

单选题 · mid

  • A.对数计算成本高,训练速度慢
  • B.错误标签损失大,模型被迫记忆噪声← 正确答案
  • C.只支持二分类无法多分类
  • D.无需 softmax 归一化即可使用

答案:B。交叉熵对“模型在错标样本上预测错误标签”施加极大惩罚,损失值可无限大,模型为了降低损失被迫去记忆噪声样本。A 只是工程开销问题,C、D 是事实错误——交叉熵天然支持多分类且依赖 softmax。

Q5. 广义交叉熵 GCE 中参数 q=1 时退化为哪种损失?

单选题 · mid

  • A.平均绝对误差 MAE← 正确答案
  • B.标准交叉熵损失
  • C.均方误差 MSE
  • D.铰链损失 Hinge

答案:A。GCE 公式为 (1−f_y^q)/q,代入 q=1 得 1−f_y,这正是平均绝对误差的形式。q→0 时才逼近交叉熵,MSE 是回归损失,Hinge 是 SVM 常用损失,都与 GCE 的退化端点无关。

Q6. 关于 Co-teaching 机制的正确说法是?

多选题 · mid

  • A.两个网络各自计算损失并挑小损失样本← 正确答案
  • B.网络 A 用自己挑的样本独立完成训练
  • C.网络 A 的小损失样本被用来训练网络 B← 正确答案
  • D.保留率随训练轮次增加而递减← 正确答案

答案:ACD。Co-teaching 的双网络各自独立计算损失、互选小损失样本交给对方训练,而不是训练自己,所以 B 错。保留率 R(T) 按“先多留、后少留”的节奏退火,D 正确。核心就是“我挑的你训练”,让两个网络形成互补筛选。

Q7. 置信学习中类别阈值 t_ỹ 通常如何确定?

单选题 · mid

  • A.手工固定设置为 0.5
  • B.取该类样本的平均预测概率← 正确答案
  • C.取全部样本中的最大预测概率
  • D.从验证集中随机抽样估计

答案:B。置信学习对每个标注类 ỹ,计算该类所有样本在 ỹ 类上的平均预测概率作为阈值。这个阈值随类别自适应,A 的固定 0.5 无法适应不同类别难度,C 关注的是全局最大值而非类别内统计量,D 的随机抽样缺少统计依据。

Q8. 下列哪些方法可以用于应对标签噪声?

多选题 · mid

  • A.估计噪声转移矩阵← 正确答案
  • B.使用鲁棒损失函数← 正确答案
  • C.Co-teaching 双网络互筛← 正确答案
  • D.删除所有低置信样本

答案:ABC。估计转移矩阵可校正训练过程,鲁棒损失能降低错标签干扰,Co-teaching 用双网络互筛挑选干净样本,三者都是验证过的方案。D 的“删除所有低置信样本”属于过度清洗,会误伤难样本,是典型误区。

Q9. 关于 Co-teaching 训练过程,正确的是?

多选题 · hard

  • A.双网络参数独立但相互传递干净样本← 正确答案
  • B.保留率随轮次逐渐降低至保留 1−ε← 正确答案
  • C.两个网络的最终参数完全相同
  • D.小损失样本在低噪声时更接近干净样本← 正确答案

答案:ABD。Co-teaching 两个网络参数独立,只是把各自的小损失样本交给对方训练,A 对。保留率退火到 1−ε,B 对。参数完全不同,C 错。小损失样本确实更可能是干净样本,尤其噪声率较低时这一直觉更可靠,D 对。

Q10. 清洗测试集后模型评估指标显著提高,最可能的原因是?

单选题 · extreme

  • A.模型泛化能力确实显著提升
  • B.清洗测试集掩盖了真实噪声下的表现← 正确答案
  • C.清洗对测试集的评估结果无影响
  • D.噪声只影响训练集而不影响测试集

答案:B。测试集应保留原始标注分布以模拟真实部署环境。清洗测试集相当于把考试题目的“错别字”都改了再让考生答题,分数虚高并不能反映真实能力,B 对。A 是虚假自信,C 与题意矛盾,D 忽视了测试集同样存在标注噪声的事实。