想象你是一家新开张小餐馆的店主老陈。餐馆开在一条热闹的美食街上,可一个月过去了,门口冷冷清清——没人来吃,就没有点评;没有点评,路过的客人更不敢进门。你手里只有一千张印菜单的传单(这就是你全部的“营销预算”),不可能发给街上每个路人。直觉告诉你,与其漫无目的地见人就发,不如观察一下:哪些客人看起来最犹豫?哪些客人像是在替一大帮朋友踩点?把传单精准递给这些人,让他们进门、吃完、写下点评,口碑才能像滚雪球一样转起来。 这就是“冷标注样本处理”要做的事。在 AI 世界里,“顾客点评”就是人工标注的标签,“传单预算”就是有限的标注经费。一个刚立项的模型,手头几乎没有带标签的数据(这就是“冷启动”),工程师们得像老陈一样精明:让模型自己决定“该请谁进门”。这个“主动挑选样本 → 请人标注 → 模型变聪明 → 再挑下一批”的循环,就是主动学习(Active Learning)的核心。而冷标注样本处理,正是这套功夫的起手式——如何在标注预算几乎为零时,用最少的标签撬动最大的模型性能。

岗位关联

对 AI 从业者而言,学会冷标注样本处理,意味着你不再是被动等待“标注好的数据”,而是能主动掌控“用最少的钱训练最好的模型”这项稀缺能力——无论做 NLP、CV 还是工业质检,它都能直接降低数据成本、加速项目落地。

目录
  1. 可视化演示
  2. 冷启动困境
  3. 不确定性查询
  4. 代表性采样
  5. 多样性覆盖
  6. 融合策略
  7. 闭环验证
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示哈希表的键值插入、哈希函数映射和链地址法冲突解决过程,支持切换插入与查找模式并调节操作速度。

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

哈希表插入过程 红色为当前操作桶,粉色为链中已有元素,绿色为查找命中 h(k) = k mod m 调节间隔控制操作速度

冷启动困境

老陈站在店里,看着桌上那一千张传单,心里直打鼓:发给谁?隔壁烧烤店老板给他支了一招——“按门牌号挨家挨户塞就行了呗!”老陈知道这主意不靠谱:整条街三百户人家,挨家发一遍,一半传单会进了垃圾桶,真正愿意来尝鲜的人根本没收到几张。随机采样就是这样一种“挨家发传单”的笨办法:它在无标签的数据池里随便挑样本让人标注,运气好能碰上几个有用的,运气不好标了一百条还是教不会模型。

冷启动的本质是“鸡生蛋”的恶性循环:模型需要标注数据才能学会预测,可它还没学会预测,就没法判断哪些数据值得标注。那么,能不能用一条极小的“种子标注集”先让模型跑起来,让它自己开口说“我想看哪条数据”?这就是主动学习的起点——把“挑样本”的权力从人手里交给模型自己。主动学习框架会维护一个“未标注池”和一个“已标注集”,每一轮都让模型从池子里挑出最该被标注的样本,送去给人工打标签,然后把新标签塞回训练集,让模型长大一点,再去挑下一批。

衡量一个冷启动策略好不好,业界有一个直观的指标——标注效率比:随机采样需要 \(N_{\text{random}}\) 个样本才能达到的效果,主动采样用 \(N_{\text{active}}\) 个就做到了:

老陈想明白了:挨家发传单不叫营销,叫浪费。他决定换一套思路——先观察街上来往的人,再决定把传单递给谁。模型也该如此,先靠极少种子样本站起来,再自己挑食。

