小样本学习与元学习实战
小样本学习与元学习实战:低数据也能训好模型
关键词:小样本学习(FSL)、元学习(Meta-Learning)、迁移学习、数据增强、主动学习、上下文学习
适用读者:手头只有几百甚至几十条第高质量标注、却要训出可用模型的数据科学家、算法工程师与研究者。
0. 写在前面:低数据的三宗罪
大模型时代有个残酷反差:数据越多越好用,但真实业务里数据往往极少且极贵。
- 医疗罕见病:每类只有几十张影像,且一张标注要副主任医师花 20 分钟;
- 工业缺陷:不良品占比千分之一,想凑齐"裂纹/划痕/污染"各几百张几乎不可能;
- 小语种 NLP:能请到的母语标注者凤毛麟角。
直接用这些"小数据"从头训练,必然踩中三宗罪:
| 症状 | 表现 | 根因 |
|---|---|---|
| 过拟合 | 训练集 100%、验证集 60% | 模型容量 ≫ 数据量,记住了噪声 |
| 高方差 | 换一批样本,指标剧烈波动 | 估计不稳定,统计意义不足 |
| 泛化差 | 新场景/新分布直接崩 | 没见过足够多样的边界情况 |
本文的宗旨:不靠堆数据,而靠"借力先验 + 聪明用样本 + 约束容量"把小数据用透。所有方法配原理图、可跑代码与一个完整模拟案例,论文均来自 arXiv(含 2025 最新综述)。
1. 全景图:低数据训练的四条武器
一句话记忆:迁移解决"起点",增强解决"数量",元学习解决"适配速度",主动学习解决"标注预算"。
2. 武器一:迁移学习 / 预训练微调(低数据首选)
2.1 原理
低数据时绝对不要从头训练。正确姿势是:拿一个在海量数据上预训练好的模型(如 CV 的 CLIP/ImageNet 权重、NLP 的 BERT/Llama 权重)当"起点",只用你的小数据做微调。预训练已经把通用特征(边缘、纹理、语法、语义)学好了,你只需在顶部"接一行"适配自己的任务。
2.2 冻结策略(关键工程)
低数据下最忌"全参微调"——它会把预训练学到的好特征冲掉。按数据量由少到多,逐步解冻:
| 数据量 | 建议策略 | 可训练参数 | 目的 |
|---|---|---|---|
| 极少(每类不到 20) | 只训分类头,冻结全部 backbone | ~0.1% | 防灾难性遗忘 |
| 较少(每类几十) | 冻结底层 + LoRA/Adapter 调上层 | 0.5%~2% | 轻量适配 |
| 中等(每类几百) | 底层小学习率 + 全量微调 | 100% | 充分适配 |
直觉:数据越少,越要相信预训练、越要管住学习率。学习率通常比从头训小 5~10 倍。
3. 武器二:数据增强(让小数据"变多")
增强的本质是在标签不变的前提下,制造输入空间的合理扰动,逼模型学"不变性"。
| 方法 | 适用 | 原理 | 注意 |
|---|---|---|---|
| EDA(同义替换/删词) | 文本 | 轻扰文本不改义 | 别改关键词 |
| 回译(中→英→中) | 文本 | paraphrase 式增广 | 可能引入语义漂移 |
| 几何/颜色变换 | 图像 | 翻转/旋转/调色 | 需符合物理(别把"9"翻成"6") |
| Mixup / CutMix | 图像/向量 | 两张图线性混合,标签按比平滑 | 软化标签防过自信 |
| LLM 生成合成数据 | 文本/多模态 | 用大模型造"难例"补覆盖 | 防模型崩塌(见第 7 节) |
Mixup 的核心公式(标签也按比例混合):
x̃ = λ·x_i + (1-λ)·x_j
ỹ = λ·y_i + (1-λ)·y_j λ ~ Beta(α, α)
一个轻量文本增强示例(EDA 风格,不依赖大模型):
import random
def eda_augment(text, n=4, p=0.1):
words = text.split()
out = []
for _ in range(n):
w = words.copy()
# 随机删词 / 同位置复制,制造轻微扰动
w = [x for x in w if random.random() > p] or w
out.append(" ".join(w))
return out # 返回 n 条增强样本,标签不变
samples = eda_augment("患者持续低热三天伴咳嗽")
print(samples)
4. 武器三:小样本学习(FSL)三范式
小样本学习的经典设定是 N-way K-shot:给每类 K 个样本(K 常=1 或 5),模型要认出新的 N 类。FSL 综述(arXiv:2402.03017, 2025)把方法归为三大类:
4.1 度量学习:Prototypical Networks(最直观)
原理:为每类算一个"原型向量" c_k = 该类支撑集样本在特征空间的平均;新样本被分到离自己原型最近的类(用欧氏距离)。
c_k = (1/|S_k|) · Σ_(x∈S_k) f_θ(x) # 类原型
p(y=k | x) = softmax( -‖ f_θ(x) - c_k ‖² ) # 距离→概率
直觉:小样本下没法学"决策边界",那就学"每个类的中心长什么样",新样本往最近的中心靠。无需逐类训练,天然支持新类。
4.2 优化学习:MAML(元学习的代表)
MAML(Model-Agnostic Meta-Learning, Finn et al. 2017, arXiv:1703.03400)的野心是:学一组"好初始化参数",让模型遇新任务只做一步梯度更新就能学好。它用"双层循环"实现。
- 内层(inner loop):模拟"遇到新任务时快速适配";
- 外层(outer loop):让"初始点"对一堆任务都好适配——即在参数空间找一个"对所有任务都敏感、一调就灵"的位置。
- Reptile(arXiv:1803.02999)是 MAML 的简化版:不做二阶梯度,直接"多步 SGD 后,把初始参数拉向任务末参数",更高效。
一个简化版 MAML 训练循环(PyTorch 风格伪代码):
import torch
def maml_step(model, tasks, inner_lr=1e-2, outer_lr=1e-3):
meta_loss = 0.0
for task in tasks: # 一批任务
# —— 内层:用 support set 快速适配 ——
theta = {k: v.clone() for k, v in model.named_parameters()}
for x_s, y_s in task.support:
loss = model(x_s, y_s, theta)
grads = torch.autograd.grad(loss, theta.values(), create_graph=True)
theta = {k: theta[k] - inner_lr * g for k, g in zip(theta, grads)}
# —— 外层:在 query set 上评估,对'初始参数'回传 ——
x_q, y_q = task.query
meta_loss += model(x_q, y_q, theta)
# 用元损失更新真正的初始参数
outer_opt.zero_grad(); meta_loss.backward(); outer_opt.step()
注意:真实 MAML 需二阶梯度(
create_graph=True),显存与算力都不便宜;Reptile 用一阶近似更省。低数据场景下,MAML 类方法适合"有很多相似小任务"的情况(如多类罕见病逐一适配)。
5. 武器四(LLM 专属):上下文学习(In-Context Learning)
对大语言模型,小样本可以"免训练"——这就是 In-Context Learning(ICL):在提示里放几个示例(demo),模型照着做,不更新任何权重。2025 的 FSL 综述已把 ICL 列为"新兴小样本范式"。
- 优点:零标注成本、秒级适配、不改模型;
- 缺点:示例质量极度敏感(顺序、措辞都影响结果),且受上下文长度限制;
- 进阶:Active-Prompt(arXiv:2302.12246)用模型自身不确定性挑"最该写进提示的示例",正是把主动学习思想用到了 ICL。
6. 武器五:主动学习(Active Learning,精准补标)
主动学习回答的是:“标注预算有限时,先标哪几条最值钱?” 它从"未标注池"里挑信息量最大的样本给人标,用最少标注换最大提升。
两类经典指标:
- 不确定性(Uncertainty):Least Confidence、Max-Entropy、BALD;
- 多样性(Diversity):CoreSet、聚类中心,避免重复标同类。
一个基于预测熵的不确定性采样片段:
import torch, torch.nn.functional as F
def select_most_uncertain(model, unlabeled_loader, k=10):
scored = []
with torch.no_grad():
for x, idx in unlabeled_loader:
p = F.softmax(model(x), dim=-1)
entropy = -(p * p.log()).sum(1) # 熵越大越不确定
scored.extend(zip(idx.tolist(), entropy.tolist()))
scored.sort(key=lambda t: t[1], reverse=True) # 取最不确定的 k 条
return [i for i, _ in scored[:k]]
2025 前沿:LLM-based Active Learning 综述(arXiv:2502.11767, ACL 2025)指出范式正从"Selection(从池里选)“转向"Generation(让 LLM 生成新难例)+ Annotation(让 LLM 当标注员)”,标注成本可比人工低 40 倍,并提出"模型崩塌"风险(学生学老师的幻觉)——需混合人工校验。
7. 模拟案例:罕见病 X 光分类,每类仅 20 张
7.1 场景
- 任务:5 类罕见肺部病变二分类/多分类,每类仅 20 张标注 X 光(共 100 张),另有 5000 张未标注。
- 目标:训出 AUC ≥ 0.85 的可用模型,标注预算只够再标 100 张。
- 硬件:单张 16G 显卡。
7.2 方案对比(同样 100 张标注,不同武器)
| 方案 | 做法 | 预期 AUC | 说明 |
|---|---|---|---|
| 从头训练 CNN | 100 张直接训 | ~0.62 | 严重过拟合,baseline |
| 迁移+微调(冻结 backbone) | ImageNet 预训练 + 只训头 | ~0.83 | 借力先验,最稳 |
| 迁移+Mixup 增强 | 上者 + 图像增广 | ~0.86 | 数据变多,泛化更好 |
| + 主动学习补标 100 张 | 挑最不确定样本再标 | ~0.89 | 预算花在刀刃上 |
| 元学习 MAML | 多任务 episodic 训练 | ~0.84 | 需多任务支撑,本场景收益有限 |
| LLM 生成合成文本报告辅助 | 多模态对齐 | ~0.87 | 需防合成偏差 |
7.3 端到端流程
7.4 模拟结果(标注:以下为方法预期区间示意,非真实跑分)
| 阶段 | 标注量 | 增强 | AUC | 备注 |
|---|---|---|---|---|
| 初始微调 | 100 | 无 | 0.83 | 已可用 |
| + 主动补标 | 200 | 无 | 0.87 | +0.04 |
| + Mixup | 200 | 有 | 0.89 | 再 +0.02,达标 |
读图要点:主动学习把"白送的 100 张标注"用在模型最弱处,比随机补标多换约 2~3 个点;增广进一步平滑决策边界。真实数字请用你自己的验证集实测,并务必保留独立测试集防数据泄漏。
8. 2025 前沿论文速览(速查表)
| 论文 | arXiv / 出处 | 类别 | 一句话价值 |
|---|---|---|---|
| Matching Networks | 1606.04080 (2016) | FSL 度量 | 注意力记忆,小样本开山 |
| Prototypical Networks | 1703.05175 (2017) | FSL 度量 | 类原型,最直观 |
| MAML | 1703.03400 (2017) | 元学习 | 学"好初始化",一调就灵 |
| Reptile | 1803.02999 (2018) | 元学习 | MAML 一阶近似,更高效 |
| FSL 综合综述 | 2205.06743 (2022) | 综述 | 200+ 论文,概念辨析 |
| FSL 当代综述 | 2402.03017 (2025) | 综述 | 含 ICL、神经过程等新范式 |
| Active-Prompt | 2302.12246 (2023) | 主动学习+ICL | 用不确定性挑 few-shot 示例 |
| LLM-based Active Learning | 2502.11767 (ACL 2025) | 主动学习 | Selection→Generation 范式转变 |
| Low-Resource Data 分析综述 | Cao et al. 2025 | 综述 | PAC 理论 + 几何/元学习/LLM 统一框架 |
9. 选型决策树:我该用哪招
最简决策:
- 单任务、有预训练模型 → 冻结 backbone 微调 + 增广(最稳、最省);
- 有很多相似小任务、要快速适配新类 → 元学习(MAML/ProtoNet);
- 是 LLM、不想训练 → 上下文学习 + Active-Prompt 挑示例;
- 标注预算紧 → 主动学习,把每一分标注花在模型最弱处。
10. 总结与资源
低数据训练不是"将就",而是一门让每一条样本都发挥最大价值的工程学:
- 迁移 给你一个高起点,低数据时千万别从头训;
- 增强 把有限样本在标签不变下"复制"出多样性;
- 元学习 让模型"学会学习",遇新任务一步到位;
- 主动学习 把稀缺标注预算精准投到信息量最大的样本;
- LLM 上下文学习 则把"小样本"做到零训练成本。
上手三步走:① 拿预训练权重冻结 backbone 跑通 baseline;② 加 Mixup/回译增广 + 早停正则;③ 用主动学习从未标注池挑最难的样本补标一轮。多数团队卡在"没预训练就硬训",而本文任意一条武器都能先把 baseline 拉起来。
常用资源:
torchvision.models/transformers:现成预训练权重- Prototypical Networks / MAML:各框架 few-shot 库(如 learn2learn)
- Active Learning:modAL(Python 主动学习库)
- 综述配套:FSL 综述 arXiv:2402.03017、LLM-AL 综述 arXiv:2502.11767
注:本文实验结果为方法预期区间的示意模拟,真实收益取决于数据质量、底座模型与超参;上线前请用独立测试集实测,并警惕 LLM 合成数据的"模型崩塌"。
*如果这篇对你有用,欢迎收藏 + 关注,后续会写「主动学习实战:用 100 次标注把模型从 0.7 拉到 0.9」与「MAML 二阶梯度显存优化 5 招」。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)