Автор: Нина Коновалова Редактура: Шамиль Мамедов
Недавно OpenAI представили миру диффузионную модель SORA. Она ****способна генерировать видео потрясающего качества на основе картинки, текстового промпта или даже видео.
Рисунок 1. Схема видео-диффузионной модели SORA (источник: https://arxiv.org/pdf/2402.17177v1.pdf)
Конечно, деталей, архитектуру, процесс обучения нам открывать не стали. Зато сослались на некоторые полезные работы. В этом обзоре мы и поговорим о трансформерной архитектуре, которую применили в SORA (кстати, Stability выложили статью по StableDiffusion 3, которая тоже будет трансформерной).
Наш обзор скорее верхнеуровневый и без страшной математики 🙂
Сначала мы вспомним, что такое Vision Transformer и как он работает, поговорим о Masked Autoencoders для маскированных данных. А затем перейдем к статьям, где было предложено поменять стандартную архитектуру UNet на трансформерную, и узнаем, к какому результату это все привело.
Для начала вспомним идею трансформерной архитектуры для задачи компьютерного зрения (CV). Она пришла в CV из NLP, оказалась очень полезной и часто используемой в самых различных задачах.
📄 Paper
📎 GitHub
Первая ключевая работа, на основе которой было построено множество других — это ViT, или Visual Transformer.
Visual Transformer — трансформерная модель, которая работает с изображениями.
Рисунок 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 рекомендуем вам почитать этот пост 🙂
Эта работа очень важна: она получила широкое распространение, много различных продолжений и улучшений. Мы не будем подробно останавливаться на каждом, но отметим некоторые из них.