想象你是一个果园采购员,要在上万棵果树里挑出最甜的 100 颗果子,但预算有限,不可能每颗都剖开尝一口。新手会随机摘几颗就下结论,精明的老手却有一套策略:先扫一圈,专挑那些“看着熟不熟最拿不准”的果子尝——因为它信息量最大;同时不同品种的树都得照顾到——免得只盯着一片好果园,就误以为整片山都甜。还要凭多年的挑果经验,先靠颜色、香气猜出七八分,只在关键时剖开验证。 AI 训练也是这样。标注一张图要花钱、花人力、花时间,而主动学习(Active Learning)就是那位“精明采购员”:它让模型自己判断“哪些图片最值得被标注”,用最少的标注预算撬动最高的模型精度。从怎么度量“拿不准”(不确定性采样)、怎么避免选到一堆相似图(多样性采样),到怎么和半监督学习配合、用什么工具落地——本文把这套“水果采购心法”完整讲给你听。

岗位关联

掌握主动学习,等于学会用最省的标注预算训出更好的 CV 模型——这是数据标注团队与算法工程师手里最实用的一把杠杆,值得每一位 AI 从业者掌握。

目录
  1. 可视化演示
  2. 主动学习基础
  3. 不确定性采样
  4. 多样性采样
  5. 半监督配合
  6. CV场景应用
  7. 工具与框架
  8. 项目落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示计算机视觉主动学习实战应用的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。

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

计算机视觉主动学习实战应用:主动学习 主动学习的核心思想与CV标注成 不确定性采样的度量方法与选图逻 核心机制可视化 计算机视觉主动学习实战应用整体架构与关键组件

主动学习基础

采购员接手果园前,第一件事不是急着尝果子,而是想清楚策略:预算能尝多少颗、先扫哪片园子、每轮怎么规划。主动学习的起点也一样,它不改变你的模型结构,改变的是“数据从哪来”这件事。传统训练是模型被动等着投喂数据,主动学习则让模型主动开口:“我要标注这几张图,别给我那些我已经知道的。”

把这套逻辑翻译成技术语言:主动学习假设有一大堆未标注图片,称为未标注池 $\mathcal{U}$;每次从池子里挑一小批最有价值的样本,交给人工标注者(Oracle)打标签,然后更新训练集、重新训练模型,循环往复。整个循环是“训练 → 预测 → 挑图 → 标注 → 再训练”。挑图环节的核心,是所有主动学习算法的灵魂——选择函数(Query Strategy):

像采购员每轮尝过几颗果子,心里那份“哪片园子甜”的判断就更准一分。主动学习每轮挑完、标完、训完,模型对“哪些图有价值”的认识也更新一次。标注预算有限,所以每一轮挑选都格外珍贵——这正是整套方法的出发点。

x∗=arg⁡max⁡x∈Us(x)x^{*} = \arg\max_{x \in \mathcal{U}} s(x)
这个式子是说:从候选池里,挑出评分函数 $s(x)$ 值最大的一张(或一批)图去标注。
  1. 候选池 $\mathcal{U}$所有还没标注的图片集合,就像果园里还没被尝过的果子。
    U={x1,x2,…,xn}\mathcal{U} = \{x_1, x_2, \dots, x_n\}
  2. 评分函数 $s(x)$给每张图打一个“价值分”,表示这张图值得标注的程度。
    s:X→Rs: \mathcal{X} \rightarrow \mathbb{R}
  3. $\arg\max$ 贪心挑选每次都挑当前得分最高者,一步步逼近最优。
    arg⁡max⁡x∈Us(x)\arg\max_{x \in \mathcal{U}} s(x)

不确定性采样

采购员手握预算,最该先尝哪颗?老手的答案是:越“拿不准”的果子越要先剖开看。一颗表皮红得透亮的苹果,谁都知道它甜;但一颗颜色发黄又带点斑的,你反而想切开验证——因为它可能惊艳,也可能酸掉牙,信息量最大。不确定性采样(Uncertainty Sampling)就是这个思路:挑模型“最犹豫”的样本。