E=NrandomNactiveE = \frac{N_{\text{random}}}{N_{\text{active}}}
效率比 \(E\) 表示主动采样比随机采样“省了多少倍标注量”。\(E=3\) 意味着过去要标 300 条,现在标 100 条就能达到同样的模型准确率。
  1. 随机采样的标注量展开\(N_{\text{random}}\) 是不加任何挑选、纯随机标注时需要的样本数。它的特点是“广撒网”,但大量样本信息冗余,教不会模型新东西。
    Nrandom=随机策略达到目标精度所需标注数N_{\text{random}} = \text{随机策略达到目标精度所需标注数}
  2. 主动采样的标注量展开\(N_{\text{active}}\) 是主动学习策略下挑选同样数量的样本后的实际标注数。因为每一条都是“千挑万选”出来的,通常远小于前者。
    Nactive=主动策略达到目标精度所需标注数N_{\text{active}} = \text{主动策略达到目标精度所需标注数}
  3. 两者相除得到倍数关系效率比数值越大,说明主动挑选越“物超所值”。当 \(E=1\) 时,主动学习和随机采样没区别,策略就失效了。
    E=NrandomNactive(E≥1)E = \frac{N_{\text{random}}}{N_{\text{active}}} \quad (E \geq 1)

不确定性查询

老陈发现一个规律:那些在店门口踱步、反复看菜单、又掏出手机查点评的客人,最容易被一张传单打动。为什么?因为他们“心里没谱”——不确定这家店好不好吃,所以外界的任何一点信息都能推动他们做决定。不确定性查询正是抓住了这个心理:一个样本,如果模型对它的预测结果摇摆不定、糊里糊涂,那它带给模型的“信息增量”就最大。

什么叫“模型摇摆不定”?比如手写数字识别,一个样本的预测结果是“有 45% 像 3,有 45% 像 8,剩下 10% 像别的”,模型完全拿不准它是 3 还是 8。这时候只要请人标注一下,模型就能学会一个极具鉴别力的边界。相比之下,一个被模型以 99% 置信度判定为 7 的样本,标了也白标——它早就懂了。熵(Entropy) 是量化这种“糊涂程度”的经典工具,它统计模型在所有类别上的概率分布有多“平均”:

除了熵,工程上还常用边缘采样——只看模型预测概率最高的两个类别,两者差距越小说明越纠结;以及置信度阈值——凡是预测置信度低于某个门槛的样本统统进入待标注队列。老陈心里有了底:传单要发给“站在门口犹豫最久的人”。模型挑样本也一样,先找那些“最没把握”的。

H(x)=−∑ipilog⁡piH(x) = -\sum_{i} p_i \log p_i
熵 \(H(x)\) 越大,说明模型对样本 \(x\) 的预测越均匀、越没把握。概率均匀分布在所有类别上时熵最大;概率集中到某一个类别时熵接近 0。
  1. 取出模型对各类的预测概率对样本 \(x\),模型会输出它属于每个类别 \(i\) 的概率 \(p_i\),比如“45% 像 3、45% 像 8、10% 像别的”。
    pi=P(y=i∣x)p_i = P(y = i \mid x)
  2. 计算每个类别的信息贡献把 \(p_i\) 取自然对数再乘以 \(p_i\)。概率越接近中位数 \(0.5\),这个值的绝对值越大,代表这个类别“搅浑水”的能力越强。
    pilog⁡pip_i \log p_i
  3. 加负号让结果为正因为 \(\log p_i \leq 0\),整体乘上负号后,\(H(x)\) 恒为非负,方便比较大小。
    −pilog⁡pi-p_i \log p_i
  4. 所有类别求和把每个类别的贡献加总。\(H(x)\) 接近 0 表示模型很确定;\(H(x)\) 达到上限表示模型对每一类都“五五开”。
    H(x)=−∑ipilog⁡piH(x) = -\sum_{i} p_i \log p_i

代表性采样

可老陈很快就遇到了新问题:按“谁最犹豫”来发传单,确实拉来了一批客人,但这些人都是二十来岁的年轻人。口味清淡的老顾客、带着孩子的家庭、嗜辣重口的食客,一个都没进来。这是因为“最犹豫”的客人往往都扎堆在决策边界附近,长得都差不多,标一个就能代表一群——如果把预算全砸在他们身上,其他区域的样本就全被冷落了。

