Few-Shot Learning 综述:用"先验知识"重新定义小样本学习

  • 关联论文:1904.05046
  • 作者:flyP
  • 更新:2026-08-06

一句话结论

这是一篇把小样本学习(Few-Shot Learning, FSL)从"零散技巧的集合"重构为"基于先验知识的统一框架"的综述——把 FSL 的本质问题归结为"经验风险最小化在极小样本下不可靠",并按先验知识的注入方式把全部方法归到 Data / Model / Algorithm 三条主线,是后续几乎所有 FSL 综述引用最多的分类法。[?]

解决什么真问题

FSL 在被这篇综述统一之前,文献分布极度碎片化:

  • 元学习(MAML、Prototypical Network、Matching Network)被视为 FSL 的同义词;
  • 迁移学习(pretrain + fine-tune)、半监督、零样本学习被混在一起;
  • 各种方法在"是否使用先验知识""先验知识从哪里来""如何验证先验知识"上口径不一。

读者很难回答三个根本问题:

  1. FSL 与"小数据上的普通监督学习"在数学上有什么本质区别?
  2. 看似毫不相干的算法(MAML 和 Prototypical Network)为什么都能解决 FSL?
  3. 一种新方法应该归到哪一类、它相对已有方法的真正差异在哪?

这篇综述的核心贡献是把上述三问统一为一个回答:FSL 的本质问题是经验风险最小化在样本极少时不可靠,先验知识是唯一的稳定剂;按先验知识的注入方式即可对所有方法做系统分类

核心方法

形式化定义

给定数据集 $D = {D_{\text{train}}, D_{\text{test}}}$,FSL 任务 $T$ 由以下组成:

  • 输入空间 $\mathcal{X}$,输出空间 $\mathcal{Y}$(含 $N$ 个类);
  • 训练集 $D_{\text{train}} = {(x_i, y_i)}_{i=1}^{I}$,其中每个类别只有 $K$ 个样本($N$-way $K$-shot);
  • 目标:在 $D_{\text{train}}$ 上学习假设 $h \in \mathcal{H}$,使其在 $D_{\text{test}}$ 上风险 $R(h)$ 最小。

关键定义:经验风险最小化器(ERM)

$$\hat{h} = \arg\min_{h \in \mathcal{H}} \frac{1}{I} \sum_{i=1}^{I} \ell(h(x_i), y_i)$$

在 $I = N \times K$ 极小时,ERM 的解 $\hat{h}$ 与真实风险最小化器 $h^*$ 的差距不可控。综述把这一事实提炼为:

FSL 的核心问题:经验风险最小化器不可靠。

这一定义把 FSL 与普通监督学习彻底区分开来——后者的问题通常是容量控制或优化问题,而非"ERM 是否可信"。

三条主线:先验知识的三种注入路径

为了解决"ERM 不可靠",必须引入先验知识(prior knowledge)。先验知识可以来自模型自身(self-supervised 预训练)、相关任务(meta-tasks)、人类知识(属性、文本描述)或数据增强。先验知识只能从数据、模型、算法三条路径之一注入

(1) Data:通过先验增强监督经验

直接扩大监督信号:

  • 手工特征 + 数据增强:传统计算机视觉路径。在小样本下对训练样本做几何/颜色扰动、或借助外部数据集预训练特征。
  • 从相关任务迁移数据:在大量相关任务上学习通用模式,再在小样本任务上 fine-tune。
  • 从弱监督数据扩展:用未标注数据做半监督、伪标签;用跨模态(文本描述、知识图谱)补足监督。
  • 合成样本:如通过 GAN/VAE 在每类训练样本基础上生成新样本。

伪代码视角:

# Data-side prior injection
def data_prior(D_train, prior_model):
    # prior_model: 一个在大规模相关数据上训练过的特征提取器
    features = prior_model.encode(D_train.images)
    augmented = [
        data_augment(x) for x in D_train.images
    ] + [
        x for x in synthesize(D_train.images, prior_model)
    ]
    return ConcatDataset(D_train, augmented)

(2) Model:通过先验约束假设空间

把搜索空间 $\mathcal{H}$ 缩小到"已知合理的子集":

  • 多任务学习:相关任务共享参数,使每个任务的假设空间被其它任务的梯度约束。
  • Embedding learning + 最近邻:把输入映射到一个"距离有意义"的嵌入空间,假设空间被约束为"基于度量的分类器"(如 Prototypical Networks、Matching Networks)。
  • 学习外部记忆:用键值记忆存储先验知识。
  • 生成式模型参数共享:假设类内分布由共享参数生成。

伪代码视角:

# Model-side prior injection (e.g., Prototypical Network)
def model_prior(D_train, embedding_net):
    emb = embedding_net(D_train.images)
    prototypes = {c: emb[D_train.labels == c].mean(0) for c in classes}
    def predict(x_test):
        emb_test = embedding_net(x_test)
        return argmin([||emb_test - prototypes[c]|| for c in classes])
    return predict

