Modern Robotics и Physical AIУрок 2.1 · Transporter и CLIPort
Глоссарий
2.1 Часть 2 · Пространственные представления, язык и планирование

Transporter и CLIPort: где и что

Политики части 1 смотрят на картинку и выдают числа: координаты или углы суставов. На каждый навык им нужны десятки демонстраций, а команду словами большинство из них не понимает. Но в задачах на столе действие — точка на той же картинке, которую видит робот: взять здесь, положить туда. Transporter превращает действие в карту по пикселям и учится брать предмет по одной демонстрации. CLIP связывает слова с картинками, а CLIPort соединяет одно с другим: CLIP отвечает, что брать, Transporter — где.

≈ 45 минут3 лаборатории, интерактив и квизмиссии с целью
СЛОВАОбучи маленький CLIP прямо на странице и найди предмет, которого не было в обучении
КАРТАНаучи робота брать кубик по одной демонстрации и сравни с регрессией координат
УКЛАДКАНайди поворот, при котором деталь войдёт в гнездо, по картам для 36 углов
КОМАНДАСоедини слова с картами и проверь цвет, которого не было в демонстрациях

Начать урок ↓

1 Слова

Картинки и подписи в одном пространстве

Чтобы выполнить команду «положи синий кубик в миску», робот должен связать слова с тем, что видит. Классический путь — детектор с фиксированным списком классов. Но на каждый новый предмет или признак ему нужны новые размеченные картинки.

CLIP (Radford и соавторы, OpenAI, 2021) учится иначе. Берут 400 миллионов пар «картинка — подпись» из интернета и две сети: одна превращает картинку в вектор, другая — подпись. Задача обучения — угадать, какая подпись к какой картинке. В пакете из N пар N верных сочетаний и N² − N неверных: векторы верных пар сближают, неверных — разводят. Это контрастное обучение.

После обучения слова и картинки живут в одном пространстве. Чтобы найти предмет, достаточно описать его словами: побеждает картинка, вектор которой ближе всего к вектору текста. Так CLIP без единой размеченной картинки из ImageNet угадывает 76,2% классов — столько же, сколько ResNet-50, обученный на 1,28 миллиона размеченных картинок.

Проверим это в миниатюре. Предметы — четыре формы шести цветов, подписи — «цвет + форма». Одного сочетания в обучении нет совсем: фиолетового кубика модель не увидит ни разу.

🔬 Лаборатория 1

По строкам — подписи, по столбцам — картинки. Чем ярче клетка, тем ближе векторы подписи и картинки. Обведена диагональ: верные пары.

Поиск по описанию

Пунктиром обведён фиолетовый кубик: в обучении его не было.

Под капотом: контрастная цель и наша маленькая модель

Пусть в пакете NN пар, uiu_i — нормированный вектор ii-й картинки, vjv_j — нормированный вектор jj-й подписи, τ\tau — температура. Сходство — скалярное произведение, а цель — две перекрёстные энтропии: для каждой картинки угадать её подпись среди NN и для каждой подписи — её картинку:

ℓij=ui⋅vjτ,L=−12N∑i(log⁡eℓii∑jeℓij+log⁡eℓii∑jeℓji).\begin{gathered} \ell_{ij} = \frac{u_i \cdot v_j}{\tau}, \\ \mathcal L = -\frac{1}{2N}\sum_{i}\Bigl(\log \frac{e^{\ell_{ii}}}{\sum_j e^{\ell_{ij}}} + \log \frac{e^{\ell_{ii}}}{\sum_j e^{\ell_{ji}}}\Bigr). \end{gathered}

У CLIP картинку кодирует ResNet или ViT, подпись — трансформер. Пакет — 32 768 пар, температура обучается, начальное значение 0,07.

У нас картинка — 16 × 16 пикселей, её кодирует сеть с одним скрытым слоем: 768 → 48 → 16. Подпись — сумма векторов двух слов, цвета и формы, по 16 чисел на слово. Векторы нормируются, τ=0,1\tau = 0{,}1. Пакет — 16 разных пар, у каждой картинки случайный сдвиг, размер и шум; 600 шагов Adam. Матрица на сцене — восемь пар, которых модель не видела в этом виде: картинки нарисованы заново.

