你接到一个有趣的任务:替朋友写一份自助餐厅的「必吃榜单」。餐厅里有 200 道菜,可你的胃容量有限,不可能尝遍。聪明人先随机试 10 道菜,摸清这家店的「脾气」——味型偏辣还是偏甜、食材新鲜度如何。然后你会优先尝那些「说不清好不好吃」的菜,因为它们信息量最大。但真正的难题是:尝到什么时候该放下筷子? 继续尝下去,榜单可能仍在缓慢变好,可胃已经快撑爆了——每多吃一道菜带来的新信息越来越少。这个「何时收手」的决策,就是主动学习里的停止准则。机器学习里的主动学习,就是让模型自己从海量未标注数据里挑出最值得标注的样本,请人来标;而停止准则回答的是:标到多少就能停,既不浪费预算,又不牺牲效果。

岗位关联

掌握停止准则,你就握住了标注成本与模型效果的平衡点。做数据标注管理或主动学习项目时,不再盲目前进,能科学地分配每一份标注预算,在效果与成本之间做出有理有据的取舍。

目录
  1. 停止准则概述
  2. 置信度阈值
  3. 性能收敛判定
  4. 预算约束策略
  5. 阈值实验设计
  6. 工程实践建议
  7. AI 应用场景
  8. Python 演示
  9. 常见误区
  10. 面试题

停止准则概述

想象你站在自助餐厅的取餐台前,手里端着盘子,桌上已经排了 18 道菜。你尝出这家店的规律:凡是裹着琥珀色酱汁的肉菜都很惊艳,而凉拌类的普遍一般。现在你面临选择——是再去拿第 19 道菜,还是就此收手开始写推荐榜?如果继续拿,你可能会遇到一道惊艳新菜,但也有很大概率只是重复验证已知口味,还占用了胃容量。主动学习循环一模一样:模型从尚未标注的样本池中挑选「最拿不准」的样本,请人工标注,再更新模型,如此反复。停止准则要回答的,就是「循环转到这里,是否该刹车」。

从自助餐过渡到技术语言:主动学习每一轮都在消耗标注预算,换来模型性能的提升。停止准则的本质是一个权衡——边际收益与边际成本的对决。如果模型每多获得 100 条标注,准确率只提高 0.01%,那这笔交易显然不划算。停止准则是这套决策机制的统称:它既可以是简单的规则,也可以是由多个指标组成的复合策略。

最朴素的停止准则可以直接盯住性能变化量。记第 $t$ 轮结束时模型在验证集上的性能为 $F(\mathcal{L}_t)$,其中 $\mathcal{L}_t$ 是已标注集合。当相邻两轮的性能提升不超过设定阈值 $\theta$ 时,我们判定「不值得继续尝菜」:

停止太早,榜单上的菜可能还有大坑没踩到,模型泛化不足;停止太晚,预算和人力被大量浪费,性价比急剧下降。所以停止准则的核心目标,就是找到那个「再尝一口的满足感明显变小」的时刻。后面几节讲的置信度、性能曲线、预算,都是实现这个目标的三种不同尺子。

Δt=F(Lt)−F(Lt−1)≤θ\Delta_t = F(\mathcal{L}_t) - F(\mathcal{L}_{t-1}) \le \theta
这个公式的意思是:连续比较两轮迭代,如果性能涨得还没有一根头发丝粗,就说明边际收益已经微乎其微,可以收手了。
  1. 已标注集合第 $t$ 轮结束时模型见过的全部已标注样本,相当于你已经尝过的那些菜。
    Lt\mathcal{L}_t
  2. 性能函数在固定验证集上计算出的模型指标,比如准确率或 F1,相当于推荐榜单的靠谱程度。
    F(Lt)F(\mathcal{L}_t)
  3. 相邻轮差分把本轮性能与上一轮相比,看这一轮主动学习到底带来了多少提升。
    F(Lt)−F(Lt−1)F(\mathcal{L}_t) - F(\mathcal{L}_{t-1})
  4. 阈值比较提升量小于 $\theta$ 时,说明新增样本提供的信息已经微不足道,停止是理性的。
    Δt≤θ\Delta_t \le \theta

