想象你是一位刚入行的美食品鉴官,第一个任务就是去“山城老灶”川菜馆写食评。菜单上 128 道菜,主编只批了 8 道试吃预算。每吃一道就要记住味道、写下评价——吃过的菜写得细致,没吃过的只能靠猜。你盯着菜单发愁:这 8 道到底点什么,才能让整篇食评又准又全面? 这正是主动学习(Active Learning)要解决的两难。现实中,算法工程师手里常常躺着几十万条未标注数据,而标注预算只够几千条。与其闭着眼随机抽一批碰运气,不如让模型自己打分:哪些数据最能让模型“涨知识”?回答“哪些数据最值得标注”的打分规则,就是查询策略(Query Strategy)。接下来的文章会像“点菜”一样拆解这套方法:从不确定性采样、多样性采样,到期望效果策略、策略组合与实验评估,帮你把每一分标注成本花在刀刃上。

岗位关联

给正在做数据标注与模型迭代的 AI 从业者:当你预算有限、数据量庞大时,查询策略就是你的“菜单筛选术”。学会它,你就能用最少的标注样本换来最大的模型提升,快速告别“标注预算超支、模型效果却原地踏步”的困境。

目录
  1. 可视化演示
  2. 查询策略概述——点菜也要方法论
  3. 不确定性采样——专治“拿不准”
  4. 多样性采样——别让螃蟹霸占整桌
  5. 期望效果策略——全局一杆秤
  6. 策略对比选型——看菜下筷
  7. 组合与评估——好菜配好单
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示主动学习怎么选数据?查询策略的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

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

主动学习怎么选数据?查询策略:主动学习 主动学习查询策略的总体框架与目 不确定性采样的置信度与边缘采样 核心机制可视化 主动学习怎么选数据?查询策略整体架构与关键组件

查询策略概述——点菜也要方法论

小A盯着“山城老灶”的菜单,128 道菜让人眼花缭乱。他偷偷瞄了一眼旁边那位资深品鉴官的笔记本,发现上面密密麻麻写满符号:有的菜名后面画着"?",那是味道最拿不准的;有的画着星号,那是能代表某一类做法的;还有的画着圈,口味跟已经点过的菜离得最远。原来,点菜本身就是一门手艺——先把试吃预算当作分数,给每道菜打分,再从中挑出分数最高的 8 道。

把这个场景搬回机器学习:模型就是小A,未标注数据就是那本菜单,而“打分规则”正是查询策略(Query Strategy)。主动学习的运作方式和点菜如出一辙:先用已经标注好的数据训练一个初版模型——相当于小A吃过的 5 家川菜馆积累出的味觉经验;然后让查询策略给所有未标注数据打分,选出分数最高的几条,交给标注员去标注;标注完把新知识拼回训练集,模型重训升级,再进入下一轮。如此循环,模型就能持续进步。

形式化地看,每一轮我们都在做同一件事:从候选池中选出一个让打分函数取到最大值的样本。好的查询策略通常要兼顾三个理想标准——信息量大(这道菜最颠覆你之前的认知)、多样性好(选中的菜口味覆盖面广)、代表性强(能代表某一类做法的平均水平)。

小A在笔记本上写下这句话:“点菜不是随缘,是给每道菜打一个'值得试吃分'。”他合上本子,目光落在菜单上画满"?"的那几道菜——那些最让他拿不准的,正是第一轮该下筷的地方。

x∗=arg⁡max⁡x∈U ϕ(x)x^{*}=\displaystyle\arg\max_{x\in\mathcal{U}}\ \phi(x)
这个公式很朴素:在未标注池里找让打分函数 φ 最大的那个样本。φ 怎么设计,决定了主动学习是“有效省力”还是“白花钱”。
  1. 候选池 \mathcal{U}所有还没标注的样本集合,相当于菜单上还没尝过的 120 道菜。
    U={x1,x2,…,xn}\mathcal{U}=\{x_1,x_2,\ldots,x_n\}
  2. 打分函数 \phi(x)查询策略的核心,把“这道菜多值得试吃”量化成一个分数,φ 越大代表越值得标注。
    ϕ:U→R\phi:\mathcal{U}\rightarrow\mathbb{R}
  3. \arg\max 取值遍历整个候选池,找出让 φ 达到最大值的那个 x,作为本轮要查询的样本。
    x∗=arg⁡max⁡x∈U ϕ(x)x^{*}=\displaystyle\arg\max_{x\in\mathcal{U}}\ \phi(x)
  4. 预算约束实际中每次不只选一个,而是选 Top-K 批量标注,φ 分数排名前 K 的样本进入标注队列。
    Squery={x(1),x(2),…,x(K)}S_{\text{query}}=\{x_{(1)},x_{(2)},\ldots,x_{(K)}\}