于是老陈又想:能不能在“犹豫的人”之外,再请一些“特别有代表性”的客人?比如街上那个天天跟邻居唠嗑的王大爷,他一个人就认识半条街的人,还知道每个人的口味。请了他,等于一次采访了半个街区。在数据世界里,这种“认识很多人”的样本叫代表性样本——它落在数据分布最稠密的区域,周围有大量相似的邻居,标了它,模型就能推断它周围一大片未标注样本的类别。

量化代表性最常用的方法是密度估计:数一数样本 \(x\) 周围有多少近邻,邻居越多,代表性越强。用 \(K\) 近邻的概念来表达,样本的代表性得分可以写作它到所有邻居相似度的平均值:

老陈的传单策略升级了:一半发给犹豫的人,一半发给王大爷这样的“社区节点”。模型也一样,有了不确定性还不够,还得参考代表性——请一个“认识很多人”的样本,等于同时请了它的一整个圈子。

R(x)=1k∑xj∈NNk(x)sim(x,xj)R(x) = \frac{1}{k} \sum_{x_j \in \text{NN}_k(x)} \text{sim}(x, x_j)
\(R(x)\) 衡量样本 \(x\) 能在多大程度上“代言”它周围的 \(k\) 个邻居。如果 \(x\) 周围样本密集且相似度高,它的代表性得分就高,先标它性价比最高。
  1. 找出样本的 \(k\) 个最近邻用距离度量(如欧氏距离)找到数据池里与 \(x\) 最相近的 \(k\) 个样本,记作 \(\text{NN}_k(x)\)。
    NNk(x)={xj∣xj 是 x 的 k 个最近邻}\text{NN}_k(x) = \{x_j \mid x_j \text{ 是 } x \text{ 的 } k \text{ 个最近邻}\}
  2. 逐对计算相似度用余弦相似度或高斯核函数计算 \(x\) 与每个邻居 \(x_j\) 的相似度分数,越相似分数越高。
    sim(x,xj)∈[0,1]\text{sim}(x, x_j) \in [0, 1]
  3. 求平均值把 \(k\) 个相似度分数加起来除以 \(k\)。得分高的样本说明它身边“人丁兴旺”,标它等于标了一大片。
    R(x)=1k∑xj∈NNk(x)sim(x,xj)R(x) = \frac{1}{k} \sum_{x_j \in \text{NN}_k(x)} \text{sim}(x, x_j)

多样性覆盖

又过了两周,老陈发现一个问题:他确实请了不少“社区节点”,可这些节点彼此也是熟人——王大爷认识的街坊,和李大妈认识的街坊,几乎全是同一拨人!传单发出去了,收获的点评却高度雷同。这就是多样性缺失的代价:如果选出的样本一个比一个相似,那么标注它们获得的信息就严重冗余,等于花钱请同一批人重复回答同一个问题。

多样性覆盖要求选出的这一批样本,彼此之间尽量“不撞脸”。数据版本里怎么做?两个手段:一是相似度去重——候选样本得分再高,如果和已经被选中的某个样本相似度超过阈值,就把它剔除或降权;二是类别配额——预先按类别分配标注名额,比如这一批要标 100 条,每个类别最多占 25 条,防止模型偏科。一个实用的小技巧是批次约束:不要一条一条地挑(那会导致连续选中一堆相似样本),而是每次“成批挑选”,一边挑一边实时更新已选样本集,让后续挑选自动避开“撞脸”的样本。

形式化表述:给定已选样本集 \(S\),新候选样本 \(x\) 的多样性得分定义为它与 \(S\) 中所有样本的最小相似度——离“已选圈子”越远越好:

老陈现在懂了:请客不能只请一个圈子的,川菜、粤菜、甜品、轻食都得照顾到。多样性覆盖让这一批“被请进门的样本”尽可能覆盖整个数据空间的各个角落,不浪费一寸标注预算。