置信度阈值

当你在自助餐厅尝到第 20 道菜时,对这家店的「口味直觉」已经很敏锐:扫一眼菜品的色泽、气味、摆盘,就能八九不离十地判断出它好不好吃。这时,你其实不太需要再动筷子了——你的直觉已经对所有菜都有「把握」。机器学习里的置信度阈值,就是量化模型这种「把握程度」的尺子。

分类模型对每个未标注样本都会输出一个概率分布,比如「这是糖醋排骨的概率 0.85,是菠萝古老肉的概率 0.10,是番茄炒蛋的概率 0.05」。模型对样本最有把握的那个概率,就叫置信度。如果未标注池里的绝大多数样本,模型都能给出很高的置信度,说明它已经「见多识广」,再去请人标注这些样本,大概率只是验证它的判断,信息量很低。

于是自然衍生出一个停止准则:统计整个未标注池的平均置信度,当它超过某个阈值 $\tau$ 时,停止标注。设未标注池为 $\mathcal{U}$,对其中每个样本 $x$ 取最大类别概率,再求平均:

阈值 $\tau$ 的设定并非越大越好。设成 0.99 可能永远触发不了,就像你非要等一家餐厅的每道菜都被你 100% 预判才收手——这几乎不可能。实践中通常先观察置信度分布,再选择 0.85~0.95 之间的值;也可以在前期用较低阈值鼓励多标注,后期调高阈值提高收手门槛,这叫动态调整策略。还要提醒一句:置信度高不代表预测对,模型可能「过度自信地犯错」——就像你把一盘闻着像糖醋排骨的菜自信地归为「必吃」,结果它是菠萝古老肉。所以实战中,置信度阈值更适合配合其他准则一起使用。

cˉ=1∣U∣∑x∈Umax⁡c∈CP(c∣x)≥τ\bar{c} = \frac{1}{|\mathcal{U}|} \sum_{x \in \mathcal{U}} \max_{c \in \mathcal{C}} P(c \mid x) \ge \tau
这个公式把「模型对全池样本的把握程度」捏合成一个平均分。平均分超过阈值 $\tau$(比如 0.9),就像你觉得扫一眼就能判断所有菜好不好吃,不用再尝了。
  1. 未标注池还没标过的候选样本集合,对应还没尝过的菜品。
    U\mathcal{U}
  2. 单样本置信对样本 $x$,模型在所有类别中给出最高的那个概率,即模型对 $x$ 最有把握的程度。
    max⁡c∈CP(c∣x)\max_{c \in \mathcal{C}} P(c \mid x)
  3. 池平均把所有样本的置信度取平均,得到整个未标注池的平均把握水平。
    1∣U∣∑x∈U\frac{1}{|\mathcal{U}|} \sum_{x \in \mathcal{U}}
  4. 阈值判断平均置信度超过 $\tau$,认为模型已经「胸有成竹」,停止标注。
    cˉ≥τ\bar{c} \ge \tau

性能收敛判定

煲汤时你会隔一会儿尝一口。刚下锅时每加一勺盐,味道都有明显变化;但煲到后面,汤味越来越稳定,连续尝几口都差不多。这时候你知道:汤成了,再加料也变不出新花样。模型性能也类似——随着标注样本不断加入,性能曲线先是陡峭上升,然后逐渐变平。性能收敛判定,就是盯着这条「味道曲线」来决定何时关火。

做法是准备一个固定的验证集,每轮主动学习结束后都测算模型在这个验证集上的性能,形成一条学习曲线。然后判断曲线是否进入「平坦区」:比较当前轮与 $k$ 轮之前的性能差,如果差值小到某个容忍度 $\epsilon$,并且这种状态持续了 $w$ 轮,就认为性能已收敛,可以停止:

为什么非要连续 $w$ 轮?因为验证集存在随机波动——这轮准确率 0.882,下轮 0.880,可能纯属噪声。若见一次波动就停,相当于汤刚沸就关火。窗口检测就相当于「多尝几口再下结论」。此外还有基准对比法:事先定一个目标基准,比如全监督模型性能的 90%,当前模型达到这个基准时也可以停止。这类方法和学习曲线监控配合,能有效防止「假收敛」和「过晚停止」两个极端。

∣Ft−Ft−k∣≤ϵ持续 w 轮|F_t - F_{t-k}| \le \epsilon \quad \text{持续} \ w \ \text{轮}
简单说:当前轮的性能和 $k$ 轮前相比变化很小,而且连续多轮都这样,说明曲线已经平得跟眼镜布一样,再标也没大用。
  1. 窗口起点$k$ 轮前的那次性能值,作为这段观察窗口的起点。
    Ft−kF_{t-k}
  2. 窗口终点当前轮的性能值,是和起点做比较的对象。
    FtF_t
  3. 变化幅度窗口起点到终点的绝对值,用来衡量这段时间性能到底动了多少。
    ∣Ft−Ft−k∣|F_t - F_{t-k}|
  4. 容忍度$\epsilon$ 是允许的性能波动上限,比如 0.005,比这个还小就算「没变化」。
    ϵ\epsilon
  5. 持续条件要求这种「没变化」的状态连续维持 $w$ 轮,防止偶尔一次运气好被误判为收敛。
    持续 w 轮\text{持续} \ w \ \text{轮}

预算约束策略

你在自助餐厅最现实的约束不是口味,而是胃容量。计划吃 12 道菜就吃 12 道,不管后面的菜多诱人,都得留出胃的位置。这就是主动学习里的预算约束策略——标注预算(最多能标多少样本)是项目开始前就定死的刚性上限。

固定预算分配是最朴素的策略:总预算 $B$ 条标注,分成若干批,每批标注固定数量的样本。分批标注节奏很重要:不要一口气把所有预算花完,而是留一小部分做「收尾验证」。工程上常设一个预算警戒线 $\rho$,比如预算用到 85% 时,系统就不再启动大规模标注,只做小批量校准,并为最终模型验证预留样本:

预算约束策略最怕「用不完」和「不够用」两个极端。用不完说明主动学习选样本的效率高,预算定得太宽;不够用说明任务太难或预算拍脑袋定小了。所以项目复盘时要做成本收益分析:每多花一笔预算,换来多少性能提升?把这些数据沉淀下来,下次定预算就有据可依。回到自助餐厅,预算策略就是告诉你:「你已经吃了 10 道菜,按计划只能再吃 2 道了,选最值得的来吧。」

Rt=∑i=1t∣Qi∣B≥ρR_t = \frac{\sum_{i=1}^{t} |\mathcal{Q}_i|}{B} \ge \rho
这个公式计算的是「预算已经消耗了多少比例」。当消耗率 $R_t$ 超过警戒线 $\rho$(比如 0.85),就提醒团队:胃快满了,该收尾了。
  1. 每轮新标注第 $i$ 轮主动学习新标注的样本数量,相当于每轮吃了几道菜。
    ∣Qi∣|\mathcal{Q}_i|
  2. 累计消耗把从第 1 轮到第 $t$ 轮所有新标注样本数加总,得到已经用掉的预算总量。
    ∑i=1t∣Qi∣\sum_{i=1}^{t} |\mathcal{Q}_i|
  3. 总预算项目一开始就锁定的最大可标注数量,对应你的胃容量上限。
    BB
  4. 消耗率已经用掉的预算占总预算的比例。这个比例逼近 1,就相当于胃快撑满了。
    Rt=∑i=1t∣Qi∣BR_t = \frac{\sum_{i=1}^{t} |\mathcal{Q}_i|}{B}
  5. 警戒线当消耗率超过 $\rho$ 时触发警戒,停止盲目加标,转入收尾与验证。
    Rt≥ρR_t \ge \rho

阈值实验设计

你在这家自助餐厅总结出「平均自信度到 0.9 就收手」的经验,可换一家餐厅还适用吗?也许另一家口味差异极大,你的直觉根本不准。所以在真正的大项目里用某个阈值之前,最好先找个「模拟演练场」验证一下。阈值实验设计就是干这件事的。