不确定性采样——专治“拿不准”

小A的目光停在“夫妻肺片”上。菜单上写着“麻辣”,可服务员含糊地说“也可以做甜口”。到底是麻是甜?小A越看越拿不准,反而越想点它——因为这一口下去,哪怕只纠正一个认知,信息量也远大于再点一道十拿九稳的“回锅肉”。这就是不确定性采样的直觉:模型越犹豫的样本,越值得标注。

模型对每个未标注样本都会输出“它属于各个类别的概率”。如果一类概率接近 0.9,模型很笃定,这条数据标了也学不到多少新东西;如果概率在 0.5 附近摇摆,说明模型正处于“知识盲区”,这种样本就是黄金样本。围绕“如何量化犹豫程度”,业界有三种经典算法:最低置信度(Least Confidence)取最高类别概率,概率越低越优先;边缘采样(Margin Sampling)看最高两个类别概率的差,差值越小说明模型在两类之间摇摆得越厉害;熵值采样(Entropy)则从信息论出发,用熵来度量整体概率分布的不确定性。

熵可以理解为“惊讶程度的期望”。如果一道菜的口味只有麻辣一种可能,熵就低,因为结果没什么可惊讶的;如果甜口、麻口、酸口概率各占三分之一,熵就高,因为尝之前你完全猜不到。把这种直觉写成公式:

小A最终把“夫妻肺片”列进了第一轮试吃清单,因为它最可能颠覆他的味觉地图。不过他也隐隐担心:如果每轮都只点最拿不准的菜,会不会 8 道菜吃下来,全是同一类辣味?这个担忧,恰好指向了另一种查询策略。

H(x)=−∑c=1CP(y=c∣x)log⁡2P(y=c∣x)H(x)=\displaystyle-\sum_{c=1}^{C}P(y=c\mid x)\log_2 P(y=c\mid x)
熵越大,说明模型的预测分布越接近均匀、越犹豫。熵值采样就是选熵最大的未标注样本去查询。
  1. 类别 c 与 C模型面临的 C 个类别,比如“甜口/辣口”两类,这里要遍历每一个类别。
    c∈{1,2,…,C}c\in\{1,2,\ldots,C\}
  2. 条件概率 P(y=c|x)模型认为样本 x 属于类别 c 的置信度,取值在 0 到 1 之间,数值越高越自信。
    0≤P(y=c∣x)≤10\le P(y=c\mid x)\le 1
  3. 对每一项取 -\log_2概率越小,-\log_2 越大,表示“如果它真的是这个类,带来的惊讶越大”。
    Ic=−log⁡2P(y=c∣x)I_c=-\log_2 P(y=c\mid x)
  4. 按概率加权求和把每个类别的“惊讶度”用它的概率加权后相加。分布越均匀,熵越高,模型越没把握。
    H(x)=∑c=1CP(y=c∣x)⋅IcH(x)=\sum_{c=1}^{C}P(y=c\mid x)\cdot I_c

多样性采样——别让螃蟹霸占整桌

假设小A真把 8 道预算全花在“最拿不准”的麻辣菜上:辣子鸡、水煮鱼、毛血旺……最后写出来的食评,麻辣维度写了三页纸,可这家店的凉菜、汤品、甜点一个都没尝过,读者照样不知道这家店值不值得来。一顿合格的品鉴,不能扎堆。

