Meta Learning
Метаобучение обучает модель на множестве задач, чтобы она адаптировалась к новой задаче по нескольким примерам. Разбираем, как работают эпизоды, MAML и прототипические сети.
Метаобучение, которое часто называют «обучением обучаться», — это подход в машинном обучении (ML), при котором модель обучают на множестве связанных задач, чтобы она могла быстро адаптироваться к новой задаче, обычно по нескольким размеченным примерам. В отличие от обучения с учителем, при котором модель подгоняют под один набор данных, метаобучение оптимизирует сам процесс обучения: начальные веса, пространство эмбеддингов, используемое для сравнения примеров, или сеть, которая обучается на примерах за один прямой проход. Основное применение метаобучения — обучение по малому числу примеров, то есть распознавание новых классов по одному или нескольким примерам каждого класса, а также роботы и другие агенты, которым нужно на лету адаптироваться к новым условиям.
Как работает метаобучение#
Метаобучение проходит в эпизодах, имитирующих ситуацию, с которой модель столкнётся при тестировании. В каждом эпизоде выбирается задача, например задача классификации в режиме 5-way 1-shot, сформированная на основе пяти классов, на каждый из которых приходится одно размеченное изображение. Размеченные примеры образуют опорную выборку, а отложенные примеры тех же классов — запросную выборку. Во внутреннем цикле модель адаптируется к опорной выборке; во внешнем цикле метапараметры обновляются с учётом того, насколько хорошо адаптированная модель справляется с запросной выборкой, поэтому модель получает вознаграждение за успешную адаптацию, а не за запоминание какой-либо одной задачи. Классы, используемые для метатестирования, никогда не встречаются при метаобучении.
Основные подходы#
- На основе оптимизации: Model-Agnostic Meta-Learning (MAML) обучается находить начальные параметры, с которых один или несколько шагов градиентного спуска по опорной выборке новой задачи дают хороший результат. Во внешнем цикле вычисляются градиенты через внутреннее обновление, для чего нужны градиенты второго порядка; варианты первого порядка, такие как Reptile от OpenAI, позволяют избежать этих затрат, сдвигая начальные параметры в сторону весов, адаптированных для каждой задачи.
- На основе метрик: Эти методы обучают пространство эмбеддингов, в котором примеры классифицируются по расстоянию. Прототипические сети усредняют эмбеддинги опорных примеров каждого класса, получая прототип, и относят каждый запрос к ближайшему прототипу, поэтому при добавлении класса во время тестирования обучать модель не нужно.
- На основе модели: Сеть, например рекуррентная нейронная сеть (RNN) с внешней памятью, считывает опорную выборку и напрямую предсказывает метки для запросов, обучаясь процедуре адаптации через свои активации. В статье о GPT-3 обучение в контексте больших языковых моделей (LLMs), то есть решение задачи по примерам в запросе, описывается как внутренний цикл такого метаобучения, а предварительное обучение — как внешний цикл.
В регрессионном тесте самого 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 точкам снижает ошибку на новых точках ранее не встречавшейся синусоиды более чем в четыре раза.
Метаобучение и смежные понятия#
- Трансферное обучение: повторно использует веса, обученные на одной большой задаче, как начальную точку для другой, не оптимизируя их способность к адаптации. Дообучение детектора Ultralytics YOLO26, предварительно обученного на COCO, на пользовательском наборе данных — это трансферное обучение: начальные веса получены в результате обычного обучения на COCO, а адаптация выполняется на размеченном наборе данных в течение многих эпох, а не по нескольким примерам и нескольким шагам градиентного спуска.
- Обучение по малому числу примеров: задача обучения по очень небольшому числу примеров. Метаобучение — один из подходов к её решению; предварительно обученные эмбеддинги с простым классификатором — другой.
- Автоматизированное машинное обучение (AutoML): подбирает архитектуры и гиперпараметры, обычно для одного набора данных за раз. В некоторых обзорах обучение гиперпараметров сразу для нескольких задач относят к метаобучению.
- Непрерывное обучение: обучается последовательности задач, не забывая предыдущие, тогда как метаобучение подготавливает модель к быстрому освоению новых задач.
Бенчмарки и результаты#
Большинство исследований метаобучения было посвящено бенчмаркам изображений с малым числом примеров: Omniglot содержит 1623 рукописных символа из 50 алфавитов, а miniImageNet использует 100 классов ImageNet по 600 изображений в каждом, разделённых на отдельные классы для метаобучения, валидации и тестирования. Два более поздних исследования поставили под сомнение вклад самого метаобучения. Работа «Быстрое обучение или повторное использование признаков?» показала, что успех MAML в основном обусловлен повторным использованием признаков, изученных во внешнем цикле; упрощённый вариант ANIL, адаптирующий во внутреннем цикле только последний слой, показал результат на уровне MAML. Затем работа «Переосмысление классификации изображений с малым числом примеров» обнаружила, что линейный классификатор на качественном эмбеддинге, обученном обычным методом с учителем или самостоятельным обучением на классах метаобучения, превосходил ведущие на тот момент методы метаобучения с малым числом примеров.