D(x)=1−max⁡xs∈Ssim(x,xs)D(x) = 1 - \max_{x_s \in S} \text{sim}(x, x_s)
\(D(x)\) 越高,说明 \(x\) 和已有选择越不重复。若候选样本与已选样本的相似度高达 0.9,则 \(D(x)\) 只有 0.1,会被抑制;若相似度仅 0.2,则 \(D(x)=0.8\),值得入选。
  1. 扫描已选样本集遍历 \(S\) 中每一个已经被选中、待标注的样本 \(x_s\)。
    xs∈Sx_s \in S
  2. 找出最高相似度计算 \(x\) 与所有 \(x_s\) 的相似度,取最大的那个。这个值越大,说明 \(x\) 和已有选择“撞得越狠”。
    max⁡xs∈Ssim(x,xs)\max_{x_s \in S} \text{sim}(x, x_s)
  3. 用 1 减去它得到多样性分最高相似度越低,多样性分越高;最高相似度越高,多样性分越低。
    D(x)=1−max⁡xs∈Ssim(x,xs)D(x) = 1 - \max_{x_s \in S} \text{sim}(x, x_s)

融合策略

到了第四周,老陈手里的策略已经有三套了:不确定性高的(犹豫的人)、代表性强的(人脉广的人)、多样性好的(圈子不重样的人)。可传单只有一千张,不可能三个方向各发一千张。现实中的老陈做了个决定:把三个维度按权重打个总分,每一项都评个分,然后加起来排序,选总分最高的进去。这就是主动学习里的融合策略。

在学术与工程实践中,最经典的融合方式是加权评分:给每个候选样本算一个综合得分 \(S(x)\),它同时兼顾不确定性和代表性,再在批次挑选阶段加入多样性约束。一个常见的形式是:

其中 \(U(x)\) 是归一化后的不确定性得分(比如熵),\(R(x)\) 是归一化后的代表性得分,\(\lambda\) 是一个 0 到 1 之间的权重。这里的门道是分工:不确定性得分负责“挑难的”,代表性得分负责“挑典型的”,两者互补。如果只用不确定性,模型会一直盯着决策边界,忽视数据主体;如果只用代表性,模型会把大量标注预算花在早已学会的区域。

老陈最终的三维评分表,跟模型工程师手里的融合打分完全是一个道理:不迷信单一指标,而是让多个策略分工协作,再根据当前阶段动态调整优先级。犹豫的要请,典型的要请,不重样的更要请。

S(x)=λ⋅U(x)+(1−λ)⋅R(x)S(x) = \lambda \cdot U(x) + (1 - \lambda) \cdot R(x)
λ=λ0⋅exp⁡(−tT)\lambda = \lambda_0 \cdot \exp\left(-\frac{t}{T}\right)
\(\lambda\) 是动态调度的权重:训练初期,模型还很“笨”,不确定性高,挑选重在探索(\(\lambda\) 较大);随着训练推进,模型越来越有把握,重心逐步转向代表性(\(\lambda\) 变小),这叫做温度调度。\(t\) 是当前迭代轮数,\(T\) 是总轮数,\(\lambda_0\) 是初始权重。
  1. 归一化各策略得分把熵、代表性、多样性三个指标的原始值各自缩放到同一量纲(比如 0 到 1),否则“熵”动辄十几,“代表性”却只有零点几,加权没有意义。
    Unorm=U−Umin⁡Umax⁡−Umin⁡U_{\text{norm}} = \frac{U - U_{\min}}{U_{\max} - U_{\min}}
  2. 加权求和得到综合分\(\lambda\) 越接近 1,综合分越偏向不确定性;\(\lambda\) 越接近 0,越偏向代表性。
    S(x)=λ⋅U(x)+(1−λ)⋅R(x)S(x) = \lambda \cdot U(x) + (1 - \lambda) \cdot R(x)
  3. 按批次加入多样性约束每选中一个样本就把它加入已选集 \(S\),下一个样本的综合分乘以多样性折扣 \((0.5 + 0.5D(x))\),避免连续选中相似样本。
    Sfinal(x)=S(x)×(0.5+0.5D(x))S_{\text{final}}(x) = S(x) \times \left(0.5 + 0.5 D(x)\right)
  4. 排序选前 \(K\) 个把池子里所有样本按最终得分排序,一次性输出前 \(K\) 条送去标注。这就是“成批挑选”,既高效又保证多样性。
    Selected=top-K{Sfinal(x)}\text{Selected} = \text{top-}K \left\{ S_{\text{final}}(x) \right\}