Модель ни разу не видела фиолетовый кубик, но нашла его. Вектор подписи — сумма векторов слов, а цвет и форму картинки сеть научилась кодировать по отдельности: фиолетовый она видела на мяче, миске и банке, кубик — пяти других цветов. У CLIP то же даёт масштаб: в 400 миллионах пар встречается почти любое сочетание признаков. Роботу это и нужно — понимать слова, которых нет в его демонстрациях.

Но CLIP отвечает только на вопрос «что». Он сравнивает с текстом картинку целиком и не говорит, в каком месте стола взять предмет и куда его положить. Как получить из картинки место действия?

🔬 Лаборатория 2

Действие — клетка на картинке

Политики части 1 выдают действие числами: по всей картинке сеть вычисляет координаты предмета. Если кубик сдвинулся, сеть должна заметить сдвиг и пересчитать числа, и этому её учат на сотнях примеров с кубиком в разных местах.

Transporter (Zeng и соавторы, Google, 2020) замечает, что в задачах на столе действие уже лежит в картинке. Камеры глубины смотрят на стол, и по их снимкам собирают вид сверху, который совпадает со столом: каждый пиксель — место, куда робот может опустить захват. Значит, можно не вычислять координаты, а оценить каждый пиксель: насколько хорошо взять здесь. Получается карта, и робот берёт там, где она ярче.

Карту считает полносвёрточная сеть: одни и те же веса скользят по всей картинке. Сдвинули кубик — пик карты сдвинулся вместе с ним. Это эквивариантность сдвига: учить отдельно каждое положение кубика не нужно.

Ада — домашний гуманоидный робот, на котором построены лабораторные работы курса. Подробнее о ней — в уроке 0.1.

Проверим на столе Ады. Демонстрация — сцена, где оператор берёт красный кубик. Обучим две модели: карту — один фильтр 5 × 5, который скользит по сетке стола 24 × 24, — и регрессию координат — сеть, которая по всей картинке выдаёт два числа, как в части 1. Проверка — 30 новых сцен, где предметы лежат в других местах.

Вид на стол сверху: квадраты — кубики, кольцо — миска, круг — мяч.

Карта «где взять» целиком. Тот же стол сверху, 24 × 24 клетки: чем темнее клетка, тем выше оценка «взять здесь». На большой сцене видна только её вершина.

Под капотом: карта, softmax по клеткам и эквивариантность

Сеть выдаёт оценку Q(u,v)Q(u, v) для каждой клетки (u,v)(u, v). Вероятность взять в клетке — softmax по всем клеткам, а цель обучения — перекрёстная энтропия с клеткой, где брал оператор:

p(u,v)=eQ(u,v)∑u′,v′eQ(u′,v′),L=−log⁡p(u∗,v∗),f(g∘o)=g∘f(o).\begin{gathered} p(u, v) = \frac{e^{Q(u, v)}}{\sum_{u', v'} e^{Q(u', v')}}, \qquad \mathcal L = -\log p(u^*, v^*), \\ f(g \circ o) = g \circ f(o). \end{gathered}

Последнее равенство — эквивариантность: если gg сдвигает картинку oo, то карта f(o)f(o) сдвигается так же. У Transporter карту считает глубокая полносвёрточная сеть по виду сверху, собранному из трёх камер RGB-D. У нас — один фильтр 5 × 5 по трём цветам, 75 весов и сдвиг. Регрессия координат — сеть 1728 → 32 → 2 по всей сетке, около 55 тысяч весов, ошибка — средний квадрат. Обе модели обучаются здесь же, 120 и 300 шагов Adam.

Карта брала красный кубик в новых сценах после одной демонстрации, а регрессия промахивалась и после двадцати: ей нужно выучить, как каждое положение кубика превращается в числа. В статье Transporter то же на большом масштабе. В задаче вставить блок в гнездо карта с одной демонстрацией даёт 100%, а свёрточная сеть с регрессией — 8% даже с тысячей демонстраций.

С двумя кубиками разница ещё заметнее: у карты два пика, и робот берёт один из них, а регрессия выдаёт среднее — точку между кубиками. Это мультимодальность из урока 1.3, только теперь она видна на картинке. Взять — половина задачи. Куда положить?

2 Укладка

Куда положить: поиск по шаблону

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

Признаки вырезки и сцены Transporter учит по демонстрациям. У нас они заданы: в прорези гнезда +1, в стенках вокруг неё −1. Деталь — уголок из пяти квадратов. Яркость карты — доля детали, которая легла в прорезь, за вычетом той, что попала на стенки.

