想象一个后厨学徒小林。大师傅日理万机,不可能把每道菜的完整做法都亲口教一遍。小林有个本事:面对一张新菜谱,他能凭已有经验猜出味道走向,但有些菜谱他一看就发怵——咸甜拿不准,火候没概念。于是小林定下规矩:每次只挑自己最没把握的几道菜去请教大师傅。这样一来,师傅的时间不浪费,自己的短板补得也最快。 机器学习里的主动学习(Active Learning)干的就是这件事。训练好的模型像小林,海量未标注数据像一摞菜谱,人工标注者像大师傅。与其把几万条数据全部标完再训练,不如让模型先自己看一遍,挑出它“最困惑”的样本去请人标注。这个挑选规则叫查询策略,其中最常用的一大类就是不确定性采样——谁最没把握,就先问谁。 不确定性采样有三位主力:置信度采样(看最高把握有多低)、边缘采样(看前两个选项咬得多紧)、熵采样(看整体思路有多乱)。本篇就用小林的后厨故事,把这三兄弟讲透:怎么算、怎么选、怎么配合标注流程、怎么提防“越采越偏”的坑,以及和其他采样策略如何搭配。
掌握不确定性采样,就掌握了用最少标注成本撬动最高模型收益的核心杠杆。无论做数据标注平台、算法调优还是成本敏感型 AI 落地,这都是你绕不开的看家本领。
目录
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
核心原理:模型为什么也要挑食
小林最初的规则很简单:每次训练完,他把所有待研究菜谱都在心里“预演”一遍,然后挑最没底的几道去问大师傅。这套“预演→排序→请教→复盘”的循环,就是主动学习的主干。在机器学习里,它有个正式名字叫基于池的主动学习(pool-based active learning):模型对一批未标注样本做预测,按查询策略给每个样本打分,把分数最高的送去人工标注,标注结果再并入训练集重新训练。
主动学习要解决的问题很直白:高质量标注很贵。请大师傅教一道菜要耗费他的时间,所以每一道请教机会都得花在刀刃上。所谓查询策略(query strategy),就是模型决定“先问哪些样本”的规则,而不确定性采样正是其中最常用的一类——用模型自己的困惑当向导。
给定未标注池 \( U \),模型先给每个候选样本 \( x \) 算一个“困惑程度”得分 \( \mathcal{S}(x) \),然后挑得分最高的优先标注:
对小林而言,\( \mathcal{S}(x) \) 就是“这道菜让我多没底”。每一轮主动学习都是一次“让最困惑的菜谱优先得到真答案”的取舍。接下来的三位主力选手,就是三种计算“没底”的具体方式。
- 候选样本 \( x \)未标注池里的一张“菜谱”,也就是一个还没有真实标签的数据点。
- 未标注池 \( U \)所有还没交给大师傅确认的样本集合,通常数量巨大。
- 打分函数 \( \mathcal{S}(x) \)模型对样本 \( x \) 的“困惑程度”,困惑越大分越高。
- argmax 挑选遍历整个池子,把分数最高的样本挑出来优先标注。
置信度采样:最拿得出手的猜测都没底气
小林面对菜谱时心里会打赌:六成把握是咸的,三成是甜的,一成是辣的。他最强项的猜测也不过六成——这道菜值得问。置信度采样就是这个思路:把模型对每个类别的预测概率排成一排,看最大的那个有多大。
分类模型输出的 softmax 概率可以通俗理解为“对每个类别的把握程度”,其中最大的那个概率就叫最高类别概率,也就是模型的置信度(confidence)。如果连最自信的猜测都很小,说明模型对这个样本整体没底气。置信度采样专门挑这类样本:
置信度采样简单高效,但有个盲区:它只盯着“最高”这一个数,忽略了第二名、第三名的分布信息。比如 \( [0.40, 0.35, 0.25] \) 和 \( [0.40, 0.30, 0.30] \) 的最高概率都是 0.40,可后者显然更纠结——模型在三个类别间摇摆得更厉害。置信度采样对这两个样本一视同仁。小林后来也发现了:只看最强的赌注有几成胜算,会漏掉其他选项在暗搓搓冒头的情况,于是就有了边缘采样。
- 类别概率 \( P(y_k \mid x) \)模型预测样本 \( x \) 属于第 \( k \) 类的概率,K 个类别就有 K 个概率。
- max 取最大值只看模型最自信的那个类别,概率是多少。
- argmin 取最小值在未标注池里挑“最高概率也最小”的样本,连最拿得出手的猜测都很小,说明整体没底。
- 置信度取值范围置信度一定落在 0 到 1 之间,越接近 0 越值得标。
边缘采样:前两名咬得越紧越值得问
小林学精了:比起最高的那个把握,他更关心“咸”和“甜”是不是在打架。如果咸有 52%、甜有 48%,那这道菜他根本分不清,必须问;如果咸有 98%、甜只有 1%,那基本不用纠结。边缘采样就是量这个“打架程度”。
边缘采样取前两个最高类别的概率之差,这个差叫边缘(margin)。差距越小,模型在这两个类别之间越犹豫,说明样本越靠近决策边界——也就是模型划分类别的分界线附近。边界附近的样本最容易被分错,对提升模型帮助也最大:
边缘采样有个漂亮的特例:二分类时两个类别概率加起来等于 1,边缘 \( = |2P(y_1 \mid x) - 1| \),挑最小边缘等价于挑最高概率最小的样本,所以此时边缘采样和置信度采样的排序完全一致。边缘采样抓住了“最强的两个候选在打架”这一关键信号,比只看老大的置信度采样多看了一眼老二。
- 第一可能类别 \( \hat{y}_1 \)模型认为最可能的那个类别,即概率最大的类别。
- 第二可能类别 \( \hat{y}_2 \)模型认为第二可能的类别,即概率第二大的类别。
- 做差得到边缘两个概率之差越小,模型在两类别之间越摇摆。
- argmin 挑选遍历未标注池,选边缘最小的样本优先标注。
熵采样:思路越乱越值得问
小林还会遇到一种菜谱:尝了一口,咸甜辣鲜全都冒出来,脑子里同时浮现五六种做法,没有哪个特别突出。这种“整体乱成一锅粥”的程度,在信息论里叫熵。熵采样专挑这种思路最乱的样本。
熵(entropy)是信息论里度量不确定性的标准工具。对样本 \( x \) 的类别概率分布求熵,分布越均匀、越分散,熵越大,模型越没底。熵采样把所有类别的概率都纳入计算,信息最完整:
熵有两个标志性性质:当预测完全确定(某个类别概率为 1)时,熵为 0;当预测均匀分布时,熵最大,等于 \( \log_2 K \)。二分类时熵和置信度采样排序等价;多分类时,熵能识别出置信度看不到的“第二第三名也在抢戏”的情况。如果说置信度采样盯着“最强的猜测有多强”,边缘采样盯着“前两名差多少”,那熵采样就是后退一步,看整道菜的思路有多混乱——它是信息量最完整的不确定性度量。
- 类别总数 \( K \)分类任务一共有多少个互斥的类别。
- 概率乘对数每个类别的概率乘以它的对数。概率小于 1 时对数为负,所以这个乘积是负数或 0。
- 求和并取负把所有类别的贡献加起来,再乘负号,就得到非负的熵值。
- argmax 挑选熵越大的样本,类别分布越均匀、判断越混乱,越优先标注。
流程配合:从挑菜到上桌
小林不可能为一道菜就跑一趟大师傅那儿,他得一次性凑一批最值得问的菜谱,列好优先级,再统一请教。这就是不确定性采样在实际标注流程中的位置:它不是终点,而是流水线的入口。
实际项目里,每一轮主动学习都要选定两个参数:批量大小 \( B \)(每轮最多送标多少个)和阈值 \( \tau \)(不确定度低于多少就不值得标)。流程是:先对未标注池全部样本打分排序,把分数达不到阈值的放一放,再取分数最高的 \( B \) 个去人工标注,标完并入训练集重训:
完整的迭代循环可以拆成五步:
小林的流程从此变成:先随机学几道基础菜→每周批量挑最没把握的菜谱→请教师傅→把答案记进菜谱本→下轮再挑。每轮都有明确节奏,标注效率大幅提升。
- 不确定度门槛 \( \tau \)只有得分不低于 \( \tau \) 的样本才值得送人工标注,避免浪费时间。
- 批量大小 \( B \)每轮最多送标 \( B \) 个样本,保证标注者工作量稳定。
- 降序取前 B对过门槛的样本按得分从高到低排队,取前 \( B \) 个。
- 冷启动初始只随机标注几十条样本,训练一个“差不多”的模型。
- 打分模型对未标注池全部样本按 \( \mathcal{S}(x) \) 打分。
- 筛选过阈值、取 Top-B,形成本批送标队列。
- 标注标注员按队列人工标注,必要时标记拒答或疑似噪声。
- 更新新标注数据并入训练集,重训模型,回到第 2 步。
采样偏差:越采越偏的坑
小林很快发现一个问题:他总挑最难做的菜谱去问师傅,三个月后菜谱本里全是刁钻的分子料理,家常小炒反而没几道。真上手做家常菜时,反而生疏了。这就是“越采越偏”。
采样偏差指主动学习选出的标注子集在分布上严重偏离真实数据分布。不确定性采样天然偏好模型难以分类的样本,这些样本往往集中在决策边界附近,甚至本身就是噪声。多轮迭代后,边界难例在训练集中越堆越多,模型被“带偏”,简单区域的泛化能力反而下降。我们可以用指示函数统计本批选中样本的类别占比,直观检查是否失衡:
缓解手段有四个常用方向:
小林吸取教训后,每批菜谱里固定塞几道普通家常菜,再去问大师傅——既练难题也保基本功。采样偏差提醒我们:不确定性要选,但不能让“不确定性”独裁。
- 指示函数 \( \mathbf{1}[\cdot] \)括号里的条件成立取 1,不成立取 0,用来“数人头”。
- 求和加总把本批 \( B \) 个样本里属于类别 \( y \) 的样本个数数出来。
- 除以批量 \( B \)得到该类别在本批选中集合里的占比。
- 与真实分布对比当采集占比明显偏离真实类别占比时,说明采样有偏。
策略对比:不止一种挑菜哲学
后厨里不同师傅有不同挑菜哲学:有的专挑没把握的(不确定性采样);有的要求每类菜都得问(多样性采样);有的让几个徒弟同时试做、意见分歧最大的才去问师傅(委员会查询);还有的会先估算“问完这道菜后整体手艺能进步多少”(期望误差减少)。不确定性采样只是主动学习查询策略的一种,实战中常与以下策略组合使用。
多样性采样(如 Coreset、基于聚类)要求每批样本覆盖特征空间的不同区域,防止冗余和偏置。委员会查询(Query-by-Committee, QBC)训练多个模型组成“委员会”对样本投票,分歧越大越值得标注。期望误差减少(Expected Error Reduction)模拟“标注后误差降多少”,效果上限高但计算贵。混合策略(如 BADGE)同时考虑不确定性和多样性,兼顾效率与均衡。
QBC 里有一个与熵长得几乎一样的度量——投票熵:
没有放之四海而皆准的策略。不确定性采样快而锐利,适合标注预算紧张、追求快速提升的场景;委员会查询稳健但开销大;实践老手通常按业务场景组合出招,就像大师傅选菜,荤素搭配才营养均衡。
- 委员会规模 \( V \)参与投票的模型总数,相当于几个徒弟一起试做。
- 票数 \( V(y_i) \)有多少个模型认为样本属于第 \( i \) 类。
- 得票比例把票数标准化成概率分布。
- 求熵得票越分散,说明模型们争论越激烈,样本越值得问。
AI 应用场景
医疗影像标注中的胸片筛选
阶段:数据标注与数据管理
解决的问题:三甲医院每天产生上千张胸片,放射科医生标注时间极其有限。传统做法随机抽样标注,大量正常样本占用医生精力,病灶样本经常漏标。AI 先用少量已标注片训练初版模型,对剩余片子做不确定性打分,把模型最困惑的片子——往往是早期病变、病灶边界模糊的复杂片——优先排给医生。
具体案例:某影像 AI 团队在肺结节筛查项目中,用熵采样每轮挑 200 张最不确定的 CT 切片优先标注。相比随机标注,只用了 60% 的标注量就把结节检出率从 85% 提升到 92%。
智能客服意图识别语料建设
阶段:数据科学与数据工程
解决的问题:新客服机器人需要数千条意图标注语料,人工逐条标注成本高。传统随机标注会把大量相似问法重复标注,而“我要退钱到底是退款还是投诉”这类边缘样本经常被漏掉,导致意图分类器在关键边界上频繁出错。
具体案例:某电商客服团队用边缘采样从 5 万条用户问法中每轮挑 500 条最模糊的,三轮迭代后意图分类准确率达 91%,标注量比全量标注节省了约 70%。
工业质检中的长尾缺陷发现
阶段:数据标注与模型迭代
解决的问题:产品表面缺陷中常规划痕样本多、罕见缺陷种类多。随机抽样常常把罕见缺陷漏掉,导致模型对长尾缺陷几乎失效。模型对少量罕见缺陷图片输出极低置信度,正是置信度采样最该优先挑选的对象。
具体案例:某工厂质检系统统计发现,模型对 12 种缺陷中的 3 种罕见缺陷几乎无法识别。用置信度采样优先挑出这些低置信度图像送人工复核,两周内把长尾缺陷的召回率从 41% 提升到 78%。
Python 演示
# -*- coding: utf-8 -*-# 不确定性采样演示: 对比随机采样与置信度采样import numpy as npfrom sklearn.datasets import make_classificationfrom sklearn.linear_model import LogisticRegression X, y = make_classification(n_samples=600, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42) def run_pipeline(strategy, n_rounds=10, batch=5, n_init=10): rng = np.random.RandomState(0) train_idx = rng.choice(len(X), n_init, replace=False) for _ in range(n_rounds): model = LogisticRegression(max_iter=1000) model.fit(X[train_idx], y[train_idx]) pool = np.setdiff1d(np.arange(len(X)), train_idx) if strategy == 'random': pick = rng.choice(pool, batch, replace=False) else: probs = model.predict_proba(X[pool]) scores = 1 - probs.max(axis=1) # 置信度采样: 最高概率越低越不确定 pick = pool[np.argsort(scores)[::-1][:batch]] train_idx = np.concatenate([train_idx, pick]) model = LogisticRegression(max_iter=1000) model.fit(X[train_idx], y[train_idx]) return model.score(X, y) if __name__ == '__main__': acc_random = run_pipeline('random') acc_al = run_pipeline('uncertainty') print('随机采样 准确率: {:.4f}'.format(acc_random)) print('不确定性采样 准确率: {:.4f}'.format(acc_al))
X, y = make_classification(...)生成 600 个带真实标签的合成样本,用于模拟“标注池”。train_idx = rng.choice(len(X), n_init, replace=False)冷启动:先随机标 10 个样本,让初版模型“入门”。pool = np.setdiff1d(np.arange(len(X)), train_idx)构造未标注池:所有还没被标注的样本下标。probs = model.predict_proba(X[pool])让模型对每个未标注样本输出各类别概率。scores = 1 - probs.max(axis=1)置信度采样打分:最高概率越低,分数越高,越不确定。pick = pool[np.argsort(scores)[::-1][:batch]]挑分数最高的 5 个样本下标,送去“人工标注”。train_idx = np.concatenate([train_idx, pick])把新标注样本并入训练集,进入下一轮迭代。
常见误区
误区我以为置信度采样就是看模型输出的所有类别概率,把概率最小的那个类别对应的样本挑出来标注。
正解置信度采样算的不是“最小概率”,而是“所有类别里最大的那个概率”。它挑的是连最高把握都很低的样本。比如某样本概率为 \( [0.4, 0.35, 0.25] \),置信度是 0.4,要挑的是“最高也才 0.4”的样本。如果只看最小概率 0.25,那恰恰是模型最不会考虑的类别,不代表模型对整样本没把握。
为何常见:“置信度”这名字让人直觉地想去抓一个小概率值,忽略了它真正的定义是“最高类别概率里取最小”,漏掉了 max 这一步。
误区熵用了所有类别的概率,信息更全,所以熵采样在所有情况下都比置信度采样好。
正解二分类时,熵的排序和置信度采样完全一致,两者没有优劣。多分类时熵确实更全面,但需要对所有类别求和,计算稍贵,而且对概率估计的噪声更敏感。选哪种主要看类别数和实际效果,而不是盲目追求“信息多”。
为何常见:觉得“信息量越大就一定越好”,忽略了二分类这个特殊场景和额外的计算代价。
误区只要一直用不确定性采样挑样本标注,模型准确率肯定会一路涨上去。
正解不一定。连续几轮都挑最难的样本,会让训练集分布偏离真实分布,甚至把噪声当难例堆进训练集,出现“越采越偏”。实际工程中要设阈值、混入随机样本、加多样性约束,并用验证集监控,发现不涨就调整策略。
为何常见:把“数据越多越好”的直觉直接套到主动学习上,忽略了主动学习改变的不是数据量,而是训练集的分布。
误区模型自己选出要标注的样本,那是不是就不用人工了,直接拿模型预测结果当标签?
正解不行。不确定性采样只是查询策略,负责回答“先标哪些样本”;标签仍必须来自人工标注者或权威知识库(oracle)。它省的是标注数量,不是标注环节。若直接拿模型预测当标签,会把错误当成正确答案反复放大。
为何常见:把“选样本”和“给标签”两件事混为一谈,忽略了主动学习的前提是存在一个正确的标签来源。
面试题
Q1. 不确定性采样属于主动学习流程中的哪个环节?
- A.特征工程环节
- B.查询策略环节← 正确答案
- C.模型部署环节
- D.数据清洗环节
答案:B。不确定性采样是主动学习中的查询策略,负责决定“先标注哪些样本”。主动学习循环由查询策略选样、人工标注、重训练三步组成;特征工程、模型部署、数据清洗分别是数据预处理、上线应用和数据管理,都不是查询策略的职责。对应后厨故事,查询策略就是小林挑菜谱的规则。
Q2. 某三分类样本的输出概率为 [0.55, 0.30, 0.15],置信度采样的置信度值是多少?
- A.0.55← 正确答案
- B.0.30
- C.0.15
- D.0.70
答案:A。置信度采样的置信度定义为所有类别预测概率中的最大值,即 max([0.55, 0.30, 0.15]) = 0.55。0.30 和 0.15 分别是第二、第三大概率,0.70 是三者之和,都不符合定义。置信度越低代表模型越没把握,所以采样时优先选置信度最小的样本。
Q3. 边缘采样选择样本的依据是什么?
- A.全部类别概率之和
- B.模型训练损失大小
- C.最低类别概率大小
- D.前两大概率之间的差值← 正确答案
答案:D。边缘采样取前两个最高类别概率之差作为“犹豫度”,差值越小说明模型在两类之间越摇摆,样本越靠近决策边界。它比置信度采样多利用了第二名的信息。全部概率之和、训练损失、最低类别概率都与边缘的定义无关。
Q4. 二分类样本 A 概率为 [0.52, 0.48],样本 B 为 [0.98, 0.02],熵采样更偏向选谁?
- A.样本 A,因为它的熵更高← 正确答案
- B.样本 B,因为它的熵更高
- C.两者的熵值完全一致
- D.熵采样无法做出区分
答案:A。熵衡量概率分布的混乱程度。样本 A 的 [0.52, 0.48] 接近均匀分布,熵更大;样本 B 的 [0.98, 0.02] 接近确定分布,熵接近 0。熵采样选熵最大的样本,所以选 A。这正是熵相比置信度更能识别“整体纠结”的体现。
Q5. K 类分类中,预测概率为均匀分布时,熵值等于多少?
- A.熵值恰好为 0
- B.熵值恰好为 1
- C.熵值等于 log₂K← 正确答案
- D.熵值等于类别数 K
答案:C。K 类均匀分布时每类概率都是 1/K,代入熵公式得 H = -Σ(1/K)·log₂(1/K) = log₂K,即最大熵。熵为 0 对应完全确定;常数 1 只在二分类均匀时出现;K 是类别总数而不是熵值。
Q6. 以下属于不确定性采样常见度量的是?
- A.置信度采样← 正确答案
- B.边缘采样← 正确答案
- C.熵采样← 正确答案
- D.随机采样
答案:ABC。不确定性采样的三大主力是置信度采样(看最高类别概率)、边缘采样(看前两大概率之差)、熵采样(看全类别分布的熵)。随机采样不利用模型的不确定性信息,属于基线策略,不算不确定性度量。
Q7. 多轮主动学习反复使用不确定性采样,出现“越采越偏”的最直接解释是什么?
- A.学习率过大导致发散
- B.标注数据量增长过快
- C.难例逐渐主导训练集分布← 正确答案
- D.模型容量不足以拟合
答案:C。每轮都挑模型最没把握的难例,多轮后难例逐渐主导训练集分布,边界样本和疑似噪声堆积,导致模型对简单区域的泛化变差。学习率、数据量增长、模型容量都与采样偏差没有直接关系。
Q8. 缓解不确定性采样冗余和偏差的可行手段是?
- A.结合多样性采样← 正确答案
- B.设置不确定性阈值← 正确答案
- C.使用混合查询策略← 正确答案
- D.完全改用随机采样
答案:ABC。缓解措施包括:结合多样性采样保证特征空间覆盖、设置不确定性阈值过滤疑似噪声、使用混合策略平衡难例与代表点。“完全改用随机采样”等于放弃主动学习的信息优势,不是有效的缓解手段。
Q9. 主动学习要解决的核心痛点是什么?
- A.高质量标注成本高昂← 正确答案
- B.模型推理速度太慢
- C.数据特征维度爆炸
- D.服务器算力不足
答案:A。主动学习的核心动机是降低标注成本:用更少的标注样本达到接近全量标注的效果。推理速度、特征维度、算力都是工程优化问题,不是主动学习要解决的目标。
Q10. 二分类问题中,边缘采样与置信度采样的样本排序有什么关系?
- A.两者排序恰好相反
- B.两者排序完全相同← 正确答案
- C.边缘采样完全不看置信度
- D.两者之间没有任何关系
答案:B。二分类时 p₁ + p₂ = 1,边缘 = p₁ - p₂ = |2p₁ - 1|。选择最小边缘等价于选择 p₁ 最接近 0.5、也就是最高概率最小的样本,这与置信度采样选中的样本完全一致,因此两者排序相同。这也是“边缘采样是置信度采样的二分类特例”的由来。