对于一个分类模型,输入一张图 $x$,它会输出属于每个类别的概率 $P(y=c|x)$。如果模型对某张图输出“猫 50%、狗 50%”,说明它快纠结死了,这张图最有训练价值。最常用的度量是熵(Entropy),它把“犹豫程度”量化成一个数:

除了熵,还有两个常用的“犹豫”指标。一个是间隔采样(Margin Sampling),看最大概率和第二大概率差多少,差值越小越犹豫;另一个是最低置信度(Least Confidence),直接看最大概率本身,越低越值得标。间隔的定义是:

$M(x)$ 越小,说明模型在两个类别间摇摆越厉害,这张图越需要人工给个“标准答案”。一颗果子越让老采购员看不透,他越要亲自剖开;一张图越让模型两头为难,它越该被送去标注——这就是不确定性采样的全部哲学。

H(x)=−∑c=1CP(y=c∣x)log⁡P(y=c∣x)H(x) = - \sum_{c=1}^{C} P(y=c|x) \log P(y=c|x)
熵越大,代表各类概率分布越均匀,模型越“拿不准”,这张图越值得标注。
  1. 类别概率 $P(y=c|x)$模型猜测图 $x$ 属于第 $c$ 类的概率,取值在 0 到 1 之间。
    P(y=c∣x)∈[0,1]P(y=c|x) \in [0, 1]
  2. 对数项 $\log P$把概率映射到“信息量”的尺度,概率越小、信息量越大。
    log⁡P(y=c∣x)\log P(y=c|x)
  3. 对类别求和把所有类别的贡献加总,均匀分布时熵最大。
    M(x)=P(y=y^1∣x)−P(y=y^2∣x)M(x) = P(y=\hat{y}_1|x) - P(y=\hat{y}_2|x)

多样性采样

只挑“拿不准”的果子有隐患。假设果园东头有好几棵相邻的苹果树,因为光照差都长着半青半红的果子,模型对它们全都“拿不准”。如果你挨个标注,等于花三份预算买了三颗几乎一模一样的果子。聪明的采购员会先抬头看看全局:东边一片、西边一片、山上还有一片,每片挑一颗代表尝尝,心里对整个果园才有谱。多样性采样(Diversity Sampling)干的就是这件事。

常见的做法是聚类选择:把未标注图片的特征向量做聚类(比如 K-Means),每个簇里的图片彼此相似,于是从每个簇里挑一两个代表去标注,保证覆盖不同“口味”。更理论化一点的是核心集选择(Core-Set),它的目标是找一个小子集,使得子集里的点能“代表”整个候选池——两个聚类结果是殊途同归的“分区尝果”。核心集形式化如下:

在实际工程里,主动学习很少只用单一策略,常见套路是把不确定性和多样性组合起来:先按不确定性排出前几百张候选,再用聚类或核心集从里面“去重压缩”出最终的一批。先尝最可疑的,再保证品种多样——采购员的这两条铁律,也是主动学习的两根支柱。

min⁡V⊂U, ∣V∣=k  max⁡xi∈U  min⁡xj∈V  d(xi,xj)\min_{V \subset \mathcal{U}, \, |V| = k} \; \max_{x_i \in \mathcal{U}} \; \min_{x_j \in V} \; d(x_i, x_j)
这个公式的直觉是:用 $k$ 个代表点去“覆盖”全部候选点,让每个候选点距离最近代表点的最大距离尽量小。
  1. 代表子集 $V$从候选池里选出的 $k$ 个样本,就像挑出的 $k$ 颗代表果。
    V⊂U,∣V∣=kV \subset \mathcal{U}, \quad |V| = k
  2. 最近代表距离 $\min_{x_j \in V} d(x_i, x_j)$每个候选点找离它最近的代表点,距离越小越安心。
    min⁡xj∈Vd(xi,xj)\min_{x_j \in V} d(x_i, x_j)
  3. 最大覆盖半径 $\max_{x_i \in \mathcal{U}}$让最远的那个候选点也别离代表点太远,保证全局覆盖。
    max⁡xi∈U  min⁡xj∈V  d(xi,xj)\max_{x_i \in \mathcal{U}} \; \min_{x_j \in V} \; d(x_i, x_j)