不确定性采样恰好有个这样的毛病:最让模型犹豫的样本通常挤在决策边界附近的同一个簇里。第一轮标完一批,剩下最犹豫的还是同一个区域,结果钱全花在了同一种口味上。多样性采样(Diversity Sampling)正是补这个缺口的思路,两大代表方法分别是聚类代表和核心集覆盖。聚类代表先对未标注数据做 K-Means 分簇,把特征空间切成几块“口味区”,再从每个簇里挑离中心最近的代表样本;核心集覆盖更进一步,它不问“每簇挑谁”,而是直接寻找一个大小为 K 的子集,让所有未标注样本到该子集的距离都尽量近。

核心集选择的数学目标非常漂亮,它要同时处理“覆盖”和“预算”两个约束:

小A把第一轮的“麻辣专场”划掉,重新调整:凉菜点一道、热菜点一道、汤品点一道、甜点补一道。8 道菜分布在菜单的不同角落,食评的四个维度终于站得住了。可他转念一想:如果只求覆盖,会不会错过了那盘最惊艳、最能代表这家店水平的“辣子鸡”?这种从全局视角出发的纠偏,正是下一节的主角。

S∗=arg⁡min⁡S⊂U, ∣S∣=K max⁡x∈U min⁡s∈S d(x,s)S^{*}=\displaystyle\arg\min_{S\subset\mathcal{U},\,|S|=K}\ \max_{x\in\mathcal{U}}\ \min_{s\in S}\ d(x,s)
一句话解释:在预算 K 的限制下,选一个子集 S,让离 S 最远的那个未标注样本也不要太远。通俗讲就是“用最少的代表菜,覆盖菜单上所有口味角落”。
  1. 候选子集 S 与预算 K要从未标注池里挑出一个大小为 K 的子集,这就是本轮要标注的样本集合。
    S⊂U,∣S∣=KS\subset\mathcal{U},\quad |S|=K
  2. 距离 d(x,s)x 与已选代表 s 在特征空间中的距离,常用欧氏距离,距离近代表口味相近、信息冗余。
    d(x,s)=∥x−s∥2d(x,s)=\lVert x-s\rVert_2
  3. 内层 \min_{s\in S}对每个未标注样本 x,找离它最近的已选代表,得到“x 到集合的最短距离”。
    dmin⁡(x,S)=min⁡s∈Sd(x,s)d_{\min}(x,S)=\min_{s\in S}d(x,s)
  4. 外层 \min\max希望“最远的那个样本”也不要离代表太远,即最小化最大覆盖半径。
    min⁡S max⁡x∈U dmin⁡(x,S)\min_{S}\ \max_{x\in\mathcal{U}}\ d_{\min}(x,S)

期望效果策略——全局一杆秤

小A旁边坐着一位更资深的前辈,他点菜的方式让小A大开眼界。前辈不看哪道菜最拿不准,也不看口味覆盖,而是问:“我吃了哪道菜之后,对整家店的判断会变得最笃定?”他选了“辣子鸡”——因为这是川菜的基本功,试完这一道,这店其他菜的辣度、火候、用料水平都能估出七八成。

期望效果策略(Expected Effect Strategy)走的就是这条全局路线。它不是“局部好奇”,而是模拟“标注后模型的变化”,选对全局帮助最大的样本。两个经典实现:期望误差减少(Expected Error Reduction,EER)设想如果给某个样本标上了某个标签、加入训练集会重训模型,然后让新模型在未标注池上跑一遍,看看整个池子的期望误差降了多少;误差降得越多,这个样本越值得标。期望模型改变(Expected Model Change)则换个角度衡量“变化”——用新参数与旧参数的差异幅度(常以梯度大小近似)来判断这个样本对模型参数的“冲击力”。

EER 的公式表达了这个思想实验的全过程:

前辈的“全局一杆秤”让小A叹服,但前辈也提醒:“EER 每次查询都要重训模型,点一道菜要重新尝一整桌,代价不小。”小A记下这句话,开始思考一个更现实的问题:不同餐厅、不同预算,到底该用哪套点菜法?