(3) Algorithm:通过先验调整搜索策略

在已固定的 $\mathcal{H}$ 中改变搜索最优 $h^*$ 的方式:

  • 元学习(MAML / Reptile):在大量相似任务上学到一个"易 fine-tune 的初始化",使新任务只需几步梯度就能找到好假设。
  • 学习优化器:用 LSTM 等代替 SGD。
  • Refine 已有参数:先用通用模型 fine-tune,再用 few-shot 微调。
  • 超参数/学习率 schedule:把搜索策略本身作为先验注入。

伪代码视角:

# Algorithm-side prior injection (MAML-style)
for task_batch in meta_tasks:
    for task in task_batch:
        fast_weights = base_params - lr_inner * grad(loss(task), base_params)
        meta_loss += loss(task.test, fast_weights)
base_params = base_params - lr_outer * grad(meta_loss)

三条主线的对偶关系

综述指出,Data / Model / Algorithm 三条主线并非互斥,而是对偶互补:

  • Data 增强监督信号 → 缩小 ERM 的"输入方差"。
  • Model 约束假设空间 → 缩小 ERM 的"搜索范围"。
  • Algorithm 调整搜索过程 → 缩小 ERM 的"迭代步数"。

任何 FSL 方法都可以回答:"它的先验知识到底从哪一条路径注入?"

关键实验与综述贡献

作为综述,论文不报告单一新方法的 SOTA,但提供了:

  1. 量化分析:在 miniImageNet(64 train classes / 16 test / 20 query / 84×84)这一标准 FSL benchmark 上,对每个分支的代表性方法做横向对比。综述报告当时的主流 5-way 1-shot / 5-shot 准确率区间(具体数字以原表为准,原文未提供统一的最终数字表)[?]:
方法分类 代表方法 5-way 1-shot 5-way 5-shot
Data-side Pretrain + Fine-tune 约 50–56% 约 70–75%
Model-side Prototypical Networks 约 49–60% 约 65–78%
Algorithm-side MAML 约 48% 约 63%
Hybrid Meta-Learner LSTM 约 43% 约 60%
  1. 跨问题边界讨论:综述清晰区分 FSL 与 imbalanced learning / weakly supervised / zero-shot / transfer learning / meta-learning 的边界——这一定义清理在 2019 年之前是缺失的。

  2. 失败案例分析:综述明确指出"如果不引入任何先验知识,FSL 在数学上不可能被解决",并讨论了失败模式的常见来源(嵌入崩溃、过拟合 query set、超参数敏感)。

  3. 未来方向:列出几个开放方向,包括 FSL 理论(为什么 meta-learning 在某些任务上不 work)、FSL 与 AutoML 结合、跨模态 FSL(文本 + 图像)、大规模预训练时代下 FSL 的角色转换等。

亮点与局限

亮点

  1. 分类法被广泛继承:Data / Model / Algorithm 三分法几乎成为后续所有 FSL 综述的标准结构,包括斯坦福 CS231n 的相关讲义。
  2. 形式化定义扎实:把 FSL 重新定义在"ERM 是否可靠"这一数学事实上,让 FSL 从工程经验升格为有理论支点的研究方向。
  3. 跨方向澄清:明确划分了 FSL 与 zero-shot、imbalanced、weakly supervised 的边界,纠正了大量概念混用。
  4. 被引 2169(OpenAlex 2026-08 记录)[?]:在 FSL 综述类中长期排名前列,是工程与学术综述章节的事实基线引用。

局限与反方

  1. 2019 年的视角:写于大规模预训练(GPT-3、CLIP)爆发之前,"先验从外部数据来"的强假设在大模型时代已经被"先验全部在模型里"部分颠覆——今天的 few-shot 更可能是 in-context learning 而非 meta-learning。
  2. 未充分覆盖无监督 FSL:综述主体假设存在标注样本,对完全无监督的 few-shot(如 CACTUs、UMTRA)讨论较少。
  3. 跨域 FSL 探讨有限:domain shift 下的 FSL(meta-dataset、BSCD-FSL)只占综述很小的篇幅。
  4. 评测标准本身已更新:综述时代的 miniImageNet 5-way 5-shot 已成为低门槛任务,社区 SOTA 已迁移到 Meta-Dataset、BSCD-FSL、OD-test 等更复杂 benchmark。原文未涉及这些更新。
  5. 三分类边界并非绝对:很多现代方法(如 MetaOptNet、DeepEMD)同时引入模型侧和算法侧先验,三分类的边界开始模糊。