闭环验证

又过了两个月,老陈的店口碑终于热起来了。但他发现一件怪事:传单照发、客人照请,小店的口味却好像没什么进步了。后来他想明白了——店里的招牌菜已经基本定型,再请多少客人来试吃,也提不出让他惊艳的新建议了。该收手时就收手。

主动学习同样要面对“何时停止”的问题,这个不是拍脑袋决定的,而是有一套明确的停止准则。最常见的有三种:第一,预算耗尽——标注经费花光了,循环自然终止;第二,性能饱和——连续几轮新增标注后,模型在验证集上的准确率提升小于某个极小阈值(比如 0.5%),说明边际收益已经微乎其微;第三,不确定性枯竭——池子里剩余样本的熵普遍低于某个门槛,说明模型对它们都已胸有成竹。此时应该终止标注,把省下的预算留给下一个项目。

更关键的是,在每一轮循环中,模型并不是推倒重来,而是用增量训练的方式把新标注的样本吸收进已有模型——就像老陈不是每月关店重开,而是不断往菜单上加新菜。整个闭环流程可以概括为:种子训练 → 模型挑样本 → 人工标注 → 增量更新 → 再次挑选。通过这个循环,模型从最初只有十来个标注样本的“冷启动”状态,逐步过渡到覆盖大部分数据分布的“热运行”状态。如果用准确率曲线来刻画这个过程的边际收益:

老陈最后把传单预算砍掉了一半,因为店里的口碑已经足够撑起客源。主动学习项目落地时也一样,越到后期越要克制——懂得何时收手,才是冷标注样本处理最成熟的表现。

ΔAcct=Acct−Acct−1若ΔAcct<ϵ ⇒ 停止\Delta \text{Acc}_t = \text{Acc}_t - \text{Acc}_{t-1} \quad \text{若} \quad \Delta \text{Acc}_t < \epsilon \ \Rightarrow \ \text{停止}
这个公式是“性能饱和停止”的数学表达:第 \(t\) 轮对比上一轮的准确率提升 \(\Delta \text{Acc}_t\)。当提升小于阈值 \(\epsilon\)(例如 0.005)时,就触发停止。如果每一轮增量都微乎其微,说明模型该学的都学会了,再标下去只是浪费钱。
  1. 记录相邻两轮准确率在第 \(t\) 轮和第 \(t-1\) 轮结束后,分别在相同验证集上评测模型准确率 \(\text{Acc}_t\) 与 \(\text{Acc}_{t-1}\)。
    Acct, Acct−1\text{Acc}_t, \ \text{Acc}_{t-1}
  2. 相减得到边际提升两轮准确率之差就是这一轮新标注样本带来的“性能增量”。
    ΔAcct=Acct−Acct−1\Delta \text{Acc}_t = \text{Acc}_t - \text{Acc}_{t-1}
  3. 与阈值比较触发停止当边际提升小于预设阈值 \(\epsilon\) 时,说明继续标注的性价比已经很低,主动学习循环应停止。
    ΔAcct<ϵ ⇒ 停止标注\Delta \text{Acc}_t < \epsilon \ \Rightarrow \ \text{停止标注}

AI 应用场景

工业质检中的缺陷样本标注

阶段:数据标注与管理(冷启动阶段)

解决的问题:某电子产品工厂要训练一个检测 PCB 板焊接缺陷的模型,但工厂历史良品率高达 98%,缺陷样本极其稀少。传统做法是让质检员从十万张图中随机抽图标注,结果抽到的大量是“正常板”,缺陷样本寥寥无几,模型训练效果极差。AI 工程师接入主动学习后,先用少量随机标注图片训练一个弱模型,再由模型从剩余图片中挑出它“最不确定是不是缺陷”的批次图片优先请质检员标注。

