小勤是一名刚加入 NLP 团队的实习生,老板丢给他 10 万条用户评论,让他标出情感极性,好训练分类模型。小勤撸起袖子打算一条条标完,导师老周拦住了他:“你这不是在标注,是在抄书。真正聪明的做法,是让模型每天只问你'最该问的那几条'。” 这就是主动学习——像一个聪明的实习生向导师请教:不盲目把整本练习册从头做到尾,而是每次挑自己最没底、最容易答错的题去问,用最少的提问换来最大的进步。在 NLP 文本标注场景里,“练习册”是海量未标注文本,“导师”是标注员,“没底的题”则由模型自己打分选出来。一遍遍循环下来,标注成本能省下一大半。本文将带你完整走一遍这条“聪明请教”之路:从原理、策略、指标,到工具、模型协同和项目落地。

岗位关联

掌握主动学习,是 NLP 工程师优化数据成本的核心技能之一。它能让你在标注预算有限时,依然训练出逼近全量监督效果的高质量模型,这是走向资深数据科学家的关键一步。

目录
  1. 可视化演示
  2. 主动学习原理
  3. 查询策略
  4. 不确定性度量
  5. 序列标注处理
  6. 工具选型
  7. 模型协同
  8. 项目落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

NLP任务里文本标注费时费力,主动学习能自动挑最该标注的样本提升标注效率,是降低NLP标注成本的有效手段。本篇... 切换模式查看不同维度。

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

主动学习的核:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

主动学习原理

小勤对着 10 万条评论深吸一口气,准备开工。老周笑了:“你以为当 NLP 工程师是当校对员?全量标注的钱和时间,没几个项目扛得住。反过来想想,你上学时刷题,是把整本练习册做完,还是专门挑不会的题问老师?”小勤恍然大悟——原来标注也可以“挑题问”,这就是主动学习的起点。

主动学习(Active Learning)的核心思想是:让训练中的模型自己指出“哪些未标注样本对提升性能最有帮助”,再由人工标注这些样本并加入训练集。它把“人盲目标”变成“模型主动提问”,目标是让模型在标注量远小于全量的情况下,逼近甚至达到全量监督训练的效果。这个“训练—查询—标注—更新”的循环,就是主动学习的标准范式。

在 NLP 文本分类任务中,模型训练好之后会对每条未标注文本输出一个概率分布。如果模型对某条文本的类别摇摆不定(比如情感极性正负各占一半),这条文本就是“最该问的题”。形式化地看,主动学习的每一轮都会从候选池里选出一个最值得标注的样本:

小勤现在明白了:与其埋头抄书式地标注所有数据,不如让模型自己开口提问。每一轮提问,模型都变得更聪明一点点,标注员则把力气花在刀刃上。

x∗=arg⁡max⁡x∈Uϕ(x,θ)x^* = \arg\max_{x \in U} \phi(x, \theta)
这个公式的意思是:从尚未标注的文本集合 U 中,挑出“查询分数 φ”最高的那条文本 x,交给人工标注。分数越高,代表标注它对模型提升越大。
  1. 候选文本 xx 是未标注池 U 中的一条文本,比如一条用户评论。
    x∈Ux \in U
  2. 查询分数函数 φφ 是打分器,它衡量“标注 x 对模型有多少价值”,不同策略有不同打分方式。
    ϕ(x,θ)\phi(x, \theta)
  3. 模型参数 θθ 是当前模型的参数,模型用它预测每一条候选文本的类别概率。
    θ\theta
  4. 取最大值argmax 就是在 U 里找出分数最高的那个 x,作为本轮最值得标注的样本。
    arg⁡max⁡x∈U\arg\max_{x \in U}

查询策略

既然要“问”,那怎么个问法?老周给小勤列了三种现场:第一种,看到一道题完全没思路,心跳加速——这是“不确定性”;第二种,几个学霸对答案争得面红耳赤——这是“委员会分歧”;第三种,一道题虽然会做,但它是很多题的原型,搞懂它一举多得——这是“代表性”。三种问法,对应三类查询策略。