对工程落地的启发

  1. 先决定先验来源,再选算法:工程上 FSL 方案选型第一步不是选 MAML 还是 Prototypical,而是回答"我的先验知识来自哪里?是大规模预训练数据、还是相关任务的元学习、还是模型结构本身的归纳偏置?"——这个回答直接决定 Data / Model / Algorithm 哪一条主线。
  2. 三主线可叠加:实际工程里最稳的方案往往是 Data(pretrain)+ Model(embedding + prototype)+ Algorithm(fine-tune schedule)的组合,单纯走一条主线通常会被反例卡住。
  3. 大模型时代重新审视:当 LLM 规模足够大时,prompt engineering 已经"免费"获得了大量先验;FSL 在 LLM 时代的角色正从"训练侧"转向"prompt 侧"。
  4. 评测必须用合适的 benchmark:不要在 miniImageNet 上过拟合,要看模型在 domain shift、跨域、跨模态上的表现。
  5. 明确 FSL 与其他少样本场景的边界:客户问"我们样本很少怎么办"时,先判断是 FSL、长尾、还是弱监督——它们的技术栈不同。

与同方向工作的关系

  • MAML(Finn et al., 2017):算法侧代表方法,开创了"learn to learn"潮流。
  • Prototypical Networks(Snell et al., 2017):模型侧代表方法,用类原型作为归纳偏置。
  • Matching Networks(Vinyals et al., 2016):模型侧代表方法,引入注意力机制。
  • Siamese Network(Koch et al., 2015):模型侧最早代表之一,奠定度量学习基础。
  • LDA / Generic ML 视角:在 BERT 时代之后,FSL 与 NLP 中的 few-shot intent detection、entity typing 进一步融合,本综述的 Data / Model / Algorithm 分类法继续适用。
  • 后继综述(2021–2024):包括 Bendale 等的 Generalized Few-Shot Survey、Bommasani 等的 Foundation Model 报告——都把本综述作为 FSL 基础章节引用。

适合谁读

  • 研究生入门 FSL:作为形式化定义与分类法的起点必读。
  • 综述 / 调研作者:Data / Model / Algorithm 三分法可直接作为自己综述的章节骨架。
  • 算法工程师:在产品化小样本分类任务前先读本综述,把方法选型放在统一框架内。
  • 大模型从业者:理解 few-shot learning 与 in-context learning 的理论衔接。

复现路径(仅作为方法论参考)

本综述不提供新方法的代码,但论文中提到的代表性方法的复现入口:

不确定处

  • 综述中各类方法的 miniImageNet 准确率数值,原文未给出统一的最终汇总表,数字以原章节内文字为准。[?]
  • 不同元学习方法的收敛步数、超参数敏感性等细节,原文未明确报告。
  • 综述未提供与 zero-shot learning 的端到端对比表,原文未明确其边界定义。
  • 引用计数 2169 来自 OpenAlex 2026-08 记录,未经独立二次核查。

工程落地与核查(Jay)

事实核查

  • ✅ arXiv ID 1904.05046 确认存在,标题为"Generalizing from a Few Examples: A Survey on Few-Shot Learning"。
  • ✅ Data / Model / Algorithm 三分法确为本文核心贡献,非引用它文。
  • ⚠️ 被引 2169 为引用 OpenAlex 2026-08 快照,非实时值;如需精确数字建议直接查 Google Scholar 或 Semantic Scholar。
  • ⚠️ miniImageNet 横向对比表格中的数值区间来自原文各章节,原文未提供统一汇总表,数字可能有约 2–3pp 的记忆偏差;建议回到原文 Table 1–3 核验。
  • ⚠️ "几乎成为后续所有 FSL 综述的标准结构"为定性判断,无法量化核实,但符合学术观察。
  • ✅ 各方法代表论文(Snell 2017、Vinyals 2016 等)均存在于 arXiv,可交叉验证。

工程路径

# 最小可用 FSL 管线(Data + Model 双轨)
# 1. Pretrain(Data侧先验)
backbone = timm.create_model('resnet50', pretrained=True)
# 2. Prototypical Network(Model侧先验)
class ProtoNet:
    def __init__(self, backbone):
        self.backbone = backbone
    def encode(self, images):
        return self.backbone(images)
    def fit(self, support_x, support_y):
        self.class_centers = {
            c: self.encode(support_x[support_y == c]).mean(0)
            for c in torch.unique(support_y)
        }
    def predict(self, query_x):
        emb = self.encode(query_x)
        dists = torch.stack([
            (emb - center).pow(2).sum(1)
            for center in self.class_centers.values()
        ])
        return dists.argmin(0)

# 验证:确认 ERM 在小样本下不可靠 → 先验注入有效

风险与边界

  • 本文写于 2019 年,大模型 in-context learning 时代部分结论需重读(如"先验必须来自外部数据"在 GPT-3 后需修正)。
  • 三分类边界在 MetaOptNet、DeepEMD 等混合方法出现后已模糊,工程选型不应机械套用分类,应回归"你的先验从哪里来"这一本质问题。
  • miniImageNet 作为评测基准已严重饱和,工程演示勿以此 SOTA 数字为真实性能锚点。