资讯动态

主动学习实战:用有限标注预算撬动模型效果上限

发布时间:2026/10/18 13:29:16 来源:尧图企业网站定制
咱们搞AI的心里都清楚一件事模型的效果天花板往往不是靠调参调出来的而是被数据喂出来的。但问题是高质量的标注数据越来越贵尤其在垂直行业里有多少人工就有多少智能这句话说着轻松做起来全是眼泪。我之前经手过一个工业视觉项目生产线每天能产出几千张图片但真正有用的缺陷样本寥寥无几工程师熬夜圈框标注累死累活一个月模型上线后遇到新型缺陷还是抓瞎。后来我换了个思路不再被动地接受所有数据而是让模型主动开口点菜——它自己告诉我它最想知道哪几张图的答案。这就是主动学习Active Learning的核心玩法把有限的标注预算花在模型最困惑、最能提升效果的数据上。这篇文章我就把这套方法论从头到尾拆开讲一遍从原理机制到落地实操再到我踩过的坑一次性说清楚。1. 主动学习的核心思路为什么主动比被动更聪明1.1 常规训练模式的问题出在哪做过监督学习的同学都知道标准流程收集数据 - 人工标注 - 训练模型 - 评估调优。这套流程听起来没毛病但在真实场景里会遇到两个尴尬情况。第一个情况是数据严重冗余。摄像头每天拍一万张图其中九千张都是正常背景只有一百张有目标物十张是真正的异常缺陷。如果把这一万张全标了标注员的大部分精力其实都花在了那些一眼就知道没毛病的图上真正关键的异常样本反而被淹没在海量常规数据里容易漏标、错标。第二个情况是长尾分布。现实中的异常种类千奇百怪有些缺陷一年也遇不到两次。传统训练方式下模型对高频类别的识别会越来越准但对低频、新出现的类别几乎无感因为训练时就没见过几次。而且标注团队的精力是有限的预算也是有限的把有限的资源均匀撒在全部数据上本质上是对预算的浪费。打个比方这就像学生复习备考。被动学习是把整本教材从头到尾翻十遍不管是不是考点主动学习则是先做一套模拟卷发现自己三角函数和立体几何最薄弱然后集中精力专攻这两个章节。同样是复习一小时后者的提分效果明显更好。1.2 主动学习到底是怎么运作的主动学习的标准框架里有两个角色学习引擎Learner和查询策略Query Strategy。学习引擎就是我们常见的机器学习或深度模型负责从已有标注数据中学习规律查询策略则是出题老师负责从没有标注的数据池里挑出对模型提升最有价值的那一批样本交给人工标注。整个流程是一个循环先用一小部分标注数据训练一个初始模型然后用这个模型去预测所有未标注数据查询策略根据预测结果给出评分挑选最有价值的样本交给人工标注标注完的数据加入训练集重新训练模型然后进入下一轮。这个循环可以一直跑下去直到模型效果达到业务指标或者标注预算花完。这里说的有价值很关键。怎么定义价值不同查询策略有不同的理解方式后面我会详细展开。但核心思想是一致的模型越是搞不定、越是犹豫、越是觉得模棱两可的样本越值得让标注员帮忙确认。换句话说主动学习是在用模型对数据的困惑程度来指导标注优先级。1.3 主动学习不是半监督学习别搞混经常有人把主动学习和半监督学习混为一谈这两个思路有本质区别。半监督学习是模型自己消化无标注数据比如用伪标签、一致性正则化这些手段让模型从大量未标注数据中自学主动学习则是模型请求人来教通过标注员的反馈来消除不确定性。实际项目中这两个方法并不冲突完全可以组合使用。先用主动学习挑出最关键的一批样本让人标注剩下的未标注数据用半监督手段让模型自己继续学。这两者搭配起来往往能把标注成本压到极低我后面会提到一个具体案例。2. 查询策略选型主动学习最核心的技术决策2.1 不确定性采样专挑模型下不了决心的样本不确定性采样是最直观、最常用的一类策略思路就是模型越犹豫越值得问。具体实现方式有几种最小置信度采样Least Confidence只看模型预测概率中最大的那个值值越小说明模型越没底气。比如模型对某张图预测的类别概率是正常 0.4缺陷A 0.3缺陷B 0.3最大概率才0.4那这张图就很有价值。但这种方式有个盲区它只看最高分忽略了其他类别的分布情况。边界采样Margin Sampling稍微改进了一点它计算最高概率和第二高概率之间的差值差值越小说明模型在两类之间摇摆得越厉害。比如某样本预测最高是0.45第二是0.44差距只有0.01模型几乎分不清两个类别这种样本就很值得标。熵值采样Entropy Sampling则从信息论的角度出发计算预测分布的信息熵。熵值越高说明预测分布越均匀模型越不确定。我目前在项目中使用最多的是熵值采样因为它能综合反映整个概率分布的情况而不仅仅是看前两名。不过这些策略有个共同的问题只关注单样本的不确定性容易漏掉那些模型很确定、但其实是错误确定的样本。这和模型是否已经收敛、类别是否平衡都有关系接下来要讲的多样性采样就是对这个问题的一种补充思路。2.2 多样性采样覆盖数据空间避免重复提问纯不确定性采样还有一个坑选出来的样本往往挤在同一个区域。模型对某个局部区域搞不懂于是把那一带的样本全选出来了但这些样本长得都很像标完一个其他几个的效果提升其实也很接近边际收益递减。多样性采样就是为了解决这个问题。常用的做法是先对未标注数据做聚类然后从每个簇里挑代表性的样本或者用特征空间中的距离度量保证选出的样本两两之间足够分散。我在一个文本分类项目里试过把不确定性采样和多样性采样结合。先用聚类把用户反馈分成二十多个话题簇然后在每个簇里用熵值采样挑最不确定的几条。同样的标注预算下只跑不确定性采样的模型F1值是0.72加上多样性约束之后提升到0.79而且只用了原来百分之六十的标注量。所以我的经验是如果你的数据本身分布比较复杂、类别边界模糊别只用单一策略。2.3 委员会查询多个模型吵架谁吵得凶选谁委员会查询Query by Committee简称QBC的思路更有意思。训练多个模型组成一个评审委员会让它们分别预测未标注数据如果模型们对同一个样本的预测结果分歧很大说明这个样本本身就存在歧义值得标注。实际操作中委员会可以是同一模型用不同随机种子训练出来的多个副本也可以是不同结构的模型比如决策树加SVM加逻辑回归的混合体。分歧程度的度量方式有用投票熵的也有用KL散度平均值的。QBC的优势是鲁棒性强不太容易受到单一模型偏差的影响适合数据噪声比较大的场景。缺点也很明显训练多个模型的计算成本成倍增加。我在实际项目里一般不会全程用QBC通常是在训练早期、模型还很不稳定的阶段跑几轮等模型稳定之后就切换到熵值采样性价比更高。2.4 策略组合的实战经验没有哪个策略是万能的最靠谱的做法是结合数据场景来选。如果你的数据是图像分类、模型是CNN这类结构化数据不确定性采样加多样性聚类就够用了如果数据是文本、标注成本极高、每一条标注都要资深专家花很长时间那建议直接用QBC因为标错一条的代价太大。另外一个重要的经验前一两轮查询不要完全依赖策略而是混合一部分随机采样。因为初始模型太弱它认为不确定的地方可能根本不重要这时候随机采样一些覆盖不同分布的数据反而能快速建立基础能力。我习惯的做法是第一轮百分之八十随机加百分之二十策略采样后面逐轮降低随机比例到第五轮就全量采用策略采样了。3. 从零搭建主动学习闭环完整实操过程3.1 环境准备与数据池构建首先要把数据组织好。我们需要一个带标注的初始训练集哪怕只有几百条也行一个大规模未标注数据池以及一个单独留出来做评估的测试集三个集合要严格分开别混在一起。工具方面我推荐先用开源的modAL这个库上手。它封装了常用的查询策略而且兼容scikit-learn接口写起来很顺手适合快速跑通流程。如果你的项目是深度学习模型那就需要自己写查询逻辑但核心的循环框架是通用的。下面这段代码我直接把最核心的循环给出来from modAL.models import ActiveLearner from modAL.uncertainty import uncertainty_sampling from sklearn.ensemble import RandomForestClassifier # 初始化模型和标注数据 model RandomForestClassifier() initial_idx np.random.choice(len(X_pool), size100, replaceFalse) X_initial, y_initial X_pool[initial_idx], y_pool[initial_idx] # 初始化主动学习器 learner ActiveLearner( estimatormodel, query_strategyuncertainty_sampling, X_trainingX_initial, y_trainingy_initial ) # 迭代查询标注 n_queries 20 for round_idx in range(n_queries): query_idx, query_instance learner.query(X_pool, n_instances10) y_new oracle_label(query_instance) # 人工标注环节 learner.teach(X_pool[query_idx], y_new)注意query方法返回的两个值前一个是样本下标后一个是样本内容。n_instances控制每轮选多少样本交给标注员这个参数需要根据标注产能来定我一般控制在单日可完成标注量的百分之八十左右留出缓冲。3.2 初始模型训练第一块基石要打稳初始模型太弱查询策略给出的优先级参考价值就会大打折扣。我的经验是初始标注集至少覆盖每个类别二十条以上样本而且类别比例尽量均衡让模型先对全局有个基本概念。这一阶段有两条细节值得留意。第一类别的定义要明确统一特别是多分类任务中边界样本到底归哪一类要提前写清楚。第二初始模型用相对简单但训练快速的结构就好不要太复杂。我的一个项目里初始阶段就用了轻量的卷积网络训练几分钟就能收敛跑完一轮后看学习曲线如果模型在训练集上的效果都不理想那说明初始标注集本身就有问题得回头补数据而不是急着迭代。3.3 循环迭代的关键环节别让流程自动化变成流水账循环迭代是整个主动学习的引擎。每一轮流程都是用当前模型预测所有未标注数据 - 查询策略选出候选样本 - 送到标注平台 - 标注员完成标注 - 审核 - 合并到训练集 - 重新训练模型。这里最容易被忽视的是标注质量审核环节。我见过不少团队把主动学习做成标注流水线样本选出来就直接丢给标注员标完就直接进训练集结果废样本、误标样本混了一堆模型效果越来越差。我的做法是每轮随机抽百分之十的已标注样本做二次审核由资深工程师复核发现标注不一致超过百分之五就要回头检查标注规范和样本选择逻辑。增量训练也要控制节奏。我习惯是每轮新增样本数量控制在原训练集规模的百分之十到二十这样模型参数调整不会太剧烈能够平滑迁移上一轮的学到的规律。如果一次注入太多新数据模型很容易遗忘之前学到的东西效果反而倒退。3.4 评估与收尾什么时候停下来主动学习贵在迭代但不能无限迭代下去。我每跑完一轮就在固定测试集上计算准确率、召回率、F1这些指标画出学习曲线。曲线刚开始时斜率明显后面会逐渐平缓如果连续三轮提升幅度都不到百分之一说明已经进入平台期这时候继续标数据的边际收益已经不大了可以收工。还有一种停止条件是预算耗尽。很多业务场景的标注预算不是无限的这时候就需要提前做好规划。我的习惯是总预算的百分之六十用于前几轮快速见效的迭代剩下百分之四十留给后期精调和处理冷门样本。如果发现预算快用完而曲线还在抬升就把查询策略切换成更激进的熵值采样集中火力解决最不确定的部分。4. 三个落地案例主动学习在不同场景中的实际表现4.1 医疗影像里的稀少病灶挖掘医疗影像是个非常典型的应用场景因为阳性病灶的标注成本极高需要专业医生花大量时间逐张查看而影像数据中绝大多数都是正常组织。项目团队用主动学习做了个切片的筛选工具策略上用熵值采样加边界采样组合目标是让医生集中精力审核模型看不懂的区域。结果很有说服力标注量减少了百分之六十模型对罕见病灶的召回率反而提升了两倍多。这个案例给我的启发是主动学习特别适合那种稀有目标、稀缺标注的场景。如果业务本身就是为了找到极少数异常那么让模型主动把可疑样本挑出来比盲目的全量标注不知道高到哪里去了。4.2 工业质检里的长尾缺陷类型工业质检同样受益。缺陷类型的长尾效应非常明显常见的划痕、脏污样本很好收集但裂纹、气泡、异色这些罕见缺陷往往几个月才出现一次。如果不用主动学习工程师只能等缺陷自然发生才能积累数据周期长且不可控。团队的做法是先把过去的误检样本全部收集起来作为初始种子然后用主动学习从每天新产线数据中挑出模型最不确定的图片交给老师傅确认。经过三个月的迭代新缺陷的发现速度从平均两周提前到了两天错漏率降低了近八成。这里面的关键就是主动学习能够在海量正常数据中快速锁定可疑的少数派把人的精力用到最需要判断力的地方。4.3 智能客服的意图识别优化文本分类任务里主动学习的应用同样成熟。一个客服机器人项目初始只有十几个意图类别语音对话里用户表达方式五花八门新说法、新口语层出不穷。团队构建了未标注的用户对话池用主动学习循环选样每轮从对话池中挑出模型最不确定的对话记录交给运营人员标注新意图。这个项目值得注意的细节是查询策略用了不确定性采样派生的熵值法但初始几轮混合了一大半随机采样。因为用户表达的方式太丰富纯策略采样容易在早期把样本集中到单一表达模式上随机采样则能覆盖更多样化的句式。最终效果是意图识别的分类准确率从0.58提升到0.84而且只标注了原本计划量的三成数据。5. 常见问题与排查技巧实录踩坑笔记5.1 冷启动失败初始模型太弱查询建议不可靠这个坑我在第一个项目里就踩过。初始标注只有五十条模型训练出来在验证集上准确率勉强过半查询策略选出来的样本很多都是重复的、边界模糊的垃圾样本。后来我把初始标注扩大到两百条并且保证类别覆盖均衡查询建议的质量立刻上了个台阶。这里有一个通用经验在初始模型效果达到可用水平之前不要急着依赖策略采样。宁可先多花一点标注量把底子打好也不要在弱模型的基础上强行做主动学习否则后面每一轮的反馈都是错误信号。5.2 数据冗余导致查询失效主动学习最怕的就是未标注数据池里面信息密度太低。如果数据池里有大量重复或近似重复的样本查询策略可能会反复选出同一类样本因为从模型的角度看它们同样不确定。但标注完成之后模型学会的只是这一小片区域对全局的提升并不大。我在处理这类问题时先用hash去重或者特征聚类把明显相似的样本合并再进行查询效果改善不少。5.3 查询策略与模型结构不匹配不是所有策略都适用于所有模型。比如基于梯度的期望模型变化量Expected Model Change策略只对可以使用梯度信息的模型有效而决策树、KNN这类模型没有平滑的梯度强行套用梯度类策略就会失效。选策略前先看模型类型这个基础工作千万不能跳过。5.4 标注标准不一致主动学习把数据交给标注员时往往是一批一批来的每一批样本的特点不同如果标注规范没有同步升级就会导致标准漂移。比如第一轮标注的样本可能是低对比度、模糊的边界情况第二轮突然来了一批高噪声、多目标重叠的样本不同标注员对相同情况的判断可能就不一样了。我的对策是每批标注启动前把上一批的典型案例整理成标准说明让标注员对齐标准必要时组织快速复标会议。5.5 效果不如预期的排查思路如果你的主动学习项目跑了几轮效果反而下降先从这几个方向排查第一训练集和测试集是否分布一致是否混入了未标注的数据第二标注质量是否有问题抽样检查一下标签有没有错误第三模型是否在学习新数据时发生了遗忘需要调小每轮新增数据量第四查询策略的n_instances是否太大导致一次注入过多样本扰乱了模型。我个人的建议是每轮保留一份历史模型和训练数据的快照效果回退时可以直接对比当前状态和上一轮的差异定位问题会快得多。6. 写在最后主动学习不是银弹但它是效率杠杆做主动学习项目这几年我最大的体会是它并不能让模型凭空变强而是把本来就有限的标注资源用在刀刃上让每一次人工标注都发挥出最高的信息价值。它的意义不在于取代人或算法而在于重塑数据和模型之间的协作关系。如果你想在自己的项目里尝试主动学习我的建议是从最小闭环开始几百条初始标注、一批未标注数据池、一个简单的模型、一个开源查询策略库跑上三五轮看看学习曲线的走势。别一上来就整复杂的多策略融合或者委员会查询先把基础流程跑通再根据实际效果逐步加码。最后分享一个实用小技巧在标注平台接进主动学习时把模型预测的结果和置信度实时展示给标注员。这样标注员看到模型对某条样本的把握程度心理上会有个预期标注时也会更注意那些模型犹豫的细节整体标注质量的稳定性会明显提高。这个小改动成本几乎为零但回报很实在。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