x∗=arg⁡min⁡x∈U Ey~∼P(y∣x)[ L(θ′(x,y~),U) ]x^{*}=\displaystyle\arg\min_{x\in\mathcal{U}}\ \mathbb{E}_{\tilde{y}\sim P(y\mid x)}\Big[\ \mathcal{L}\big(\theta^{\prime}(x,\tilde{y}),\mathcal{U}\big)\ \Big]
这是所有查询策略中最“想得多”的一个:它会假想每一种可能的标注结果,重训模型,再评估全局损失,最后挑那个让全局损失期望最小的样本。理论上漂亮,代价也不小。
  1. 虚拟标签 \tilde{y}样本还没标,但假设它的标签服从当前模型的预测分布,用来模拟“如果标出来是这个类会怎样”。
    y~∼P(y∣x)\tilde{y}\sim P(y\mid x)
  2. 重训后的参数 \theta^{\prime}把 (x, \tilde{y}) 当作新标注样本加入训练集重新训练,得到新模型参数。
    θ′(x,y~)=arg⁡min⁡θLtrain(θ)\theta^{\prime}(x,\tilde{y})=\arg\min_{\theta}\mathcal{L}_{\text{train}}(\theta)
  3. 未标注池上的损失新模型在候选池 \mathcal{U} 上的平均损失,代表“这种标注带来的全局收益”。
    L(θ′,U)=1∣U∣∑u∈Uℓ(θ′,u)\mathcal{L}(\theta^{\prime},\mathcal{U})=\frac{1}{|\mathcal{U}|}\sum_{u\in\mathcal{U}}\ell(\theta^{\prime},u)
  4. 求期望与取最小对每个样本的所有可能标签求期望损失,然后挑期望损失最小的那个样本去查询。
    x∗=arg⁡min⁡x E[L(θ′,U)]x^{*}=\arg\min_{x}\ \mathbb{E}\big[\mathcal{L}(\theta^{\prime},\mathcal{U})\big]

策略对比选型——看菜下筷

小A翻开前辈的旧笔记,发现没有一条策略是“万能钥匙”。老饕只点拿不准的,结果 8 道川菜撞了型;另一位美食博主只求口味覆盖,却完美错过了店里最惊艳的招牌菜。选策略要“看菜下筷”——菜单厚薄、口味宽度、预算多少,决定了该用哪一招。

落到工程选型上,三个维度最关键:规模适配。候选池只有几千条时,不确定性采样又快又有效,一次推理就能算出所有分数;候选池到了百万级,纯不确定性采样会选出大量“扎堆”样本,必须叠加多样性约束。噪声鲁棒。如果数据集中本身就有标注错误或者离群点,纯不确定性采样会把预算疯狂砸在“怪味菜”上——那些离群样本让模型永远犹豫。EER 这类全局策略对离群点也更敏感。延迟开销。不确定性采样只需一轮前向推理,毫秒级出分;EER 每查询一个样本都要重训一次模型,在深度模型上几乎不可用,通常只有在小模型或代理模型上才能落地。

把这些权衡写成一个可调的综合评分,思路是把不确定性分和多样性分线性叠加:

小A在笔记末尾写道:“菜单薄、口味单一的店,随便点都行;菜单厚、口味杂的店,第一轮先点拿不准的,第二轮补覆盖,第三轮看全局。”他忽然意识到,这些策略从来不是单打独斗,真正的高手都是把几套打法组合着用。

S(x)=α⋅U(x)+β⋅D(x),α,β≥0S(x)=\alpha\cdot U(x)+\beta\cdot D(x),\quad \alpha,\beta\ge 0
这里的 U 是“犹豫度”,D 是“差异化距离”。α 大代表更倾向猎奇、找边界样本;β 大代表更求稳、防冗余。调节这两个旋钮,就是在不同的数据分布之间做取舍。
  1. 不确定性分 U(x)模型对 x 的“犹豫程度”,来自置信度、边缘或熵中的任意一种,取值范围归一化到 [0,1]。
    U(x)∈[0,1]U(x)\in[0,1]
  2. 多样性分 D(x)x 与已选出样本的差异化程度,实践中常用 x 到已知标注集的最短距离表示,距离越大越不重复。
    D(x)=min⁡s∈Slabeledd(x,s)D(x)=\min_{s\in S_{\text{labeled}}}d(x,s)
  3. 权重 \alpha,\beta调节“猎奇”和“覆盖”的偏好,两者之和常归一化为 1,让综合分保持稳定量级。
    α+β=1\alpha+\beta=1

