🧠 第七章 数据标注
📄 一句话概括

二类语料 600 条,按 0% 到 40% 的比例随机翻错标签:测试准确率从 0.920 走到 0.800, 中间 10% 那档甚至略升到 0.927。真正开始伤是 20% 之后——0.900、0.847、0.800 一路往下。

📝 本节和前面几节的关系

前六章讲算法和 NLP。从这一章起换到训练师的日常:喂给模型的数据是怎么来的。 这一节先回答「标注凭什么重要」。

一、标注是什么

标注就是给原始数据贴标签:这张图里有几辆车、这句话是夸还是骂、这段录音说的是哪几个字。 它干的事是把「人能看懂的东西」翻译成「机器能算的东西」。 没有这一步,再多的图、再多的文本,对模型来说都只是字节。 所以有一句话在行业里流传很广:数据决定上限,模型决定离上限多近。标注就是唯一能改上限的环节。 模型调参调到天亮,通常只能挪一两个点;标注质量从 80% 提到 95%,经常能挪十个点。这就是投入产出比。

二、标错了会掉多少

Demo 造了 600 条二类数据,把标签按比例随机翻错,再训练同一个模型。 错误率 0% 到 10%:测试准确率 0.920 → 0.920 → 0.927。几乎没掉,中间那档还略高。 错误率 20% 到 40%:0.900 → 0.847 → 0.800。一路往下。 为什么前 10% 不疼?因为少量随机翻错的标签相当于给模型加了噪声,反而阻止它死记硬背边界。 这叫「标签噪声的正则化效应」,在文献里被反复观察到。 但别把这个当借口。噪声是「随机翻错」才温和; 真实标注错误往往是系统性的——某个人把「路灯」全标成「监控杆」,那就不是噪声,是污染。

三、系统性错误比随机错误可怕得多

随机错误每条数据都错得不一样,模型能从多数里学到对的方向。 系统性错误是同一个方向错到底,模型会把它当成真理学进去,而且学得很自信。 更麻烦的是它不容易被发现:整批数据内部一致,交叉验证也查不出来。只有拿真实场景一跑,才发现全线崩。 所以标注管理里最重要的一条不是「标得准」,是口径统一。 同一批数据由一个人标完,比五个人各标一部分更可靠。 必须多人分标的时候,得先对齐规范、做重叠抽样、算一致性。这些是下一节和 7.1.3 要讲的内容。

四、这一节的边界

Demo 用的是合成数据、二类任务、逻辑回归。它说明的是趋势,不是具体数字。 真实项目里,错误率对应的准确率下降还跟任务难度、类别数、模型容量有关。 多类任务比二类更怕错标,因为错标会跨类污染。 所以这张表不能拿去当验收标准。它的用处是让人有个数量感:「错一成」不是小事,「错三成」等于白干。

五、动手 Demo:标注错误率与模型准确率的关系

造 600 条 8 维二类样本,450 条训练、150 条测试,测试集标签始终干净; 按 0%、5%、10%、20%、30%、40% 的比例随机翻转训练集标签; 每档都训一个逻辑回归,打出训练集和测试集准确率。

mask = rg.random(len(y)) < rate
y_noisy = y.copy()
y_noisy[mask] = 1 - y_noisy[mask]        # 随机翻标签

w, b = fit(X[tr], y_noisy[tr].astype(float))
acc_te = H.acc((sigmoid(X[te] @ w + b) > 0.5).astype(int), y[te])

实跑输出:

--------------------------------------------------------------------
标错了会怎样:标注错误率与模型准确率
--------------------------------------------------------------------
  样本总数                 600(二类各半,8 维)
  训练 / 测试              450 / 150,测试集标签始终干净
  学习率 / 轮数            0.30 / 400

  标注错误率   训练集被翻的条数   训练集准确率   测试集准确率
  ----------------------------------------------------------
          0%                  0          0.913          0.920
          5%                 24          0.860          0.920
         10%                 56          0.804          0.927
         20%                 99          0.740          0.900
         30%                136          0.640          0.847
         40%                195          0.569          0.800

  0% 到 10%                测试准确率 0.920 → 0.927
  0% 到 40%                测试准确率 0.920 → 0.800
  绝对下降                 0.120
  第一行说明一件事:错误率 0% 时训练集准确率也不是 1.000,因为这两类本来就有重叠,天生分不到满分。
  再看前 10 个百分点:几乎没掉,中间那档甚至略高一点——少量标签噪声在这里起了点正则作用,把模型从「死记边界」推回了「看大方向」。
  真正开始伤是 20% 之后:0.900、0.847、0.800,一路往下。所以质量红线该划在 10% 到 20% 之间,而不是「差不多就行」。

第一行 0% 时训练集准确率只有 0.913,不是 1.000——因为两类分布本来就重叠,线性模型分不到满分。 这一点很重要:训练集不满分不一定是模型不行。 训练集准确率那一列一路掉到 0.569,因为标签被翻了一半,模型连训练集都拟合不了了。 测试集那一列才是真实损失:0.920 → 0.800。 注意它不是随着错误率线性下降,中间有个「不疼」的缓冲段。 「被翻的条数」那一列可以核对:5% 时训练集 450 条里有 24 条被翻,24 除以 450 正好 5.3%。

30 秒实验

  1. 把错误率扫到 60%,看测试准确率会不会掉到 0.5 以下。
  2. 改成「系统性翻错」(只翻某一类的标签),看下降曲线和随机翻错差多少。
  3. 想一想:为什么少量随机标签噪声反而可能提升测试准确率?

常见误区

  1. 「标注是体力活,不重要」——它决定模型的上限。
  2. 「错一点没关系,多标点就盖过去了」——错到 20% 之后,多标也救不回来。
  3. 「随机错和系统性错一样」——系统性错会被模型当成真理学进去。
自测三问(点开对答案) 1. 为什么说标注决定模型的上限? —— 标签定义了「什么算对」,标签错的方向,模型学得再准也是错的。 2. 为什么 10% 以内的随机标签噪声伤害不大? —— 它相当于给模型加噪声,阻止死记硬背,起了一点正则作用。 3. 系统性错误为什么比随机错误更危险? —— 同方向错到底,模型会一致地学错,且批内一致,交叉验证也查不出来。

重要性和代价都清楚了。下一节把标注按几何形式分一分,看每种的价钱差多少。

相关笔记