具体案例:一家代工厂用上述方案为 PCB 缺陷检测模型标注数据,标注预算从十万张压缩到一万二千张,模型对微小裂纹的召回率提升了 23%。质检员不再面对大片冗余的正常图片,而是被系统引导着只看“模型拿不准”的图,人效升了两倍。

医疗影像辅助诊断的冷启动标注

阶段:数据标注与管理(跨部门协作阶段)

解决的问题:三甲医院放射科要构建肺结节 CT 辅助筛查模型,医院有海量历史 CT 影像,但只有不到 1% 有医生确诊标注。每张 CT 标注需要一位资深放射科医生耗时十五分钟,直接全员标注不现实。采用主动学习后,系统先由算法团队用公开数据集预训练模型,然后让模型筛出“结节概率在 40%-60% 之间”的疑难影像,优先请医生标注;同时通过多样性约束保证每个肺叶区域都有覆盖。

具体案例:某医疗 AI 公司与医院合作,将主动学习嵌入标注工作流。医生打开标注工作站时,系统已排好当天最值得标注的 30 张 CT;运行三个月后,模型对早期微小结节的检出率从 62% 提升至 87%,而医生总标注时长反而减少了 40%。

Python 演示

python78 行
import numpy as npfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom collections import Counter  class KNNClassifier:    def __init__(self, k=3):        self.k = k        self.X_train = None        self.y_train = None     def fit(self, X, y):        self.X_train = np.array(X)        self.y_train = np.array(y)     def predict_proba(self, X):        proba_list = []        for x in X:            d = np.linalg.norm(self.X_train - x, axis=1)            idx = np.argsort(d)[:self.k]            labels = list(self.y_train[idx])            cnt = Counter(labels)            total = sum(cnt.values())            proba_list.append([cnt.get(i, 0) / total for i in range(3)])        return np.array(proba_list)  def entropy_uncertainty(proba):    p = np.clip(proba, 1e-9, 1.0)    return -np.sum(p * np.log(p), axis=1)  def uncertainty_sampling(model, X_pool):    proba = model.predict_proba(X_pool)    scores = entropy_uncertainty(proba)    return np.argsort(scores)[::-1]  def random_sampling(X_pool, seed=42):    rng = np.random.default_rng(seed)    return rng.permutation(len(X_pool))  def run_round(model, X_pool, y_pool, order, budget):    for idx in order[:budget]:        new_x = X_pool[idx].reshape(1, -1)        new_y = np.array([y_pool[idx]])        model.X_train = np.vstack([model.X_train, new_x])        model.y_train = np.hstack([model.y_train, new_y])    proba = model.predict_proba(X_pool)    acc = (proba.argmax(axis=1) == y_pool).mean()    return acc  def main():    X, y = load_iris(return_X_y=True)    X_train, X_pool, y_train, y_pool = train_test_split(        X, y, train_size=0.1, stratify=y, random_state=42)     model_a = KNNClassifier(k=3)    model_a.fit(X_train, y_train)    acc_before = (model_a.predict_proba(X_pool).argmax(axis=1) == y_pool).mean()    print(f"种子训练集 15 条,初始准确率: {acc_before:.2%}")     order_a = uncertainty_sampling(model_a, X_pool)    acc_a = run_round(model_a, X_pool, y_pool, order_a, budget=30)    print(f"主动学习再标 30 条后准确率: {acc_a:.2%}")     model_b = KNNClassifier(k=3)    model_b.fit(X_train, y_train)    order_b = random_sampling(X_pool)    acc_b = run_round(model_b, X_pool, y_pool, order_b, budget=30)    print(f"随机采样再标 30 条后准确率: {acc_b:.2%}")  if __name__ == "__main__":    main()
目的:演示主动学习中最基础的“熵不确定性采样”流程——冷启动时只靠 15 条种子样本,让模型主动挑 30 条最有价值的样本标注,对比随机采样的性能差距。
  1. X_train, X_pool, y_train, y_pool = train_test_split(...)把数据集分成“种子训练集”和“未标注池”,模拟冷启动状态。
  2. model.fit(X_train, y_train)用极少种子样本训练 KNN 分类器,此时模型还很“笨”。
  3. entropy_uncertainty(proba)计算每个池中样本的熵,熵越高代表模型越没把握。
  4. np.argsort(scores)[::-1]按熵降序排列,得到最值得标注的样本索引序列。
  5. run_round(model, X_pool, y_pool, order, budget=30)批量挑选前 30 个样本,模拟“送人工标注”并增量加入训练集。
  6. model.X_train = np.vstack([model.X_train, new_x])KNN 的“增量训练”就是简单地把新样本追加进训练集并重新预测。
  7. proba.argmax(axis=1) == y_pool用精度来度量这轮主动学习后的模型性能。

