🔴 Сложный ⏱️ 55 минут

Meta-Learning

📋 Содержание урока

Meta-Learning 🧭

Покажи трёхлетнему ребёнку картинку с капибарой — животным, которое он никогда прежде не видел, — и назови его один раз. Через час, увидев капибару на другой фотографии, в другом ракурсе, на другом фоне, ребёнок почти наверняка её узнает. Одного примера ему хватило. А теперь вспомни, сколько размеченных фотографий кошек и собак нужно типичной модели компьютерного зрения, чтобы уверенно отличать одних от других: тысячи, а лучше десятки тысяч на каждый класс. Пропасть между этими двумя сценариями — не техническая деталь, а один из самых интересных открытых вопросов машинного обучения, и именно ему посвящён сегодняшний урок.

Дело не в том, что человеческий мозг умнее нейросети в каком-то абстрактном смысле. Дело в том, что ребёнок, увидевший капибару, — не новичок в задаче «узнать животное по фотографии». За три года жизни он уже видел сотни видов животных, научился выделять контур, шерсть, количество лап, форму морды, и самое главное — он научился самому процессу быстрого обучения новому животному по одному-двум примерам. Он не учится узнавать капибару с нуля: он применяет уже отточенный навык «быстро выучить новый класс» к новому конкретному классу. Именно эту идею — научиться самому процессу обучения, а не единственной задаче — и формализует метаобучение (meta-learning), тема этого урока.

Метаобучение продолжает линию, которую мы начали в уроке 348 про перенос обучения (transfer learning), но делает следующий, более смелый шаг. Transfer learning отвечает на вопрос «как использовать одну уже обученную модель для одной новой, но похожей задачи». Метаобучение ставит вопрос амбициознее: «как обучить модель так, чтобы она умела быстро адаптироваться к любой новой задаче из целого семейства похожих задач, каждый раз видя лишь считаные примеры». Разница на первый взгляд кажется тонкой, но она полностью меняет то, чему и как мы обучаем модель, — и в этом уроке мы разберём эту разницу подробно, шаг за шагом дойдём до алгоритма MAML (Model-Agnostic Meta-Learning), который стал одним из самых влиятельных решений этой задачи, и увидим, что в его сердце лежит формула градиентного спуска из урока 285, применённая необычным, двухуровневым способом.

Сегодня мы разберём три связанных, но самостоятельных идеи: саму парадигму «learning to learn» («обучение обучению») в противопоставлении с переносом обучения; формальную постановку few-shot learning (обучения по нескольким примерам) в виде N-way K-shot задачи; и алгоритм MAML как один из самых элегантных ответов на вопрос, как вообще обучить модель быстрой адаптации. Завершим практическими применениями — местами, где метаобучение из красивой академической идеи превращается в рабочий инструмент.

История

Идея «научиться учиться» появилась в машинном обучении задолго до того, как для неё придумали современное название и элегантные алгоритмы. Ещё в 1987 году Юрген Шмидхубер в своей дипломной работе описал принцип, который он назвал «self-referential learning» — системы, которые модифицируют собственные правила обучения на основе опыта, а не только модифицируют веса под конкретную задачу. Несколько лет спустя, в 1991 году, Йошуа Бенджио с соавторами независимо исследовал похожую идею — обучение самого правила обновления весов (а не только самих весов) с помощью внешнего оптимизационного процесса. Эти ранние работы были математически интересны, но практически почти бесполезны: вычислительных мощностей и данных того времени категорически не хватало, чтобы обучать модель не на одной задаче, а сразу на распределении из сотен и тысяч задач.

Вторая волна интереса к метаобучению поднялась в середине 2010-х вместе с общим взрывом глубокого обучения. В 2016 году вышла работа про Matching Networks — архитектуру, которая обучалась сравнивать новый пример с размеченными примерами из маленькой обучающей выборки (support set) прямо во время предсказания, без отдельного шага дообучения. А в 2017 году Челси Финн, Питер Аббил и Сергей Левин из Berkeley опубликовали статью про MAML — алгоритм, ставшийde-facto эталоном метаобучения на годы вперёд именно благодаря своей универсальности: в отличие от многих конкурирующих подходов, MAML не требует специальной архитектуры сети и подходит для классификации, регрессии и даже обучения с подкреплением (урок 347) — отсюда и название Model-Agnostic, «независимый от модели».

Любопытный поворот случился уже в начале 2020-х: когда исследователи начали изучать поведение по-настоящему огромных языковых моделей вроде GPT-3, обученных вообще без явной мета-структуры — просто предсказывать следующее слово на гигантском массиве интернет-текста, — обнаружилось, что такие модели неожиданно демонстрируют поведение, поразительно похожее на быструю адаптацию по нескольким примерам: покажи модели в промпте два-три примера новой задачи, и она справляется с четвёртым, ни разу не обновив ни одного веса. Это явление назвали in-context learning (обучением в контексте), и хотя это не метаобучение в буквальном алгоритмическом смысле MAML, параллель между ними — одна из самых интригующих тем современного глубокого обучения, и мы вернёмся к ней подробнее в разделе про связь с другими темами курса.

Learning to learn: чем метаобучение отличается от переноса обучения

Интуиция

Представь двух людей, готовящихся к спортивным соревнованиям неизвестного заранее вида. Первый — узкий специалист: он десять лет тренировался исключительно в теннисе, довёл технику удара до совершенства, и если ему вдруг предложат сыграть в бадминтон, он потратит месяцы, чтобы перестроить хват ракетки и чувство мяча под новую игру, используя то немногое общее, что есть между теннисом и бадминтоном (это в точности логика transfer learning из урока 348: одна хорошо обученная модель, адаптированная под одну новую, но родственную задачу). Второй человек — многоборец, который в детстве и юности пробовал десятки разных видов спорта: плавание, бег, гимнастику, единоборства. Он никогда не был лучшим в каждом отдельном виде, но зато выработал нечто более ценное для нашей ситуации — общий навык «быстро войти в форму в новом виде спорта». Дай ему бадминтон, покажи хват ракетки, дай пару минут потренироваться — и он уже вполне сносно играет, хотя раньше в бадминтон не играл ни разу.