查询策略是主动学习的心脏,它决定每个样本的“查询分数”。最常用的是不确定性采样:模型对样本越没把握,越倾向选出它。比如用熵来度量“纠结程度”,熵越大说明模型在多个类别间犹豫不决:

除了熵,还有委员会投票(Query-by-Committee)——训练多个模型组成“评审团”,看它们对同一文本的意见分歧有多大,分歧越大越值得标注;以及信息密度加权——不仅看不确定性,还要看样本是否处于稠密区域,避免标到孤立离群点。实际项目中,普遍先跑不确定性采样,等性能瓶颈了再叠加密度或多样性策略。

老周总结:问法没有绝对优劣,核心是“对症下药”。小勤的项目是情感分类,类间界限模糊,最适合从不确定性采样起步。

ϕentropy(x)=−∑c∈CP(c∣x;θ)log⁡P(c∣x;θ)\phi_{\text{entropy}}(x) = -\sum_{c \in C} P(c \mid x; \theta) \log P(c \mid x; \theta)
熵的概念可以从“选择题答案分布”来理解:如果模型对每条评论的情感输出“正向 0.5、负向 0.5”,说明它完全分不清,熵达到最大,这条评论就应该优先被标注。如果你确定答案是“正向 0.9、负向 0.1”,模型很自信,熵很小,就可以放一放。
  1. 类别集合 CC 是所有可能的标签类别,比如文本情感分类中的“正向、负向”。
    c∈Cc \in C
  2. 类别后验概率P(c|x;θ) 是模型预测文本 x 属于类别 c 的概率。
    P(c∣x;θ)P(c \mid x; \theta)
  3. 熵求和对所有类别求概率乘对数概率的相反数之和,值越大代表模型越不确定。
    −∑c∈C-\sum_{c \in C}

不确定性度量

小勤决定用不确定性采样,但“没底”也得有个量化标准。老周给他递来三把“尺子”:心跳尺、摇摆尺、混乱尺。心跳尺看模型对最可能答案的把握;摇摆尺看第一名和第二名咬得多紧;混乱尺看所有答案整体是否一团乱麻。

第一把尺子——最小置信度(Least Confidence):模型给出预测标签 ŷ 的概率越低,说明它越不自信,这个样本越值得标。第二把尺子——边际采样(Margin Sampling):模型认为最可能的类别和第二可能的类别概率差距越小,说明它在两个答案之间越摇摆。这两者都只关注“头部”两个答案,而熵则关注整个概率分布:

小勤给这三把尺子做了测试:在文本分类中,边际采样通常比最小置信度更稳定,因为最小置信度只盯着“最高分”,忽略了次高类别的干扰;而熵虽然信息最全,但计算稍重。实际做情感分类时,小勤最终以边际采样为主、熵作为辅助校验,标注预算立刻省下了近 40%。

ϕLC(x)=1−P(y^∣x;θ)\phi_{\text{LC}}(x) = 1 - P(\hat{y} \mid x; \theta)
ϕMargin(x)=P(y1∣x;θ)−P(y2∣x;θ)\phi_{\text{Margin}}(x) = P(y_1 \mid x; \theta) - P(y_2 \mid x; \theta)
对于文本分类,假设模型预测一条评论“正向 0.52、负向 0.48”,LC 分数是 0.48(很高),Margin 分数是 0.04(很小),不管用哪把尺子,这条评论都该被优先挑出来标注——因为它正负难分。
  1. 预测标签 ŷ模型认为最可能的那个类别,也就是概率最大的类别。
    y^=arg⁡max⁡cP(c∣x;θ)\hat{y} = \arg\max_{c} P(c \mid x; \theta)
  2. 最小置信度用 1 减去最高类别概率,数值越大说明模型对最高分的答案越没把握。
    1−P(y^∣x;θ)1 - P(\hat{y} \mid x; \theta)
  3. 第一名和第二名y₁ 是概率最高的类别,y₂ 是概率第二高的类别。
    y1,y2y_1, y_2
  4. 边际差距两个头部概率相减,差距越小,模型越在两个答案之间摇摆。
    P(y1∣x;θ)−P(y2∣x;θ)P(y_1 \mid x; \theta) - P(y_2 \mid x; \theta)

