每个类只给 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_way | 5 | 每次任务随机抽 5 个字符类 |
k_shot | 1 | 每类只给 1 张 support 图 |
q_query | 1 | 每类 1 张 query 图做评估 |
inner_lr | 0.4 | 内循环(任务内微调)学习率 |
meta_lr | 0.001 | 外循环(元优化)学习率 |
meta_batch_size | 32 | 每个 meta-step 跑多少个任务 |
max_epoch | 30 | 外循环总轮数 |
| 内循环步数 | 训练 1 / 验证 3 | inner_train_step |
代码入口:Homework/HW15_MetaLearning/HW15-MetaLearning.ipynb
🎯 先跑一个"能跑的":迁移学习基线 BaseSolver
元学习好调的前提,是手里得有一个对照。作业里BaseSolver就是这个基线,思路很朴素:
- 从训练集里抽 5 个任务,逐个当普通分类器训练
- 推理时,先在 support 上微调
inner_train_step步 - 再到 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),仅供参考