Именно эту разницу формализует различие между transfer learning и метаобучением. Transfer learning оптимизирует веса модели под одну конкретную исходную задачу (скажем, классификацию по ImageNet), а затем адаптирует эти веса под одну конкретную целевую задачу через дообучение (fine-tuning), которому всё равно требуется приличное количество размеченных примеров целевого домена — в уроке 348 мы видели, что дообученный BERT для анализа тональности отзывов требовал порядка тысячи размеченных примеров вместо ста тысяч с нуля, и это уже огромная экономия, но всё ещё далеко не единицы примеров. Метаобучение с самого начала обучается не на одной задаче, а на целом распределении задач, и цель обучения — не «хорошо решать эту одну задачу», а «уметь после короткой встречи с новой задачей из этого же распределения быстро под неё подстроиться, увидев лишь считаные примеры».

Формальное определение

Метаобучение (meta-learning). Пусть задачи $\mathcal{T}_i$ сэмплируются из некоторого распределения задач $p(\mathcal{T})$, причём каждая задача $\mathcal{T}_i$ имеет собственный небольшой обучающий набор (support set) $\mathcal{D}_i^{tr}$ и тестовый набор (query set) $\mathcal{D}_i^{test}$. Модель $f_\theta$ с параметрами $\theta$ обучается не решать одну конкретную задачу, а находить такую стратегию адаптации $\theta \to \theta_i'$ по данным $\mathcal{D}_i^{tr}$, которая минимизирует ожидаемую ошибку на query-наборе для любой задачи, сэмплированной из $p(\mathcal{T})$:

$$\min_\theta \; \mathbb{E}_{\mathcal{T}_i \sim p(\mathcal{T})} \Big[ \mathcal{L}_{\mathcal{T}_i}\big(f_{\theta_i'}\big) \Big], \qquad \theta_i' = \text{Adapt}(\theta, \mathcal{D}_i^{tr})$$

Ключевое отличие от обычного обучения (и от переноса обучения): оптимизируется не качество на одной задаче, а качество самой процедуры адаптации $\text{Adapt}(\cdot)$, применённой к множеству разных задач.

Разбор примеров

Пример 1 (перенос обучения против метаобучения на одном и том же материале). Возьмём материал из урока 348 — классификацию еды по фотографии (пицца, суши, борщ). Transfer learning решил бы эту задачу так: взять ResNet-50, предобученную на ImageNet, заморозить нижние слои, дообучить последний слой на фотографиях именно этих трёх блюд. Результат — модель, которая отлично отличает пиццу от суши и борща, но если завтра тебе понадобится отличать ещё и рамен от пельменей, всю процедуру дообучения придётся повторять заново на новых данных. Метаобучение решило бы задачу иначе: обучающая стадия происходила бы не на трёх конкретных классах еды, а на тысячах маленьких эпизодов — «различи 5 случайных видов еды по 1 фотографии каждого», где виды еды каждый раз разные. В результате получается не модель, которая умеет отличать пиццу от суши, а модель, которая умеет научиться отличать любые 5 новых видов еды, увидев по одному их фото, — включая рамен и пельмени, которых при обучении не было вовсе.

Пример 2 (сколько нужно данных). Сравним напрямую, как каждый из подходов реагирует на нехватку данных целевой задачи. Дообучение BERT под анализ тональности отзывов (урок 348) требовало порядка тысячи размеченных примеров, потому что даже дообучение последних слоёв — это всё ещё полноценный градиентный спуск по параметрам сети на конкретном домене, а полноценному градиентному спуску (урок 285) нужно достаточно данных, чтобы оценка градиента не была слишком шумной. Метаобучающая модель, специально натренированная на решение задач по 1–5 примерам, справляется на несколько порядков меньшим числом примеров целевой задачи именно потому, что «умение быстро адаптироваться по малому числу примеров» — это то самое качество, ради которого её обучали с самого начала, а не побочный эффект общей предобученности.

Пример 3 (когда transfer learning бессилен, а meta-learning работает). Представь стартап, разрабатывающий систему компьютерного зрения для склада, которая должна распознавать новые модели товаров сразу же, как только их завозят на склад, — без задержки на сбор тысяч фотографий и дообучение под каждый новый товар. Классический transfer learning здесь работает плохо: под каждый новый товар пришлось бы заново собирать датасет и дообучать модель, а на складе новые товары появляются каждый день. Модель, обученная методом метаобучения на тысячах эпизодов «различи несколько случайных товаров по паре их фотографий», за секунды адаптируется к новым товарам без дообучения вообще — это ровно тот сценарий, в котором разница между переносом обучения и метаобучением перестаёт быть академической и становится вопросом жизнеспособности всего продукта.

Почему это важно

Понимание этой разницы — не терминологическая придирка, а ключ к тому, чтобы выбрать правильный инструмент для правильной задачи. Если у тебя одна конкретная целевая задача и хотя бы сотни-тысячи примеров для неё — transfer learning из урока 348 почти всегда будет проще, дешевле в обучении и не менее эффективен. Но если твоя задача заведомо повторяется с постоянно меняющимся набором классов, пользователей или доменов, а данных на каждый конкретный случай катастрофически мало, единственная модель, дообученная один раз, попросту не успевает подстраиваться под новизну — и именно здесь вступает в игру идея специально обучить модель самому навыку быстрой адаптации.

Few-shot learning и постановка N-way K-shot

Интуиция

Вернёмся к ребёнку и капибаре. Формализуем, что вообще значит «узнать новое животное по одному примеру» на языке, который можно закодировать и обучить. Нам нужно как-то задать: сколько новых классов ребёнок должен научиться различать (в реальности — сколько угодно, но в контролируемом эксперименте — конкретное число), и сколько примеров каждого класса ему показали перед тестом. Именно эти два числа — количество новых классов и количество примеров на класс — и задают стандартную формулировку задачи few-shot learning (обучения по нескольким примерам), которую в литературе принято называть N-way K-shot.

Формальное определение

N-way K-shot задача. Дано $N$ новых классов, ранее не встречавшихся при обучении модели, и по $K$ размеченных примеров каждого класса — вместе они образуют support set размера $N \times K$. Модель должна классифицировать новые, ещё не виденные примеры (query set) по этим $N$ классам, используя только информацию из support set. Стандартные варианты: 5-way 1-shot (5 классов, 1 пример на класс — самый требовательный, «увидел один раз»), 5-way 5-shot (5 классов, 5 примеров на класс — чуть проще). Обучение организуется через episodic training (эпизодическое обучение): на каждой итерации из большого набора «старых», уже размеченных классов случайно сэмплируется мини-задача ровно такой же структуры $N \times K$, имитируя условия, в которых модель окажется на новых классах после обучения.

Разбор примеров

Пример 1 (полное описание конкретной 5-way 1-shot задачи). Представь, что мы собираем задачу распознавания редких видов птиц. Support set состоит ровно из 5 фотографий — по одной на класс: снегирь, свиристель, поползень, пищуха и оляпка (5 разных, ранее моделью не виденных видов). Каждая фотография помечена именем своего вида — итого 5 пар «изображение — метка». Query set — это, скажем, 15 новых фотографий тех же пяти видов (по 3 на класс), которые модель ранее вообще не видела и должна классифицировать, опираясь только на 5 фотографий из support set. Обрати внимание: модель не проходит через полноценное обучение на этих 5 фотографиях — это было бы почти бессмысленно, пяти примеров категорически мало для обучения с нуля. Вместо этого модель, уже прошедшая метаобучение на тысячах похожих эпизодов с другими видами птиц, использует support set как своего рода «шпаргалку», к которой сравнивает каждый query-пример.

Пример 2 (few-shot в медицине: 3-way 5-shot). Возьмём сценарий из области, где few-shot learning особенно ценен, — диагностику редких заболеваний. Пусть нужно различить 3 редких кожных заболевания по дерматоскопическим снимкам, и на каждое заболевание в мировой медицинской литературе набралось всего по 5 подтверждённых, качественно снятых случаев — это и есть 3-way 5-shot задача с support set из 15 снимков (3 класса × 5 снимков). Собрать тысячи снимков для классического обучения с нуля попросту невозможно — редкие болезни на то и редкие; но метаобучающая модель, предварительно обученная на тысячах эпизодов классификации по другим, более распространённым кожным патологиям, способна разумно обобщить накопленный «навык различения кожных паттернов по малому числу примеров» на эти три новых редких диагноза.

Пример 3 (контраст с обычным supervised learning на конкретных числах). Чтобы почувствовать масштаб разницы, сравним напрямую. Обычная сверточная сеть для классификации котов и собак с нуля (без transfer learning) требует порядка десятков тысяч размеченных изображений на класс, чтобы выучить устойчивые признаки и не переобучиться. Дообученная через transfer learning (урок 348) модель на основе ImageNet способна обойтись сотнями-тысячами примеров на класс. А корректно обученная few-shot модель в 5-way 1-shot постановке классифицирует новые классы, вообще не встречавшиеся при обучении, по одному-единственному примеру каждого — разрыв не в разы, а на три порядка величины (единицы примеров против десятков тысяч), и именно этот разрыв делает few-shot learning отдельной, самостоятельно интересной областью, а не просто «transfer learning с меньшим датасетом».

Простой базовый подход — Prototypical Networks. Прежде чем переходить к MAML, полезно увидеть одну из самых простых рабочих идей few-shot классификации: вместо того чтобы вообще что-либо дообучать, можно вычислить «прототип» каждого класса как среднее эмбеддингов (векторных представлений) его примеров из support set, а затем классифицировать query-пример по ближайшему прототипу. Возьмём игрушечный пример: 2-way 2-shot задача с двумерными эмбеддингами. Класс A представлен двумя точками $(1, 1)$ и $(1, 3)$, значит прототип класса A — это их среднее: $\left(\frac{1+1}{2}, \frac{1+3}{2}\right) = (1, 2)$. Класс B представлен точками $(4, 1)$ и $(4, 3)$, прототип B — $(4, 2)$. Пусть query-точка имеет координаты $(1{,}5;\ 2{,}5)$. Расстояние до прототипа A: $\sqrt{(1{,}5-1)^2+(2{,}5-2)^2} = \sqrt{0{,}25+0{,}25} \approx 0{,}707$. Расстояние до прототипа B: $\sqrt{(1{,}5-4)^2+(2{,}5-2)^2} = \sqrt{6{,}25+0{,}25} \approx 2{,}550$. Query-точка ближе к прототипу A, значит модель классифицирует её как класс A. Никакого градиентного спуска на support set не потребовалось вообще — вся «адаптация» свелась к усреднению векторов. Это красивый и по-своему честный подход, но у него есть предел: он не меняет саму модель под конкретную задачу, а лишь сравнивает готовые эмбеддинги. MAML, который мы разберём дальше, устроен принципиально иначе — он обучает параметры модели через настоящие шаги градиентного спуска, просто делает это очень быстро.

Почему это важно

N-way K-shot — это не абстрактная формула ради формулы, а стандарт, который позволяет разным исследовательским группам и разным алгоритмам сравнивать результаты на одной и той же шкале сложности: 5-way 1-shot задача заведомо труднее 5-way 5-shot (меньше информации на класс), а 20-way 1-shot труднее 5-way 1-shot (больше классов нужно различить). Когда ты в статье или документации видишь запись вида «модель X достигает точности 68% на miniImageNet 5-way 1-shot», ты теперь точно понимаешь, что стоит за этими цифрами: 5 новых классов, по одному примеру каждого, и 68% правильных ответов на новых query-примерах этих же пяти классов.

MAML: оптимизация поверх оптимизации

Интуиция

Вернись мысленно к формуле шага градиентного спуска из урока 285: $w^{(t+1)} = w^{(t)} - \eta \nabla L(w^{(t)})$ — из любой стартовой точки $w^{(0)}$ мы спускаемся к минимуму конкретной функции потерь конкретной задачи. А теперь задай себе более амбициозный вопрос: что, если бы мы могли выбрать саму стартовую точку $w^{(0)}$ не случайно, а специально так, чтобы из неё любая задача из целого семейства похожих задач решалась буквально за один-два шага этой же формулы? Представь турист��, который не поднимается на одну конкретную гору, а должен уметь быстро взойти на любую вершину из целого горного хребта — и его высаживают каждый раз в новом, заранее неизвестном месте у подножия. Идеальная стратегия для такого туриста — заранее выбрать себе базовый лагерь не у подножия какой-то одной горы, а в точке, равноудалённой (в разумном смысле) от вершин всех гор хребта, из которой к любой конкретной вершине по факту оказывается близко.

Именно эту идею реализует MAML (Model-Agnostic Meta-Learning): мы ищем не веса, хорошо решающие одну задачу, а начальные веса $\theta$, из которых несколько обычных шагов градиентного спуска (в точности формула урока 285) приводят к хорошему решению любой задачи из распределения $p(\mathcal{T})$. Отсюда точная формулировка идеи из вступления к этому уроку: метаобучение как «оптимизация поверх оптимизации» — внутри MAML буквально два вложенных друг в друга цикла градиентного спуска.

Формальное определение

Алгоритм MAML. Для каждой задачи $\mathcal{T}_i$, сэмплированной из $p(\mathcal{T})$, на внутреннем цикле (inner loop) выполняется один или несколько обычных шагов градиентного спуска (формула урока 285) по support-набору задачи, начиная от общих параметров $\theta$:

$$\theta_i' = \theta - \alpha \nabla_\theta \mathcal{L}_{\mathcal{T}_i}(f_\theta)$$

где $\alpha$ — скорость обучения внутреннего цикла. На внешнем цикле (outer loop, мета-обновление) параметры $\theta$ обновляются так, чтобы минимизировать суммарную ошибку после внутренней адаптации, измеренную на query-наборах всех задач батча:

$$\theta \leftarrow \theta - \beta \nabla_\theta \sum_{\mathcal{T}_i} \mathcal{L}_{\mathcal{T}_i}\big(f_{\theta_i'}\big)$$

где $\beta$ — скорость обучения внешнего цикла. Ключевая математическая тонкость: поскольку $\theta_i'$ само является функцией от $\theta$, градиент внешнего цикла $\nabla_\theta \mathcal{L}_{\mathcal{T}_i}(f_{\theta_i'})$ требует дифференцирования через шаг внутреннего градиентного спуска — то есть вычисления производных второго порядка. Именно это и есть буквальный смысл фразы «градиентный спуск по градиентному спуску».

Разбор примеров

Пример 1 (внутренний цикл — обычный шаг из урока 285, применённый к одной задаче). Пусть у нас есть семейство простых одномерных задач с функцией потерь $\mathcal{L}_{\mathcal{T}_i}(w) = (w - a_i)^2$, где $a_i$ — «правильный ответ» для конкретной задачи $\mathcal{T}_i$ (это крайне упрощённая, но честная модель того, что в оригинальной статье про MAML делалось на задачах регрессии синусоид с разной амплитудой и фазой — там тоже каждая задача имеет свой «истинный» ответ, к которому нужно подстроиться). Возьмём общий стартовый вес $\theta = 1$ и конкретную задачу с $a_i = 2$. Градиент: $\mathcal{L}_{\mathcal{T}_i}'(w) = 2(w - a_i)$, в точке $\theta=1$: $\mathcal{L}_{\mathcal{T}_i}'(1) = 2(1-2) = -2$. При скорости внутреннего цикла $\alpha = 0{,}25$:

$$\theta_i' = 1 - 0{,}25 \cdot (-2) = 1{,}5$$

Один-единственный шаг обычного градиентного спуска (в точности формула урока 285) сдвинул вес с $1$ до $1{,}5$, а ошибка упала с $\mathcal{L}(1) = (1-2)^2 = 1$ до $\mathcal{L}(1{,}5) = (1{,}5-2)^2 = 0{,}25$ — в четыре раза. Это и есть быстрая адаптация: не десятки итераций, а буквально один шаг, потому что стартовая точка $\theta=1$ была выбрана заранее с расчётом на такие задачи.

Пример 2 (внешний цикл — как выбирается такая удачная стартовая точка). Продолжим тот же пример, но теперь разберёмся, откуда вообще взялась «удачная» стартовая точка. Пусть распределение задач состоит из трёх задач с $a_1=2$, $a_2=-2$, $a_3=0$ (три разных «истинных ответа», симметрично расположенных вокруг нуля). Проделаем алгебру один раз в общем виде: после одного шага внутреннего цикла с $\alpha=0{,}25$ адаптированный вес равен $\theta_i' = \theta(1-2\alpha) + 2\alpha a_i = 0{,}5\theta + 0{,}5 a_i$, а query-ошибка после адаптации — $\mathcal{L}_{\mathcal{T}_i}(\theta_i') = (1-2\alpha)^2(\theta-a_i)^2 = 0{,}25(\theta - a_i)^2$. Просуммировав по трём задачам и взяв производную по $\theta$ (это и есть мета-градиент внешнего цикла), получаем $\nabla_\theta \sum_i \mathcal{L}_{\mathcal{T}_i}(\theta_i') = 0{,}5 \cdot (3\theta - \sum_i a_i) = 1{,}5\theta$ (поскольку $a_1+a_2+a_3=0$). При скорости внешнего цикла $\beta=0{,}1$ шаг мета-обновления имеет вид $\theta \leftarrow \theta - 0{,}1 \cdot 1{,}5\theta = 0{,}85\theta$ — то есть на каждой мета-итерации $\theta$ просто умножается на $0{,}85$. Стартуя из $\theta^{(0)}=1$, получаем трассировку внешнего цикла:

Мета-итерация 0 1 2 3 4 5
$\theta$ $1{,}000$ $0{,}850$ $0{,}7225$ $0{,}6141$ $0{,}5220$ $0{,}4437$

Значение $\theta$ геометрически стремится к $0$ — и это абсолютно осмысленный результат: при симметричном распределении задач вокруг нуля именно точка $\theta=0$ равноудалена от всех трёх «вершин» $a_1=2$, $a_2=-2$, $a_3=0$ в том смысле, что один и тот же шаг внутреннего цикла из неё одинаково хорошо приближает к решению любой из трёх задач. Внешний цикл, шаг за шагом, буквально нашёл этот «базовый лагерь туриста» — не перебором, а градиентным спуском по мета-параметру $\theta$, в точности так же, как обычный градиентный спуск урока 285 находит минимум обычной функции потерь, только здесь «функция потерь» — это качество адаптации, а не качество решения одной задачи.

Пример 3 (практический компромисс — First-Order MAML). Точный расчёт мета-градиента, как в примере 2, требует вычисления производных второго порядка (по сути, взятия градиента от градиента), что для реальных нейросетей с миллионами параметров ощутимо дороже по памяти и вычислениям, чем обычный, «одноэтажный» градиентный спуск. На практике поэтому часто используют First-Order MAML (FOMAML) — упрощение, в котором при вычислении внешнего градиента зависимость $\theta_i'$ от $\theta$ через сам шаг адаптации попросту игнорируется, то есть внешний градиент считается напрямую по $\theta_i'$, как если бы это были независимые параметры. Это приближение, а не точная формула — оно жертвует частью теоретической строгости ради вычислительной дешевизны, — но эмпирически на многих задачах даёт результат, почти не уступающий полному MAML. Ещё более радикальное, но родственное по духу упрощение — алгоритм Reptile (OpenAI, 2018), который вообще не вычисляет градиенты второго порядка, а просто многократно двигает $\theta$ в сторону адаптированных $\theta_i'$ разных задач, усредняя направление движения. Это иллюстрирует общий принцип инженерной практики метаобучения: точная формула MAML — эталон, но в реальных системах почти всегда работают с той или иной приближённой, более дешёвой её версией.

Почему это важно

MAML — не единственный алгоритм метаобучения, но именно его двухуровневая структура (внутренний цикл — обычный градиентный спуск по конкретной задаче, внешний цикл — градиентный спуск по качеству адаптации сразу по многим задачам) стала эталонной формулировкой всей области, потому что она не привязана к конкретной архитектуре сети или типу задачи: то же самое уравнение работает и для классификации изображений, и для регрессии, и — как показали Финн, Аббил и Левин в оригинальной статье — даже для обучения с подкреплением (урок 347), где «задачей» может быть отдельная среда или отдельная динамика робота. Понимание того, что здесь буквально используется знакомая формула $w \leftarrow w - \eta \nabla L(w)$ из урока 285, только на двух уровнях сразу, снимает с MAML ореол «магии» и превращает его в логичное, хотя и вычислительно более затратное, расширение градиентного спуска.

Применения: где метаобучение работает на практике

Интуиция

Метаобучение особенно ценно именно там, где данные не просто ограничены, а принципиально ограничены — то есть их не получится собрать больше, сколько бы бюджета и времени ты ни выделил. Медицинская диагностика редкого заболевания не станет проще оттого, что ты наймёшь тысячу размечающих специалистов: в мире физически существует лишь несколько сотен подтверждённых случаев. Именно такие сценарии — «данных мало и в обозримом будущем больше не станет» — и есть естественная ниша метаобучения, в отличие от transfer learning, который чаще решает более мягкую проблему «данных пока недостаточно, но их можно постепенно собирать».

Разбор примеров

Пример 1 (холодный старт рекомендательной системы). Когда на сервис регистрируется новый пользователь, у сервиса нет истории его взаимодействий — классическая проблема холодного старта. Обычная рекомендательная модель, обученная на миллионах пользователей с богатой историей, плохо справляется с пользователем, у которого есть лишь 3-5 оценённых товаров или прослушанных треков. Мета-обученная рекомендательная модель, натренированная на тысячах эпизодов «предскажи предпочтения пользователя по 5 его первым действиям», способна за эти же 3-5 взаимодействий выдать заметно более точные персональные рекомендации, чем модель, которая просто «была предобучена на всех пользователях сразу» — разница ровно та же, что между transfer learning и метаобучением из первого раздела этого урока, только здесь «задача» — это конкретный пользователь, а не конкретный домен изображений.

Пример 2 (диагностика редких заболеваний, доведённая до конкретики). Вернёмся к примеру из раздела про few-shot learning — 3-way 5-shot классификация редких кожных заболеваний. Практическая ценность здесь не абстрактная: для распространённых заболеваний (скажем, обычной экземы) в медицинских архивах легко найти десятки тысяч размеченных снимков, и на них прекрасно работает обычное дообучение. Но для по-настоящему редкого генетического кожного заболевания, которое встречается у нескольких сотен людей в мире, идея «просто собери больше данных» попросту неприменима физически. Мета-обученная на распространённых кожных патологиях модель, перенастроенная на 5 снимках редкого случая, — единственный реалистичный путь получить диагностический инструмент, который в принципе можно обучить.

Пример 3 (быстрая адаптация робота к новой среде). Робот-манипулятор, обученный захватывать предметы в контролируемых условиях лаборатории, должен уметь адаптироваться к новому, ранее не виденному предмету или к новой поверхности стола (другое трение, другой наклон) за считаные попытки — переобучать заново всю политику управления (урок 347, обучение с подкреплением) на новом объекте физически долго и дорого, каждая попытка — это реальное движение реального манипулятора. Мета-обученная политика, натренированная на многообразии виртуальных сред и предметов в симуляции, адаптируется к новому реальному предмету за 5-10 физических попыток вместо тысяч эпизодов обучения с нуля.

Почему это важно

Общая нить всех трёх примеров одна: метаобучение окупается ровно там, где стоимость получения дополнительных данных для конкретного случая (нового пользователя, редкой болезни, нового предмета для робота) непропорционально высока по сравнению со стоимостью заранее, один раз, обучить модель на большом разнообразии похожих случаев. Это не универсальный инструмент на каждый день — для задач с достаточным количеством данных transfer learning или обычное обучение с нуля почти всегда проще и надёжнее, — но там, где данных объективно мало и дорого, метаобучение зачастую единственный работающий подход.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: В задаче классификации редких минералов используется постановка 4-way 3-shot. Сколько всего размеченных изображений входит в support set?


Задание 2: Постановка 20-way 1-shot. Сколько примеров содержит support set?


Задание 3: В 5-way 1-shot задаче query set состоит из 4 примеров на каждый из 5 классов. Сколько всего примеров в query set?


Задание 4: Дана функция потерь одной задачи метаобучения $\mathcal{L}_{\mathcal{T}}(w) = (w-3)^2$, стартовый общий вес $\theta = 0$, скорость внутреннего цикла $\alpha = 0{,}2$. Найти адаптированный вес $\theta'$ после одного шага внутреннего цикла.


Задание 5: Опишите своими словами, чем набор данных Support set отличается от Query set в few-shot задаче.


Задание 6 (машинное обучение): Обычная модель, обучаемая с нуля на классификацию котов и собак, требует порядка $20\,000$ размеченных изображений на класс. Мета-обученная few-shot модель решает ту же задачу как 2-way 5-shot. Во сколько раз меньше размеченных примеров новых классов ей требуется?


Задание 7: В чём принципиальная разница между transfer learning (урок 348) и метаобучением с точки зрения того, на чём именно обучается модель — на одной задаче или на распределении задач?


Задание 8: Prototypical Networks: класс A представлен точками support set $(2, 0)$ и $(4, 0)$. Найти прототип класса A.


Задание 9: В медицинском сценарии нужно различить 4 редких генетических синдрома, для каждого из которых есть по 3 подтверждённых снимка. Определить $N$ и $K$ этой few-shot задачи.


Задание 10: MAML: внешняя скорость обучения $\beta = 0{,}1$, мета-градиент в текущей точке $\theta=2$ равен $5$. Найти $\theta$ после одного шага внешнего цикла.

Средние задания (11–20)

Задание 11: Дана задача с $\mathcal{L}_{\mathcal{T}}(w) = (w-a)^2$, стартовый вес $\theta=1$, $a=5$, $\alpha=0{,}3$. Найти адаптированный вес $\theta'$ после одного шага внутреннего цикла и значение потерь до и после адаптации.


Задание 12: Та же задача, что в задании 11 ($a=5$, $\theta=1$, $\alpha=0{,}3$), но внутренний цикл делает два последовательных шага. Найти $\theta''$ после второго шага.


Задание 13 (машинное обучение): Для семейства задач $\mathcal{L}_{\mathcal{T}_i}(w)=(w-a_i)^2$ с $a_1=4$, $a_2=-4$ (две симметричные задачи) и $\alpha=0{,}25$ найти, к какой точке $\theta^*$ сходится внешний цикл MAML при бесконечном числе мета-итераций (используя рассуждение о симметрии, аналогичное примеру 2 в разделе про MAML).


Задание 14: Объяснить, почему нельзя просто обучить модель полноценным градиентным спуском (многими сотнями итераций) прямо на support set из 5 примеров в 5-way 1-shot задаче, как это делается при обычном обучении с нуля.


Задание 15: Prototypical Networks: класс A представлен точками $(0,0)$ и $(2,0)$, класс B — точками $(0,4)$ и $(2,4)$. Query-точка $(1,1)$. К какому классу её отнесёт модель?


Задание 16 (машинное обучение): Рекомендательный сервис мета-обучил модель холодного старта на эпизодах вида «предскажи предпочтения по 5 первым действиям пользователя». Новый пользователь совершил лишь 3 действия. Сработает ли адаптация этой конкретной мета-обученной модели без дополнительных изменений, и почему?


Задание 17: MAML для сети с $10^7$ параметров: почему вычисление точного мета-градиента (полного MAML) требует существенно больше памяти, чем один обычный шаг градиентного спуска той же сети?


Задание 18: Дана задача $\mathcal{L}_{\mathcal{T}}(w)=(w-a)^2$ с $a=10$, стартовый общий вес $\theta=0$. При каком значении $\alpha$ (скорости внутреннего цикла) один шаг внутреннего цикла сразу приведёт точно в оптимум $\theta'=a=10$?


Задание 19: Объяснить своими словами разницу между полным MAML и First-Order MAML (FOMAML) — что именно упрощается и какой ценой.


Задание 20: В эпизодическом обучении (episodic training) на каждой мета-итерации сэмплируется мини-задача из старых, уже размеченных классов. Зачем вообще нужна эта имитация, если конечная цель — работа на новых, ранее не встречавшихся классах?

Продвинутые задания (21–30)

Задание 21 (машинное обучение): Семейство задач регрессии $\mathcal{L}_{\mathcal{T}_i}(w)=(w-a_i)^2$ с четырьмя задачами $a_1=6$, $a_2=-6$, $a_3=2$, $a_4=-2$, скорость внутреннего цикла $\alpha=0{,}2$. Найти мета-градиент суммарной query-ошибки по $\theta$ в общем виде и определить точку сходимости внешнего цикла.


Задание 22: Для той же системы, что в задании 21, при $\alpha=0{,}2$ и внешней скорости $\beta=0{,}05$ найти явный коэффициент геометрического убывания $\theta$ за одну мета-итерацию (то есть число $k$, такое что $\theta_{new}=k\cdot\theta$).


Задание 23 (машинное обучение): Компания сравнивает две стратегии для распознавания новых товаров на складе: (а) transfer learning с дообучением 500 шагов градиентного спуска на 200 новых фотографиях каждого нового товара; (б) MAML-модель, адаптирующаяся 3 шагами внутреннего цикла на 5 фотографиях товара. Новый товар завозится на склад раз в час. Какая стратегия реалистичнее в этих условиях и почему?


Задание 24: Модель протестирована на трёх независимых 5-way 1-shot эпизодах с точностью на query set $72\%$, $65\%$ и $80\%$. Найти среднюю точность на этапе итогового тестирования (meta-test).


Задание 25: Явно проследить, как формула внешнего цикла MAML $\theta \leftarrow \theta - \beta \nabla_\theta \sum_i \mathcal{L}_{\mathcal{T}_i}(f_{\theta_i'})$ соотносится с формулой обычного градиентного спуска $w^{(t+1)}=w^{(t)}-\eta\nabla L(w^{(t)})$ из урока 285. Что здесь играет роль «$w$», что — роль «$L$», и в чём принципиальное отличие в вычислении градиента?


Задание 26 (машинное обучение): Медицинский стартап хочет диагностировать 6 редких генетических синдромов, для каждого из которых в мировой практике накоплено ровно по 4 подтверждённых снимка. Сформулировать эту задачу как N-way K-shot и оценить, разумно ли рассчитывать на обучение модели с нуля напрямую на этих данных.


Задание 27: Почему First-Order MAML (FOMAML) даёт лишь приближённый, а не точный мета-градиент, — показать это на одном шаге алгебраически, используя обозначения из задания 25 (то есть указать, какое слагаемое цепного правила отбрасывается).


Задание 28: Query-ошибка после инner-loop адаптации для конкретной задачи равна $\mathcal{L}_{\mathcal{T}_i}(\theta_i') = 0{,}09$, а до адаптации (на исходных общих весах $\theta$) была $\mathcal{L}_{\mathcal{T}_i}(\theta) = 4$. На сколько процентов адаптация снизила ошибку?


Задание 29: Провести параллель между числом «shots» ($K$) в few-shot learning и числом примеров, которые помещают в промпт большой языковой модели при few-shot prompting (in-context learning, урок 344). В чём формальное сходство постановки задачи и в чём принципиальное различие механизма адаптации?


Задание 30: Спроектировать (в общих чертах, без реализации) эксперимент метаобучения для диагностики редких заболеваний сетчатки глаза: описать, что будет играть роль отдельной «задачи» $\mathcal{T}_i$ при мета-обучении, откуда взять данные для мета-обучающих эпизодов, если самих редких заболеваний физически мало, и какую конкретную N-way K-shot постановку использовать на этапе итогового тестирования.

Частые ошибки

Ошибка 1. Путать метаобучение с обычным transfer learning просто потому, что оба используют «предобученную» модель. Правильно: transfer learning дообучает одну модель под одну целевую задачу; метаобучение с самого начала обучается на распределении многих задач, оптимизируя саму процедуру быстрой адаптации, а не итоговое качество на одной конкретной задаче. Почему это важно: спутав эти подходы, легко выбрать не тот инструмент — например, пытаться дообучить обычную предобученную модель на пяти примерах, хотя она никогда не обучалась под такой сценарий и попросту переобучится.

Ошибка 2. Пытаться обучить модель с нуля полноценным градиентным спуском прямо на крошечном support set few-shot задачи (5-10 примеров), как при обычном обучении. Правильно: при таком объёме данных нужен либо явно ограниченный по числу шагов внутренний цикл (как в MAML — один-два шага, а не сотни), либо подход вовсе без обновления весов (Prototypical Networks). Почему это важно: на пяти примерах модель с миллионами параметров переобучается почти мгновенно, запоминая конкретные картинки вместо обобщающих признаков класса.

Ошибка 3. Забывать, что мета-обучение и мета-тестирование должны использовать непересекающиеся наборы классов. Правильно: классы, на которых проходит episodic training (мета-обучение), не должны совпадать с классами, на которых модель тестируется в конце (meta-test) — иначе оценка качества few-shot адаптации будет завышенной и нечестной. Почему это важно: если протестировать модель на тех же классах, на которых она мета-обучалась, результат будет измерять не способность к быстрой адаптации к новому, а обычную память модели о старых классах.

Ошибка 4. Считать, что MAML требует специальной архитектуры сети. Правильно: MAML называется Model-Agnostic именно потому, что применим к любой архитектуре, обучаемой обычным градиентным спуском, — сверточным сетям, трансформерам, полносвязным сетям. Почему это важно: путаница здесь может привести к отказу от MAML в пользу более сложного и специфичного решения там, где обычный MAML прекрасно подошёл бы.

Ошибка 5. Игнорировать вычислительную стоимость полного (второго порядка) MAML при выборе алгоритма на практике. Правильно: для больших моделей почти всегда стоит начинать с более дешёвых приближений — FOMAML или Reptile, — и переходить к полному MAML только если приближения дают недостаточное качество. Почему это важно: полный MAML для сети с миллионами параметров может требовать неприемлемо много памяти и времени обучения именно из-за производных второго порядка.

Ошибка 6. Путать in-context learning больших языковых моделей (урок 344) с буквальным метаобучением по алгоритму MAML. Правильно: параллель между ними — интересная и полезная аналогия в постановке задачи (несколько примеров перед новым случаем), но механизмы принципиально разные: MAML явно обновляет веса через градиентный спуск, in-context learning не обновляет веса вообще. Почему это важно: смешивание этих понятий приводит к неверным техническим выводам — например, к ошибочному предположению, что промпт с примерами как-то «дообучает» веса модели.

Главное запомнить

  • Метаобучение (meta-learning) — это парадигма «learning to learn»: модель обучают не решать одну конкретную задачу, а быстро адаптироваться к новым задачам, которых она не видела при обучении, используя лишь несколько примеров.

  • В отличие от transfer learning (урок 348), которое адаптирует одну модель под одну новую задачу через дообучение, метаобучение с самого начала обучается на распределении множества задач $p(\mathcal{T})$.

  • Few-shot learning формально задаётся как N-way K-shot: $N$ новых классов, $K$ размеченных примеров каждого в support set, классификация проверяется на отдельном query set.

  • Episodic training (эпизодическое обучение) имитирует условия будущей адаптации: на каждой итерации сэмплируется мини-задача такой же структуры $N\times K$ из уже размеченных классов.

  • MAML (Model-Agnostic Meta-Learning) ищет такие начальные веса $\theta$, из которых несколько обычных шагов градиентного спуска (формула урока 285) приводят к хорошему решению любой задачи из распределения.

  • Внутренний цикл MAML — это в точности обычный градиентный спуск $\theta_i' = \theta - \alpha\nabla_\theta\mathcal{L}_{\mathcal{T}_i}(f_\theta)$ для конкретной задачи.

  • Внешний цикл MAML — тоже градиентный спуск, но по качеству адаптации сразу по многим задачам, отсюда фраза «оптимизация поверх оптимизации».

  • Вычисление точного мета-градиента требует дифференцирования через шаг внутреннего цикла — производных второго порядка; практические приближения (FOMAML, Reptile) экономят на этом вычислительную стоимость.

  • Метаобучение особенно ценно там, где данных объективно мало и дорого получить больше: диагностика редких заболеваний, распознавание редких объектов, холодный старт новых пользователей.

  • Параллель с in-context learning больших языковых моделей (урок 344) полезна как аналогия в постановке задачи, но это не тот же самый механизм: там нет явного обновления весов.

Связь с темами курса

Метаобучение прямо продолжает и одновременно переосмысливает урок 348 про transfer learning. Оба подхода решают одну и ту же фундаментальную проблему — как использовать уже накопленный опыт, чтобы не обучать каждую новую задачу с абсолютного нуля, — но делают это на разных уровнях амбиции. Transfer learning берёт единственную модель, обученную на единственной исходной задаче, и один раз дообучает её под единственную целевую задачу: связь «одна модель — одна задача» сохраняется, просто с полезной предысторией. Метаобучение ломает эту связь: оно с самого начала обучается на множестве разных задач одновременно, и результатом обучения становится не модель, хорошо решающая какую-то конкретную задачу, а модель (точнее, стартовая точка или процедура адаптации), которая одинаково хорошо готова быстро подстроиться под любую новую задачу из похожего семейства. На практике эти подходы нередко комбинируют: сначала предобучают модель на большом общем корпусе данных методами transfer learning (например, предобучают энкодер изображений на ImageNet), а затем поверх этого предобучения проводят мета-обучение эпизодами N-way K-shot — получая лучшее из обоих миров.

Ещё более прямая связь — с уроком 285 про градиентный спуск. MAML буквально построен на формуле шага $w^{(t+1)} = w^{(t)} - \eta\nabla L(w^{(t)})$ из этого урока, только применяет её дважды на двух разных уровнях: внутренний цикл — это ровно эта формула, применённая к параметрам конкретной задачи на её support-наборе; внешний цикл — эта же формула, но применённая к исходным, общим параметрам $\theta$ и к «функции потерь», которая сама зависит от результата внутреннего шага. Именно эта вложенность — причина, по которой полный MAML требует производных второго порядка (гессиана внутреннего шага): чтобы понять, как изменение стартовой точки $\theta$ повлияет на итоговую query-ошибку, нужно учесть, что $\theta$ влияет на неё не напрямую, а через промежуточный, тоже зависящий от $\theta$, результат адаптации $\theta_i'$. Понимание сходимости градиентного спуска на выпуклых и невыпуклых поверхностях потерь (тоже из урока 285) напрямую переносится и сюда: функция потерь внешнего цикла MAML — по сути ещё более сложная, «мета»-поверхность, которая почти никогда не выпукла, а значит на неё распространяются те же практические сложности с локальными минимумами и седловыми точками, что и на обучение обычных нейросетей.

Наконец, стоит аккуратно, без чрезмерных обобщений, провести параллель с уроком 344 про BERT, GPT и большие языковые модели, а именно с явлением in-context learning. Когда большой языковой модели показывают в промпте несколько примеров новой задачи — скажем, два-три примера перевода фразы на выдуманный шифр — и она справляется с четвёртым примером без единого обновления весов, постановка задачи формально почти дословно совпадает с few-shot learning: несколько размеченных примеров перед новым случаем, N-way K-shot по духу. Но важно не путать это с буквальным метаобучением по алгоритму MAML: в MAML адаптация — это явный, определённый шаг градиентного спуска по весам модели; в in-context learning языковая модель вообще не обновляет ни одного веса во время генерации ответа, вся «адаптация» происходит внутри активаций сети за счёт механизма внимания, обрабатывающего примеры из промпта как часть входного контекста. Тем не менее исследователи отмечают, что предобучение на гигантском и разнообразном корпусе текста само по себе неявно поощряет модель становиться хорошей именно в этом навыке — быстро улавливать закономерность по паре примеров в контексте, — и в этом смысле связь с идеей «learning to learn» из сегодняшнего урока не случайна, даже если конкретный механизм адаптации принципиально иной.

Интересные факты

  • Идея метаобучения («self-referential learning») была сформулирована Юргеном Шмидхубером ещё в 1987 году — за тридцать лет до MAML, но практически не могла быть реализована из-за нехватки вычислительных мощностей того времени.

  • Название Model-Agnostic Meta-Learning выбрано осознанно: авторы алгоритма специально показали в оригинальной статье 2017 года, что один и тот же метод работает для классификации изображений, регрессии и обучения с подкреплением (урок 347) — редкий случай алгоритма, одинаково применимого к трём совершенно разным типам задач машинного обучения.

  • Reptile, упрощённая альтернатива MAML от OpenAI, обходится вовсе без производных второго порядка, но эмпирически показывает результаты, близкие к полному MAML, — наглядная иллюстрация того, что на практике точная математическая формула и её дешёвое приближение нередко работают почти одинаково хорошо.

  • Стандартный бенчмарк miniImageNet для few-shot классификации содержит всего 100 классов (по сравнению с 1000 у полного ImageNet), специально урезанных так, чтобы удобно было составлять эпизоды 5-way 1-shot и 5-way 5-shot для честного сравнения разных алгоритмов метаобучения между собой.

Лайфхаки

  • Прежде чем браться за метаобучение, честно оцени, действительно ли твоя задача устроена как множество похожих, но разных задач с малым числом примеров на каждую, — если у тебя одна целевая задача и хотя бы сотни примеров, transfer learning из урока 348 почти всегда будет и проще, и не менее эффективен.

  • Начинай эксперименты с более дешёвых приближений — FOMAML или Reptile, — прежде чем вкладываться в вычислительно дорогой полный MAML с производными второго порядка; для многих задач разница в качестве оказывается несущественной.

  • Всегда проверяй, что классы (или задачи) в мета-обучающей выборке и в тестовой выборке не пересекаются — иначе легко получить завышенную, нечестную оценку качества few-shot адаптации.

  • Если задача позволяет обойтись без явного обновления весов, начни с более простого базового решения вроде Prototypical Networks — сравнение с прототипами по эмбеддингам зачастую служит хорошим и быстрым в реализации ориентиром, прежде чем переходить к MAML.

  • Отчитываясь о качестве few-shot модели, никогда не полагайся на один эпизод — усредняй точность по многим случайно сэмплированным N-way K-shot эпизодам, как показано в задании 24, чтобы получить статистически надёжную оценку.

  • Экспериментируй с числом шагов внутреннего цикла: один шаг — самая дешёвая и распространённая настройка MAML, но два-три шага иногда заметно улучшают итоговое качество адаптации ценой пропорционально возросшей вычислительной стоимости.

Пройдя этот урок, ты прошёл путь от интуитивного наблюдения — ребёнок узнаёт незнакомое животное с одного взгляда — до конкретной математической формулы, которая объясняет, как обучить модель тому же самому навыку. Метаобучение — одна из тех тем, где красивая идея («научи модель самому процессу обучения, а не одной задаче») превращается в честную, выписываемую на бумаге формулу, при этом не переставая быть удивительной: то, что несколько вложенных друг в друга шагов обычного градиентного спуска способны выработать нечто похожее на человеческую способность обобщать по единственному примеру, — само по себе повод остановиться и оценить, насколько далеко продвинулось машинное обучение за без малого сорок лет с первых работ Шмидхубера. Следующий урок курса, про Neural Architecture Search, покажет ещё одно применение той же общей идеи «оптимизации поверх оптимизации» — только на этот раз поиск будет идти не по весам модели, а по самой её архитектуре.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!