半监督配合

经验丰富的采购员有个绝活:不用剖开果子,光看颜色、捏捏软硬,就能猜个八九不离十。他仍然会剖开最关键的几颗验证猜测,但其他果子靠经验“猜”就能节省大量动作。半监督学习(Semi-Supervised Learning)就是 AI 界的“猜果经验”,它和主动学习配合起来天衣无缝。

具体怎么配合?主流做法是伪标签(Pseudo-Labeling):用当前模型对未标注图做预测,只采纳置信度足够高的预测作为“假标注”,加进训练集一起训练。比如模型对某张图输出“猫 98%”,那这张图就贴上个“猫”的伪标签,当真实标注用。判断依据是一个阈值:

更进一步,还可以把伪标签作为一项正则化约束加入总损失,让模型在带标签和无标签数据上一起训练:

其中 $\mathcal{L}_{\mathrm{sup}}$ 是人工标注的监督损失,$\mathcal{L}_{\mathrm{unsup}}$ 是无标注数据的正则损失(比如对图片做随机增强后,模型输出要保持一致),$\lambda$ 是两者权重。主动学习和半监督的分工很清晰:主动学习解决“标什么”,半监督解决“用什么不标的数据”。一个派活,一个干活,配合起来能把标注预算的价值放大数倍。

y^=arg⁡max⁡cfc(x),if  max⁡cP(y=c∣x)≥τ\hat{y} = \arg\max_{c} f_c(x), \quad \mathrm{if} \; \max_{c} P(y=c|x) \ge \tau
只有模型非常有把握的样本,才有资格贴上伪标签参与训练;把握不足的,继续留给主动学习人工标注。
  1. 模型输出 $f_c(x)$模型对图 $x$ 属于类 $c$ 的打分。
    fc(x)f_c(x)
  2. 置信度阈值 $\tau$一个超参数,表示“多大把握才算可靠”,通常设 0.95 左右。
    max⁡cP(y=c∣x)≥τ\max_{c} P(y=c|x) \ge \tau
  3. $\arg\max_c$ 选标签把概率最大的类别当作这张图的伪标签。
    L=Lsup+λ⋅Lunsup\mathcal{L} = \mathcal{L}_{\mathrm{sup}} + \lambda \cdot \mathcal{L}_{\mathrm{unsup}}

CV场景应用

不同水果有不同挑法:西瓜靠拍、芒果靠闻、苹果看色。CV 任务也一样,图像分类、目标检测、语义分割、关键点检测,各自的不确定性度量方式大不相同。直接照搬通用公式,就像拿拍西瓜的手势去拍葡萄,必然翻车。

图像分类最简单:整张图过一个分类网络,直接对输出的 softmax 概率算熵或 margin 就行。一张图对应一个不确定性分数,干净利落。目标检测则复杂得多——图上有一堆框,每个框里一个物体、带一个分类概率,模型对这张图的“犹豫”要怎么算?常用做法是聚合:把所有候选框的不确定性取平均,或者取最高 Top-K 框的均值,把“图级不确定性”推导出来:

语义分割对每个像素都要输出类别,不确定性可以在像素级算好,再聚合成“图平均不确定性”或“高不确定像素占比”。关键点检测则更讲究:遮挡、模糊的关键点才是标注难点,可以只取最不确定的那几个关键点区域去标注。核心原则始终不变:把模型当前的“犹豫”准确地汇总成一张图的优先级,只是换了一把符合任务形态的尺子。