常见误区

误区反正模型刚开始啥也不会,别折腾了,随机抽几百条数据先标了再说。标注预算充足,不需要挑挑选选,直接一次性把数据都标了最省事。

正解冷启动恰恰是主动学习最关键的阶段。随机抽样在数据分布不均匀时,会把大量预算浪费在冗余样本上。就像老陈把传单挨家挨户发一遍,一半进了垃圾桶。正确的做法是先标少量种子样本,让模型获得“初步判断力”,再由它来引导后续标注的方向。

为何常见:人的直觉是“先凑够数据再优化策略”,但冷标注样本处理的核心恰恰是“先建立反馈,再用反馈指导挑选”——这个逆向思维初学者不容易转过弯来。

误区不确定性采样既然效果这么好,那就每轮都挑熵最大的样本好了,把所有标注预算全砸在疑难样本上。

正解细想一下,如果模型永远只盯着决策边界附近最难的样本,它会对数据分布的主体区域一无所知。就像老陈只请犹豫的客人,结果全是同一类年轻人,口味清淡的老人、带孩子的家庭全被忽略了。不确定性负责“攻坚”,代表性负责“扫盲”,多样性负责“防偏”,三者融合才是完整策略。

为何常见:初学者容易把“熵大 = 信息量大”误解为“熵大 = 永远最优”。但实际上信息量不只来自“难”,还来自“覆盖面”。只攻难点会让模型变成偏科生。

误区既然模型是数据喂出来的,那索性一次性把所有样本全标注了,模型效果一定最好。

正解全量标注在预算充足时确实准确率最高,但代价巨大且收益递减。主动学习的价值在于用一部分标注达到接近全量标注的效果。真正的工程智慧是在性能和成本之间取平衡——当准确率达到业务可接受水平时(比如 90%),继续标注的边际收益已低于标注成本,就应当停止。这就像老陈的店,招牌菜定型后再请多少人试吃,口味也不会突飞猛进了。

为何常见:工程师的本能是“追求最优效果”,但工程实践追求的是“在有限预算下的最优效果”。看到全量标注的准确率更高,就容易忽略它耗费的成本是主动采样的数倍。

面试题

Q1. 主动学习解决的核心问题是什么?

单选题 · easy

  • A.让模型自动生成标注标签
  • B.用尽量少的标注换取尽量高的性能← 正确答案
  • C.替代人工标注的所有工作
  • D.增大模型的训练参数量

答案:B。主动学习的目标是用有限的标注预算挑出最有价值的样本,以最少的人工标注达到较好的模型性能。A 错在主动学习不生成标签,只挑样本送人工标注;C 错在它仍依赖人工标注;D 与标注无关。

Q2. 冷启动阶段最合理的起步方式是什么?

单选题 · easy

  • A.一次性标注全部未标注数据
  • B.完全依赖模型自己无监督学习
  • C.先标少量种子样本再启动循环← 正确答案
  • D.放弃模型训练改用手工规则

答案:C。冷启动起步应先用随机抽取的小批量种子样本让模型获得初步能力,再进入主动学习循环。A 浪费预算;B 无监督无法获得类别标签;D 放弃了机器学习方法本身。

Q3. 熵作为不确定性度量,熵值越大表示什么?