所谓演练场,是留下一份已经完全标注好的数据作为「演习数据集」。在它上面模拟完整的主动学习流程:从少量种子样本出发,每轮用不确定性采样挑选样本、模拟标注、更新模型,直到触发停止。关键在于同时对比多个候选阈值,看哪个阈值在「成本-效果」性价比上表现最好:

实验不能只跑一次就拍板。演练集上的模拟会受到随机种子、样本抽取顺序的影响,所以要用多个随机种子重复实验,检查结果是否稳定——这就是结果复现检查。如果每次都是 0.9 最好,那可以放心用;如果 0.8 和 0.9 时好时坏,说明阈值敏感性高,需要更谨慎。这就像你在几家不同餐厅分别演练过「收手时机」,确认经验可以迁移,才敢在真正的大宴上放心使用。

τ∗=arg⁡max⁡τ∈ΘΔF(τ)C(τ)\tau^{*} = \arg\max_{\tau \in \Theta} \frac{\Delta F(\tau)}{C(\tau)}
这个公式的意思是:在候选阈值集合 $\Theta$ 里,逐个计算「每花费一条标注能换来多少性能提升」,选出性价比最高的那个阈值作为正式配置。
  1. 候选阈值集准备一组待比较的阈值,比如 0.7、0.8、0.9 三档。
    Θ\Theta
  2. 性能增益在阈值 $\tau$ 下,从主动学习启动到停止,模型性能一共提升了多少。
    ΔF(τ)\Delta F(\tau)
  3. 标注成本在阈值 $\tau$ 下,触发停止时累计消耗的样本数,相当于总共尝了多少道菜。
    C(τ)C(\tau)
  4. 性价比性能增益除以标注成本,得到「每条标注换来的性能提升」,越高越划算。
    ΔF(τ)C(τ)\frac{\Delta F(\tau)}{C(\tau)}
  5. 最优选择在所有候选值中挑性价比最高的那个,标记为 $\tau^*$。
    τ∗=arg⁡max⁡τ∈Θ\tau^* = \arg\max_{\tau \in \Theta}

工程实践建议

真正经营一家餐厅,光有「尝菜到何时收手」的直觉还不够,后厨得留下试吃记录,品控要定期复核,大堂要挂上进度看板。主动学习的停止准则落地到工程里,同样需要一整套「经营制度」,否则停止准则就只是一句口号。

日志留痕是第一要务:每一轮主动学习都要记录当前已标注样本数、平均置信度、验证集性能、预算消耗率。没有日志,停止之后想复盘「当时为什么停」根本无从谈起。人工抽检复核则是质量控制的关键:从已标注样本里随机抽 $n$ 条,请专家重新标注,计算与原有标注的一致率。如果一致率低于合格线 $\alpha$,说明标注质量出了问题,即便性能曲线看似收敛,也不能放心停止:

工程上还建议搭建可视化看板,把性能曲线、置信度分布、预算消耗画在一张图上,让团队能直观看到停止信号是否临近。模型上线也要渐进式进行:先小流量灰度,观察线上指标和抽检反馈,确认稳定后再全量放开。这样一来,停止准则不再是一个孤立的公式,而是一套「有记录、有复核、有看板、有灰度」的完整工程机制。餐厅能靠制度保证出品稳定,主动学习项目也能靠这套制度保证标注投入物有所值。