组合与评估——好菜配好单

小A最终交出的试吃方案是混合的:第一轮用“最拿不准”锁 3 道,快速摸清味觉边界;第二轮用“口味覆盖”补 3 道,防止菜品扎堆;第三轮用“代表菜”填 2 道,让食评更有纵深。三轮下来,8 道菜既有重点又有广度。这种混合打法正是工程中最常见的策略组合思路。

把混合思路写成通用框架,就是对多个策略的得分做加权融合。比如令 φ₁ 是熵值采样分、φ₂ 是核心集距离分,然后计算加权总和。两阶段法也很常用:先用聚类把未标注数据分成几桶,再在每个桶内做不确定性采样,相当于“先定菜系,再挑招牌”。批量查询时还要做一步去重,保证同一道菜不会在 Top-K 里出现两次。至于怎么验证策略好不好用?标准答案是学习曲线:横轴是标注样本数,纵轴是模型性能(准确率或 AUC),曲线越陡峭,说明标注预算花得越值;另一个常用指标是标注效率,即“单位标注数带来的性能提升”。

加权融合的数学形式简单却极其灵活:

交稿那天,主编只问了小A一句:“8 道菜,换回一篇合格的食评了吗?”小A摊开学习曲线,横轴是试吃道数,纵轴是食评的读者评分——前 4 道菜评分一路飙升,后 4 道增速放缓但把覆盖面撑了起来。这就是查询策略的全部意义:让每一口试吃,都花在能改变判断的地方。

score(x)=∑k=1Kλk ϕk(x),∑k=1Kλk=1\text{score}(x)=\sum_{k=1}^{K}\lambda_k\,\phi_k(x),\qquad \sum_{k=1}^{K}\lambda_k=1
几个策略各出一张分,乘上信任权重后加总。权重就是你的方向盘:数据噪声大就调大多样性权重,预算紧就调大不确定性权重。
  1. 策略集合 \phi_k把不同策略放进同一个打分框架,例如 φ₁ 是熵值采样分、φ₂ 是核心集距离分。
    ϕ1=H(x),ϕ2=dmin⁡(x,S)\phi_1=H(x),\quad \phi_2=d_{\min}(x,S)
  2. 权重 \lambda_k每个策略的信任度,所有 λ 非负且和为 1,保证融合后的分数量级稳定。
    λk≥0,∑k=1Kλk=1\lambda_k\ge 0,\quad\sum_{k=1}^{K}\lambda_k=1
  3. 按需调参数据噪声大时调大 λ₂(多样性),标注预算紧时调大 λ₁(不确定性),本质就是旋转几个旋钮。
    score 越大,越先进入标注队列\text{score 越大,越先进入标注队列}

AI 应用场景

医疗影像可疑病灶筛查

阶段:数据标注排序与迭代采集

解决的问题:病理切片中 99% 是正常组织,医生逐张阅读成本极高,随机抽样会把大量预算浪费在正常片上。用不确定性采样给可疑病灶切片优先排队,再用聚类去重避免同一病人的相似切片重复标注。

具体案例:某三甲医院肺癌 CT 筛查项目,2 万张未标注切片、预算 500 张。第一轮用熵值采样选 300 张最可疑的切片,第二轮用聚类补 200 张覆盖不同肺叶,医生完成标注后模型 AUC 从 0.82 提升到 0.91,而随机抽样的对照组仅提升到 0.85。

客服工单意图冷启动

阶段:冷启动样本选择与标注预算分配

解决的问题:新接入的电商客服系统有 100 万条历史工单且无标签,意图类别超过 40 类、长尾严重,直接众包标注又贵又慢。用核心集选择把每类意图的代表样本先选出来,让冷启动模型尽快覆盖全部意图类型。

