Meta Learning
元学习在许多任务上训练模型,使模型只需少量示例就能适应新任务。了解任务周期、MAML 和原型网络的工作原理。
元学习常被称为“学会学习”,是一种机器学习 (ML)方法:通过在许多相关任务上训练模型,使其能够从少量标注样本中快速适应新任务。监督学习是在单个数据集上拟合模型,而元学习优化的是学习过程本身:初始权重、用于比较样本的嵌入空间,或能在一次前向传播中从样本中学习的网络。元学习的主要应用是少样本学习,即每个新类别只用一到几个样本进行识别;此外,它还用于必须实时适应新条件的机器人和其他智能体。
元学习的工作原理#
元学习通过一系列模拟模型测试时所处情境的任务回合进行训练。每个回合都会抽取一个任务,例如一个 5-way 1-shot 分类问题:从五个类别中各取一张带标签的图像。带标签的样本组成支持集,同类别中留出的样本组成查询集。在内循环中,模型根据支持集进行适应;在外循环中,则根据适应后的模型在查询集上的表现更新元参数,这样模型得到的奖励是适应得好,而不是记住某个特定任务。用于元测试的类别不会出现在元训练中。
主要方法#
- 基于优化的方法:模型无关元学习 (MAML)会学习一个初始化参数,使模型只需针对新任务的支持集执行一到几步梯度下降,就能取得良好表现。外循环需要对内循环更新过程求导,因此需要二阶梯度;OpenAI 的 Reptile等一阶变体则通过将初始化参数朝每个任务适应后的权重方向移动,避免了这项开销。
- 基于度量的方法:这类方法会学习一个嵌入空间,使样本能够按距离分类。原型网络会将每个类别的支持集嵌入取平均,形成一个原型,并将每个查询样本分配给最近的原型。因此,测试时新增类别无需任何训练。
- 基于模型的方法:带外部记忆的循环神经网络 (RNN)等网络会读取支持集并直接预测查询样本的标签,在激活值中学习适应过程。GPT-3 论文将大型语言模型 (LLM)中的上下文学习——根据提示中的示例解决任务——描述为这类元学习的内循环,而预训练则是外循环。
MAML 自身的回归基准测试要求小型网络根据每条正弦波的 10 个点,拟合振幅和相位随机的正弦波。下面的 PyTorch示例通过内外循环对初始化参数进行元训练,然后测试模型能否通过一步适应拟合新的正弦波:
import torch
import torch.nn.functional as F
from torch import nn
from torch.func import functional_call
torch.manual_seed(0)
net = nn.Sequential(nn.Linear(1, 40), nn.ReLU(), nn.Linear(40, 40), nn.ReLU(), nn.Linear(40, 1))
meta_optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
def sine_task_losses():
"""Sample a sine-wave task, adapt on 10 points with one gradient step, and return query losses before and after."""
amplitude, phase = torch.empty(1).uniform_(0.1, 5), torch.empty(1).uniform_(0, 3.14)
x = torch.empty(20, 1).uniform_(-5, 5)
y = amplitude * torch.sin(x + phase)
params = dict(net.named_parameters())
support_loss = F.mse_loss(functional_call(net, params, x[:10]), y[:10])
grads = torch.autograd.grad(support_loss, list(params.values()), create_graph=True) # inner loop
adapted = {name: p - 0.01 * g for (name, p), g in zip(params.items(), grads)}
before = F.mse_loss(functional_call(net, params, x[10:]), y[10:])
after = F.mse_loss(functional_call(net, adapted, x[10:]), y[10:])
return before, after
# Outer loop: update the shared initialization so that one inner step fits each new task
for step in range(10000):
meta_loss = sum(sine_task_losses()[1] for _ in range(4))
meta_optimizer.zero_grad()
meta_loss.backward()
meta_optimizer.step()
# On 500 unseen sine waves, compare query error before and after the one-step adaptation
losses = torch.tensor([[loss.item() for loss in sine_task_losses()] for _ in range(500)])
print(f"query MSE before adaptation: {losses[:, 0].mean():.2f}, after one step: {losses[:, 1].mean():.2f}")它会输出 query MSE before adaptation: 3.10, after one step: 0.70。经过元学习的初始化参数无法拟合任何特定的正弦波,但在 10 个点上进行一次梯度更新后,模型对未见过的波形新点的误差会降低四倍以上。
元学习与相关术语的区别#
- 迁移学习:将一个大型任务上训练得到的权重用作另一个任务的起点,但不会专门针对适应能力对其进行优化。在自定义数据集上微调经过 COCO 预训练的 Ultralytics YOLO26检测器,就是迁移学习:它的初始权重来自 COCO 上的常规训练,而适应过程需要使用带标注的数据集进行多个训练轮次,而不是用少量样本执行几步梯度更新。
- 少样本学习:从极少量样本中学习的问题。元学习是解决这一问题的一类方法;使用简单分类器的预训练嵌入则是另一类方法。
- 自动机器学习 (AutoML):搜索网络架构和超参数,通常一次针对一个数据集。一些综述将跨任务的超参数学习也归入元学习。
- 持续学习:按顺序学习一系列任务,同时不遗忘较早学到的任务;元学习则让模型为快速学习新任务做好准备。
基准测试与研究发现#
小样本图像基准推动了大多数元学习研究:Omniglot 包含来自 50 种字母体系的 1,623 个手写字符;miniImageNet 使用 100 个 ImageNet类别,每类 600 张图像,并划分为不同类别用于元训练、验证和测试。后来的两项研究质疑了元学习本身的贡献有多大。“快速学习还是特征复用?”指出,MAML 的成功主要源于复用外循环中学到的特征;它的简化变体 ANIL 只在内循环调整最后一层,却取得了与 MAML 相当的表现。之后,“重新思考小样本图像分类”发现,使用常规监督或自监督方式在元训练类别上学习的优质嵌入线性分类器,优于当时领先的小样本元学习方法。