Aaudit=1n∑i=1n1[y^i=yiexpert]≥αA_{\text{audit}} = \frac{1}{n} \sum_{i=1}^{n} \mathbb{1}[\hat{y}_i = y_i^{\text{expert}}] \ge \alpha
这个公式在检查「标注员和专家是不是英雄所见略同」。抽检 $n$ 条样本,计算标注一致的比例,如果达不到合格线 $\alpha$,就得排查标注质量问题,不能急着上线。
  1. 抽检样本每次抽查 $n$ 条已经标注好的样本,相当于后厨随机抽查几道已出锅的菜。
    nn
  2. 流程标注主动学习流程或标注员给出的标签,即后厨出品的实际口味。
    y^i\hat{y}_i
  3. 专家复核专家重新标注得到的「标准答案」,相当于品控主管的最终评判。
    yiexperty_i^{\text{expert}}
  4. 一致指示当流程标注与专家标注一致时记为 1,否则为 0。
    1[y^i=yiexpert]\mathbb{1}[\hat{y}_i = y_i^{\text{expert}}]
  5. 一致率达标所有抽检样本的一致率必须不低于合格线 $\alpha$,比如 0.98。
    Aaudit≥αA_{\text{audit}} \ge \alpha

AI 应用场景

医疗影像标注:帮医生省下 40% 阅片时间

阶段:数据标注与管理 / 主动学习

解决的问题:传统医学影像标注把海量 CT、胸片全部外包给专家,但约七成影像是正常或重复信息,每张都让专家看既烧钱又耗时。主动学习让模型先筛出最「拿不准」的病灶影像——比如边界模糊的小结节、磨玻璃影——优先送专家标注;停止准则自动监测平均置信度,当专家标注的边际价值下降时果断收工。

具体案例:某三甲医院肺结节筛查项目,初始用 500 张影像启动模型,每轮让主动学习挑 200 张「最难」的片子给放射科医生标注。当未标注池平均置信度超过 0.92 且连续两轮验证集敏感度提升小于 0.5% 时,系统自动停止。医生每周阅片量减少约 40%,模型敏感度稳定在 92% 以上。

自动驾驶数据运营:预算花在边角场景上

阶段:数据管线与标注管理

解决的问题:自动驾驶车队每天回传数百万帧道路图像,99% 是晴天直行的重复场景,全量标注等于烧钱。传统做法是随机抽帧送标,预算花掉了但模型在雨雾、夜间等边角场景依然「抓瞎」。

具体案例:某自动驾驶公司对 3D 检测模型设定了每版本 20 万帧的标注预算,采用「性能收敛 + 预算警戒」双准则:每轮主动学习挑选不确定性最高的场景帧,连续两轮 mAP 提升小于 0.5% 时冻结标注。6 轮迭代后,雨雾场景识别率提升 6.3%,预算节省 30%,剩余预算被重新分配到仿真与算法优化上。

客服机器人知识库:从「全量标」到「聪明地停」

阶段:NLP 数据标注 / 主动学习

解决的问题:客服机器人搭建 FAQ 知识库时,需要标注大量用户问法的意图类别。标注员水平参差,且大量语料是重复的相似问法,人工标注效率低、成本高。主动学习自动挑出模型「看起来像又拿不准」的句子优先标注,配合停止准则判断意图体系是否已经成熟。

具体案例:某电商平台客服机器人首月计划标注 2 万条语料。主动学习跑到第 5 周时,未标注池平均置信度稳定达到 0.88,触发置信度停止。系统转入「高置信自动标注 + 人工抽检」模式,抽检一致率 0.97,意图识别准确率保持 91%,标注人力投入降为原来的三分之一。

Python 演示