序列标注处理

小勤的情感分类项目顺利上线,老板又派来新任务:从合同文本中抽取甲方、乙方、金额等实体——这是序列标注任务。小勤发现,一条合同句子有一二十个词,模型对每个词都会输出一个标签概率。“整句话该不该标,得看哪些词最让模型犯难。”小勤对着“本协议自签署之日起生效”这句犯了嘀咕:哪些词是关键实体,哪些只是填空?

序列标注(如 NER 命名实体识别、POS 词性标注)与文本分类不同,模型的输出是“每个 token 一个标签分布”。因此先要计算每个词的“犹豫程度”,再把词级不确定度聚合成句子级分数来排序。最直接的方式是求平均:把句子中每个词的熵加起来除以词数,得到整个句子的平均“混乱度”。

小勤还学到两个进阶技巧:一是“最大值聚合”——如果某句话里有一个词特别不确定,这个“弱环”可能拖垮整句的实体识别,因此有些团队用最大熵而不是平均熵来排序;二是“实体边界修正”——模型往往对实体开头和结尾的边界词最不确定,单独把它们挑出来复核,比整句重新标注划算得多。老周听完点点头:“长句子别慌,先逐词量犹豫,再按任务目标选择聚合方式。你要标实体,边界词才是命门。”

ϕsent(s)=1n∑i=1nϕtoken(wi;s)\phi_{\text{sent}}(s) = \frac{1}{n} \sum_{i=1}^{n} \phi_{\text{token}}(w_i; s)
可以把一句话想象成一张考卷,每个词是一道小题。先给每道小题按“没底程度”打分(熵),再算全班试卷的平均没底分,分数越高的考卷越该被老师收上去人工批改。
  1. 句子拆成词句子 s 被分词器拆成 n 个 token,w_i 是其中的第 i 个词。
    s=(w1,w2,…,wn)s = (w_1, w_2, \dots, w_n)
  2. 词级不确定度φ_token(w_i) 是第 i 个词的熵,表示模型对这个词打标签的犹豫程度。
    ϕtoken(wi)\phi_{\text{token}}(w_i)
  3. 句级平均把所有词的犹豫分数加总再除以词数 n,得到整句的查询分。
    1n∑i=1n\frac{1}{n}\sum_{i=1}^{n}

工具选型

小勤准备动手实现,正打算从零写循环,老周拦住他:“工具箱里有两把现成的螺丝刀,你先看看。”一把叫 modAL,设计得像乐高模块,灵活自由;另一把叫 ALiPy,设计得像瑞士军刀,策略齐全、开箱即用。小勤翻来覆去把玩,发现每把都有脾气。

modAL 是一个轻量级 Python 主动学习框架,核心思想是“模块化组合”:你可以像搭积木一样,把 sklearn 风格的分词器、分类器、查询策略自由拼装,几行代码就能跑通一个主动学习循环,非常适合快速原型验证。ALiPy 则提供了更完整的工具箱:内置大量查询策略(不确定性、委员会投票、密度加权、Expected Error Reduction 等),还附带数据集划分、实验对比、结果分析工具,适合做系统的策略研究和长时间批量实验。

modAL 和 ALiPy 如何选?小勤的实践心得是:如果是验证新思路、快速跑通流程,modAL 的 API 直觉性更强;如果要做全面的策略对比实验或需要一个“全流程实验台”,ALiPy 更省心。两个框架都支持自定义查询策略——当你需要实现自己发明的“实体边界加权不确定度”时,只需继承查询策略基类,重写打分函数即可,这也是小勤最终两边都用的原因。

