Трансформер
Политике нужно одновременно читать несколько камер, команду и состояние суставов, а на выходе выдавать последовательность действий. RT-1, ACT, Octo, π0 и GR00T делают это трансформером. В уроке мы разберём внимание на шести токенах, которые можно двигать руками, а потом посчитаем, во что обходятся токены у настоящих политик и почему частота управления не равна частоте вывода. Если трансформер знаком, урок можно пропустить.
Сколько входов у политики
Возьмём π0. На каждом шаге модель получает кадры трёх камер, текстовую команду вроде «убери чашку в раковину» и состояние робота, а выдаёт пачку из 50 действий. Кадр — это тысячи пикселей, команда — несколько слов, состояние — короткий вектор чисел. Входы разной природы и разного размера, и прочитать их должна одна сеть.
Трансформер решает это одним приёмом: всё превращается в токены, векторы одинаковой длины. Кадр режут на квадратные патчи, команду — на слова и их части, состояние проходит через линейный слой и становится одним токеном. Дальше сеть работает с цепочкой токенов. Связи между ними устанавливает внимание: каждый токен решает, на какие другие ему смотреть и что у них взять.
- 768 кадры трёх камер, по 256 токенов на картинку 224 px
- до 48 команда
- 1 состояние робота
- 50 действий пачки
Как картинка становится токенами
Vision Transformer (ViT, 2021) режет картинку на квадратные патчи, вытягивает каждый в вектор и проецирует линейным слоем. Патч становится токеном, как слово в предложении. Чем мельче патч, тем больше токенов и тем лучше сеть видит детали. Но внимание сравнивает каждый токен с каждым, поэтому число пар растёт как квадрат числа токенов.
Перед тобой кадр со стола Ады, 224 × 224 пикселя. Сделай ставку, потом переключай размер патча и наводи курсор на кадр.
Ада — домашний гуманоидный робот, на котором построены лабораторные работы курса. Подробнее о ней — в уроке 0.1.
Под капотом: ViT и откуда 196 токенов
Картинка с каналами режется на патчей . Каждый патч вытягивается в вектор из чисел и умножается на матрицу , спереди добавляется токен [class], к каждому токену — обучаемая позиция. Для 224 × 224 и выходит 14 × 14 = 196 патчей и ещё [class] (расчёт). ViT-B — 12 слоёв, , 12 голов, 86M параметров.
Трансформер не всегда лучше свёрточной сети. На ImageNet без сильной регуляризации ViT на несколько пунктов хуже ResNet и догоняет лучшие модели только при 14–300 млн картинок для обучения. Поэтому в RT-1 и ACT картинки кодирует свёрточная сеть: RT-1 получает из кадра 300 × 300 81 токен, а TokenLearner сжимает её до 8 токенов на кадр. Вывод от этого ускоряется в 2,4 раза.
Найди чашку: внимание по шагам
Ада ищет на столе чашку. Каждый из шести предметов — токен. У токена есть ключ: вектор, по которому его находят. И есть значение: то, что токен отдаёт, если его выбрали. У нас значение предмета — его место на столе. Запрос «где чашка» сравнивается с каждым ключом скалярным произведением, softmax превращает оценки в веса, а ответ внимания — сумма значений с этими весами. Всё считается вручную на двумерных векторах, которые ты двигаешь сам. Ручки появляются от миссии к миссии.
К — кадр камеры, Т — текстовая команда, С — состояние робота, Д — действие. Цветом отмечены блоки π0.
Под капотом: формулы внимания, головы и маски
Softmax берётся по строкам: у каждого запроса веса в сумме дают 1. Зачем делить на : если компоненты и независимы, со средним 0 и дисперсией 1, то дисперсия равна . При больших оценки разбегаются, softmax уходит в область, где почти весь вес у одного токена, а градиенты крошечные.
У каждой головы свои матрицы, поэтому головы смотрят на разные признаки. Ширина головы — , так что все головы вместе стоят почти как одна голова полной размерности. Self-attention: , и берутся из одной последовательности. Cross-attention: из одной, и из другой. Так запросы действий в ACT читают признаки картинок, а DiT в GR00T N1 — признаки VLM.
Маска : 0 там, где токену можно смотреть на токен , и там, где нельзя. Каузальная маска закрывает всё правее диагонали: при . Блочная маска π0 и prefix-LM в PaliGemma открывает клетку, если номер блока у не больше, чем у : внутри блока внимание идёт в обе стороны, между блоками — только назад. Маска паддинга закрывает столбцы пустых токенов.
Блок 2017 года и его полносвязный подслой:
В ViT и Gemma норма стоит до подслоя:
Как устроена лаборатория. У предмета два признака: цвет (красный, синий, белый) и место (у переднего края, в середине, в глубине стола). Ключ общей головы — вектор цвета плюс 0,7 вектора места, поэтому все шесть ключей разные. Голова «цвет» видит только цвет, голова «место» — только место, у них ключи длиной 1,4. Значение предмета — его координаты на столе 1 × 1 м. Длина запроса — до 3. При к двум видимым компонентам добавляются скрытых: случайные числа с дисперсией 1, одни и те же при каждом запуске (зерно 169). Пороги миссий: вес чашки больше 0,5; ответ дальше 15 см от центров предметов при весах не больше 0,6; наибольший вес меньше 0,9; у пар больше 0,8 и у чашки больше 0,3 в обеих головах.
Внимание не знает порядка
Сумма с весами не зависит от того, в каком порядке стоят слагаемые. Если переставить токены, каждый унесёт свой вес с собой, и ответ не изменится. Для робота это проблема: «возьми чашку, потом миску» и «возьми миску, потом чашку» — разные команды. Поэтому к токенам добавляют позиционные кодировки: векторы, которые зависят только от номера позиции. В статье 2017 года это синусоиды разных частот.
Ниже — команда из четырёх токенов-слов. Токен действия спрашивает у них: какой предмет взять первым? Переставляй слова и ищи команды, на которых Ада ошибётся.
Каждая клетка — косинусное сходство кодировок двух позиций, 16 чисел на позицию. Наведи курсор на клетку. Рамкой отмечены позиции 0–3, на которых стоит команда.
Под капотом: синусоиды, RoPE и наша игрушечная команда
Каждая пара чисел — синусоида своей частоты: от одного оборота за 6,3 позиции до очень медленных. Соседние позиции получают похожие векторы, далёкие — менее похожие. Синусоиды в статье 2017 года выбрали в расчёте на последовательности длиннее, чем при обучении. Обученные позиционные эмбеддинги дали почти тот же результат. В ACT позиции картинок — двумерные синусоиды, в Decision Transformer — эмбеддинг шага по времени, в Gemma — RoPE: он поворачивает векторы запроса и ключа на угол, который зависит от позиции.
Наша команда. Токен слова — 4 числа содержания (по одному на слово) и 16 чисел позиции; без позиций они нулевые. Запрос токена действия любит предметы, чашку чуть больше миски: так вышло при «обучении». Ещё он любит начало команды: его позиционная часть совпадает с кодировкой позиции 0. Ответ — предмет с большим весом. Без позиций чашка выигрывает всегда, и Ада ошибается во всех 12 командах из 24, где миска идёт раньше чашки. С позициями ранний предмет получает больший вес, и ошибок нет ни в одной из 24 перестановок.
Сколько стоят токены
Внимание сравнивает каждый токен с каждым: удвой число токенов — пар станет вчетверо больше. Но квадратично дорожает только этот член. Проекции Q, K, V и полносвязный блок обрабатывают токены по одному, их стоимость растёт линейно. У π0 около 870 токенов при ширине модели 2048, и большую часть вычислений слоя пока забирают именно они. Камеры и разрешение — это бюджет: каждая новая камера добавляет сотни токенов.
Калькулятор считает длину последовательности, грубую стоимость прохода и размер KV-кэша. Пресеты задают входы настоящих политик. Ширину и глубину модели выбираешь сам, поэтому все пресеты сравниваются на модели одного размера, по умолчанию как у π0.
Под капотом: что считает калькулятор
- внимание: FLOPs — произведение и смесь значений ;
- проекции и FFN: FLOPs — матрицы , , , и FFN шириной ;
- KV-кэш: чисел, по 2 байта в bf16.
Это грубая оценка для обычного блока трансформера: умножение и сложение считаем за две операции, FFN шириной , нормы и softmax не считаем. В настоящих моделях FFN бывает шире, тогда доля внимания ещё меньше. Vaswani и соавторы сравнивали так же: слой self-attention стоит , рекуррентный — , и внимание дешевле, пока . У π0 при (расчёт).
FlashAttention квадратичность не убирает: FLOPs остаются , зато дополнительная память — , а ускорение получается за счёт меньшего числа обращений к памяти GPU. KV-кэш считаем для префикса — токенов наблюдения. У Gemma 2B в π0 18 слоёв, одна KV-голова и : около 18 КБ на токен в bf16, а префикс из 816 токенов — около 15 МБ (расчёт). Калькулятор держит одну KV-голову с для любой ширины модели. Памяти кэш у π0 берёт мало, дорого время: энкодеры и проход по наблюдению занимают 46 мс из 73.
Почему 73 мс дают 50 Гц
Когда модель строит выход за несколько шагов, ключи и значения уже обработанных токенов не меняются. Их считают один раз и сохраняют. Это KV-кэш. В π0 так кэшируют наблюдение — картинки и команду: блочная маска из лаборатории гарантирует, что оно не зависит от действий. Пачку действий модель уточняет за 10 шагов flow matching (урок 1.8), и каждый шаг читает готовые K и V вместо того, чтобы снова прогонять 816 токенов наблюдения.
Вторая идея — пачки. π0 выдаёт сразу 50 действий, а модель перезапускают раз в 0,5 с. Робот получает новое действие каждые 20 мс, хотя модель вызывают дважды в секунду. Ниже — вывод π0 на RTX 4090 с тремя камерами. Нажимай на блоки и на ленту тиков.
Под капотом: цифры вывода и как устроены другие системы
π0 — 3,3B параметров: Gemma 2B с энкодером картинок SigLIP и action expert на 300M. Вывод на RTX 4090 с тремя камерами: энкодеры картинок 14 мс, проход по наблюдению 32 мс, 10 шагов flow matching 27 мс, всего 73 мс. Если модель работает не на компьютере робота, добавляется сеть: 86 мс. Время «без кэша» — наша оценка по той же схеме: 14 + 10 × (32 + 2,7) ≈ 361 мс. KV-кэш работает только на выводе: при обучении и в первом проходе считать всё равно нужно.
В работе о real-time chunking (Black, Galliker, Levine, 2025) prefill KV-кэша π0 занимает 46 мс при шаге управления 20 мс: за один вывод проходит больше двух тиков. Как стыковать пачки без пауз и рывков, разберём в уроке 1.7.
Другие системы. π0-FAST тратит на пачку около 750 мс против ~100 мс у π0: 30–60 токенов действий 2B-модель декодирует по одному. GR00T N1 (2,2B, из них 1,34B — VLM) выдаёт пачку из 16 действий за 63,9 мс на L40; VLM работает на 10 Гц, действия — на 120 Гц. В Helix медленная VLM S2 на 7B работает на 7–9 Гц, быстрая политика S1 на 80M — на 200 Гц и управляет 35 степенями свободы.
Как модели выдают действия
Трансформер внутри у всех, а действия выдают по-разному. Можно записать действие строкой токенов и генерировать их по одному, как текст. Можно выдать всю пачку за один проход декодера. А можно получить пачку из шума за несколько шагов диффузии или flow matching. От способа зависит, сколько проходов модели нужно на одну пачку.
Разложи модели по способу выдачи действий
Перетащи карточку в корзину или нажми карточку, а потом корзину.
Как модели превращают наблюдения и действия в токены
| Модель | Наблюдения → токены | Действия | Внимание |
|---|---|---|---|
| Decision Transformer | состояние через линейный слой (Atari — CNN) плюс токен return-to-go | 1 токен на шаг, предсказывается из токена состояния | GPT, каузальная маска; K шагов — 3K токенов |
| RT-1, 35M | 6 кадров 300 × 300 → FiLM-EfficientNet-B3, язык через USE → 81 → TokenLearner → 8 на кадр, всего 48 | 11 измерений (7 рука, 3 база, 1 режим) × 256 бинов | только декодер, 8 слоёв, 19M |
| RT-2, 55B / 12B | картинка и текст через VLM | строка из 8 целых, 256 бинов | как в исходной VLM |
| OpenVLA, 7B | 224 × 224, DINOv2 + SigLIP → проектор → Llama 2 | 7 измерений × 256 бинов вместо 256 редких токенов словаря | авторегрессия |
| ACT, ~80M | 4 камеры 480 × 640 → ResNet18 → 300 на камеру, плюс суставы и z — 1202 | 100 фиксированных запросов → cross-attention → 100 × 14 | энкодер 4 слоя, декодер 7, CVAE |
| Octo, 27M / 93M | CNN и патчи 16 × 16: 256 (256 × 256) + 64 (запястье 128 × 128), 2 кадра; язык T5 → 16 | readout-токены → диффузионная голова → пачка | блочная маска; readout только читает |
| π0, 3,3B | SigLIP: 256 на кадр (224 px, openpi); состояние → 1 токен | 50 токенов через action expert 300M, flow matching, 10 шагов | 3 блока: [картинки + текст], [состояние], [действия] |
| GR00T N1, 2,2B | 224 × 224 → SigLIP-2 и pixel shuffle → 64 на кадр; признаки 12-го слоя LLM | 16 действий, flow matching, 4 шага | DiT: self-attention по действиям, cross-attention к VLM |
| Helix, 7B + 80M | S2 сжимает сцену и команду в один латентный вектор; у S1 свёрточный энкодер | 35 степеней свободы на 200 Гц | S1 — энкодер-декодер с cross-attention |
Восемь вопросов о типичных заблуждениях
Итоги урока
- Политика превращает всё в токены: патчи картинок, слова команды, состояние, действия. Число токенов — главный рычаг стоимости.
- Внимание: запрос сравнивается с ключами, softmax даёт веса, ответ — смесь значений. Длина запроса задаёт резкость, а при размазанных весах ответ оказывается между вариантами.
- Деление на держит оценки в рабочем диапазоне: без него softmax схлопывается в один пик.
- Маска решает, кто кого видит. Блочная маска π0 отделяет наблюдение от действий, поэтому его можно кэшировать. Головы смотрят на разные признаки, и вместе различают то, что каждая путает.
- Внимание само не знает порядка: его задают позиционные кодировки.
- Квадратичен только член внимания. KV-кэш ускоряет вывод, а пачки отделяют частоту управления от частоты вывода: 73 мс на вывод и 50 Гц на робота.
Открытые вопросы
Хочешь добавить политике четвёртую камеру высокого разрешения. Что посчитаешь, прежде чем решить?
Сколько токенов даст камера: у PaliGemma картинка 224 / 448 / 896 px — это 256 / 1024 / 4096 токенов. Как вырастет член внимания и его доля в стоимости слоя. Сколько добавится KV-кэша и, главное, времени до первого шага flow: у π0 это уже 46 мс из 73. Уложится ли вывод в интервал между запусками пачек. И сколько будет стоить обучение: OpenVLA на 384 px вместо 224 обучалась в 3 раза дольше без прироста качества. Часто дешевле сжать токены, как TokenLearner в RT-1 или 64 токена на кадр в GR00T N1.
Почему π0 может управлять на 50 Гц, если один вывод занимает 73 мс?
Потому что модель выдаёт пачку из 50 действий, а робот исполняет 25 из них по 20 мс: модель нужна раз в 0,5 с, и 73 мс в этот интервал укладываются. Сам вывод быстрый благодаря KV-кэшу: наблюдение проходится один раз, а 10 шагов flow стоят 27 мс. Helix и GR00T идут дальше и разделяют медленную VLM (7–10 Гц) и быструю политику (120–200 Гц).
Гид по статье
A. Vaswani и соавторы, «Attention Is All You Need», NeurIPS 2017.
- Читать внимательноРазделы о scaled dot-product attention, multi-head attention и positional encoding, а также «Why Self-Attention» с таблицей стоимости слоёв.
- Можно пропуститьДетали обучения перевода и таблицы BLEU: base-модель на 65M параметров училась 12 часов на 8 P100, big на 213M — 3,5 дня и дала 28,4 BLEU на EN→DE.
- Вопрос по ходуВ таблице self-attention дешевле рекуррентного слоя, пока . Выполняется ли это для π0, где , а ? Что изменится, если дать π0 картинки 448 px?
Материалы
- The Illustrated TransformerДжей Аламмар — трансформер в картинках; есть и The Illustrated GPT-2
- The Annotated TransformerHarvard NLP — статья 2017 года построчно с кодом
- Let's build GPT: from scratch, in code, spelled outАндрей Карпатый — трансформер с нуля, строка за строкой; код — nanoGPT
- Attention in transformers, step-by-step3Blue1Brown, глава DL6; вводная — DL5, текстовая версия — на сайте
- The Transformer Family Version 2.0Лилиан Венг — обзор вариантов; раньше — Attention? Attention!
- Transformer ExplainerИнтерактивный разбор GPT-2 в браузере; ещё — LLM Visualization
- How caching worksHugging Face — как устроен KV-кэш на выводе
Дальше: пачка действий за один проход. ACT — трансформер, который выдаёт пачку из 100 действий за один проход декодера. Почему пачки помогают, сколько действий брать и что делать на стыках — урок 1.7 «ACT», он выйдет следующим.