具体案例:先将工单文本向量化并聚类成 45 桶,每桶挑 5 条离中心最近的工单,共 225 条送去标注。模型重训后意图分类 F1 从随机种子冷启动的 0.43 提升到 0.79,且迭代三轮后长尾意图的召回率翻倍。

自动驾驶边缘场景挖掘

阶段:数据闭环与困难样本挖掘

解决的问题:路测数据里常规路况海量、罕见路况(逆光、暴雨、事故车)稀少,随机抽帧选出来的全是高速路直行画面。用多样性采样对视频帧做特征聚类,每簇抽代表,再配合不确定性采样重点挑选模型在困难场景上低置信度的帧。

具体案例:某自动驾驶团队从 10 万小时路测数据中抽出 5000 帧送去标注,罕见场景覆盖率从 12% 提升到 67%,模型在 corner case 数据集上的 mAP 提升 9 个百分点。

Python 演示

python47 行
import numpy as npfrom sklearn.datasets import make_classificationfrom sklearn.linear_model import LogisticRegression  def uncertainty_sampling(model, X_pool):    proba = model.predict_proba(X_pool)    return np.argmin(proba.max(axis=1))  def margin_sampling(model, X_pool):    proba = np.sort(model.predict_proba(X_pool), axis=1)    return np.argmin(proba[:, -1] - proba[:, -2])  def core_set_selection(X_labeled, X_pool):    dists = np.min(np.linalg.norm(X_labeled[:, None, :] - X_pool[None, :, :], axis=2), axis=0)    return np.argmax(dists)  def active_learning_loop(n_queries=12, strategy="uncertainty"):    X, y = make_classification(        n_samples=400, n_features=4, n_informative=3,        n_redundant=0, n_clusters_per_class=1, random_state=42    )    idx_labeled = np.random.choice(len(X), 4, replace=False)    idx_pool = np.setdiff1d(np.arange(len(X)), idx_labeled)    accs = []    for _ in range(n_queries):        model = LogisticRegression(max_iter=600)        model.fit(X[idx_labeled], y[idx_labeled])        accs.append(model.score(X[idx_pool], y[idx_pool]))        if strategy == "uncertainty":            q = uncertainty_sampling(model, X[idx_pool])        elif strategy == "margin":            q = margin_sampling(model, X[idx_pool])        elif strategy == "core_set":            q = core_set_selection(X[idx_labeled], X[idx_pool])        idx_labeled = np.append(idx_labeled, idx_pool[q])        idx_pool = np.delete(idx_pool, q)    return accs  if __name__ == "__main__":    for s in ["uncertainty", "margin", "core_set"]:        accs = active_learning_loop(strategy=s)        print("Strategy %-12s final acc: %.3f" % (s, accs[-1]))
目的:用逻辑回归在合成分类数据上跑通主动学习循环,对比三种查询策略(置信度最低、边缘采样、核心集选择)经过 12 轮迭代后的最终准确率,直观感受“会选数据”带来的增益。
  1. def uncertainty_sampling(model, X_pool)计算每个未标注样本的最大预测概率,取最小的那个,即模型最没把握的样本。
  2. proba.max(axis=1)取每行(每个样本)各类别概率的最大值,代表模型当前的自信程度。
  3. def margin_sampling(model, X_pool)对每行概率排序后取“最大减次大”,差值最小说明模型在两个类别间摇摆。
  4. def core_set_selection(X_labeled, X_pool)用向量化广播计算每个未标注样本到所有已标注样本的距离,取每个点的最近距离,再选最近距离最大的点。
  5. dists = np.min(np.linalg.norm(X_labeled[:, None, :] - X_pool[None, :, :], axis=2), axis=0)核心的距离矩阵计算:把已标注集和候选集扩展出两个新维度(None),广播求差后沿特征轴求范数,再沿已标注轴求最小。
  6. idx_labeled = np.append(idx_labeled, idx_pool[q])把本轮选中的样本索引从候选池挪进标注池,模拟一次人工标注完成。
  7. idx_pool = np.delete(idx_pool, q)从候选池删除已标注样本,保证同一数据不会被重复查询。

常见误区

