Diffusion Policy
В уроке 1.3 выяснилось, что политике нужна модель распределения действий, иначе она усредняет объезды и едет в чайник. В уроке 1.4 диффузия научилась брать сэмплы из распределения любой формы. Diffusion Policy соединяет обе идеи: диффузия строит не точку, а пачку будущих действий, а последние наблюдения служат ей условием. Начальный шум выбирает стратегию, пачка её держит. В уроке обучим такую политику для Ады, выясним, сколько шагов пачки исполнять и сколько шагов денойзинга нужно на самом деле, и разберём, почему метод работает.
Ада — домашний гуманоидный робот, на котором построены лабораторные работы курса. Подробнее о ней — в уроке 0.1.
Push-T: задача из статьи
Политике мало выбрать одну стратегию: её нужно исполнять плавно, на настоящем роботе и в реальном времени. Chi и соавторы в 2023 году предложили для этого Diffusion Policy и проверили её на 12 задачах из четырёх бенчмарков: Robomimic, Push-T, Block Pushing и Franka Kitchen. Главный пример статьи — Push-T.
В Push-T круглый агент толкает Т-образный блок в зелёный контур на столе. Задача мультимодальна: к блоку можно зайти слева или справа, толкнуть его за перекладину или за ножку, и операторы делают это по-разному. На настоящей руке UR5 Diffusion Policy решила задачу в 95% попыток, IBC — ни разу, LSTM-GMM — в 20%.
Прежде чем сравнивать политики, разберёмся с метрикой: что именно считается решением.
Метрика говорит, куда прийти, но не говорит как. Как политика выбирает один способ из нескольких и не бросает его на полпути?
Под капотом: награда в Push-T
Награда — доля закрытой цели с запасом в 5%:
Метрика бенчмарка — лучшая награда за эпизод, усреднённая по 50 стартам. На реальном роботе авторы считали пересечение блока с целью на последнем шаге (IoU): у Diffusion Policy 0,80, у человека-оператора 0,84.
В интерактиве блок и цель состоят из перекладины 140 × 35 и ножки 35 × 100, цель повёрнута на 45°. Площадь пересечения считается точно: блок и цель — по два прямоугольника, а пересечение выпуклых многоугольников находится отсечением Сазерленда — Ходжмана.
Диффузия строит пачку действий
В уроке 1.4 диффузия генерировала точку на плоскости. Политике нужна не точка, а движение. Поэтому Diffusion Policy генерирует пачку действий: положения робота на 16 шагов вперёд. Пачку целиком начинают с гауссова шума и за несколько шагов денойзинга превращают в связное движение.
Наблюдения при этом не зашумляют. Кадры с камер и положение робота — только условие: сеть получает их на каждом шаге денойзинга и по ним решает, куда сдвинуть пачку. Процедура генерации одна для любой ситуации, меняется только условие.
Почему пачка держит стратегию? Сторону объезда выбирают один раз на всю пачку, и все 16 шагов следуют этому выбору. Перемотай денойзинг пачки рядом с чайником и найди, на каком шаге выбрана сторона.
Итак, стратегию выбирает начальный шум, а денойзинг доводит пачку до одной из стратегий, которые есть в данных. Как собрать из этого политику, которая работает на роботе от камеры до мотора?
Под капотом: денойзинг пачки с условием
Обозначим пачку на шаге денойзинга через , наблюдения — через . Сеть учат угадывать добавленный шум, как в уроке 1.4, только с наблюдениями на входе:
Шаг DDIM с на более ранний сначала оценивает чистую пачку, потом снова добавляет к ней предсказанный шум меньшего уровня:
В интерактиве денойзер точный и без условия, как в уроке 1.3: пачка — 16 боковых смещений Ады вокруг чайника, 9 шагов до него и 6 после, по 40 демонстрациям. Сторону считаем по оценке чистой пачки на уровне чайника: дальше 6 см от маршрута. В лаборатории ниже денойзер — обученная сеть с условием.
Как устроена политика
Одной пачки на всю задачу не хватит: сцена меняется, и робот должен на это реагировать. Поэтому политика работает циклом. Она смотрит на два последних кадра, энкодер считает их признаки, денойзинг строит пачку из 16 действий, робот исполняет первые 8, и цикл повторяется с новыми кадрами. Это отступающий горизонт, знакомый по скользящему горизонту из урока 0.3: планируем далеко, исполняем начало, перепланируем.
Собери этот цикл сам. Два блока в наборе лишние.
Цикл политики
Блоки
Числа 2, 16 и 8 авторы подобрали опытом. Короткая история наблюдений меньше переобучается, длинная пачка держит стратегию, а исполнение половины пачки оставляет время на реакцию. Проверим, как это работает на Аде.
Под капотом: политика из статьи
- Вход. Два последних шага наблюдений: кадры двух камер и положение захвата.
- Энкодер. ResNet-18 на каждую камеру без предобучения, spatial softmax вместо глобального усреднения, GroupNorm вместо BatchNorm. Признаки считаются один раз за вывод пачки.
- Денойзер. Одномерный UNet по оси времени пачки, наблюдения и номер шага входят через FiLM. Есть и трансформерный вариант с cross-attention к наблюдениям, но авторы советуют начинать с UNet.
- Обучение. Случайный шаг из 100, квадратичная ошибка между шумом и его предсказанием, действия нормированы в отрезок [−1, 1], веса усредняются экспоненциально (EMA).
- Управление. Пачка — целевые положения, а не скорости. Позиционное управление у авторов стабильно лучше скоростного, у бейзлайнов было наоборот.
- Размер и частота. Сеть шума — 256 млн параметров в симуляции и 67 млн на роботе, энкодер — 22 млн на две камеры. Политика выдаёт пачку 10 раз в секунду, контроллер интерполирует её до 125 Гц.
Ада и диффузионная политика
Проверим на сцене из урока 1.3. Политика видит два последних положения Ады и выдаёт пачку из 16 шагов вперёд. Денойзер — настоящая маленькая сеть, она обучается прямо в браузере за несколько секунд. Рядом можно включить регрессию с пачками: она выдаёт всю пачку за один проход сети.
По горизонтали — сколько шагов пачки исполнять из 16, по вертикали — сколько прогонов из 20 прошли без касания и без смен плана при сдвиге чайника.
Пачка держит выбранную сторону, исполнение половины пачки — компромисс между решимостью и реакцией, а шагов денойзинга нужно гораздо меньше, чем при обучении. Сколько шагов делают настоящие роботы и как они сокращают задержку?
Под капотом: политики в лаборатории
Наблюдение. Положения Ады на прошлом и текущем шаге относительно чайника — четыре числа. Боковое положение Ада оценивает с ошибкой около 8 см, как по неточному датчику.
Пачка. Положения Ады на 16 шагов вперёд относительно текущего, по и : 32 числа. Исполняем шагов из 16, потом строим новую пачку.
Денойзер. Полносвязная сеть: на входе зашумлённая пачка, наблюдение и номер шага шума (43 числа), два слоя по 64 нейрона с tanh, на выходе оценка чистой пачки. Косинусное расписание, 100 шагов шума при обучении, 3000 шагов Adam по 32 примера — около двух секунд в браузере. При выводе — DDIM с выбранным числом шагов.
Регрессия с пачками. Сеть 4 → 64 → 64 → 32, среднеквадратичная ошибка, 2500 шагов Adam. Вся пачка — за один проход.
Прогоны. Каждый запуск — 10 прогонов: старт чуть смещён, к движению добавлен шум регулятора около 0,5 см. В миссии со сдвигом чайника каждый запуск — одни и те же 20 прогонов для любой длины исполнения: чайник сдвигается на 12 см в сторону Ады на шаге от 8-го до 19-го. Так длины исполнения сравниваются на равных.
Метрики. Касание — центры Ады и чайника ближе 31 см. Смена плана — новая пачка у чайника объезжает его с другой стороны, чем прошлая.
Сколько шагов делают настоящие роботы
Каждый шаг денойзинга — полный проход большой сети. DDPM на 100 шагах тратит около секунды на видеокарте T4, а робот на 10 Гц ждёт новую пачку каждые 0,6–0,8 секунды. В лаборатории Аде хватало трёх-четырёх шагов, и настоящие системы идут тем же путём: сокращают число шагов, меняют генератор и строят следующую пачку, пока исполняется текущая.
| Система | Генератор | Шагов при выводе | Время вывода |
|---|---|---|---|
| Diffusion Policy | DDIM | 16 (в разделе 3.4 статьи — 10) | 0,1 с на RTX 3080 |
| Consistency Policy | дистилляция Diffusion Policy | 1–3 | 21–22 мс против ~195 мс у DDIM на 15 шагах |
| RDT-1B | DPM-Solver++ | 5 | — |
| π0 | flow matching | 10 | 73 мс на RTX 4090 |
| GR00T N1 | flow matching | 4 | 63,9 мс на L40 |
| ALOHA Unleashed | DDIM | 50 | 43 мс на RTX 4090 |
Flow matching при гауссовом шуме эквивалентен диффузии, но учит более прямые пути от шума к данным, поэтому шагов нужно меньше. Его разберём в уроке 1.8. Быстрый вывод всё равно не убирает задержку целиком: пока сеть считает, робот должен что-то исполнять. Что происходит на стыке пачек?
Стыки пачек и задержка
Пока сеть строит следующую пачку, робот либо ждёт, либо продолжает старую. Синхронный вывод останавливает робота, и движение получается с паузами. Асинхронный продолжает старую пачку и переключается на новую, когда она готова. Но новая пачка строилась по устаревшим кадрам и может выбрать другую стратегию, поэтому на стыке появляется скачок.
Сгладить скачок усреднением нельзя по той же причине, что в уроке 1.3: среднее двух стратегий бывает недопустимым действием, и авторы π0 от усреднения отказались. Real-Time Chunking (RTC) от Physical Intelligence поступает иначе. Следующую пачку строят, пока исполняется текущая; действия, которые уже уходят на моторы, замораживают, а остальные дорисовывают так, чтобы новая пачка продолжала исполняемую. Метод работает без переобучения и выдерживает задержки больше 300 мс.
Задержки и способы стыковать пачки подробно разберём в уроке 1.7 про ACT. Осталось понять, почему диффузионная политика вообще работает лучше других и верно ли объяснение, которое дают авторы.
Почему метод работает
Авторы приводят три объяснения. Первое — мультимодальность: начальный шум выбирает стратегию, денойзинг доводит её до конца, и усреднения нет. Второе — длинный выход: диффузия описывает распределение над всей пачкой, поэтому можно предсказывать согласованную последовательность действий. Третье — устойчивое обучение: IBC приходится оценивать нормировку по отрицательным примерам, а диффузия учит score, в котором нормировки нет.
Результаты при этом нужно отделять от объяснений. Средний прирост 46,9% — это сравнение в симуляции. На реальных роботах авторы приводят отдельные задачи: 95% на Push-T, 90% на задаче с кружкой. Что выигрыш объясняется именно мультимодальностью, статья не доказывает.
С этим объяснением спорят. По оценке Mazza и соавторов, на стандартных бенчмарках условных мод почти нет (урок 1.3). Работа 2025 года (arXiv 2512.01809) на 28 бенчмарках связывает преимущество генеративных политик с шумом при обучении и итеративными шагами, а не с выразительностью модели: двухшаговая регрессионная политика почти не уступила flow-политике. А когда демонстрации разных операторов действительно расходятся, генеративная голова нужна: в ALOHA Unleashed — 70% успеха против 25% у регрессии с L1.
Практический вывод такой. Если в данных одна стратегия, регрессия с пачками дешевле и не хуже. Если операторы решают задачу по-разному или сцена допускает несколько решений, нужна генеративная политика.
Восемь вопросов о типичных заблуждениях
Итоги урока
- Diffusion Policy генерирует пачку действий на 16 шагов вперёд из шума при условии последних наблюдений. Наблюдения не зашумляют.
- Стратегию выбирает начальный шум на первых шагах денойзинга, а пачка её держит, поэтому робот не виляет.
- Отступающий горизонт: предсказать 16, исполнить 8. Короче — план меняет сторону, длиннее — робот поздно замечает изменения сцены.
- Шагов денойзинга нужно мало: 16 у Diffusion Policy, 10 у π0, 4 у GR00T N1, 1–3 после дистилляции. Один шаг без дистилляции даёт почти среднее.
- Стыки пачек не усредняют: следующую пачку достраивают к исполняемой, как в Real-Time Chunking.
- Мультимодальность — объяснение авторов, а не доказанная причина успеха. Если в данных одна стратегия, регрессия с пачками дешевле и не хуже.
Открытые вопросы
Вывод занимает 100 мс, а робот управляется на 10 Гц. Как устроить исполнение, чтобы не было ни пауз, ни рывков?
Строить следующую пачку асинхронно, пока исполняется текущая, и начинать вывод заранее, за столько шагов до конца пачки, сколько длится вывод. Действия, которые будут исполнены за время вывода, замораживать и дорисовывать к ним остальную пачку, как в Real-Time Chunking, а не усреднять пачки. Задержку можно имитировать и при обучении. В LeRobot асинхронный вывод сократил время на задачу с 13,75 до 9,7 с.
Почему позиционное управление может быть устойчивее к задержке и накоплению ошибки, чем скоростное?
Целевое положение не зависит от того, где робот оказался из-за прошлых ошибок: регулятор тянет его в нужную точку, и ошибка не копится. Скорости же интегрируются, и любая неточность или задержка сдвигает всю оставшуюся траекторию. Кроме того, пачку положений проще стыковать: следующая пачка задаёт те же абсолютные точки, а не приращения от места, где робот случайно оказался.
Гид по статье
C. Chi et al., «Diffusion Policy: Visuomotor Policy Learning via Action Diffusion», RSS 2023.
- Читать внимательноОтступающий горизонт и выбор длины наблюдений, предсказания и исполнения; сравнение позиционного и скоростного управления; опыты на реальном Push-T.
- Можно пропуститьПодробности трансформерного варианта и таблицы по отдельным задачам Robomimic.
- Вопрос по ходуПочему авторы советуют начинать с варианта на UNet, а не с трансформера?
Материалы
- Diffusion PolicyСайт проекта: видео отступающего горизонта на Push-T и задачи с кружкой
- Код Diffusion PolicyРеализация авторов, лицензия MIT
- Colab авторовОбучение политики на Push-T в браузере
- Доклад Cheng ChiПервый автор о методе и опытах
- Real-Time ChunkingK. Black et al., 2025 — как стыковать пачки без пауз и рывков
- Atlas и Large Behavior ModelBoston Dynamics и TRI, 2025 — диффузионная политика на гуманоиде
Дальше: трансформер. Вариант Diffusion Policy на UNet хорошо работает с одной-двумя камерами. Современные политики получают на вход много камер, команду текстом и историю наблюдений, и почти все они построены на трансформере. Как он устроен и почему подходит для политик — урок 1.6 «Трансформер».