ϕvote(x)=−∑c∈CV(c)Tlog⁡V(c)T\phi_{\text{vote}}(x) = -\sum_{c \in C} \frac{V(c)}{T} \log \frac{V(c)}{T}
委员会投票的分数可以这样理解:让 T 个模型组成“评审团”对同一份卷子打分,V(c) 是选择类别 c 的评审人数。投票越分散,说明评审团分歧越大,这份卷子越值得人工复核。
  1. 委员会规模 TT 代表委员会中模型的总个数,比如训练 5 个不同随机种子的分类器。
    TT
  2. 投票计数 V(c)V(c) 是委员会中把样本 x 归为类别 c 的模型数量。
    V(c)V(c)
  3. 投票比例取熵把投票比例当作概率分布计算熵,分歧越大熵越高。
    V(c)Tlog⁡V(c)T\frac{V(c)}{T} \log \frac{V(c)}{T}

模型协同

小勤用 ALiPy 跑通了 NER 主动学习,但发现一个尴尬的问题:刚开始模型太笨,选出来的“最不确定样本”常常是文本本身的噪声数据,标了一批之后性能提升却很有限。老周点拨他:“你让一个刚入门的实习生去问问题,他能问出什么好问题?先给他找个'助教'——预训练语言模型。基础底子好了,问的问题才有价值。”

预训练语言模型(如 BERT、RoBERTa 及其中文变体)在主动学习流程中扮演“助教”角色:一方面,它提供了高质量的上下文语义表示,让下游分类器更快学会决策边界;另一方面,预训练模型输出的概率分布更平滑、更有区分度,基于它的不确定性度量比从头训练的模型可靠得多。更重要的是,可以在预训练模型的嵌入空间中计算样本之间的相似度,从而加入“代表性”考量——避免模型连续挑出十几条几乎重复的评论。

小勤把“不确定 + 密度”组合策略应用后,效果立竿见影:模型不再执着于挑特殊句式,而是优先标注那些“高频但易错”的典型样本,同样的标注预算下,F1 分数又提升了 3 个百分点。他感叹:让预训练模型当助教,实习生问的问题一下子就“上道”了。