🧩 Интерактив
Под капотом: перенос как корреляция признаков

Пусть ψ\psi — признаки вырезки вокруг точки взятия, φ\varphi — признаки всей сцены. Оценка укладки в положение τ\tau (сдвиг и поворот) — их взаимная корреляция:

Qplace(τ)=ψ(o[Tpick])∗φ(o)[τ],Tplace=arg⁡max⁡τQplace(τ).\begin{gathered} Q_{\text{place}}(\tau) = \psi\bigl(o[T_{\text{pick}}]\bigr) * \varphi(o)[\tau], \\ T_{\text{place}} = \arg\max_\tau Q_{\text{place}}(\tau). \end{gathered}

ψ\psi и φ\varphi — две полносвёрточные сети, их учат той же перекрёстной энтропией по положениям, где оператор клал предмет. Поворот перебирают явно: вход поворачивают на k=36k = 36 углов, и оценка становится картой размером H × W × 36. Поэтому сеть не учит поворот как число, а сравнивает повёрнутые копии. На сцене признаки заданы вручную, сетка 32 × 32, деталь — 80 клеток.

Сколько демонстраций нужно

Карты и поиск по шаблону дают Transporter обобщение, которого нет у сетей, выдающих числа. Ниже — успех на задачах из статьи в зависимости от числа демонстраций. GT-State MLP получает на вход точные позы всех предметов — то, что классическому стеку даёт восприятие, — и всё равно учится медленнее.

По горизонтали — число демонстраций, по вертикали — доля успешных попыток. Данные — таблица 2 статьи Transporter, 2020.

Transporter берёт и кладёт по картам и учится на десятках демонстраций. Но он не знает слов: если на столе три кубика, он возьмёт тот, который чаще брали в демонстрациях. Как добавить к картам команду?

🔬 Лаборатория 3

CLIPort: CLIP выбирает, что взять, Transporter — где

CLIP знает слова, но не даёт места. Transporter даёт место, но не знает слов. CLIPort (Shridhar, Manuelli, Fox, 2021) соединяет их в два потока. Семантический поток — признаки CLIP, связанные с текстом команды: он отвечает, что брать. Пространственный — сеть Transporter: она отвечает, где. Потоки сливаются в одну карту «где взять» и «куда положить».

Главное, что даёт CLIP, — слова, которых не было в демонстрациях. В статье цвета разделены: робота учат на жёлтых, коричневых, серых и голубых предметах, а проверяют на оранжевых, фиолетовых, розовых и белых. Одна модель на 10 задач работает не хуже отдельных моделей для каждой, а на настоящей руке Franka одна модель выучила 9 задач всего по 179 парам «картинка — действие».

Соберём CLIPort в миниатюре. «Где» — фильтр взятия, который учится брать кубики. «Что» — сходство с текстом команды по мини-CLIP из первой лаборатории: для каждой клетки он берёт окно, небольшой квадрат стола вокруг неё, и сравнивает его с командой. Итог — их произведение. Демонстрации робота — команды только с красным, синим и зелёным цветом. Для сравнения — модель, которая учит слова только по этим демонстрациям: к фильтру взятия для каждого слова добавляется свой фильтр.

где
что
итог

Три карты — тот же стол сверху, 24 × 24 клетки, темнее — выше оценка. «Где» — места, где фильтр научился брать кубики, без учёта команды. «Что» — где окно стола похоже на слова команды. «Итог» — их произведение, это карта «где взять», как в лаборатории 2.

Под капотом: как устроен настоящий CLIPort и что мы упростили

В CLIPort семантический поток — замороженный энкодер картинок CLIP (ResNet-50) и его текстовый энкодер. Признаки текста умножают на признаки картинки на нескольких уровнях декодера, а признаки семантического потока на каждом уровне складывают с признаками пространственного. CLIP получает только цвет: он обучен без глубины, а пространственный поток видит RGB-D. Обучение — та же перекрёстная энтропия по положениям взятия и укладки, 200 тысяч шагов на одной видеокарте за два дня.

