小样本学习与元学习实战:低数据也能训好模型

关键词:小样本学习(FSL)、元学习(Meta-Learning)、迁移学习、数据增强、主动学习、上下文学习
适用读者:手头只有几百甚至几十条第高质量标注、却要训出可用模型的数据科学家、算法工程师与研究者。


0. 写在前面:低数据的三宗罪

大模型时代有个残酷反差:数据越多越好用,但真实业务里数据往往极少且极贵

  • 医疗罕见病:每类只有几十张影像,且一张标注要副主任医师花 20 分钟;
  • 工业缺陷:不良品占比千分之一,想凑齐"裂纹/划痕/污染"各几百张几乎不可能;
  • 小语种 NLP:能请到的母语标注者凤毛麟角。

直接用这些"小数据"从头训练,必然踩中三宗罪

症状 表现 根因
过拟合 训练集 100%、验证集 60% 模型容量 ≫ 数据量,记住了噪声
高方差 换一批样本,指标剧烈波动 估计不稳定,统计意义不足
泛化差 新场景/新分布直接崩 没见过足够多样的边界情况

本文的宗旨:不靠堆数据,而靠"借力先验 + 聪明用样本 + 约束容量"把小数据用透。所有方法配原理图、可跑代码与一个完整模拟案例,论文均来自 arXiv(含 2025 最新综述)。


1. 全景图:低数据训练的四条武器

样本太少直接训会过拟合

高质量小数据集

怎么用透小数据?

借力先验 迁移学习、预训练微调

把数据变多 数据增强、合成

学会快速适配 小样本学习、元学习

挑最值钱的标 主动学习

落地 冻结 backbone 与 微调头部

可用模型

一句话记忆:迁移解决"起点",增强解决"数量",元学习解决"适配速度",主动学习解决"标注预算"


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)把方法归为三大类:

小样本学习 FSL

度量学习 Metric-based
学相似度

优化学习 Optimization-based
学怎么初始化

模型学习 Model-based
学记忆机制

Prototypical Networks
类原型 = 支撑集均值

Matching Networks
注意力读记忆

MAML 与 Reptile
内层适配加外层元更新

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)的野心是:学一组"好初始化参数",让模型遇新任务只做一步梯度更新就能学好。它用"双层循环"实现。

循环

随机初始化 θ

从任务分布采样一批任务 T_i

内层 每个 T_i 用 support set 做几步更新
θ_i = θ - α·∇L_supportθ

外层 在 query set 评估 L_queryθ_i
对初始 θ 求梯度并更新 θ

  • 内层(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 列为"新兴小样本范式"。

提示里放 K 个示例
输入→输出

拼接新输入

冻结的大模型

直接给出预测
无需训练

  • 优点:零标注成本、秒级适配、不改模型;
  • 缺点:示例质量极度敏感(顺序、措辞都影响结果),且受上下文长度限制;
  • 进阶:Active-Prompt(arXiv:2302.12246)用模型自身不确定性挑"最该写进提示的示例",正是把主动学习思想用到了 ICL。

6. 武器五:主动学习(Active Learning,精准补标)

主动学习回答的是:“标注预算有限时,先标哪几条最值钱?” 它从"未标注池"里挑信息量最大的样本给人标,用最少标注换最大提升。

不确定性高

多样性好

循环

未标注池

查询策略

挑模型最拿不准的

挑覆盖边界、簇的

人工、LLM 标注

加入训练集 retrain

两类经典指标:

  • 不确定性(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 端到端流程

ImageNet 预训练 backbone

冻结 backbone, 仅训分类头
用 100 张标注

主动学习 在未标注池挑 100 张最不确定

人工标注这 100 张

合并 200 张 与 Mixup 增广 retrain

最终模型 AUC≈0.89

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. 选型决策树:我该用哪招

极多 ≥1000

几十~几百

极少 不到20

否单任务

每类有多少标注?

常规监督与数据增强

是否多任务或要快速适配新类?

迁移预训练 与 冻结 与 强增广

元学习 MAML与ProtoNet
或 LLM 上下文学习

预训练微调与主动学习补标注

主动学习挑高价值样本
加 LLM 合成难例

上线

最简决策

  • 单任务、有预训练模型 → 冻结 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 招」。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