ϕdensity(x)=ϕunc(x)×1K∑x′∈NK(x)sim(x,x′)\phi_{\text{density}}(x) = \phi_{\text{unc}}(x) \times \frac{1}{K} \sum_{x' \in N_K(x)} \text{sim}(x, x')
这个公式是“不确定性 × 代表性”的组合评分。前面是模型对 x 的没底程度,后面是 x 在嵌入空间中和它最像的 K 个邻居的平均相似度。如果一条文本既让模型犹豫,又不孤立(和很多其他文本都像),那标注它的收益就翻倍了。
  1. 不确定性基础分φ_unc(x) 可以是前面任一种不确定性分数,比如 LC 或熵。
    ϕunc(x)\phi_{\text{unc}}(x)
  2. K 近邻集合N_K(x) 是在嵌入空间中与 x 最相似的 K 条文本。
    NK(x)N_K(x)
  3. 平均相似度对 K 个邻居的相似度求平均,衡量 x 的代表性和典型程度。
    1K∑x′∈NK(x)\frac{1}{K} \sum_{x' \in N_K(x)}

项目落地

纸上谈兵容易,真刀真枪落地才是硬仗。小勤要把这套流程固化到团队里,老周给他列了一份“落地四件套”:冷启动怎么搞、标注质量怎么守、ROI 怎么算、迭代怎么跑。

冷启动是第一关。模型在最初只有几百条标注时还很弱,这时盲目用不确定性采样会选出一堆“因模型太弱而误判为不确定”的样本。常见做法是先随机标注一小批(比如总量的 5%~10%)作为种子集,让模型“及格”了再进入主动学习循环。质量审查同样关键:主动学习选出的样本往往是“难啃的骨头”,标注员容易产生分歧,所以需要双人标注 + 仲裁机制。最重要的是建立 ROI 评估:每一轮主动学习标注了多少条、模型性能涨了多少,用效率指标直观对比随机采样基线。

落地还有一个容易被忽视的环节:持续迭代。业务数据永远在变,昨天的高频句式今天可能就成了长尾。小勤在团队里定下规矩:每两周重估一次查询策略的表现,当“主动学习选出的样本里人工标签分歧率”超过 20% 时,就要检查是否出现新的数据分布漂移。三个月后,小勤的项目报告写着:标注成本下降 38%,模型 F1 反而提升了 5%。老板看着报告,默默把明年的标注预算砍了一半——小勤的“聪明请教”机制,正式在团队里生根发芽了。

η=Nrandom−NALNrandom×100%\eta = \frac{N_{\text{random}} - N_{\text{AL}}}{N_{\text{random}}} \times 100\%
这个公式算的是“节省率”:N_random 是随机采样达到目标精度所需的标注条数,N_AL 是主动学习达到同等精度所需的条数。两者之差除以随机基线,就是主动学习帮你省下的标注比例——小勤的项目里这个数字大约是 38%。
  1. 随机基线标注量N_random 是从零开始随机标注、达到目标准确率时消耗的总标注条数。
    NrandomN_{\text{random}}
  2. 主动学习标注量N_AL 是用主动学习策略达到同一目标精度时消耗的标注条数。
    NALN_{\text{AL}}
  3. 换算节省率两条数据之差占随机基线的比例,就是主动学习的“省钱率”。
    Nrandom−NALNrandom\frac{N_{\text{random}} - N_{\text{AL}}}{N_{\text{random}}}

AI 应用场景

客服意图体系的冷启动标注

阶段:数据标注与预处理

解决的问题:新上线一个“智能客服意图分类”系统时,往往有几十万条历史对话但一条意图标签都没有。如果全部人工标注,不仅周期长、成本高,而且大量相似问答会造成标注冗余。主动学习让模型先从随机的几百条种子标注中“试探”学习,再持续挑选模型最困惑的对话去标注,迅速覆盖高频意图,同时自动压缩重复样本。

具体案例:某电商客服团队要在两周内上线售前/售后/物流等 12 个意图分类器。传统方案需要标注 3 万条,主动学习 + 预训练模型组合策略只标注了 1.1 万条就达到 90% 准确率,其中“售后纠纷”类别的样本几乎全部由模型主动挑出,因为这类文本语义最多变。

法律合同 NER 的降本增效

阶段:模型训练与优化

解决的问题:合同条款的实体抽取(甲方、乙方、金额、期限)需要逐词标注,成本是普通分类的好几倍。序列标注任务里,很多句子只有一两个关键实体词,全句标注浪费巨大。用主动学习做“句级筛选 + 边界复核”,只挑模型最没底的句子给标注员,标注员也只需聚焦模型标出的不确定片段。

具体案例:某法律科技公司在做合同审查产品,4 万份合同中标注了 6000 份后 F1 就不再明显上升。接入 ALiPy + BERT 的主动学习流程后,新增的 2000 份精选合同让 F1 又涨了 4.2%,其中“连带责任条款”这类边界模糊样本占了主动选择样本的 60% 以上。

舆情监控的流式增量标注

阶段:持续学习与数据更新

解决的问题:舆情系统上线后,每天新增大量评论,热点事件会瞬间催生新表达。如果周期性全量重标,成本不可控;如果放着不管,模型在长尾新表达上快速掉点。主动学习做成“流式”模式:新数据进入缓存池,模型每天挑选 Top-N 条最不确定的样本推送给标注员,几分钟内完成增量更新。

具体案例:某舆情平台在突发社会事件期间,系统自动筛选出 200 条模型最困惑的微博评论,标注员 20 分钟标完,模型对“反讽”类文本的识别 F1 从 0.61 回升到 0.78,全程只消耗了日常十分之一的标注人力。

Python 演示

python49 行
# -*- coding: utf-8 -*-"""主动学习降低NLP文本标注成本:简易Demo用字符级词袋特征 + 逻辑回归模拟情感分类的主动学习流程。"""import numpy as npfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.linear_model import LogisticRegression raw_texts = [    "电影很精彩", "剧情太差了", "演员表演到位", "画面粗糙无聊",    "节奏紧凑好看", "结局令人失望", "音乐动听感人", "逻辑混乱不堪",    "特效震撼人心", "台词尴尬出戏", "故事温暖治愈", "剪辑拖沓冗余",]labels = [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] vectorizer = CountVectorizer(analyzer="char", ngram_range=(1, 2))X = vectorizer.fit_transform(raw_texts).toarray() labeled_idx = [0, 1]unlabeled_idx = list(range(2, len(raw_texts)))  def train_model():    clf = LogisticRegression(max_iter=500)    clf.fit(X[labeled_idx], np.array(labels)[labeled_idx])    return clf  def query_next(clf):    prob = clf.predict_proba(X[unlabeled_idx])[:, 1]    uncertainty = 1 - np.abs(prob - 0.5) * 2    best_local = int(np.argmax(uncertainty))    return unlabeled_idx.pop(best_local)  print("=== 主动学习标注流程 ===")round_no = 1while unlabeled_idx:    clf = train_model()    chosen = query_next(clf)    labeled_idx.append(chosen)    print("第%d轮:模型选出最不确定样本 #%d「%s」,人工标注为 %d" % (        round_no, chosen, raw_texts[chosen], labels[chosen]))    round_no += 1 clf = train_model()acc = clf.score(X, labels)print("\n主动学习结束:共标注 %d 条(总 %d 条)" % (len(labeled_idx), len(raw_texts)))print("最终模型在全部数据上的准确率:%.2f" % acc)
目的:演示主动学习最核心的循环——每次只用已标注数据训练模型,让模型从待标注池中挑出预测概率最接近 0.5 的“最不确定”样本人标注,再更新训练集,直到无样本可选。整个流程模拟了现实项目里“标注预算有限,优先标谁”的决策过程。
  1. vectorizer = CountVectorizer(analyzer="char", ngram_range=(1, 2))把中文短句切成字符级 1~2 元语法特征,这是最简单的中文文本表示。
  2. clf.fit(X[labeled_idx], np.array(labels)[labeled_idx])只用当前已标注的样本训练模型,模拟真实场景中未标注数据不能参与训练。
  3. prob = clf.predict_proba(X[unlabeled_idx])[:, 1]让模型对未标注池中的所有候选文本预测正向概率。
  4. uncertainty = 1 - np.abs(prob - 0.5) * 2概率越接近 0.5,说明模型越犹豫,这个值越大。
  5. best_local = int(np.argmax(uncertainty))从所有未标注样本中找出“最没把握”的那一条。
  6. unlabeled_idx.pop(best_local)把它从待标注池中移除并交给“标注员”(这里直接用真实标签模拟),同时加入已标注集合。
  7. round_no += 1每轮就是一次“训练 → 查询 → 标注 → 更新”的完整循环。

常见误区

误区“既然主动学习是选不确定的样本,那我每次就挑模型输出概率最接近 0.5 的那批,越多越好,准没错。”

正解高不确定度只是“值得标注”的必要条件,不是充分条件。想象一个实习生,他不仅不会做难题,连印刷错位的题目也看不懂——模型对噪声数据、离群点同样会表现出高不确定度,标注它们不仅浪费预算,还可能干扰训练。正确的做法是叠加代表性考量,比如在嵌入空间做密度加权,剔除孤立点;或者先做一轮数据清洗,过滤明显含乱码、超短、重复的文本。

为何常见:主动学习入门资料几乎都强调“挑不确定的”,初学者容易把“不确定性”当成了唯一的金标准,忽略了实际数据里的噪声问题。

误区“上了主动学习之后,模型自己会挑样本,标注员可以大幅裁员,甚至实现全自动标注。”

正解主动学习只是“减少”人工标注量,并不能消除标注。它挑选出的样本恰恰是模型最吃不准的难样本,反而需要更高质量的专家标注。可以这样理解:主动学习让标注员从“流水线工人”变成“专家会诊医生”,工作量少了,但每一单的难度和重要性都更高。此外,标注质量审查、双人仲裁等机制一个都不能少,否则模型会被错误标签带偏。

为何常见:“学习”二字容易让人联想成“机器自动学习”,而忽略了主动学习框架里“人的标注”是不可或缺的环节。

误区“标注师傅跟我说,反正都是标数据,随机抽一批不就行了?何必搞复杂的筛选策略,省不了多少。”

正解在标注预算非常充足(比如达到全量数据的 80% 以上)时,随机采样确实和主动学习差距不大;但在预算紧张的真实项目中,差距很大。参考前面的节省率公式,主动学习通常能节省 30%~50% 的标注量。原因很直观:随机采样是把预算均匀撒在“容易题和难题”上,主动学习则把预算集中在“做完能涨分”的难题上。不过要注意一个前提——只有查询策略和模型选择匹配时,优势才能发挥。

为何常见:小规模 demo 里标注总量太小,方差大,看不出差距;且很多人用随机采样作为基线时没用同等的模型调参,对比不公平。

误区“神经网络模型输出概率本来就不可靠,softmax 值不能当真,所以主动学习在深度学习时代没用了。”

正解直接拿一个未校准的深度模型做不确定性采样确实有风险,但实践中通过预训练语言模型的表示空间、集成模型(如多个随机种子的 dropout 采样)等方式,可以显著提升概率估计的可信度。事实上,BERT 等预训练模型的概率输出在文本分类上已经足够稳定,配合密度加权能取得很好效果。不确定性采样不是“过时”,而是需要和其他信号组合使用。

为何常见:学界确实有研究表明深度模型概率校准差,但那是针对“直接当作真实置信度”的用法;主动学习只需相对排序,对绝对校准要求没那么高。

误区“我在文本分类上用的熵采样效果很好,NER 任务也直接套用,逐词算熵再求平均应该就行了吧?”

正解不同任务的输出结构和不确定性分布差异很大。文本分类的熵直接来自句子级概率分布,而序列标注既要考虑词级标签分布,还要考虑实体边界、标签间的依赖(比如 BIO 标注的约束)。直接逐词求平均可能会漏掉“边界词特别不确定”的句子。NER 场景里,更推荐先做句级聚合,再对边界 token 做加权或单独复核;而对长文档分类,则要先考虑句子截断对不确定度的影响。

为何常见:很多人把主动学习当作“一个算法”,忽略了它其实是“查询策略 + 任务结构”的组合设计,任务变了,度量方式也要变。

面试题

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

单选题 · easy

  • A.减少模型参数量
  • B.用最少标注换取最佳性能← 正确答案
  • C.提升预测推理速度
  • D.增加无标注数据量

答案:B。主动学习不是优化模型结构或推理速度,也不是单纯堆数据,而是通过挑选最值得标注的样本,在同等标注预算下让模型性能尽可能高,或在同等性能下尽可能少标注。用“实习生只问最该问的题”来类比,目标是让学生用最少的请教次数获得最大的成绩提升。

Q2. 主动学习循环中,模型查询出样本后下一步交给谁?

单选题 · easy

  • A.测试集
  • B.模型自己
  • C.人工标注← 正确答案
  • D.优化器

答案:C。主动学习的循环是“训练 → 查询 → 人工标注 → 加入训练集 → 更新”。模型只负责从候选池里挑出最值得的文本,真正给出标签的是人工标注员。就像实习生挑出不会的题,最终要靠老师来解答。测试集和优化器都不是这个环节的主角。

Q3. 下列哪种策略属于典型的不确定性采样?

单选题 · easy

  • A.随机采样
  • B.熵采样← 正确答案
  • C.聚类采样
  • D.分层采样

答案:B。熵(Entropy)直接度量模型对文本类别分布“有多犹豫”,熵越大越值得标注,是不确定性采样的代表。随机采样、聚类采样、分层采样分别属于基线、多样性、均匀性思路,不属于“看模型有多不确定”这一派。

Q4. 最小置信度(LC)策略中,LC 分数越大代表什么?

单选题 · mid

  • A.模型越有把握
  • B.样本越难获取
  • C.模型越没把握← 正确答案
  • D.样本越稀少

答案:C。LC = 1 − P(ŷ|x),用 1 减去最高类别概率。最高概率越低,LC 分数越高,说明模型连最可能的答案都不自信,这正是“没把握”的信号。样本难获取(如需要专家知识标注)和稀有性与 LC 分数没有直接关系。

Q5. 主动学习中常用的查询策略包括哪些?

多选题 · mid

  • A.不确定性采样← 正确答案
  • B.委员会投票← 正确答案
  • C.信息密度加权← 正确答案
  • D.数据增强

答案:ABC。不确定性采样(熵、LC、Margin)、委员会投票(多模型分歧程度)、信息密度加权(不确定性和代表性结合)都是主动学习的经典查询策略。数据增强属于训练阶段的数据扩充手段,不影响“挑哪些样本去标注”的决策。

Q6. 对于 NER 序列标注任务,句子级不确定度通常怎么计算?

单选题 · mid

  • A.只取第一个词
  • B.直接忽略
  • C.取最后一个词
  • D.对所有词熵取平均← 正确答案

答案:D。NER 中模型对每个 token 输出一个标签分布,通常先算每个词的熵,再对整句求平均(或取最大),得到句子级不确定度。只取首尾词会丢失中间大量实体信息;直接忽略则无法对句子排序。

Q7. modAL 和 ALiPy 的共同特点是什么?

单选题 · mid

  • A.都是预训练语言模型
  • B.提供了主动学习流程封装← 正确答案
  • C.都是文本分词工具
  • D.都是标注管理平台

答案:B。modAL 和 ALiPy 都是 Python 主动学习库,封装了训练循环、查询策略和数据集管理,让工程师不用从零实现。它们不是模型、分词器或标注平台,而是连接“模型”和“人工标注”的主动学习中间层。

Q8. 在预训练模型加持下,为什么还要加入多样性采样?

单选题 · hard

  • A.降低计算开销
  • B.增加标注速度
  • C.避免选到冗余同质样本← 正确答案
  • D.减少模型参数

答案:C。纯不确定性采样容易连续选出语义非常相似的“同类难题”,造成标注冗余。加入多样性(如信息密度或聚类采样)后,模型会兼顾“不确定”和“有代表性”,避免反复标注十几条几乎一样的评论。这和实习生连续问同一道题的不同数字变体是同样的低效。

Q9. 主动学习项目落地时需要关注的工程问题包括哪些?

多选题 · hard

  • A.冷启动策略设计← 正确答案
  • B.标注质量审查← 正确答案
  • C.类别不均衡处理← 正确答案
  • D.必须更换 GPU 硬件

答案:ABC。冷启动要先用随机种子集让模型及格,标注质量审查防止争议样本带偏模型,类别不均衡则影响查询策略的公平性。更换 GPU 不是主动学习落地的必要条件,计算资源优化是另一个维度的问题。

Q10. 信息密度加权策略的核心思想是什么?

单选题 · extreme

  • A.只选离决策边界最远的样本
  • B.选择标注成本最高的样本
  • C.只选纯随机的样本
  • D.兼顾不确定性和代表性← 正确答案

答案:D。信息密度加权把不确定性分数乘以样本在嵌入空间与 K 近邻的平均相似度,既保留“模型犹豫”的判断,又强调“这条文本能代表一大批相似文本”。只选边界远的样本是确定性策略,选标注成本高的样本属于成本敏感学习,随机采样则完全忽略了不确定性和代表性。