python72 行
# 演示主动学习的三种停止准则# 在合成数据集上用 KNN 分类器跑主动学习循环import numpy as npfrom sklearn.datasets import make_classificationfrom sklearn.neighbors import KNeighborsClassifier # 生成一个合成数据集,作为带标注的"演练场"X, y = make_classification(n_samples=800, n_features=8, n_informative=6,                           n_redundant=0, n_classes=3, random_state=42)rng = np.random.RandomState(1)idx = rng.permutation(len(X))split = int(len(X) * 0.7)tr_idx, te_idx = idx[:split], idx[split:]X_train, X_test = X[tr_idx], X[te_idx]y_train, y_test = y[tr_idx], y[te_idx] labeled = list(idx[:10])                 # 初始已标注样本pool = list(idx[10:split])               # 未标注池budget = 120                             # 总预算batch_size = 5                           # 每轮新标注数量max_rounds = 30                          # 安全上限tau = 0.95                               # 置信度停止阈值eps = 0.005                              # 收敛容忍度conv_win = 3                             # 收敛观察窗口flag_conv = 0stop_reason = "max round"history = [] for rnd in range(1, max_rounds + 1):    if len(labeled) >= budget:        stop_reason = "budget exhausted"        break     model = KNeighborsClassifier(n_neighbors=3)    model.fit(X_train[labeled], y_train[labeled])    acc = model.score(X_test, y_test)    history.append(acc)     if pool:        proba = model.predict_proba(X_train[pool])        avg_conf = float(np.max(proba, axis=1).mean())    else:        avg_conf = 1.0     # 性能收敛判定:窗口内变化小于 eps    if len(history) >= conv_win + 1:        delta = abs(history[-1] - history[-1 - conv_win])        if delta <= eps:            flag_conv += 1        else:            flag_conv = 0     print(f"round {rnd:2d} | labeled {len(labeled):3d} | "          f"acc {acc:.3f} | avg_conf {avg_conf:.3f}")     if flag_conv >= conv_win:        stop_reason = "performance converged"        break    if avg_conf >= tau and rnd >= 4:        stop_reason = "confidence threshold"        break     # 不确定性采样:挑模型最拿不准的样本去标注    proba = model.predict_proba(X_train[pool])    uncertainty = 1 - np.max(proba, axis=1)    k = min(batch_size, len(pool))    pick_ids = np.argsort(uncertainty)[-k:]    pick_set = set(pick_ids.tolist())    labeled.extend([pool[j] for j in pick_ids])    pool = [p for j, p in enumerate(pool) if j not in pick_set] print(f"stop reason: {stop_reason}, total labeled: {len(labeled)}")
目的:完整跑一遍主动学习循环,同时监控「置信度阈值」「性能收敛」「预算耗尽」三种停止准则,观察哪个准则先触发停止,并输出每一轮的准确率与平均置信度。
  1. model.fit(X_train[labeled], y_train[labeled])只用当前已标注样本训练 KNN,对应「用尝过的菜建立直觉」。
  2. acc = model.score(X_test, y_test)在固定测试集上评估当前模型性能,对应「榜单靠谱程度」的量化。
  3. avg_conf = float(np.max(proba, axis=1).mean())计算未标注池的平均最大置信度,对应你「扫一眼菜品就有把握」的平均水平。
  4. delta = abs(history[-1] - history[-1 - conv_win])对比当前轮与 conv_win 轮前的准确率变化,是性能收敛判定的核心。
  5. if flag_conv >= conv_win:连续多轮变化都小于阈值的「持续条件」满足,说明曲线早已平坦,触发收敛停止。
  6. if avg_conf >= tau and rnd >= 4:平均置信度超过阈值且训练已跑过至少 4 轮,避免早期偶然达标就误停。
  7. uncertainty = 1 - np.max(proba, axis=1)不确定性采样:模型越「拿不准」的样本值越大,优先标注它们信息量最高。
  8. pick_ids = np.argsort(uncertainty)[-k:]挑出不确定性最高的 k 个样本,相当于专挑「说不清好不好吃」的菜。
  9. labeled.extend([pool[j] for j in pick_ids])把挑出的样本从池中移入已标注集合,模拟人工标注完成。
  10. pool = [p for j, p in enumerate(pool) if j not in pick_set]从未标注池中移除本次已选样本,保证每轮池子都在缩小。

常见误区

误区停止阈值设高一点总没错,0.95 不行就 0.99,甚至设成 1.0,模型肯定更可靠,性能会更稳。

正解阈值越高,触发条件越苛刻。平均置信度几乎不可能达到 1.0,最后的结果往往是预算被耗尽也没等到停止信号,主动学习退化成全量标注。合理做法是先看置信度分布,选一个「绝大多数样本都有把握」又能实际达到的值,比如 0.85~0.95。阈值不是越高越好,而是「及时且有效」的平衡点。

为何常见:人们本能地觉得「越严格越安全」,却忘了主动学习的初衷是省成本——过高的约束等于没省。

