Flow matching и прямые пути
Диффузионная политика из урока 1.5 превращает шум в пачку действий за десятки шагов, и каждый шаг — это проход сети. Пока пачка считается, робот стоит или едет по старому плану, поэтому счёт идёт на миллисекунды. Flow matching учит сеть на прямых путях от шума к данным, а по прямой можно идти крупными шагами: так π0, GR00T N1 и SmolVLA строят пачку за 4–10 шагов. Разберём, почему пути генерации всё равно выходят кривыми и одного шага мало, как reflow выпрямляет их почти до одного шага и сколько шагов укладывается в бюджет робота.
Скорость на прямой от шума к данным
Диффузионной модели нужны десятки шагов, чтобы превратить шум в данные. В уроке 1.5 каждый шаг стал проходом сети по всей пачке действий, и на одну пачку уходят десятки проходов. Всё это время робот стоит или едет по старому плану.
Путь от шума к данным изогнут. В уроке 1.4 денойзер при сильном шуме указывал к среднему данных, а при слабом — к ближайшей спирали, поэтому точка сначала идёт к центру и только потом сворачивает. Сеть знает направление только в текущей точке, и крупный шаг по нему срезает поворот.
В уроке 1.4 шаги сокращали сэмплером DDIM: та же сеть шагает без свежего шума и держит форму там, где DDPM уже стягивает точки к центру. Но на совсем малом числе шагов форму теряет и DDIM, поэтому диффузионные политики делают на пачку десятки шагов.
Выход — учить сеть на прямых путях от шума к данным: по прямой можно пройти одним шагом, потому что направление в начале ведёт прямо в конец. Так устроены flow matching (Lipman и соавторы, 2022) и близкий к нему rectified flow (Liu и соавторы, 2022).
Возьмём случайную точку шума и случайную точку данных и соединим их прямой. В момент точка на прямой — , скорость движения по ней постоянна и равна . Сеть учится предсказывать эту скорость по и . Это обычная регрессия: ничего не нужно моделировать по шагам. Генерация — взять шум и пройти по полю скоростей от до несколькими шагами Эйлера.
Но прямые от разных пар пересекаются: через одну точку идут прямые к разным точкам данных, и правильных ответов в ней несколько. Будут ли тогда прямыми пути генерации и хватит ли одного шага? Проверим на двух пятнах данных. Поле скоростей здесь считается по точной формуле, без сети, поэтому всё, что увидим, следует из самого метода.
Под капотом: пути, цель обучения и точное поле
У Lipman и соавторов путь задан условно: для каждой точки данных — гауссиана, которая в момент совпадает с шумом , а к сжимается вокруг . В варианте, который авторы называют путём оптимального транспорта, центр и ширина меняются линейно:
При это ровно прямая из текста и цель ; такую же цель обучения используют Liu и соавторы. Главная теорема статьи: градиенты этой «условной» цели совпадают с градиентами цели, где вместо стоит настоящее поле генерации. Поэтому достаточно учить сеть на случайных парах, а не знать поле заранее.
Какое поле выучит идеальная сеть: среднее всех скоростей, которые проходят через точку, . В момент точка — это сам шум, и он ничего не говорит о том, куда идти. Поэтому : стрелка указывает на среднее данных.
В лаборатории данные — смесь двух гауссиан, и среднее считается точно. Для компоненты с центром и разбросом :
Веса компонент — их правдоподобие в точке . Пятна — центры (±1,2; 1,0), . Путь зонда — 200 шагов Эйлера.
Пути генерации кривые, хотя каждая обучающая пара — прямая. Через точки посередине идут прямые к обоим пятнам, а поле равно их среднему. Поэтому точка, как и у диффузии, сначала идёт к среднему данных и только потом сворачивает, а один шаг приводит весь шум в среднее — в пустоту между пятнами. Так же регрессия в уроке 1.3 вела Аду в чайник между объездами слева и справа. Здесь поле посчитано по формуле. Что выучит настоящая сеть, которая видит только случайные пары?
Ада — домашний гуманоидный робот, на котором построены лабораторные работы курса. Подробнее о ней — в уроке 0.1.
Учим поле скоростей
Что выучит сеть, которая видит только случайные пары? Для настоящих данных формулы поля нет, а в каждой точке сети попадаются прямые к разным точкам данных, то есть разные правильные ответы.
Обучим маленькую сеть прямо на странице и проверим две вещи: до какого значения опустится ошибка и куда смотрят стрелки поля в разные моменты t.
Данные сложнее, чем в лаборатории 1: восемь пятен на кольце, 4000 точек. Сеть получает точку и время и выдаёт скорость. Каждый шаг обучения — 128 случайных пар «шум — данные» и случайные моменты t. Стрелки на сцене — то, что сеть думает о скорости в каждой точке в выбранный момент.
По горизонтали — шаги обучения, по вертикали — средний квадрат ошибки скорости.
Под капотом: цикл обучения и почему ошибка не падает до нуля
- Сеть. Вход — точка , 32 фурье-признака точки (косинусы и синусы проекций на 16 случайных направлений) и 5 признаков времени: . Два скрытых слоя по 48 нейронов с SiLU, выход — скорость . Adam, шаг 0,005, к концу обучения он уменьшается. Без фурье-признаков такая маленькая сеть рисует размытое кольцо вместо восьми пятен.
- Почему ошибка не уходит в ноль. Через одну точку проходят прямые к разным пятнам, и цель для неё случайна. Лучшее, что может сеть, — предсказать среднее, а разброс вокруг среднего остаётся ошибкой. Для этих данных поле можно посчитать точно, как в лаборатории 1: даже с ним средняя ошибка равна 1,87. Пунктир на графике — эта граница.
- Что видно на сцене. Стрелки — поле сети на сетке 15 × 15. Серые тянут к центру, оранжевые — от центра. Облако — 300 точек шума, которые сеть провела по своему полю до момента , по 100 шагов Эйлера на весь путь.
Сеть выучила поле, близкое к идеальному: в каждой точке — среднее скоростей всех прямых через неё. Ошибка остановилась чуть выше границы, ниже которой не опуститься никакой сети. Почти вся она — неустранимый разброс целей, поэтому по кривой обучения трудно судить, хорошо ли модель рисует. Примерно до середины пути поле тянет шум к центру кольца и только потом разворачивает к пятнам, так что путь точки снова кривой. Сколько шагов Эйлера нужно, чтобы пройти такой путь, и меньше ли их, чем у диффузии?
Диффузия и flow на одних данных
Сколько шагов нужно flow-модели и меньше ли их, чем у диффузии? Пути у неё кривые, так что выигрыш не очевиден.
Поставим рядом диффузию из урока 1.4 и сравним на равных. Для каждой модели найдём наименьшее число шагов, при котором она держит форму кольца.
Данные те же, сеть такая же, бюджет обучения тот же — 1500 шагов. Разница в двух вещах: диффузионная сеть предсказывает шум и генерирует сэмплером DDIM по расписанию DDPM, flow-сеть предсказывает скорость и генерирует методом Эйлера по прямой. Обе стартуют из одних и тех же 600 точек шума.
По горизонтали — число шагов генерации (логарифмическая шкала), по вертикали — доля точек в пятнах. Точки появляются для каждого числа шагов, которое ты попробуешь.
Под капотом: шаг DDIM — это тоже шаг Эйлера
Шаг DDIM () сначала оценивает чистую точку по предсказанному шуму, а потом смешивает её с тем же шумом в пропорции следующего момента:
Шаг Эйлера по прямому пути устроен так же. Из скорости получаются оценка данных и оценка шума , а
Значит, DDIM и Эйлер — один и тот же сэмплер, если расписание одно. Gao и соавторы в обзоре «Diffusion Meets Flow Matching» формулируют это так: при гауссовом шуме flow matching и диффузия эквивалентны, а сэмплер DDIM совпадает с сэмплером Эйлера.
Откуда тогда разница в лаборатории. Во-первых, расписание: у DDPM почти вся первая половина пути — сильный шум, и равномерная сетка тратит туда шаги впустую. Во-вторых, цель обучения: на первом шаге DDIM получает оценку данных делением на , и ошибка сети в предсказанном шуме вырастает примерно в 160 раз. Поэтому при одном шаге точки диффузии разлетаются. У сети, которая предсказывает скорость, такого деления нет.
Lipman и соавторы сравнивали пути оптимального транспорта с диффузионными в одной постановке: первые дают более быстрое обучение и генерацию, а на ImageNet 32 × 32 им нужно примерно 60% вычислений поля, чтобы достичь той же ошибки. Это не значит, что flow всегда лучше: Gao и соавторы показывают, что для широких распределений другое расписание может дать пути прямее. Результат зависит от расписания, цели и сэмплера, а не от названия метода.
Как считается качество. Точка «в пятне», если она ближе 0,2 к центру одного из восьми пятен (2,5 разброса). Пятно «на месте», если в него попала хотя бы четверть его доли точек. Обе сети: 48 × 48 нейронов, 1500 шагов по 128 примеров, одинаковое зерно. У настоящих данных в пятнах около 96% точек.
Flow держит форму с 8 шагов, диффузия — с 16. При этом flow и диффузия — одно семейство: шаг DDIM — тот же шаг Эйлера, а разницу дают расписание шума и то, что предсказывает сеть. Один шаг по-прежнему не работает: flow-модель собирает весь шум в одно пятно в центре кольца, потому что первый шаг ведёт в среднее данных. Можно ли выпрямить сами пути генерации, чтобы хватало одного шага?
Выпрямление: reflow
Можно ли выпрямить пути генерации, чтобы хватало одного шага? Сейчас один шаг собирает весь шум в центр кольца.
Пути кривые, потому что обучающие прямые пересекаются: через одну точку идут прямые к разным пятнам, и сеть учит их среднее.
До сих пор поворот проходили мелкими шагами: flow-модели в лаборатории 3 нужно было 8, и каждый из них — проход сети.
Значит, учить сеть нужно на парах, прямые которых не пересекаются. Liu и соавторы предложили, где их взять.
Пустим уже обученную модель из шума и запишем, куда она его привела, — . Пути модели — решения дифференциального уравнения, они не пересекаются. Значит, и прямые между и пересекаются редко. Обучим ту же сеть ещё раз, на парах вместо случайных. Это и есть reflow.
Проверим, сколько пересечений останется, хватит ли после этого одного шага и чем за это придётся заплатить.
Под капотом: reflow, дистилляция и одношаговые модели
- Что доказали авторы. Распределение на выходе reflow то же, что у исходной модели, а транспортная стоимость не растёт. Чем больше повторов, тем прямее могут стать пути, но много повторов авторы не советуют: копится ошибка. Новую модель они дообучают из весов предыдущей, как и мы.
- Цена. Пары нужно сгенерировать моделью 1 за много шагов и обучить сеть ещё раз. Ошибки модели 1 переходят в пары, поэтому на большом числе шагов выпрямленная модель рисует хуже исходной. На CIFAR-10 у Liu и соавторов один шаг Эйлера дал FID 378 у исходной модели и 12,21 после reflow, а точный решатель — 2,58 и 3,36.
- В лаборатории. 2000 пар, своя выборка шума. Модель 2 — копия модели 1, которую дообучают 1000 шагов по 128 пар с шагом 0,002. Пересечения считаются для 100 пар, то есть из 4950 пар отрезков.
- Другие пути к одному шагу. Дистилляция учит сеть сразу выдавать конец пути: InstaFlow так получила одношаговую Stable Diffusion, на это ушло 199 GPU-дней на A100. Consistency models отображают любую точку пути в его конец: FID 3,55 за один шаг на CIFAR-10. MeanFlow (NeurIPS 2025) учит среднюю скорость на отрезке и даёт FID 3,43 за один шаг на ImageNet 256 × 256.
Пары reflow почти не пересекаются, и выпрямленная модель за один шаг кладёт в пятна около двух третей точек и находит все восемь пятен. Платить приходится ещё одним обучением, парами, которые исходная модель строит за много шагов, и качеством на большом числе шагов: ошибки исходной модели переходят в пары. Всё это мы проверяли на точках. Сколько шагов нужно пачке действий робота и сколько миллисекунд они стоят?
Как π0 строит пачку действий
Сколько шагов нужно пачке действий и сколько они стоят? У робота два требования сразу: пачка должна объехать препятствие и посчитаться быстро, потому что, пока она считается, робот стоит или едет по старому плану.
Посмотрим, как это устроено в π0. Рядом с VLM на 3 млрд параметров работает отдельный эксперт действий на 300 млн. Он генерирует пачку из 50 действий: стартует с шума формы 50 × размерность действия и за 10 шагов Эйлера превращает его в движение. Каждый шаг — проход эксперта по 50 токенам действий. Картинки и текст VLM обрабатывает один раз за пачку и кэширует ключи и значения, а эксперт читает их на каждом шаге — так устроена блочная маска π0 из урока 1.6.
На RTX 4090 с тремя камерами вывод занимает 73 мс: 14 мс на энкодеры картинок, 32 мс на проход по наблюдению и 27 мс на все 10 шагов flow. Если модель считается вне робота, добавляется 13 мс на сеть. У GR00T N1 голова действий — трансформер DiT, и ей хватает 4 шагов: пачка из 16 действий за 63,9 мс на L40. π0.7 генерирует пачку из 50 действий за 5 шагов.
Проверим на Аде, сколько шагов нужно, чтобы пачка объехала чайник, и сколько шагов укладывается в бюджет времени.
Конвенция времени в курсе: — шум, — данные, скорость = данные − шум. Так пишут Lipman и Liu, так же время введено в статьях π0 и GR00T N1. В коде openpi наоборот: , цель — шум − действия, генерация идёт от к 0 с шагом . Авторы прямо пишут в комментарии, что это противоположно статье. Так же устроены реализации π0 и SmolVLA в LeRobot. Читая код, проверяй, где шум.
Под капотом: формулы π0 и что стоит за 73 мс
- Ошибка знака. В версиях статьи 2024 года цель записана как . При таком пути и шаге это вело бы от данных к шуму. В версии от января 2026 года знак исправлен на . В коде знак верный в своей конвенции.
- Выбор τ. Бета-распределение даёт больше обучающих примеров с сильным шумом, то есть малых . Моменты не нужны, пока шаг интегрирования больше 0,001.
- Почему 10 шагов дешевле картинок. Эксперт в 10 раз меньше VLM и работает только с 50 токенами действий, а наблюдение считается один раз и лежит в кэше. Поэтому 10 шагов стоят 27 мс, а один проход по камерам и тексту — 46 мс.
- В лаборатории. Пачка — 50 смещений захвата поперёк стола, по одному на такт 20 мс; захват едет слева направо 60 см за 1 с. Вместо обученной головы здесь точное поле для 40 демонстраций: 20 объезжают чайник сверху, 20 — снизу. Так видно, что делают сами шаги Эйлера, без ошибок обучения; у обученной сети к ним добавятся её собственные ошибки. Задержка в калькуляторе — разбивка π0: 14 + 32 + 2,7 мс на шаг (27 мс / 10) + 13 мс на сеть. Что каждый шаг стоит одинаково — наше упрощение. Простой — доля времени, когда робот стоит: исполнили 25 действий (0,5 с), ждём вывод.
- Одношаговые головы. FlowPolicy и MP1 генерируют действия за один шаг: 19,9 и 6,8 мс. В техотчёте одного автора (2026) одношаговая голова для GR00T ускорила голову с 45 до 5 мс, но успешность заметно упала: на длинных задачах LIBERO с 74,5 до 26%.
За один шаг все пачки въезжают в чайник: первый шаг из шума ведёт в среднее демонстраций. На точном поле Аде хватает 4 шагов, а на сервере и объезд, и бюджет выдерживают от 4 до 10 шагов. Сами шаги дешёвые: основную задержку даёт проход по наблюдению. Сколько шагов делают настоящие политики?
Кто сколько шагов делает
Разложи модели по числу шагов генерации на выводе. Перетащи карточку или нажми её, а потом корзину.
Восемь вопросов о типичных заблуждениях
Итоги урока
- Диффузии нужны десятки шагов на пачку, и робот ждёт каждый проход сети. Flow matching учит поле скоростей регрессией на прямых между случайным шумом и случайной точкой данных. Генерация — несколько шагов Эйлера от шума к данным.
- Обучающие прямые пересекаются, сеть учит их среднее, поэтому пути генерации кривые. Один шаг из шума приводит в среднее данных.
- При гауссовом шуме flow matching и диффузия — одно семейство: DDIM — это шаг Эйлера при другом расписании. Разницу в числе шагов дают расписание и то, что предсказывает сеть.
- Reflow учит модель на её же парах «шум → результат». Пути выпрямляются, и одного-двух шагов почти хватает. Цена — ещё одно обучение и немного качества.
- У роботов головы на flow matching делают 4–10 шагов: π0, π0.5 и SmolVLA — 10, GR00T N1 — 4, π0.7 — 5. Шаги эксперта дешёвые, основную задержку даёт проход по наблюдению.
- Конвенции времени расходятся: в курсе — шум, в коде openpi — наоборот.
Открытые вопросы
Почему π0 не генерирует пачку за один шаг, если reflow и дистилляция это позволяют?
Один шаг даёт среднее, если пути кривые, а выпрямление и дистилляция стоят дополнительного обучения и обычно немного качества. При этом 10 шагов эксперта стоят 27 мс из 73: главная часть задержки — проход по камерам и тексту, и один шаг вместо десяти сэкономил бы около трети времени. Для ловких задач потеря точности дороже этих миллисекунд. Одношаговые головы проверяют, но в техотчёте про GR00T такая голова заметно теряла в успешности.
Демонстрации объезжают чайник то слева, то справа. Что сделает каждый шаг Эйлера с пачкой и почему первый шаг самый опасный?
В начале шум ещё ничего не говорит о стороне объезда, и поле тянет пачку к среднему демонстраций — прямо в чайник. Если шаг один, пачка там и остаётся. Если шагов несколько, после первого пачка ещё зашумлена, и следующие шаги уже «видят», к какой стороне она ближе, и уводят её туда. Поэтому качество быстро растёт от одного шага к трём-четырём, а дальше почти не меняется.
Гид по статье
- Читать внимательноРазделы 3–4: условные пути, цель обучения и теорема о совпадении градиентов. Пример с путями оптимального транспорта и рисунок, где они прямые.
- Можно пропуститьДоказательства в приложениях и эксперименты с правдоподобием.
- Вопрос по ходуПочему условный путь прямой, а поле, которое выучит сеть, — нет? Где в статье об этом сказано?
X. Liu, C. Gong, Q. Liu, «Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow», ICLR 2023 — reflow, теоремы о непересечении путей и одношаговая генерация.
Материалы
- MIT 6.S184: Introduction to Flow Matching and Diffusion ModelsП. Холдеррит, Э. Эрайвс — лекции, видео и упражнения; конспект — arXiv 2506.02070
- Diffusion Meets Flow Matching: Two Sides of the Same CoinGao и соавторы, Google DeepMind, 2024 — почему DDIM и Эйлер совпадают и что на самом деле прямое
- Flow Matching Guide and CodeLipman и соавторы, 2024 — подробное руководство и библиотека flow_matching
- An introduction to Flow MatchingБлог Cambridge MLG, 2024 — вывод с формулами и рисунками
- Let us Flow TogetherСерия записей Ц. Лю о rectified flow и reflow
- How I Understand Flow MatchingВидео Jia-Bin Huang
- openpiКод π0 и π0.5: голова на flow matching — файл src/openpi/models/pi0.py
Проверь себя по всей части 1. 15 вопросов по урокам 1.1–1.8 вперемешку и задача на живой сцене: так видно, что держится в памяти. В конце — балл по каждому уроку и разделы, которые стоит повторить.
Дальше: часть 2. Голова на flow matching строит пачку за 4–10 шагов и укладывается в бюджет робота. Но сама политика осталась прежней: она умеет одну задачу, на каждый навык ей нужно полсотни демонстраций, и команду словами она не понимает. Как роботу понять, что и где делать? Об этом часть 2: геометрия сцены и язык в Transporter и CLIPort, PerAct и планировщики на больших языковых моделях. Голова действий на flow matching вернётся в части 3: в уроке про π0 она стоит рядом с VLM, а в уроке про GR00T — за медленной System 2.