误区我以为置信度最低采样就是把模型预测概率最小的那个样本挑出来标,反正概率越小越值得标。

正解它挑的是“模型最自信的那个类别也不够自信”的样本,也就是最高类别概率最小。一条样本如果模型预测的 10 个类别概率都在 0.1 附近,最高概率才 0.1,这才是真正的“难以区分”。而单纯看最低类别概率,可能挑到的是某个类别概率为 0.0001 的极端样本,那种样本往往是噪声或离群点,信息量并不高。

为何常见:因为“置信度低”这四个字容易被望文生义理解成“概率小”,忘了前面还有一个隐藏的“最高类别”限定。

误区主动学习嘛,就是跑一遍模型,把所有预测概率低的样本全部挑出来给标注员,标完就结束了。

正解主动学习是一个“训练 → 查询 → 标注 → 重训”的闭环,不是一次性筛选。第一轮挑出最不确定的样本,标注重训后,模型的不确定区域已经移动,第二轮要做的是在新模型的视角下重新打分。如果停止迭代,效果和一次性随机抽样差别不大,因为单轮查询无法利用标注反馈来动态调整后续选择。

为何常见:很多人把主动学习误当成一个静态的特征筛选器,忽略了它本质是一个迭代决策过程。

误区数据反正都要进训练集,随机抽一批跟主动学习挑一批,最后模型效果应该差不多吧?

正解当标注预算占全部数据的比例极低时,随机抽样选出的样本往往集中在数据密集区,信息冗余高;主动学习专门挑信息量大、能补全知识盲区的样本。经典实验里,主动学习用 5% 的标注数据就能追平随机抽样 20% 数据的模型效果。预算越紧,两者差距越明显。

为何常见:因为模型在“数据足够多”的前提下随机采样确实够用,人们容易把充足的场景惯性带到稀缺预算场景里。

误区既然不确定性采样这么厉害,那以后所有项目无脑上不确定性采样就对了。

正解当数据集中存在大量噪声标签或不可分的离群点时,模型会一直对离群点保持高不确定度,纯不确定性采样会把预算全部砸在怪味菜上。此时加多样性约束让选择分散开,或者退回到随机采样做基线,反而更稳。策略好不好,必须结合数据质量与任务可分性来判断。

为何常见:看到基准实验里不确定性采样平均效果最好,就忽略了实验数据是经过清洗的,真实生产数据远没有那么友好。

误区EER 从全局优化角度出发,听起来最科学,那直接用它做查询策略肯定最优吧?

正解EER 每查询一个样本都要模拟一次重训并在整个候选池上评估,计算开销随模型规模和池子大小急剧膨胀。对于深度模型,这种策略几乎无法落地。工程上常规做法是先跑不确定性采样基线,再用聚类或核心集补多样性,只有在数据量小、模型轻的场景才考虑 EER。

为何常见:人们容易把“理论最优”等同于“实践最优”,忽略了计算成本这一关键的部署约束。

面试题

Q1. 主动学习循环中,“查询策略”扮演的角色最接近下列哪项?

单选题 · easy

  • A.品菜师决定先试哪道菜← 正确答案
  • B.厨师决定怎么炒菜
  • C.服务员决定上菜顺序
  • D.收银员决定账单金额

答案:A。查询策略解决“从大量未标注数据中选哪些去标注”,正如品菜师决定先尝哪道菜。厨师对应模型训练,服务员对应用户交互,收银员对应评估环节,都不是选数据的角色。

Q2. 置信度最低(Least Confidence)采样选择的是哪种样本?

单选题 · easy

  • A.最高类预测概率最小的样本← 正确答案
  • B.最低类预测概率最小的样本
  • C.所有类别概率分布最均匀的
  • D.两个最高概率差值最小的

答案:A。置信度最低的核心是“模型最自信的类别也不够自信”,取最高概率并选最小的那个。B 找的是罕见类,C 是熵值采样的特征,D 是边缘采样的特征,三者都不等于置信度最低。

Q3. 边缘采样(Margin Sampling)最适合用在什么任务上?