s(I)=1∣PI∣∑p∈PIs(p)s(I) = \frac{1}{|P_I|} \sum_{p \in P_I} s(p)
一张图的不确定性,等于图内所有物体区域(框或像素)不确定性的平均值。
  1. 元素集合 $P_I$图片 $I$ 内所有待聚合的元素,检测任务中是预测框,分割任务中是像素。
    PI={p1,p2,…,pm}P_I = \{p_1, p_2, \dots, p_m\}
  2. 元素级分数 $s(p)$每个框或像素各自算出的不确定性(熵或 margin)。
    s(p)=−∑cP(y=c∣p)log⁡P(y=c∣p)s(p) = - \sum_{c} P(y=c|p) \log P(y=c|p)
  3. 平均聚合 $\frac{1}{|P_I|}\sum$把元素级分数平均,得到整张图的标注优先级。
    1∣PI∣∑p∈PIs(p)\frac{1}{|P_I|} \sum_{p \in P_I} s(p)

工具与框架

老采购员会定期擦亮自己的工具箱:电子秤称重、光谱仪测糖、小刀剖果,各有各的用场。做主动学习也一样,不需要什么都从零造轮子——一套趁手的工具能让你从“想法”快速跑到“实验验证”。

最常用的轻量级工具是 modAL,它把主动学习封装成了 sklearn 风格接口,几行代码就能搭一个循环:定义模型、定义查询策略、调用 fit 和 query。非常适合做基线实验和数据集的初步验证。另一个思路是在 PyTorch 生态里自己写训练循环,灵活度最高——你可以把不确定性计算插进任何模型前向传播之后,再配合 DataLoader 对未标注池做批量推理。一个典型的流程形式化如下:

开源世界里还有不少现成方案:像 ALiPy 提供了丰富的策略对比框架,Baal 支持贝叶斯不确定性估计,慢速但更稳健的 scikit-activeml 也是学术实验的好帮手。选工具的准则和挑水果一样——别选最贵的,选最合手型的。先拿 modAL 跑通基线,确认策略有效,再迁移到 PyTorch 定制化管线,是性价比最高的路径。

Bt=Query(U,Mt−1,k)\mathcal{B}_t = \mathrm{Query}(\mathcal{U}, \mathcal{M}_{t-1}, k)
第 $t$ 轮查询函数从候选池里,依据上一轮模型 $\mathcal{M}_{t-1}$ 选出 $k$ 张图进入标注队列。
  1. 上一轮模型 $\mathcal{M}_{t-1}$当前已训练好的模型,用来给未标注图打分。
    Mt−1\mathcal{M}_{t-1}
  2. 查询函数 $\mathrm{Query}$采样策略(熵、margin、核心集),是采购员手里的工具。
    Query(U,Mt−1,k)\mathrm{Query}(\mathcal{U}, \mathcal{M}_{t-1}, k)
  3. 批量大小 $k$每轮挑几张送标,太小浪费人力排班,太大挑选精度下降。
    Bt⊂U,∣Bt∣=k\mathcal{B}_t \subset \mathcal{U}, \quad |\mathcal{B}_t| = k

项目落地

光有策略和工具,离真正“把果子卖上好价钱”还差一套完整的采购流程。落地主动学习项目时,你会遇到几个现实问题:一开始模型啥都没学过,怎么知道哪张图“不确定”?每轮送标多少张才不会让标注团队手忙脚乱?怎么量化这套方法到底省了多少钱?

第一个问题叫冷启动。模型还没训练,不确定性无从谈起。稳妥的做法是先随机标注一小批(几十到几百张)打底,训练出一个“粗糙但能用”的模型,再从第二轮开始走上主动学习正轨。这就像采购员首次进园,绕了一圈先摘几颗找找手感,后面才进入“挑最有价值”的精细操作。第二个问题是轮次管理:每轮送标量 $k$ 不宜太大也不宜太小,通常设为数据总量的 1%~5%,并保持与标注团队产能匹配。

第三个问题最关键——效果评估。不要只看最终精度,要看“预算-精度”曲线的形状:同样标注 5000 张,主动学习比随机采样高几个点?一个简单的量化指标是每轮标注增益:

工程排坑还有个常见细节:每轮对未标注池重新提取特征时,记得缓存特征向量,否则几百个 epoch 的推理会拖垮迭代速度。还要给每轮采样加“去重”保护,防止模型反复挑出几乎同一张图。至此,从策略到工具再到流程,你和那位精明采购员之间只差一次次实践了——先小规模跑通,再扩大预算,让每一分标注钱都花在刀刃上。

Gain(b)=Acc(b)−Acc(b0)b−b0\mathrm{Gain}(b) = \frac{\mathrm{Acc}(b) - \mathrm{Acc}(b_0)}{b - b_0}
这个比值表示:从预算 $b_0$ 增加到 $b$,每多标一张图换来多少精度提升。主动学习的增益应该显著高于随机采样。
  1. 预算 $b$ 与基线 $b_0$$b_0$ 是冷启动的初始标注量,$b$ 是当前累计标注量。
    b>b0>0b > b_0 > 0
  2. 精度差 $\mathrm{Acc}(b) - \mathrm{Acc}(b_0)$多标出来的这部分数据带来的模型精度提升。
    Acc(b)−Acc(b0)\mathrm{Acc}(b) - \mathrm{Acc}(b_0)
  3. 归一化 $\frac{\cdot}{b - b_0}$精确到“每增加一张标注换多少精度”,公平比较不同方法。
    Acc(b)−Acc(b0)b−b0\frac{\mathrm{Acc}(b) - \mathrm{Acc}(b_0)}{b - b_0}

AI 应用场景

安防监控的目标检测标注优化

阶段:数据标注与模型迭代训练

解决的问题:安防摄像头每天产生海量监控画面,其中绝大多数是“无人、无车、无异常”的平庸帧。传统做法是把所有画面都送入标注平台,标注员耗费数小时标注大量对训练毫无帮助的背景图。主动学习让检测模型先学习一个粗糙版本,然后只挑出模型“拿不准”的帧——例如光线复杂的夜晚、遮挡严重的行人——优先送标,标注预算直接降低 60% 以上。

具体案例:某园区智能安防团队部署行人检测模型,原始方案每月需人工标注 5 万帧。引入以熵聚合为查询策略的主动学习后,每月只精标 1.5 万帧,模型在低光照场景的 mAP 反而提升了 4 个百分点。标注员也不用再熬夜刷无意义的空镜头。

自动驾驶长尾场景挖掘

阶段:数据采集与筛选

解决的问题:自动驾驶路测数据中,99% 是晴天笔直公路,真正决定系统安全的是那些“长尾”场景——暴雨、逆光、突然窜出的行人。人工从海量路测数据里捞这些场景如同大海捞针。主动学习利用多样性采样对场景特征聚类,再配合不确定性采样,自动把“罕见但模型害怕”的片段挖出来送标,让每一份标注预算都花在提升安全性的刀刃上。

具体案例:某自动驾驶公司用核心集选择算法对 200 万帧路测数据做主动筛选,每轮只精标 2 万帧。迭代三轮后,模型在长尾场景的误检率下降了 32%,而常规场景精度几乎无损。数据车队的采集效率和标注团队的产能都得到了最优化配置。

医疗影像的病灶筛查加速

阶段:辅助诊断模型训练

解决的问题:肺部 CT 筛查中,大部分切片的阴影都是良性的,真正的病灶占比很低。放射科医生时间宝贵,不可能逐张精标。主动学习让模型先学一遍,只把“特征最模糊、最需要专家判断”的切片挑给医生——比如小结节良恶性难辨的区域,配合 entropy 与 margin 两种不确定性度量交叉验证,医生标注量大幅减少,模型却越训越敏锐。

具体案例:某医疗 AI 团队开发肺结节检测模型,原始方案需要医生标注 1 万套 CT。采用主动学习后,医生只精标 3 千套,模型在独立测试集上的敏感度反而提升了 5.1%。团队把省下的标注预算用于扩充 MRI 新模态数据,整体产品线加速了三个月的研发周期。

