Автор: Нина Коновалова Редактура: Шамиль Мамедов

Введение

Недавно OpenAI представили миру диффузионную модель SORA. Она ****способна генерировать видео потрясающего качества на основе картинки, текстового промпта или даже видео.

Рисунок 1. Схема видео-диффузионной модели SORA (источник: https://arxiv.org/pdf/2402.17177v1.pdf)

Рисунок 1. Схема видео-диффузионной модели SORA (источник: https://arxiv.org/pdf/2402.17177v1.pdf)

Конечно, деталей, архитектуру, процесс обучения нам открывать не стали. Зато сослались на некоторые полезные работы. В этом обзоре мы и поговорим о трансформерной архитектуре, которую применили в SORA (кстати, Stability выложили статью по StableDiffusion 3, которая тоже будет трансформерной).

Наш обзор скорее верхнеуровневый и без страшной математики 🙂

Сначала мы вспомним, что такое Vision Transformer и как он работает, поговорим о Masked Autoencoders для маскированных данных. А затем перейдем к статьям, где было предложено поменять стандартную архитектуру UNet на трансформерную, и узнаем, к какому результату это все привело.

Transformers for images

Для начала вспомним идею трансформерной архитектуры для задачи компьютерного зрения (CV). Она пришла в CV из NLP, оказалась очень полезной и часто используемой в самых различных задачах.

ViT

📄 Paper

📎 GitHub

Первая ключевая работа, на основе которой было построено множество других — это ViT, или Visual Transformer.

Visual Transformer — трансформерная модель, которая работает с изображениями.

Рисунок 2. Схема работы Vision Transfromer (источник: ViT)

Рисунок 2. Схема работы Vision Transfromer (источник: ViT)

Авторы статьи постарались как можно точнее сохранить идею NLP transformers, применив ее к изображениям. Обычно трансформеры принимают на вход последовательность токенов (векторов). Но у нас есть картинка размером $W \times H \times C$. Что можно сделать, чтобы превратить наше изображение в такую последовательность?

Давайте возьмем картинку и разрежем ее на одинаковые патчи меньшего размера - $x^p_i \in \mathbb{R}^{P \times P \times C}$, затем проведем операцию Flatten и превратим патч в вектор размером $P^2 \cdot C$. Тогда количество патчей будет равно $N = \frac{HW}{P^2}$. Далее при помощи линейного преобразования проецируем это в некоторый вектор эмбеддинга $z_i = x_i^p\mathbf{E}$, где $E \in \mathbb{R}^{(P^2C) \times D}$— матрица преобразования.

Еще нам нужно передать информацию о структуре изображения. Также, как и в задачах NLP, кодируем позиции токенов (positional embeddings), которые складываются с эмбеддингами патчей и подаются в финальный трансформер. Для более подробного ознакомления с ViT рекомендуем вам почитать этот пост 🙂

Эта работа очень важна: она получила широкое распространение, много различных продолжений и улучшений. Мы не будем подробно останавливаться на каждом, но отметим некоторые из них.

BEiT: BERT Pre-Training of Image Transformers