单选题 · easy

  • A.需要类别概率输出的分类任务← 正确答案
  • B.只需要特征向量、无概率的任务
  • C.仅支持连续值回归的任务
  • D.只包含离散 ID 特征的排序任务

答案:A。边缘采样需要比较最高两个类别的预测概率差值,前提是模型能输出类别概率,因此适合概率输出的分类任务。无概率的模型、纯回归任务或离散排序任务都无法直接用边缘采样。

Q4. 多样性采样主要解决不确定性采样的哪个缺陷?

单选题 · mid

  • A.选中的样本扎堆冗余← 正确答案
  • B.模型收敛速度变快
  • C.标注成本大幅下降
  • D.特征维度自动减少

答案:A。不确定性采样把焦点放在决策边界附近,连续多轮容易反复选中同一簇的样本,造成冗余。多样性采样通过聚类或核心集让选中样本在特征空间分散开,正好补齐这个缺陷。

Q5. 以下哪些属于不确定性采样的具体方法?

多选题 · mid

  • A.置信度最低采样← 正确答案
  • B.边缘采样← 正确答案
  • C.熵值采样← 正确答案
  • D.核心集选择

答案:ABC。三种经典不确定性采样分别从最高概率、概率差值、信息熵三个角度度量模型的“犹豫程度”。核心集选择属于多样性采样家族,目标是覆盖整个未标注池,故不选 D。

Q6. 核心集选择(Core-Set Selection)的目标是什么?

单选题 · mid

  • A.让选中的样本覆盖全部未标注样本且覆盖半径最小← 正确答案
  • B.让选中的样本彼此距离最大
  • C.让聚类簇的数量尽量多
  • D.让模型推理速度尽可能快

答案:A。核心集是“最小覆盖半径”问题:在预算内选子集,使离它最远的未标注样本距离也尽量小。B 是最大分散但不是核心集的直接目标,C 和 D 与覆盖无关。

Q7. 关于期望误差减少(EER)策略,下列说法正确的有?

多选题 · mid

  • A.目标是让标注后的模型泛化误差期望最小← 正确答案
  • B.计算开销通常较大← 正确答案
  • C.不需要使用任何未标注数据
  • D.仅适合高维深度模型

答案:AB。EER 模拟“标注某个样本后重训模型,再在未标注池上评估损失”的过程,因此天然依赖未标注池且开销大,A、B 正确,C 错误。EER 因重训成本高,更适合小模型而非深度模型,D 错误。

Q8. 以下哪些是组合查询策略的合理做法?

多选题 · hard

  • A.不确定性分与多样性分加权求和← 正确答案
  • B.先聚类分桶再在桶内做不确定性采样← 正确答案
  • C.把熵值分与核心集距离分线性融合← 正确答案
  • D.任意两个策略的分数可以随意抵消

答案:ABC。加权求和、两阶段分桶、线性融合都是工程上常见的组合策略,能同时兼顾信息量与覆盖面。D 是陷阱:策略分数需要经过统一归一化和权重约束才能融合,不能“随意抵消”。

Q9. 数据含有较多噪声离群点时,纯不确定性采样容易产生什么问题?

单选题 · hard

  • A.把查询预算浪费在离群点上← 正确答案
  • B.模型推理速度必然变慢
  • C.标注员数量必须增加
  • D.特征空间维度自动升高

答案:A。离群点通常会让模型持续保持高不确定度,纯不确定性采样会反复选中它们,导致预算浪费。应对办法是叠加多样性约束或改用更鲁棒的策略,这与推理速度、标注员数量、特征维度无关。

Q10. 用学习曲线评估查询策略时,横轴和纵轴通常分别是什么?

单选题 · extreme

  • A.横轴是标注样本数,纵轴是模型性能← 正确答案
  • B.横轴是训练轮数,纵轴是训练损失
  • C.横轴是模型参数量,纵轴是推理精度
  • D.横轴是数据维度,纵轴是标注成本

答案:A。学习曲线的核心是回答“标注预算花得值不值”,因此横轴是累计标注的样本数(预算),纵轴是模型在验证集上的性能指标。曲线越陡,说明每增加一个标注样本带来的性能提升越大。其余组合都不衡量标注效率。