У нас слияние проще: вероятности двух карт перемножаются, log⁡p=log⁡softmax⁡(Qгде)+log⁡softmax⁡(Qчто/τ)\log p = \log \operatorname{softmax}(Q_{\text{где}}) + \log \operatorname{softmax}(Q_{\text{что}} / \tau), τ=0,05\tau = 0{,}05. Карта «что» — сходство вектора текста с вектором окна 16 × 16 вокруг каждой клетки по мини-CLIP. Фильтр «где» учится на девяти демонстрациях брать названный кубик, но команду не видит. Модель «слова из демонстраций» к общему фильтру прибавляет фильтр слова; у слова, которого не было в демонстрациях, такого фильтра нет.

Модель, которая учила слова по демонстрациям робота, знает три цвета, и фиолетовый для неё — пустое место. CLIPort знает фиолетовый от CLIP, хотя робот ни разу не брал фиолетовый кубик. Демонстрации учат его главному — брать кубики и класть их, — а за слова отвечает модель, обученная на огромном наборе пар из интернета. Это разделение труда стало основой следующих моделей.

3 Сегодня

Что осталось от этих идей

Отдельные потоки «что» и «где» ушли, идеи остались. Энкодер, обученный на парах «картинка — текст», есть почти в каждой модели зрения, языка и действий: у OpenVLA картинку кодируют вместе DINOv2 и SigLIP, наследник CLIP, а π0 построен на модели PaliGemma со своим энкодером SigLIP.

Действие как точка на картинке тоже вернулось. RoboPoint (2024) по команде отмечает на кадре точки, куда тянуться и куда класть. Gemini Robotics-ER (2025) указывает точки, предсказывает захваты, траектории и рамки предметов в 3D. Это карта Transporter, только её выдаёт большая модель, которая понимает язык.

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

4 Проверь себя

Восемь вопросов о типичных заблуждениях

5 Итог

Итоги урока

  1. CLIP учится на 400 миллионах пар «картинка — подпись» угадывать, какая подпись к какой картинке. Слова и картинки попадают в одно пространство, и предмет можно найти по описанию, даже по сочетанию слов, которого не было в обучении.
  2. Transporter выдаёт действие картой по пикселям вида сверху. Сеть эквивариантна сдвигу, поэтому карте хватает одной демонстрации там, где регрессии координат мало и тысячи.
  3. У карты может быть несколько пиков: два одинаковых кубика — два варианта взять, а не среднее между ними.
  4. Укладка — поиск по шаблону: вырезку вокруг взятого предмета сравнивают со сценой на 36 поворотах и кладут туда, где совпадение лучше.
  5. CLIPort соединяет «что» от CLIP и «где» от Transporter. Одна модель учит много задач, а слова, которых не было в демонстрациях робота, понимает благодаря CLIP.

Открытые вопросы

Почему Transporter работает с видом сверху, а не с кадром камеры как есть?

На кадре камеры перспектива искажает размеры и расстояния: один и тот же кубик ближе к камере больше, и пиксель не соответствует одному месту на столе. Вид сверху, собранный по снимкам камер глубины, совпадает со столом, поэтому каждый пиксель — действие, а сдвиг предмета — тот же сдвиг на картинке. Без этого эквивариантность не работает.

Роботу нужно поставить чашку на полку на высоте 30 см. Чего не хватает карте на столе?

Высоты и поворотов по всем осям: карта по пикселям вида сверху задаёт только место на плоскости и поворот вокруг вертикали. Transporter для таких задач добавляет регрессию оставшихся степеней свободы, а PerAct из урока 2.2 переходит к 3D-сетке и ищет следующую позу среди вокселей.

Гид по статье

M. Shridhar, L. Manuelli, D. Fox, «CLIPort: What and Where Pathways for Robotic Manipulation», CoRL 2021.

A. Zeng и соавторы, «Transporter Networks: Rearranging the Visual World for Robotic Manipulation», CoRL 2020 — карты взятия, перенос как корреляция и бенчмарк Ravens.

A. Radford и соавторы, «Learning Transferable Visual Models From Natural Language Supervision», ICML 2021 — CLIP: контрастное обучение и нулевой перенос.

Материалы

➡️

Дальше: PerAct, 3D-представления и язык. Карта по пикселям стола задаёт место на плоскости и поворот вокруг вертикали. Чтобы открыть ящик или поставить чашку на полку, нужно выбрать позу в объёме. PerAct делит пространство на миллион вокселей и ищет следующую ключевую позу как самый ценный воксель — урок 2.2.

Урок был понятен?
Нашли ошибку или неточность? Сообщить на GitHub
Урок пригодился? Скажи спасибо — так автор узнает, что курс читают.