误区这一轮准确率比上一轮低了 1 个点,模型是不是学坏了?赶紧停止,别让它再退化了。

正解单轮性能下降很可能是验证集噪声带来的,不代表真实趋势。正确做法是用观察窗口:连续 $w$ 轮性能提升都小于 $\epsilon$ 才算收敛。一次下降就像煲汤时偶然尝到一口偏淡——可能是没搅匀,不代表整锅汤坏了。

为何常见:人眼对「下降」特别敏感,容易把局部抖动当成趋势信号,这是「损失厌恶」心理在作祟。

误区先把所有样本标完,训练结束后再画一条学习曲线,看看当时第几轮该停,这样最稳妥。

正解停止准则是一个需要提前部署的「在线决策机制」,不是事后复盘工具。项目一开始就要设定好准则、阈值和监控指标,在训练过程中实时检查。如果等预算花完再分析,省成本的目标已经落空了——就像饭后才想起「刚才不该吃那道菜」,胃已经满了。

为何常见:做数据分析的人习惯事后归因,但主动学习的价值恰恰在于事中决策,顺序颠倒了价值就没了。

误区上一个项目用 $\tau=0.9$ 效果很好,新项目直接沿用,不用重新调。

正解不同数据集、模型、任务难度下,置信度分布差异很大。旧项目的 0.9 可能让新项目过早停止(模型还没学够),也可能完全触发不了。必须在带标注的演练集上重新做阈值实验,验证性价比后再迁移。这就像你在一家川菜馆总结出的「微辣」标准,放到粤菜馆里直接套用会闹笑话。

为何常见:复用历史经验是高效捷径,但停止准则高度依赖数据分布,拍脑袋沿用旧值风险很大。

面试题

Q1. 主动学习中的「停止准则」主要解决什么问题?

单选题 · easy

  • A.如何挑选最有价值的样本去标注
  • B.决定何时不再需要继续标注样本← 正确答案
  • C.如何提高模型的泛化能力
  • D.如何减少标注团队的人数

答案:B。停止准则回答的是「标到什么时候收手」,即终止主动学习循环的时机。选项 A 是样本选择策略(如不确定性采样)的职责;C 是模型训练目标;D 是团队管理问题。类比自助餐厅,停止准则是「尝到何时放下筷子」,而不是「先尝哪一道」。

Q2. 统计未标注池中每个样本的最大类别概率再求平均,当平均值超过阈值时停止,这属于哪种准则?

单选题 · easy

  • A.性能收敛判定
  • B.预算控制策略
  • C.置信度阈值← 正确答案
  • D.人工抽检复核

答案:C。题干描述的是「模型对未标注样本的平均把握程度」——这正是置信度阈值的核心逻辑。性能收敛盯的是验证集指标变化,预算控制盯的是样本消耗数量,人工抽检盯的是标注质量,均与「平均最大概率」无关。

Q3. 关于基于性能曲线的停止准则,以下哪些说法正确?

多选题 · mid

  • A.需要固定验证集来评估每轮性能← 正确答案
  • B.连续多轮性能提升小于阈值时应考虑停止← 正确答案
  • C.单次性能下降必须立即停止
  • D.通过观察窗口可降低随机波动影响← 正确答案

答案:ABD。性能曲线停止的核心是「连续多轮提升很小」,需要固定验证集保证评估口径一致,用观察窗口消除单轮噪声。单次下降可能是验证集波动,不是停止信号,所以 C 错。这就像煲汤时偶尔一口偏淡不能断定汤坏了,得多尝几口再判断。

Q4. 主动学习项目中总预算 1200 条标注,警戒比例 0.85,当前已标注 1020 条,正确做法是?

单选题 · mid

  • A.忽略警戒,继续标注到预算耗尽
  • B.进入收尾模式,预留样本做最后验证← 正确答案
  • C.立刻提高标注速度并追加预算
  • D.删除已有标注重新开始