Python 演示

python46 行
import numpy as npfrom sklearn.linear_model import LogisticRegressionfrom sklearn.datasets import make_classification X, y = make_classification(    n_samples=400, n_features=2, n_redundant=0,    n_informative=2, n_clusters_per_class=2,    flip_y=0.05, random_state=42)rng = np.random.RandomState(0) INIT_N = 20BATCH = 10ROUNDS = 10 def run_active():    idx = np.array(rng.choice(len(X), INIT_N, replace=False))    accs = []    for _ in range(ROUNDS):        clf = LogisticRegression()        clf.fit(X[idx], y[idx])        accs.append(clf.score(X, y))        cand = np.setdiff1d(np.arange(len(X)), idx)        proba = clf.predict_proba(X[cand])        ent = -(proba * np.log(proba + 1e-9)).sum(axis=1)        pick = cand[np.argsort(ent)[::-1][:BATCH]]        idx = np.concatenate([idx, pick])    return accs def run_random():    idx = np.array(rng.choice(len(X), INIT_N, replace=False))    accs = []    for _ in range(ROUNDS):        clf = LogisticRegression()        clf.fit(X[idx], y[idx])        accs.append(clf.score(X, y))        cand = np.setdiff1d(np.arange(len(X)), idx)        pick = rng.choice(cand, BATCH, replace=False)        idx = np.concatenate([idx, pick])    return accs acc_active = run_active()acc_random = run_random()print("主动学习各轮准确率:", [round(a, 3) for a in acc_active])print("随机采样各轮准确率:", [round(a, 3) for a in acc_random])print("最终领先幅度:", round(acc_active[-1] - acc_random[-1], 3))
目的:在一个模拟数据集上对比“熵不确定性采样”与“随机采样”的主动学习效果,展示同样标注预算下主动学习的精度优势。
  1. make_classification(n_samples=400, ...)生成 400 张“图片特征”的模拟数据集,两簇分布让分类有难度,更贴近真实 CV 特征。
  2. clf.fit(X[idx], y[idx])只拿当前已标注的样本训练模型,模拟“预算有限”的标注场景。
  3. proba = clf.predict_proba(X[cand])对未标注池做批量推理,得到每张图属于各个类别的概率。
  4. ent = -(proba * np.log(proba + 1e-9)).sum(axis=1)按熵公式计算每张图的不确定性,1e-9 防止对 0 取对数。
  5. pick = cand[np.argsort(ent)[::-1][:BATCH]]把未标注图按熵从高到低排序,挑出最犹豫的 10 张送标。
  6. accs.append(clf.score(X, y))每轮在全量数据上评估模型精度,画出“预算-精度”曲线。
  7. run_random()` 中的 `rng.choice(cand, BATCH, replace=False)随机挑 10 张当作对照组,与主动学习做公平对比。

常见误区

误区“模型越不确定,这张图就越值得标。我只要把熵算出来,从高到低排个序挑 top-k 就行。”

正解不确定性高只代表模型“没把握”,不代表这张图能带来新知识。果园里东头那排光照不足的树,果子全都青红参半,模型对它们全都不确定——但标了三颗就会发现它们长一个样,后面的全是冗余。正确做法是让不确定性采样和多样性采样配合:先按不确定度圈定一批候选,再用聚类或相似度去重,保证挑出来的每一张图都贡献新信息。

为何常见:初学者最容易只盯单一指标,忽略了数据集的整体分布,觉得“越犹豫越有价值”这个直觉很自然,但没想过“大量样本可能同样地犹豫”。

误区“最低置信度算起来最快,熵还要算 log,差别不大,我用最简单的就行。”

