☰
每个类只给 1 张图,还能学会分类?李宏毅深度学习作业带你跑通 Few-Shot 小样本学习
2026/10/12 16:06:02 网站建设 项目流程

每个类只给 1 张图,还能学会分类?李宏毅深度学习作业带你跑通 Few-Shot 小样本学习

【免费下载链接】leedl-tutorial《李宏毅深度学习教程》(李宏毅老师推荐👍,苹果书🍎),PDF下载地址:https://github.com/datawhalechina/leedl-tutorial/releases项目地址: https://gitcode.com/GitHub_Trending/le/leedl-tutorial

这篇内容基于开源仓库leedl-tutorial(《李宏毅深度学习教程》)的作业 15,用 PyTorch 带你跑通小样本学习(Few-Shot Learning):在 Omniglot 手写符号集上完成5-way 1-shot分类,把迁移学习基线和 MAML 元学习放一起对比,看清元学习到底"快"在哪、超参数从哪调。

🧩 先把任务说清:5-way 1-shot 在 Omniglot 上到底学什么

"5-way 1-shot"拆开看:5 个类别(way),每个类只给 1 张样本(1-shot)。模型要在几乎没见过的字符上,靠这 5 张图就把 5 个类分对。Omniglot 是 28×28 的灰度手写字符图,类数非常多、每类样本又少,天然是小样本场景。

作业把每个训练样本切成两段,理解它后面所有代码都顺了:

  • support set(支持集):那n_way × k_shot张"见过的图",用来现学这个任务
  • query set(查询集):n_way × q_query张"没见过的图",用来检验学得怎么样

作业 15 的默认配置可以直接照抄,这也是你调参的起点:

参数默认值含义
n_way5每次任务随机抽 5 个字符类
k_shot1每类只给 1 张 support 图
q_query1每类 1 张 query 图做评估
inner_lr0.4内循环(任务内微调)学习率
meta_lr0.001外循环(元优化)学习率
meta_batch_size32每个 meta-step 跑多少个任务
max_epoch30外循环总轮数
内循环步数训练 1 / 验证 3inner_train_step

代码入口:Homework/HW15_MetaLearning/HW15-MetaLearning.ipynb

🎯 先跑一个"能跑的":迁移学习基线 BaseSolver

元学习好调的前提,是手里得有一个对照。作业里BaseSolver就是这个基线,思路很朴素:

  1. 从训练集里抽 5 个任务,逐个当普通分类器训练
  2. 推理时,先在 support 上微调inner_train_step步
  3. 再到 query 上打分

它和元学习求解器输入输出格式完全一致,所以你拿到同一套指标可以直接比大小——这就是"凭什么说元学习更好"的证据来源。跑通它之后,你才看得懂后面 MAML 多出来的那部分到底在干什么。

🔁 换成 MAML:元学习的内外循环从哪调起

MAML(Model-Agnostic Meta-Learning)的核心是双层优化,翻译成大白话:

  • 外循环:优化一组"好的初始参数",让模型天生就好调
  • 内循环:换一个新任务,用 support 集微调几步(fast_weights),再在 query 上看效果

作业用了一个关键技巧——functional_forward(x, params):给定任意一组参数就前向一次,这样"原始参数"和"微调后的 fast_weights"能并存,梯度可以穿过内循环回到外循环。

调内循环时,重点盯这三个量:

  • inner_lr:0.4 在 28×28 小图上是经验值,调太大内循环容易发散
  • inner_train_step:训练时 1 步(配合一阶 MAML/FO-MAML 更快),验证时给 3 步让模型充分适应
  • meta_batch_size:一个 meta-step 里覆盖多少个任务,任务越多外循环梯度越稳

ProtoNet 和 MAML 怎么选

  • 想要实现简单、推理快:ProtoNet 这类基于原型距离的方法更省事,把每个类样本聚成一个"原型点",谁离谁近就归谁
  • 想要任务内充分自适应、泛化更强:MAML 的内循环能针对当前任务现调参数,上限更高,但训练更吃显存和调参耐心

建议先跑 MAML 的一阶版(FO-MAML,内循环只取一阶导)把流程跑顺,再考虑原始 MAML 的二阶导。

📊 Omniglot 上如何验证小样本学习效果

指标别只看训练集。小样本学习最关心在没见过的字符类上能不能分对,所以以 query 集准确率为准。按作业里的流程跑下来,训练精度能从约 26.7% 一路爬到 84.8%,验证集稳定在 78% 上下:

指标数值说明
训练精度26.7% → 84.8%外循环推进后持续上升
验证准确率≈ 78%以 query 集计算,泛化参考
对照基线迁移学习 BaseSolver同格式对比,看元学习增益

提示:迁移学习作业里也有一套训练/测试曲线,可以对照着看"领域适应"和"元学习"在收敛形态上的差别。 参考:Homework/HW11_Adaptation/HW11-Adaptation.ipynb

🧭 从单点作业到成体系:李宏毅 深度学习 作业路径

小样本不是孤立的一课,它是"数据不够时"这一整条线的收尾。把相邻作业串起来,你会有一条完整路线:

迁移学习作业从哪跑

先搞懂"源域特征怎么迁到目标域"。HW11 把特征提取器、分类器和领域对抗训练讲透了,是理解"迁移"二字的地基。

终身学习作业怎么接

模型要不断学新类,小样本就是"新类只有几张图"的极端情形。HW14 的持续学习方法分类,正好补上"知识怎么不丢"这块。

终身学习入口:Homework/HW14_LifeLongML/HW14-LifeLongMachineLearning.ipynb

元学习作业入口

想要本地跑完整流程,把仓库拉到手里即可(只读参考,请勿改动仓库内容):

git clone https://gitcode.com/GitHub_Trending/le/leedl-tutorial

然后按 HW11 → HW14 → HW15 的顺序走:先建立"迁移"的直觉,再看"持续学习"的框架,最后落在 HW15 用 MAML 把 5-way 1-shot 真正跑通、用 query 集指标验收。

✅ 收尾:你的小样本学习该按什么节奏走

  • 先复现BaseSolver基线,拿到可对比的数字
  • 再上 FO-MAML,盯inner_lr/inner_train_step/meta_batch_size三个量
  • 用 query 集验证,别被训练精度迷惑
  • 需要"省实现"就退一步用 ProtoNet,需要"强自适应"就压 MAML

把这条路走一遍,你对 Few-Shot Learning 的理解,就不只是背概念,而是手里有一套能在 Omniglot 上跑出结果、也敢换数据集复用的流程了。

【免费下载链接】leedl-tutorial《李宏毅深度学习教程》(李宏毅老师推荐👍,苹果书🍎),PDF下载地址:https://github.com/datawhalechina/leedl-tutorial/releases项目地址: https://gitcode.com/GitHub_Trending/le/leedl-tutorial

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询