别再盲目随机抽样了,用不确定性采样给模型做减法
最近我在处理一个半监督学习的分类任务时,通过引入主动学习(Active Learning)策略,显著降低了标注成本。其核心逻辑不是由人决定标什么,而是让模型告诉我们它在哪些样本上感到“困惑”,从而精准筛选出最具信息量的关键点。
在具体实现上,我采用了最经典且高效的“不确定性采样”(Uncertainty Sampling)。判断模型是否困惑的最直接指标就是预测概率分布的熵(Entropy)。当模型对某个样本的预测概率分布非常均匀(例如在二分类中接近 0.5/0.5)时,熵值最高,这意味着模型此时最不确定,该样本的标注价值最高。
为了让大家快速上手,我分享一段基于 NumPy 的核心实现逻辑。这段代码的作用是从未标注池中筛选出模型最不确定的 $n$ 个样本:
import numpy as np
def get_uncertain_samples(model, unlabeled_data, n_samples=10):
# 获取模型对未标注数据的预测概率分布
probs = model.predict_proba(unlabeled_data)
# 计算信息熵:Entropy = -sum(p * log(p))
# 加上 1e-10 是为了防止 log(0) 导致计算报错
entropy = -np.sum(probs * np.log(probs + 1e-10), axis=1)
# 选取熵值最高(最不确定)的前 n 个样本索引
uncertain_indices = np.argsort(entropy)[-n_samples:]
return uncertain_indices在实际部署这个工作流的过程中,我踩过一个非常深刻的坑:千万不要在模型完全随机初始化时就启动主动学习。如果模型初始状态太差,它挑选出的“困惑样本”往往不是具有代表性的边界案例,而是一些纯粹的噪声或离群值(Outliers)。如果直接基于这些噪声进行迭代,模型很容易在错误的方向上产生偏差,导致训练不收敛。
基于这个教训,我总结了一套经过验证的实操闭环流程,建议大家在落地时参考:
首先,必须进行 Warm-up 阶段。先随机抽取一小部分样本进行初步标注并训练,确保模型能够分清数据的基本面,建立起一个基础的决策边界。
其次,运行上述的不确定性筛选算法。利用 predict_proba 获取概率分布,计算熵值,将最高熵的样本推送给标注员。
接着,将这批高质量的新标注数据合并入原始训练集,重新拟合模型。
最后,重复这个循环。你会发现,随着迭代次数增加,模型性能的提升曲线会比随机抽样快得多,因为你每次喂给模型的数据都是它最需要的“补课资料”。
这种方法在专家标注成本极高的工业场景(比如医学影像识别或复杂法律文本分析)中效果极其明显。与其追求数据集的绝对数量,不如追求样本的“含金量”。