正解不同策略的偏好其实不同:最低置信度只看最大概率,容易忽略第二、第三类别的分布;熵对整体分布更敏感,但计算稍重;margin 则特别适合类别高度重叠的场景。就像挑西瓜,拍、掂、看藤都是手段,各有各的适用场合。实际项目中应至少对比两种策略,在验证集上挑效果好的,而不是拍脑袋决定。

为何常见:代码里置信度只需一行 1 - proba.max(),看起来“省事”,让人误以为省事就是好。

误区“我分类任务上熵策略有效,检测任务直接把每个框的熵算出来取最大不就行了?”

正解目标检测和语义分割的输出结构是“一组框/一组像素”,直接在框级或像素级算不确定性会带来尺度偏置:大框天然比小框熵值高,背景像素占多数的图平均熵会被稀释。正确姿势是按任务形态做聚合——检测用框内最大类别熵、Top-K 框均值;分割用高不确定像素占比或区域平均。每种任务要找自己的“尺子”,不能一把卡尺量所有水果。

为何常见:分类任务的不确定性计算太简单,形成思维惯性,忽略了 CV 不同任务输出结构的巨大差异。

误区“我预算 5000 张,第一轮就把 5000 张全部挑出来送标,省得来回折腾。”

正解主动学习的核心假设是“模型在训练中不断成长”,第一轮模型还很弱,它认为“最有价值”的样本未必真的有价值。就像刚进果园的新手,看谁都像甜的,转了三圈才找到门道。正确做法是采用小批量多轮迭代:每轮标 200~500 张,训练一轮再挑下一批,让模型在每个阶段都能用最新的眼光重新评估候选池。

为何常见:把主动学习误解成“一次性筛选工具”,忽略了它与模型训练的耦合——挑选策略的质量依赖于模型的成熟度。

误区“半监督的伪标签嘛,阈值设 0.99,模型只有非常肯定才给伪标签,这样一定最安全。”

正解阈值过高会导致绝大多数未标注数据被浪费,半监督形同虚设;阈值过低则会引入大量噪声标注,反而拉低训练精度。阈值 $\tau$ 是一个需要调参的权衡旋钮,实践中 0.9~0.95 常用,但也取决于任务难度和类别数量。更稳妥的做法是配合数据增强的一致性约束(对同一张图做不同增强,模型输出应稳定),让低置信样本也能以“软约束”的方式参与训练。

为何常见:“越保守越安全”的直觉在标注环节成立,但半监督的精髓恰恰是“安全地利用那部分不确定但有用的数据”,误把保守当原则。

面试题

Q1. 主动学习的核心目标是什么?

单选题 · easy

  • A.用更少的标注获得更高精度← 正确答案
  • B.让模型对所有样本都确定
  • C.减少模型的训练参数量
  • D.加快单次前向推理速度

答案:A。主动学习解决的是“标注预算有限”问题,核心目标是用最少的人工标注换取尽可能高的模型精度,类似采购员用有限的品尝次数挑出最甜的果子。它既不减少参数量,也不优化推理速度,更不是追求“对一切都确定”。

Q2. 关于熵 $H(x) = -\sum_{c} P(y=c|x)\log P(y=c|x)$,以下说法正确的是?

单选题 · mid

  • A.概率分布越均匀熵越大← 正确答案
  • B.概率分布越极端熵越大
  • C.熵的大小与概率无关
  • D.熵越大表示置信度越高

答案:A。熵衡量分布的“混乱程度”。当模型对各类别概率输出均匀(如猫 0.5、狗 0.5),熵最大,代表模型最纠结;概率越极端(如 0.99 vs 0.01),熵越小,模型越有把握。所以熵大 = 不确定高,而非置信度高。

Q3. Margin 采样中,间隔 $M(x) = P(\hat{y}_1|x) - P(\hat{y}_2|x)$ 代表什么?

单选题 · mid

  • A.最大两类概率之差← 正确答案
  • B.最小两类概率之和
  • C.所有类别的平均概率
  • D.最大概率与熵的乘积

