PerAct: 3D-представления и язык
Карта по пикселям стола из урока 2.1 задаёт место на плоскости и поворот вокруг вертикали. Чтобы открыть ящик или поставить чашку на верхнюю полку, нужна поза захвата в объёме. PerAct (2022) получает её тремя приёмами. Длинную демонстрацию он сжимает до нескольких ключевых поз, а между ними руку ведёт планировщик движения. Следующую позу ищет как самый ценный воксель — кубик пространства — в сетке 100 × 100 × 100. Миллион вокселей и команду словами обрабатывает трансформер Perceiver, который сначала сжимает их в небольшой набор из 2048 внутренних векторов. Одна такая модель выучила 18 задач в симуляции и 7 задач на настоящей руке.
От точки на столе к позе в объёме
В уроке 2.1 действие было точкой на виде стола сверху. Transporter оценивает каждый пиксель и берёт лучший, а поворот ищет среди 36 углов вокруг вертикали. Но попробуй поставить чашку на верхнюю полку: сверху верхняя и нижняя полки — один и тот же пиксель. Чтобы открыть ящик, захват берёт ручку сбоку и тянет на себя. Чтобы повернуть кран, захват поворачивается вокруг горизонтальной оси. Картой стола такие действия не описать.
Таким задачам нужна поза захвата в объёме: три координаты, три угла и состояние захвата, открыт он или закрыт. Такое действие называют 6-DoF — по числу степеней свободы (degrees of freedom). Агенты, которые переводят картинку прямо в 6-DoF-действия, учатся медленно: авторы PerAct приводят примеры, где данные для многих задач собирали неделями и месяцами.
PerAct (Perceiver-Actor; Shridhar, Manuelli, Fox, CoRL 2022 — авторы CLIPort) переносит карту действий в объём. Кубический метр над столом делят на сетку 100 × 100 × 100 вокселей. Воксель — объёмный пиксель, кубик пространства, здесь со стороной 1 см. Действие ищут как самый ценный воксель. Чтобы это заработало, авторы решают три задачи, и им посвящены три следующих раздела: как не принимать решение на каждом кадре, как выбрать позу в объёме классификацией и как обработать миллион вокселей трансформером.
Начнём с первой. Демонстрация — это сотни кадров. Сколько из них политика должна предсказывать?
Ключевые позы вместо траектории
Политики части 1 решают на каждом кадре. Десятисекундная демонстрация на 30 кадрах в секунду — 300 решений, и каждая ошибка уводит руку туда, где оператор не бывал. В уроке 1.1 такие ошибки копились как , где — вероятность ошибиться на одном шаге, а — число шагов, в уроке 1.7 ACT сокращала число решений пачками действий.
PerAct вслед за работой C2FARM (James и соавторы, 2022) оставляет от демонстрации несколько ключевых поз (keyframes). Это позы захвата, через которые задача проходит обязательно: перед чашкой, на чашке, над препятствием, перед полкой, на полке. Предсказывать непрерывные действия напрямую авторы называют неэффективным и шумным. Политика выдаёт только следующую ключевую позу, а путь до неё строит планировщик движения — классический алгоритм вроде тех, что были в уроке 0.4.
Ключевые позы находят простой эвристикой: действие ключевое, если скорости суставов почти нулевые, а состояние захвата не изменилось. Рука останавливается там, где оператор прицеливается или ждёт, пока сожмётся захват. Каждый кадр демонстрации становится примером для обучения: по этому наблюдению и команде предскажи следующую ключевую позу.
Ада — домашний гуманоидный робот, на котором построены лабораторные работы курса. Подробнее о ней — в уроке 0.1.
Проверим на Аде. Оператор ведёт её руку джойстиком и переставляет чашку со стола на верхнюю полку, огибая чайник. Запись — 325 кадров: поза захвата, его состояние и скорости трёх суставов руки. В статье демонстрации чище: эксперт задаёт промежуточные позы, руку между ними ведёт планировщик, и в остановках она стоит точно. Рука человека дрожит, поэтому порог «почти нулевой скорости» приходится подбирать.
Вид сбоку: слева Ада и её рука, справа стеллаж с двумя полками.
По горизонтали — время демонстрации, 30 кадров в секунду. По вертикали — скорость самого быстрого сустава, рад/с, шкала логарифмическая. Полоса снизу — захват: светлая — открыт, тёмная — сжат. Пунктир порога можно тянуть мышью или пальцем.
Под капотом: эвристика, планировщик и цена каждого решения
Пусть — скорость сустава в кадре , — состояние захвата, — порог. Кадр ключевой, если рука стоит и захват не меняет состояние. Каждый кадр демонстрации превращается в пример «наблюдение и команда → следующая ключевая поза»:
Порог и окно в статье не названы. У нас скорость — самый быстрый из трёх суставов руки, сглаженный по 5 кадрам; захват «не меняется», если его состояние одинаково в 12 кадрах до и после; разрыв короче 4 кадров внутри остановки считаем дрожью и склеиваем; ключевая поза — первый кадр остановки; остановка до начала движения не считается. Рука — три сустава с длинами 45, 42 и 11 см, захват всегда горизонтален, суставы считаются обратной кинематикой.
Планировщик у нас ведёт захват по прямой от позы к позе и препятствия не обходит: так сразу видно, какая поза пропала. В статье планировщик ищет путь случайными пробами, как RRT из урока 0.4 (в опытах с настоящей рукой — RRT-Connect из MoveIt), а флаг столкновений в каждом действии говорит ему, обходить ли всё в сетке или ничего. Подойти к чашке нужно сбоку: подход сверху задевает её.
Почему мало решений лучше? Пусть каждое решение с вероятностью приводит к ошибке, после которой задача провалена. Тогда эпизод из решений проходит с вероятностью . При из 325 решений без ошибки проходят 3,8% эпизодов, из шести — 94%. Это грубая модель: она не учитывает, что решение о далёкой позе труднее, чем шаг на один кадр.
По остановкам ключевые позы ловят всё нужное: подход к чашке сбоку, захват, подъём над чайником, место перед полкой, отпускание и отвод руки. Политике остаётся шесть решений вместо 325, остальное делает планировщик. Равные промежутки дают столько же поз, но не там, где они нужны. В статье ключевые позы через равные промежутки или в случайных кадрах дают нулевой успех на задаче с ящиком. В задачах RLBench у PerAct от 2 до 17 ключевых поз на эпизод.
Решений стало мало, но каждое теперь — поза в объёме: где окажется захват, как он повёрнут и сжат ли. Как сети выбрать такую позу?
Следующий лучший воксель
Ключевых поз немного, но каждая задаёт захват в объёме. Прямой путь — регрессия: сеть выдаёт три координаты и три угла числами. Из уроков 1.3 и 2.1 мы знаем, что бывает, когда в демонстрациях несколько верных ответов: регрессия со средним квадратом ошибки выдаёт их среднее.
PerAct делает с объёмом то же, что Transporter со столом. Облака точек с откалиброванных камер сводят в сетку 100 × 100 × 100 вокселей над столом, каждый размером 1 см. В вокселе 10 чисел: цвет, координаты точки, занят ли он и его индекс в сетке. Сеть оценивает каждый воксель: насколько хорошо, если центр захвата окажется здесь. Обучают её как классификатор: правильный ответ — воксель, где захват был в следующей ключевой позе, а функция потерь — перекрёстная энтропия, как у любого классификатора. Действие — самый ценный воксель. Авторы называют это поиском следующего лучшего вокселя (next best voxel).
Остальные части действия — тоже классификация. Поворот делят на 72 корзины по 5° для каждой из трёх осей. Состояние захвата и флаг столкновений — по два варианта. Флаг говорит планировщику, обходить ли всё в сетке или ничего: подвести захват к ручке ящика нужно, ничего не задев, а потянуть ящик на себя — касаясь его.
Проверим в миниатюре. Сетка — 20 × 20 × 20 вокселей по 5 см. Рука Ады держит чашку перед стеллажом с двумя полками: на сцене серые воксели — захват, бирюзовые — чашка. Команда говорит, куда её поставить. Обучим на 24 демонстрациях две модели: регрессию координат и классификатор вокселей. Регрессия получит даже больше, чем классификатор: точное положение стеллажа. Классификатор видит только, какие воксели заняты, и не всю сцену, а окно — столбец на ±8 вокселей над и под местом, которое он оценивает. Сколько сцены ему на самом деле нужно, проверим в миссии 3.
Под капотом: Q-функции PerAct и наш классификатор
По сетке вокселей и команде сеть выдаёт четыре Q-функции. Действие — их максимумы: воксель , углы Эйлера по корзинам, состояние захвата и флаг столкновений :
Цели — one-hot: воксель ключевой позы в сетке , по корзине на каждую ось поворота, по два варианта у захвата и флага. Обучение — сумма перекрёстных энтропий, как у классификатора:
Разрешение авторы проверили так: проиграли демонстрации, округлив каждое действие до вокселя и корзин поворота, и убедились, что сетки 100³ хватает. В анализе чувствительности части задач хватает сетки 32³, а точным задачам нужна полная 100³.
У нас сетка 20³ с вокселем 5 см. Признаки вокселя заданы вручную: свободен ли он, заняты ли воксели в столбце над и под ним на вокселей, четыре соседа на той же высоте и на слой ниже. Оценка линейная: общий вектор весов плюс вектор команды, у каждой из трёх команд свой. Обучение — 120 шагов Adam перекрёстной энтропией по всем 8000 вокселям. Регрессия — метод наименьших квадратов от точного положения стеллажа и команды к координатам цели. В PerAct признаки вокселей учит сеть, а команду кодирует текстовый энкодер CLIP.
Регрессия поставила чашку между полками: среднее двух верных ответов приходится на пустоту. Классификатор дал два пика и выбрал один из них. Команда переносит пик на названную полку. Без команды модель не знает, какую задачу решать: в статье PerAct без языка работает на уровне случайного выбора. Посмотри на сцену сверху: обе полки — один столбец вокселей, и карта стола из урока 2.1 их бы не различила.
Но классификатор справился, только когда видел столбец высотой 45 см. С окном поменьше полки и стол выглядят для него одинаково: опора снизу и пустота сверху. Настоящей сети нужно видеть всю сцену — миллион вокселей. Как это сделать?
Миллион вокселей и 2048 латентов
В лаборатории 2 классификатор отличил верхнюю полку от нижней, только когда его окно дотянулось до стола и до следующей доски. В статье то же на ящиках. У комода три одинаковые ручки, и команда «открой средний ящик» требует видеть комод целиком. C2FARM-BC — 3D-свёрточная сеть, которая сначала смотрит на сцену крупно, а потом приближает её часть, — справлялась на уровне случайного выбора, около 33%. PerAct — больше чем в 70% попыток.
Видеть всю сцену сразу умеет внимание из урока 1.6: каждый токен смотрит на каждый. Но число пар растёт как квадрат числа токенов, и миллион вокселей дают пар на слой. Поэтому PerAct сначала режет сетку на патчи 5 × 5 × 5, как ViT режет картинку. Остаётся токенов и ещё 77 токенов текста. Но и 8000 токенов обычному трансформеру, по словам авторов, трудно уместить в память обычной видеокарты.
Выход дают латенты. Perceiver IO (Jaegle и соавторы, ICLR 2022; в статье PerAct его зовут просто Perceiver) хранит небольшой набор обучаемых векторов, у PerAct — 2048 векторов длиной 512. Кросс-внимание (cross-attention из урока 1.6) переносит в них нужное из входа: запросы дают латенты, ключи и значения — 8077 токенов. Дальше шесть слоёв self-attention работают только с латентами. В конце ещё одно кросс-внимание раздаёт результат обратно: каждый патч спрашивает у латентов, что известно о сцене. Поэтому стоимость растёт линейно по числу токенов.
Посчитаем, сколько памяти при обучении занимают одни только оценки внимания.
Выходы головы поворота
Под капотом: кросс-внимание к латентам и наш счёт
Пусть вход — токенов , латенты — . В кросс-внимании запросы дают латенты, поэтому матрица оценок размером , а не :
Обратное кросс-внимание устроено зеркально: запросы дают токены входа, ключи и значения — латенты. Число оценок за один пример, если в сети шесть слоёв:
Здесь — сторона сетки, — сторона патча. Память — число оценок × 16 примеров в пакете (столько берут авторы) × 4 байта. Это нижняя оценка: голова внимания одна, а веса, активации полносвязных блоков и градиенты не считаем. Граница в 16 ГБ — для примера. Авторы обучали PerAct на 8 видеокартах V100 16 дней, 600 тысяч шагов.
Сетка у PerAct — 100³ × 10 каналов. Свёртка 1 × 1 × 1 поднимает каналы до 64, свёртка с ядром и шагом 5 даёт патчи . К патчам приклеивают признаки проприоцепции — состояние захвата, положения пальцев и номер шага, — и получается . Текст — 77 токенов CLIP размерностью 512, их сжимают линейным слоем до 128. Вход Perceiver — плюс обучаемые позиционные векторы.
Внимание всех ко всем по миллиону вокселей занимает сотни терабайт даже по нижней оценке, по 8077 токенам — больше 16 ГБ, а Perceiver с 2048 латентами — около 3,7 ГБ. Авторы проверяли и 512 латентов: на их задачах это не хуже, а иногда лучше. Поворот предсказывают по трём осям отдельно: 216 выходов вместо 373 248.
Соберём модель целиком. Вход — сетка вокселей и команда, выход — четыре головы: перенос, поворот, захват и флаг столкновений. По пути миллион вокселей сжимается до 8000 патчей и 2048 латентов, а потом снова разворачивается в миллион.
Какой формы тензор на каждом шаге
Тензор — таблица чисел с несколькими осями: запись 100 × 100 × 100 × 10 значит 10 чисел в каждом из миллиона вокселей. Max-pool берёт по каждому признаку максимум по всей сетке, трилинейное повышение разрешения снова увеличивает сетку, плавно заполняя промежутки. Все размеры есть в абзацах выше и в блоке «Под капотом». Задача для тех, кто хочет разобрать модель по слоям, её можно пропустить.
Разложи шаги PerAct по форме тензора на выходе. Перетащи карточку или нажми её, а потом корзину.
Только голова переноса смотрит на каждый воксель: она выдаёт 100³ оценок, по одной на воксель, авторы называют их Q-функцией. Поворот, захват и флаг столкновений считают по признакам всей сцены после max-pool. Работает ли такая модель сразу на многих задачах?
Одна модель на 18 задач
Авторы обучили одну модель на 18 задачах RLBench с 249 вариациями: открыть один из трёх ящиков, сложить блоки нужного цвета, вкрутить лампочку, поставить бутылку на подставку. Вариации — место, цвет, форма, размер и категория предметов. Камер четыре, RGB-D по 128 × 128 пикселей. На задачу — 10 или 100 демонстраций, проверка — 25 эпизодов на задачу, в эпизоде не больше 25 действий.
Сравнивали с агентами «картинка → действие» Image-BC на CNN и ViT и с C2FARM-BC, которого так же обучили по демонстрациям. PerAct лучше первых в 34 раза, вторых — в 2,8 раза. Без команды PerAct работает на уровне случайного выбора. Три точные задачи — надеть кольцо на штырь, вставить стаканы друг в друга и повесить чашки на подставку — почти не решает никто: ошибка в несколько сантиметров или градусов там необратима.
Доля успешных эпизодов из 25 на каждую задачу. Image-BC — лучший из двух вариантов, CNN и ViT. Данные — таблица 1 статьи PerAct. Наведи на строку, чтобы увидеть числа.
На настоящей руке Franka Panda с одной камерой Kinect-2 одна модель выучила 7 задач с 18 вариациями по 53 демонстрациям. Демонстрации записывали контроллером HTC Vive: человек задаёт целевые позы, а руку к ним ведёт планировщик. Нажать на дозатор антисептика модель смогла в 9 попытках из 10, смести фасоль в совок — в 1 из 5. Чаще всего она ошибалась с состоянием захвата.
Где пределы такого подхода?
Пределы ключевых поз и что пришло им на смену
Пределы авторы перечисляют сами. Между ключевыми позами руку ведёт планировщик движения, и путь от модели не зависит. В их задачах это не мешало, но налить воду в чашку так не выйдет: нужен плавный путь наклона. Динамические задачи, где нужно непрерывно подруливать, и многопалые кисти в эту схему тоже ложатся плохо. Модель видит только текущее наблюдение, поэтому задачи, где нужно помнить прошлое, вроде поиска предмета по ящикам, ей недоступны.
Модели части 3 пошли другим путём. Они выдают непрерывные пачки действий прямо по картинкам и тексту, как π0 с пачкой из 50 действий из урока 1.8. Ключевые позы и планировщик им не нужны, но и подсказки, которую даёт сетка вокселей, у них нет.
Идея действия как ценности в трёхмерной сетке осталась. В следующем уроке VoxPoser строит карты ценности в сетке вокселей без обучения на задачу: их собирает код, который пишет большая языковая модель, а путь по ним ищет планировщик.
Восемь вопросов о типичных заблуждениях
Итоги урока
- Демонстрацию сжимают до ключевых поз: кадров, где скорости суставов почти нулевые, а захват не меняет состояние. Политика предсказывает следующую ключевую позу, путь до неё строит планировщик. Решений — единицы вместо сотен.
- Позы должны попасть в узкие места задачи: захват, отпускание, обход препятствий. Позы через равные промежутки дают столько же решений, но в статье — нулевой успех.
- Действие — классификация в 3D-сетке 100³: самый ценный воксель задаёт место захвата, поворот — три оси по 72 корзины, плюс захват и флаг столкновений. Классификация сохраняет несколько верных ответов, регрессия их усредняет.
- Команда словами, закодированная CLIP, выбирает, какой из верных ответов нужен. Без неё PerAct работает на уровне случайного выбора.
- Чтобы различать одинаковые полки и ручки, нужна вся сцена. Perceiver обрабатывает 8000 патчей и 77 токенов текста через 2048 латентов, и стоимость растёт линейно по числу токенов.
- Одна модель выучила 18 задач с 249 вариациями в симуляции и 7 задач на настоящей руке по 53 демонстрациям. Пределы — планировщик, динамика, многопалые кисти и отсутствие памяти.
Открытые вопросы
Почему ключевые позы плохо подходят для задачи «налей воды в чашку»?
В ней важен сам путь: чайник наклоняют плавно, и скорость наклона определяет, куда польётся вода. Ключевые позы задают только точки, а путь между ними выбирает планировщик, которому всё равно, как наклоняется чайник. Авторы называют это ограничением и предлагают сочетать выученные и спланированные пути или предсказывать последовательность действий, а не одну позу.
PerAct видит только текущий кадр. Какие задачи из-за этого ему недоступны и как это исправить?
Задачи, где нужно помнить прошлое: посчитать предметы, нажать кнопки в заданном порядке, если по сцене не видно, какие уже нажаты, найти вещь, заглядывая в ящики по очереди. Авторы предлагают подавать наблюдения прошлых шагов, сохранять латенты Perceiver между шагами или добавить рекуррентную сеть поверх латентов.
Гид по статье
- Читать внимательноРаздел 3 и рисунок 2: ключевые позы, вокселизация и как Perceiver кодирует вход. Раздел 4.3 и рисунок 4: опыт с тремя ящиками и глобальным полем зрения. Приложение B: все размеры тензоров.
- Можно пропуститьОписание каждой из 18 задач в приложении A и подробности аугментаций в приложении E.
- Вопрос по ходуСамый мелкий воксель у C2FARM-BC — 0,47 см, у PerAct — 1 см. Почему C2FARM-BC всё равно проигрывает на задаче с ящиками?
S. James и соавторы, «Coarse-to-Fine Q-attention: Efficient Learning for Visual Robotic Manipulation via Discretisation», CVPR 2022 — C2FARM: ключевые позы, действие как воксель и сетка от грубой к мелкой.
A. Jaegle и соавторы, «Perceiver IO: A General Architecture for Structured Inputs & Outputs», ICLR 2022 — латенты, кросс-внимание на входе и на выходе.
Материалы
- PerActСтраница проекта: видео в симуляции и с настоящей рукой, ссылки на код
- peract/peractКод PerAct на PyTorch и обученные модели
- RLBenchБенчмарк из 100 задач с генерацией демонстраций; PerAct использует 18 из них
- ARMРепозиторий авторов C2FARM, на котором построен код PerAct
- perceiver-pytorchОткрытая реализация Perceiver на PyTorch, на которой основан Perceiver в PerAct
Дальше: LLM-планировщики и VoxPoser. PerAct выполняет одну команду: поставь, открой, поверни. Длинную задачу вроде «приготовь кофе» он на шаги не разложит. В уроке 2.3 большие языковые модели составляют план из навыков робота: SayCan проверяет, что каждый шаг выполним, Code as Policies пишет код политики, а VoxPoser строит карты ценности в сетке вокселей без обучения на задачу — урок 2.3.