答案:B。1020/1200 = 85%,刚好触达警戒线。设置警戒线的目的就是提醒团队收尾:停止大规模标注,预留部分预算做模型验证或小批量校准。直接耗尽预算不留验证余量,风险很高;追加预算和删除重来则偏离了预算约束的初衷。

Q5. 模型对所有未标注样本都给出很高置信度,但验证集准确率并不高。这说明了什么?

单选题 · mid

  • A.置信度准则有效,可以停止
  • B.模型可能过度自信,置信度高不等于准确率高← 正确答案
  • C.样本分布太简单,不需要标注
  • D.验证集选择不合理,必须更换

答案:B。模型输出高概率不一定代表预测正确,尤其是训练样本不足时,模型可能把「很像某类」的样本自信地分错——这就是过度自信。此时若按置信度阈值停止,会带着低性能上线。所以置信度准则要配合验证集性能或抽检一致率共同判断。

Q6. 在带标注演练集上设计停止阈值时,合理的步骤包括?

多选题 · hard

  • A.模拟真实主动学习流程逐步增加标注← 正确答案
  • B.比较多个候选阈值的性价比曲线← 正确答案
  • C.选择单位标注成本带来收益最大的阈值← 正确答案
  • D.直接沿用历史项目阈值不做验证

答案:ABC。演练集上有完整标注,可以模拟「模型挑样本 → 人工标注 → 更新模型」的完整循环,比较 0.7、0.8、0.9 等候选阈值的性价比,挑「每条标注换来的性能提升」最大的那个。直接沿用历史阈值不做验证,正是常见误区中说的「拍脑袋迁移」。

Q7. 项目要求性能优先且预算紧张,工程师同时开启置信度、收敛、预算三种准则,并采用「任一触发即停」。这种设计最可能引发的问题是?

多选题 · extreme

  • A.某个准则过早触发导致性能不达标← 正确答案
  • B.三个准则相互抵消永远不停止
  • C.标注质量下降无法控制
  • D.模型训练速度明显变慢

答案:A。「任一触发即停」是或逻辑,任何一个准则放宽都可能提前收手。比如置信度阈值在模型还没学够时就达到(过度自信),或收敛窗口因噪声误判提前满足,都会导致性能不达标。预算准则兜底保证一定会停,所以 B 不成立;C、D 与停止准则设计无直接关系。实际工程中常用「至少满足两个准则」的多数投票逻辑。

Q8. 不确定性采样和停止准则在主动学习中的分工是?

单选题 · mid

  • A.采样负责选哪些样本,停止负责何时停← 正确答案
  • B.采样负责何时停,停止负责选样本
  • C.两者功能相同可以互换
  • D.停止准则只在全监督中使用

答案:A。主动学习循环里,不确定性采样决定「下一批标哪些样本」——挑模型最拿不准的;停止准则决定「循环到何时结束」——性能够好或预算见底就停。二者各司其职,缺一不可,就像自助餐厅里「选菜」和「收手」是两套决策。

Q9. 停止准则工程化落地时,哪些实践是有帮助的?

多选题 · hard

  • A.每轮记录置信度准确率预算消耗日志← 正确答案
  • B.人工抽检已标注样本核查标注质量← 正确答案
  • C.构建可视化看板实时观测性能趋势← 正确答案
  • D.停止后立即关闭日志和监控

答案:ABC。日志留痕让停止决策可复盘,人工抽检保证标注质量不拖累模型,可视化看板让团队直观看到曲线是否进入平稳区。停止后关闭日志和监控则相反——恰恰需要继续观察线上表现,防止模型上线后性能回落。

Q10. 主动学习停止过早最直接的后果是?

单选题 · easy

  • A.性能不达标且泛化不足← 正确答案
  • B.性能提升遇阻效果差
  • C.预算超支无法控制
  • D.标注人力严重浪费

答案:A。停止过早意味着模型还没有从足够多的样本中学到规律,验证集性能达不到项目要求,对未见过的数据泛化能力也弱。预算超支和人力浪费是停止过晚的后果,方向正好相反。类比自助餐厅,收手太早可能错过真正值得推荐的招牌菜。