答案:A。Margin 取最大概率与第二大概率之差。差越小说明模型在“第一名”和“第二名”之间摇摆,越需要标注。它比最低置信度多考虑了“第二选择”,好比果子虽然被判定为甜,但甜味和酸味非常接近,仍需切开来确认。

Q4. 以下哪些属于主动学习的采样策略?

多选题 · mid

  • A.熵不确定性采样← 正确答案
  • B.间隔不确定采样← 正确答案
  • C.置信度最低采样← 正确答案
  • D.随机梯度下降法

答案:ABC。熵、间隔、置信度是三种主流的不确定性采样策略,分别从不同角度度量模型“犹豫”程度。随机梯度下降是优化器,与“挑哪些样本标注”无关,属于训练环节的工具,不是采样策略。

Q5. 多样性采样主要解决什么问题?

单选题 · easy

  • A.避免选到相似冗余样本← 正确答案
  • B.缩小特征向量的维度
  • C.加快反向传播计算速度
  • D.降低标注人员的时薪

答案:A。如果只按不确定性挑,可能选出一堆彼此相似的“难点”,信息冗余。多样性采样通过聚类或核心集让挑选的样本广泛覆盖整个数据分布,保证每张标注图都贡献新知识,如同采购员会照顾到不同品种的果树。

Q6. 关于主动学习与半监督学习的配合,以下说法正确的是?

多选题 · extreme

  • A.高置信伪标签可扩充训练集← 正确答案
  • B.一致性正则能利用无标注数据← 正确答案
  • C.两种方法互斥不能同时使用
  • D.伪标签只用于测试集评估

答案:AB。半监督学习中,高置信伪标签和一致性正则都能利用海量未标注数据,与主动学习互补——主动学习决定“标哪张”,半监督决定“怎么榨干不标的那些”。二者并非互斥,伪标签作用于训练集而非测试集。

Q7. 目标检测任务中,如何把框级不确定性聚合成图级标注优先级?

单选题 · hard

  • A.对框内分数取平均聚合← 正确答案
  • B.取整张图最大像素熵
  • C.对每像素做独立人工标注
  • D.直接套用分类任务熵公式

答案:A。检测输出多个预测框,每框有独立概率分布。图级优先级通常将所有框的不确定性取平均(或 Top-K 均值)聚合,得到“这张图整体有多值得标”。逐像素标注成本过高,直接套分类熵到多框输出则忽略了框的粒度差异。

Q8. 核心集选择(Core-Set)的核心思想是什么?

单选题 · mid

  • A.用小子集覆盖整个数据分布← 正确答案
  • B.只选每个类别的中心样本
  • C.在全量数据上做随机采样
  • D.先标注全部再筛掉冗余

答案:A。核心集挑选 $k$ 个代表点,使所有候选点到最近代表点的最大距离尽量小——即用最少代表覆盖最广分布。它并不局限于类别中心,也不做全量标注,而是数学上求解一个“最优覆盖”子集。

Q9. 主动学习项目落地时,哪些工程做法是合理的?

多选题 · hard

  • A.缓存特征向量加速每轮推理← 正确答案
  • B.迭代式小批量标注与管理← 正确答案
  • C.多轮模型版本对比评估效果← 正确答案
  • D.第一轮标完所有候选样本

答案:ABC。缓存特征避免每轮重复对整个未标注池推理;小批量迭代是主动学习的标准节奏;多轮版本对比能看到预算-精度曲线。一次性标完所有候选,既违背“边训边挑”的迭代思想,也让预算利用率大打折扣。

Q10. 主动学习项目冷启动阶段,最好的做法是?

单选题 · easy

  • A.先随机标注小批量样本← 正确答案
  • B.等积累海量数据再启动
  • C.仅采集已确定类别的样本
  • D.跳过标注直接预训练模型

答案:A。冷启动时模型还没学会任何东西,“不确定性”无从谈起,因此先随机标注一小批样本训练出粗糙模型,再进入主动学习循环。这与采购员第一次进园先随手摘几颗“找手感”的道理完全一致。