单选题 · easy

  • A.模型对该样本的预测越有把握
  • B.模型对该样本的预测越均匀越没底← 正确答案
  • C.该样本一定是噪声数据
  • D.该样本属于某个特定类别的概率极高

答案:B。熵度量概率分布的离散程度。概率均匀分布在多个类别上时熵最大,说明模型“五五开”,最没把握。A、D 是“很确定”的表现,熵接近 0;C 并非熵的语义。

Q4. 一个 KNN 模型把某样本判为三个类别的概率分别是 0.34、0.33、0.33,它的熵值最接近?

单选题 · mid

  • A.0.1
  • B.0.5
  • C.1.1← 正确答案
  • D.2.5

答案:C。三分类时熵最大值是 ln3 ≈ 1.099,当前概率三分天下,熵接近最大值。选 0.1 对应概率很集中;选 0.5 是概率较偏的情况;选 2.5 超过了三分类熵的理论上限,不可能出现。

Q5. 代表性采样选择样本时主要考察什么?

单选题 · mid

  • A.样本所在区域的样本密度← 正确答案
  • B.样本的标注成本高低
  • C.样本字段的缺失比例
  • D.样本出现的绝对时间先后

答案:A。代表性采样的核心依据是样本落在数据分布稠密区域的程度,密度高、邻居多就代表性高。B 是工程成本因素,C 是数据质量问题,D 与分布无关。

Q6. 下列哪些手段可以有效提升一批标注样本的多样性?

多选题 · mid

  • A.对相似度超阈值的样本去重← 正确答案
  • B.按类别分配标注配额← 正确答案
  • C.只用置信度最高的一条样本
  • D.批次挑选时实时更新已选集合← 正确答案

答案:ABD。相似度去重、类别配额、批次约束(实时更新已选集合)都是标准多样性策略。C 错在“只用一条”舍弃了批次化约束的全局视角,且与多样性无关。

Q7. 融合策略中引入温度调度系数 λ 的目的是什么?

单选题 · mid

  • A.让模型自动调整学习率
  • B.动态调节探索与利用的偏好← 正确答案
  • C.控制数据增强的强度
  • D.加快 GPU 推理速度

答案:B。λ 控制不确定性权重和代表性权重的相对大小:初期调大 λ 偏向探索不确定性样本,后期调小 λ 偏向利用代表性样本。这与学习率、数据增强、推理速度无关。

Q8. 某项目连续三轮主动学习后验证准确率分别提升 1.2%、0.3%、0.1%,此时应如何决策?

单选题 · hard

  • A.继续无限标注直到准确率 100%
  • B.判定边际收益递减,触发停止准则← 正确答案
  • C.调大标注预算翻倍继续冲刺
  • D.随机换一批数据源重新标注

答案:B。三轮边际提升持续衰减且最后一轮仅 0.1%,已低于常见阈值(0.5%),应触发性能饱和停止。A 忽略成本;C 与 D 都没有诊断“边际收益已经枯竭”的根本问题。

Q9. 冷启动困境下,合理的应对策略有哪些?

多选题 · hard

  • A.用公开预训练模型初始化特征← 正确答案
  • B.仅标注模型最不确定的一批样本
  • C.用少量种子样本获得初步判断力← 正确答案
  • D.融合不确定性、代表性与多样性挑选← 正确答案

答案:ACD。预训练初始化、种子训练、融合挑选都是应对冷启动的合理手段。B 错在“仅标注最不确定的一批”忽略了代表性、多样性的价值,容易导致选择偏科。

Q10. 以下关于主动学习闭环的表述,正确的有哪些?

多选题 · extreme

  • A.准确性提升低于阈值时应触发停止← 正确答案
  • B.预算耗尽必须先终止项目重新规划
  • C.增量训练让模型每轮吸收新标注← 正确答案
  • D.冷启动到热运行是渐进过渡过程← 正确答案

答案:ACD。性能饱和停止准则是标准做法;增量训练是每轮更新模型的核心机制;冷启动到热运行确实渐进过渡。B 错在“先终止项目”——预算耗尽只是结束标注循环,模型已经可用,无需推翻项目重来。