Vision Transformers: Глубокое погружение и практика

Интенсивный курс для специалистов с опытом в DL, фокусирующийся на архитектуре трансформеров в компьютерном зрении. Вы пройдете путь от математики Self-Attention до написания ViT с нуля и изучения современных архитектур типа Swin и DETR.

1. От механизмов внимания к архитектуре Transformer: математика Self-Attention и структура энкодера

От механизмов внимания к архитектуре Transformer: математика Self-Attention и структура энкодера

Добро пожаловать в курс «Vision Transformers: Глубокое погружение и практика». Вы уже знакомы с основами глубокого обучения и концепцией внимания (attention), которая зародилась в задачах обработки естественного языка (NLP). Однако настоящая революция произошла в 2017 году с выходом статьи «Attention Is All You Need». Архитектура Transformer, предложенная в ней, отказалась от рекуррентности и сверток в пользу чистого механизма внимания.

В этой статье мы разберем «двигатель» трансформера — механизм Self-Attention (самовнимания) и архитектуру Encoder (энкодера). Именно энкодер станет основой для Vision Transformer (ViT), который мы будем применять к изображениям в следующих модулях. Наша цель сегодня — понять математику процесса настолько глубоко, чтобы вы могли воспроизвести её в коде.

Концепция Self-Attention: Взгляд внутрь данных

В традиционных сверточных нейросетях (CNN) контекст собирается локально: пиксель «видит» только своих соседей через ядро свертки. Чтобы охватить всё изображение, нужно много слоев. В трансформерах механизм Self-Attention позволяет каждому элементу входных данных (будь то слово в предложении или патч изображения) взаимодействовать с каждым другим элементом сразу же, в первом слое.

Чтобы реализовать это, используется концепция Query, Key и Value (Запрос, Ключ, Значение). Эта аналогия пришла из систем поиска информации:

  • Query (Запрос): То, что мы ищем (текущий элемент, который хочет получить контекст).
  • Key (Ключ): Метка, описывающая содержимое (то, с чем мы сравниваем запрос).
  • Value (Значение): Сама информация (то, что мы извлечем, если ключ подойдет к запросу).
  • !Визуализация процесса получения векторов Q, K и V из входного вектора через умножение на матрицы весов.

    Линейные проекции

    Пусть у нас есть входной вектор . Чтобы получить , мы умножаем на три обучаемые матрицы весов:

    Где: * — входной вектор размерности . * — обучаемые матрицы весов размерности . * — полученные векторы запроса, ключа и значения.

    Математика Scaled Dot-Product Attention

    Сердцем трансформера является формула Scaled Dot-Product Attention. Давайте разберем её пошагово. Предположим, мы обрабатываем не один вектор, а сразу матрицу всех входных векторов . Тогда мы получаем матрицы .

    Формула внимания выглядит так:

    Где: * — матрица запросов (Queries). * — матрица ключей (Keys). * — матрица значений (Values). * — операция транспонирования матрицы. * — размерность вектора ключа (используется для масштабирования). * — функция активации, преобразующая числа в вероятностное распределение.

    Шаг 1: Скалярное произведение (Similarity)

    Сначала мы вычисляем . Скалярное произведение двух векторов показывает степень их сходства. Если векторы сонаправлены, произведение велико; если ортогональны — равно нулю.

    Где: * — матрица оценок (scores), показывающая, насколько каждый элемент «похож» на каждый элемент .

    В контексте компьютерного зрения это означает: «насколько этот участок изображения важен для того участка».

    Шаг 2: Масштабирование (Scaling)

    Зачем мы делим на ? При больших размерностях векторов () скалярные произведения могут становиться очень большими по модулю. Это загоняет функцию Softmax в области, где градиенты (производные) крайне малы, что останавливает обучение (проблема исчезающего градиента).

    Деление на нормализует дисперсию результата, возвращая значения в комфортный для градиентов диапазон.

    Шаг 3: Softmax и взвешенная сумма

    Применяя Softmax, мы превращаем оценки сходства в вероятности (веса внимания), которые в сумме дают 1.

    Где: * — матрица весов внимания (Attention Weights).

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

    !Блок-схема операций внутри механизма внимания.

    Multi-Head Attention: Параллельные миры

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

    Multi-Head Attention (многоголовое внимание) решает эту проблему, запуская несколько механизмов внимания параллельно. Каждый «голос» (head) имеет свои собственные матрицы и проецирует входные данные в разные подпространства.

    Математически это выглядит так:

    Где: * — результат работы -й головы. * — операция объединения (конкатенации) векторов. * — выходная линейная матрица, смешивающая результаты всех голов.

    Архитектура Энкодера (The Encoder Block)

    Оригинальный Transformer состоял из Энкодера и Декодера. Для задач компьютерного зрения (в частности, ViT) используется только Энкодер. Давайте разберем его анатомию.

    Энкодер — это стек (набор) из одинаковых слоев. Каждый слой имеет два основных подслоя:

  • Multi-Head Self-Attention (MSA)
  • Feed-Forward Network (FFN) — полносвязная сеть.
  • Вокруг каждого из этих подслоев используются два критически важных элемента:

    * Residual Connections (Остаточные связи): Вход слоя добавляется к его выходу. * Layer Normalization (Слоевая нормализация): Стабилизирует обучение.

    Уравнение для одного блока энкодера можно записать так (в современной вариации Pre-Norm, которая чаще используется в ViT):

    Где: * — вход текущего слоя (выход предыдущего). * — Layer Normalization. * — Multi-Head Self-Attention. * — промежуточный результат после блока внимания. * — Multi-Layer Perceptron (полносвязная сеть). * — выход текущего слоя.

    !Структура блока энкодера с отображением потоков данных и skip-connections.

    Feed-Forward Network (MLP)

    Блок MLP обычно состоит из двух линейных слоев с функцией активации GELU (Gaussian Error Linear Unit) или ReLU между ними. Он обрабатывает каждый вектор независимо и идентично. Если Attention смешивает информацию между разными токенами, то MLP обрабатывает информацию внутри каждого токена, увеличивая нелинейность модели.

    Где: * — матрицы весов слоев MLP. * — векторы смещения (bias). * — функция активации.

    Positional Encoding: Возвращение порядка

    Механизм Self-Attention инвариантен к перестановкам. Если вы перемешаете слова в предложении или патчи в изображении, результат вычисления для пары элементов не изменится (изменится только их позиция в матрице выхода, но не само значение). Для модели «кот на коврике» и «коврик на коте» без информации о позиции были бы неразличимы.

    Чтобы исправить это, к входным векторам добавляются позиционные кодировки (Positional Encodings). Это векторы той же размерности, что и входные данные, содержащие информацию о том, где находится элемент.

    Где: * — итоговый вход в первый слой трансформера. * — векторное представление данных (эмбеддинг). * — вектор позиционного кодирования.

    В Vision Transformers часто используются обучаемые позиционные эмбеддинги, в отличие от фиксированных синусоидальных в оригинальном NLP-трансформере.

    Заключение

    Мы разобрали математический фундамент трансформеров. Вы узнали, как механизм Self-Attention позволяет модели глобально анализировать данные, используя аналогии Query-Key-Value, и зачем нужно масштабирование на . Мы также изучили архитектуру блока Энкодера, который станет основным строительным блоком для Vision Transformers.

    В следующей статье мы перейдем от теории к практике компьютерного зрения: узнаем, как превратить 2D-изображение в последовательность векторов, понятную трансформеру, и построим архитектуру ViT.

    2. Архитектура Vision Transformer (ViT): патчинг изображений, линейные проекции и позиционные эмбеддинги

    Архитектура Vision Transformer (ViT): патчинг изображений, линейные проекции и позиционные эмбеддинги

    В предыдущей статье мы детально разобрали механизм Self-Attention и архитектуру энкодера Трансформера. Мы выяснили, что энкодер ожидает на входе последовательность векторов. В задачах обработки естественного языка (NLP) это интуитивно понятно: предложение — это последовательность слов (токенов). Но как быть с изображениями?

    Изображение — это двумерная сетка пикселей, обладающая сильной пространственной корреляцией. Если мы просто вытянем все пиксели в одну длинную строку, последовательность получится слишком огромной для механизма Self-Attention, сложность которого квадратично зависит от длины входа. Решением этой проблемы стала архитектура Vision Transformer (ViT), представленная в статье «An Image is Worth 16x16 Words» (2020).

    В этой статье мы разберем процесс подготовки изображения для подачи в Трансформер: от нарезки на патчи до добавления позиционной информации.

    1. От пикселей к патчам: Патчинг изображений

    Чтобы сделать изображение «съедобным» для стандартного Трансформера, ViT отказывается от попиксельной обработки. Вместо этого изображение разбивается на фиксированные квадратные участки, называемые патчами (patches).

    Представьте, что у вас есть изображение размером пикселей с цветовыми каналами (обычно для RGB). Мы выбираем размер патча (например, ).

    !Визуализация того, как изображение разрезается на сетку патчей, которые затем выстраиваются в последовательность.

    Количество патчей , которое мы получим, вычисляется по формуле:

    Где: * — итоговое количество патчей (длина последовательности для трансформера). * — высота исходного изображения. * — ширина исходного изображения. * — размер стороны одного патча.

    Каждый патч — это маленький трехмерный кубик данных размером . Чтобы превратить его в вектор, мы выполняем операцию выравнивания (flattening). Мы просто выписываем все значения пикселей этого патча в один длинный вектор.

    Размерность такого вектора будет равна:

    Где: * — размерность выровненного вектора одного патча. * — размер стороны патча. * — количество каналов.

    Например, для стандартного патча и RGB изображения размерность вектора будет . Теперь наше изображение превратилось в последовательность из векторов, каждый размером .

    2. Линейная проекция (Linear Projection of Flattened Patches)

    Хотя мы получили последовательность векторов, их размерность () зависит от размера патча и может быть неудобной для внутренней архитектуры трансформера. Трансформер оперирует векторами фиксированной скрытой размерности (Latent Vector Size, часто обозначается как ).

    Поэтому каждый выровненный вектор патча проходит через обучаемый линейный слой (Linear Projection). Это обычное умножение на матрицу весов, которое проецирует вектор из размерности патча в скрытую размерность .

    Математически это записывается так:

    Где: * — полученный эмбеддинг патча (вектор размерности ). * — исходный вектор -го патча (размерности ). * — обучаемая матрица проекции размерности .

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

    Результат этого этапа — последовательность Patch Embeddings.

    3. Классовый токен ([CLS] Token)

    В задачах классификации нам нужно получить один вектор, который описывает всё изображение, чтобы подать его в классификатор (MLP Head). Какой из векторов на выходе трансформера взять? Усреднить их? Взять первый? Взять последний?

    Авторы ViT позаимствовали идею из модели BERT (NLP). Они добавляют к последовательности эмбеддингов патчей еще один специальный обучаемый вектор — [CLS] token.

    Этот вектор не связан ни с каким участком изображения. Он добавляется в самое начало последовательности (позиция 0). Механизм Self-Attention позволяет этому токену «общаться» со всеми остальными патчами и агрегировать в себе информацию обо всем изображении по мере прохождения через слои энкодера.

    Таким образом, входная последовательность для энкодера выглядит так:

    Где: * — полная входная последовательность векторов. * — обучаемый вектор классового токена ([CLS]). * — эмбеддинги патчей изображения.

    4. Позиционные эмбеддинги (Positional Embeddings)

    Как мы обсуждали в прошлой статье, механизм Self-Attention не знает порядка элементов. Для него набор патчей — это просто «мешок», где патч с неба и патч с травой равноправны, и неизвестно, кто из них сверху, а кто снизу. Но для изображения структура критически важна.

    Чтобы вернуть информацию о пространстве, к каждому эмбеддингу (включая [CLS] токен) прибавляется (не конкатенируется, а именно суммируется) вектор позиционного кодирования.

    В ViT используются стандартные обучаемые 1D позиционные эмбеддинги. Это значит, что модель сама учит вектор для «позиции 1», вектор для «позиции 2» и так далее во время тренировки.

    Итоговая формула входа в первый слой трансформера:

    Где: * — итоговый вход в энкодер. * — матрица линейной проекции. * — матрица позиционных эмбеддингов размерности .

    Почему 1D, а не 2D? Авторы экспериментировали с 2D-эмбеддингами (отдельно кодировать X и Y координаты), но выяснили, что это не дает прироста точности. Модель достаточно умна, чтобы через 1D последовательность выучить 2D структуру (например, понять, что патч 5 находится под патчем 1 в сетке 4x4).

    !Детальная архитектура Vision Transformer: от входного изображения до классификации через Transformer Encoder.

    5. Индуктивное смещение (Inductive Bias)

    Важно понимать фундаментальное различие между CNN (сверточными сетями) и ViT. CNN имеют сильное индуктивное смещение:

  • Локальность: пиксели рядом связаны сильнее, чем далекие.
  • Инвариантность к сдвигу: кошка в левом углу — это та же кошка, что и в правом (благодаря общим весам ядра свертки).
  • ViT имеет гораздо меньше индуктивного смещения. Он не знает заранее, что соседние патчи важны друг для друга — он должен выучить это с нуля, используя огромные объемы данных. Единственное место, где в ViT осталось индуктивное смещение — это этап нарезки на патчи (мы предполагаем, что пиксели внутри патча локально связаны) и позиционные эмбеддинги (которые учат структуру).

    Именно поэтому ViT требует больше данных для обучения, чем ResNet, но при наличии этих данных способен достигать лучших результатов, так как не ограничен жесткими рамками сверток.

    Заключение

    Сегодня мы построили «входную дверь» для Vision Transformer. Мы узнали, как превратить 2D изображение в 1D последовательность через патчинг и линейную проекцию, зачем нужен [CLS] токен и как позиционные эмбеддинги возвращают изображению структуру.

    Теперь у нас есть полный пайплайн:

  • Изображение Патчи.
  • Патчи Проекция + [CLS] + Позиция.
  • Последовательность Transformer Encoder (из прошлой статьи).
  • Выход [CLS] Классификация.
  • В следующей части курса мы перейдем к практической реализации ViT на PyTorch, написав каждый из этих блоков своими руками.

    3. Практика: реализация Vision Transformer с нуля на PyTorch и разбор слоев Multi-Head Attention

    Практика: реализация Vision Transformer с нуля на PyTorch и разбор слоев Multi-Head Attention

    Добро пожаловать в практическую часть курса! В предыдущих статьях мы разобрали теоретический фундамент: от математики Self-Attention до концепции патчинга изображений. Теперь пришло время закатать рукава и реализовать архитектуру Vision Transformer (ViT) с нуля, используя библиотеку PyTorch.

    Наша цель — не просто скопировать код, а понять, как абстрактные формулы превращаются в операции с тензорами. Мы построим модель по кирпичикам: начнем с подготовки патчей, реализуем механизм внимания, соберем блок энкодера и объединим всё в финальную модель.

    1. Подготовка данных: Слой Patch Embedding

    Как мы помним, трансформер не умеет работать с сырой сеткой пикселей. Ему нужна последовательность векторов. Первый шаг — разрезать изображение на квадраты и спроецировать их.

    Вместо того чтобы вручную нарезать изображение циклами (что медленно), мы используем хитрость: сверточный слой nn.Conv2d. Если установить размер ядра (kernel_size) и шаг (stride), равными размеру патча, свертка сделает именно то, что нам нужно: пройдет по изображению без перекрытий и сразу спроецирует пиксели в нужное пространство размерности.

    !Использование свертки для одновременного патчинга и линейной проекции.

    Реализуем класс PatchEmbed:

    Здесь мы используем операцию транспонирования, чтобы поменять местами размерность каналов и последовательности. Это критически важно, так как слои Linear в PyTorch работают с последним измерением тензора.

    2. Сердце трансформера: Multi-Head Self-Attention (MSA)

    Это самый сложный и важный блок. Напомним формулу внимания:

    Где: * — матрицы запросов, ключей и значений. * — операция транспонирования. * — размерность вектора ключа (используется для масштабирования). * — функция активации для получения вероятностей.

    В коде нам нужно учесть наличие нескольких голов (heads). Это означает, что мы делим наш вектор эмбеддинга на несколько частей и обрабатываем их параллельно.

    Обратите внимание на манипуляции с размерностями (reshape, permute). Мы выносим измерение Heads вперед, чтобы PyTorch мог выполнять матричное умножение (@) параллельно для всех голов сразу. Это называется batch matrix multiplication.

    3. Многослойный перцептрон (MLP)

    Блок MLP (или Feed-Forward Network) обрабатывает информацию внутри каждого токена независимо. Он состоит из двух линейных слоев и функции активации GELU.

    Обычно скрытая размерность hidden_features в 4 раза больше входной in_features. Это позволяет модели проецировать данные в пространство более высокой размерности для поиска сложных зависимостей.

    4. Блок Энкодера (Block)

    Теперь соберем всё вместе в один повторяющийся блок. В ViT используется архитектура Pre-Norm, где нормализация применяется перед слоями внимания и MLP.

    Формула блока:

    Где: * — вход блока. * — Layer Normalization. * — Multi-Head Self-Attention. * — Multi-Layer Perceptron. * — выход блока.

    5. Сборка Vision Transformer

    Финальный аккорд. Нам нужно:

  • Использовать PatchEmbed.
  • Создать обучаемый [CLS] токен.
  • Создать обучаемые позиционные эмбеддинги.
  • Собрать стек из блоков Block.
  • Добавить классификационную голову (Head).
  • Разбор ключевых моментов

    * nn.Parameter: Мы оборачиваем тензоры cls_token и pos_embed в nn.Parameter, чтобы PyTorch знал, что это обучаемые веса модели, и обновлял их градиентным спуском. * expand: Токен cls_token хранится как один вектор, но в forward мы размножаем его на размер батча B, так как у каждого изображения в батче должен быть свой CLS токен. * x[:, 0]: В конце мы отбрасываем все выходы, соответствующие патчам изображения, и оставляем только выход, соответствующий CLS токену (индекс 0). Именно он накопил глобальную информацию.

    Заключение

    Поздравляю! Вы только что реализовали одну из самых влиятельных архитектур современного глубокого обучения. Мы прошли путь от сырых тензоров до полноценной модели ViT.

    Конечно, в реальных библиотеках (например, timm) код может быть более оптимизирован и содержать дополнительные трюки для стабильности, но ядро остается именно таким. Понимание того, как работают размерности (Batch, Heads, N, Dim) и как данные перетекают через слои, дает вам полный контроль над моделью.

    В следующих статьях мы обсудим, как обучать эту модель, какие стратегии аугментации данных критически важны для ViT и как использовать предобученные веса.

    4. Эволюция архитектур: иерархические трансформеры Swin и методы эффективного обучения DeiT

    Эволюция архитектур: иерархические трансформеры Swin и методы эффективного обучения DeiT

    В предыдущих модулях мы разобрали классический Vision Transformer (ViT). Мы реализовали его с нуля и увидели, что он способен обрабатывать изображения как последовательность патчей. Однако, несмотря на революционность, оригинальный ViT имеет два существенных недостатка:

  • Квадратичная сложность: Механизм Self-Attention сравнивает каждый патч с каждым. Если увеличить разрешение изображения, количество патчей растет, а вычислительная сложность взлетает по экспоненте.
  • Жажда данных: ViT лишен индуктивного смещения (inductive bias), свойственного сверточным сетям (CNN). Чтобы выучить структуру изображений, ему требуются огромные датасеты (например, JFT-300M), недоступные большинству исследователей.
  • В этой статье мы рассмотрим два знаковых ответа на эти вызовы: DeiT (Data-efficient Image Transformers), который решил проблему обучения на малых данных, и Swin Transformer, который вернул иерархичность и эффективность сверточных сетей в мир трансформеров.

    DeiT: Эффективность через дистилляцию

    Статья «Training data-efficient image transformers & distillation through attention» (2021) от Facebook AI Research предложила способ обучать трансформеры на стандартном датасете ImageNet (1.2 млн изображений) без потери качества, догоняя и перегоняя CNN.

    Ключевая идея DeiT — дистилляция знаний (Knowledge Distillation). Это процесс, при котором одна модель (Учитель, Teacher) обучает другую (Ученика, Student).

    Архитектура Учитель-Ученик

    В качестве учителя обычно берется мощная сверточная сеть (например, RegNet), так как CNN лучше понимают локальную структуру изображений при малом количестве данных. Учеником выступает Vision Transformer.

    Авторы DeiT внедрили инновацию: токен дистилляции (Distillation Token). Вспомните, что в ViT мы добавляем [CLS] токен для классификации. В DeiT к входной последовательности добавляется еще один обучаемый вектор — [DIST].

    !Архитектура DeiT с двумя специальными токенами и потоками обучения.

    Токен дистилляции взаимодействует с патчами через Self-Attention так же, как и классовый токен, но его цель — воспроизвести предсказания учителя.

    Hard Distillation Loss

    DeiT использует особую функцию потерь. Вместо того чтобы просто минимизировать разницу вероятностей (как в классической Soft Distillation), они используют «жесткую» дистилляцию. Ученик учится предсказывать тот же класс, который выбрал учитель (даже если учитель ошибся).

    Общая функция потерь выглядит так:

    Где: * — итоговая функция потерь. * — перекрестная энтропия (Cross-Entropy Loss). * — истинная метка класса (Ground Truth). * — предсказание модели на основе [CLS] токена. * — жесткое предсказание учителя (argmax его выхода). * — предсказание модели на основе [DIST] токена.

    Такой подход позволил DeiT достичь точности более 83% на ImageNet, обучаясь только на нем, без использования гигантских закрытых датасетов.

    Swin Transformer: Иерархия и сдвинутые окна

    Если DeiT решал проблему данных, то Swin Transformer (2021) от Microsoft решал проблему масштабируемости и применимости к задачам детекции и сегментации.

    Классический ViT — изотропный. Это значит, что размерность карт признаков не меняется от входа до выхода (всегда патчей). Сверточные сети (ResNet, VGG) — иерархические. Они начинают с большого разрешения, а затем постепенно уменьшают его, увеличивая количество каналов. Это создает «пирамиду признаков», что критически важно для детекции мелких объектов.

    Swin Transformer (Shifted WINdow Transformer) возвращает эту пирамидальную структуру.

    Window-based Self-Attention (W-MSA)

    Вместо того чтобы вычислять внимание между всеми патчами изображения (Global Attention), Swin разбивает изображение на окна фиксированного размера (например, патчей, где ). Внимание вычисляется только внутри каждого окна.

    Давайте сравним вычислительную сложность. Для изображения, состоящего из патчей:

    Сложность глобального MSA (как в ViT):

    Где: * — вычислительная сложность (количество операций). * — высота и ширина изображения в патчах. * — размерность скрытого вектора (channels). * — тот самый квадратичный член, который делает ViT медленным на больших картинках.

    Сложность оконного W-MSA (Swin):

    Где: * — размер окна (фиксированная константа, обычно 7).

    Заметьте, что во второй формуле нет . Сложность теперь линейно зависит от количества пикселей (). Это позволяет обрабатывать изображения высокого разрешения (например, ) намного быстрее.

    Shifted Windows (Сдвинутые окна)

    Если мы будем считать внимание только внутри изолированных окон, информация не сможет перетекать из одного окна в другое. Поле восприятия (receptive field) будет ограничено размером окна. Чтобы решить эту проблему, авторы предложили механизм Shifted Windows.

    В четных слоях (Layer ) окна разбиваются стандартно. В нечетных слоях (Layer ) сетка окон сдвигается на пикселей.

    !Механизм сдвига окон для обмена информацией между локальными зонами.

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

    Patch Merging

    Чтобы создать иерархию (уменьшать разрешение по мере глубины), Swin использует слой Patch Merging. Он работает аналогично пулингу (pooling) в CNN, но без потери информации.

    Слой берет группу из соседних патчей и объединяет их (конкатенирует). Если у нас было 4 вектора размерности , мы получаем один вектор размерности . Затем применяется линейный слой, чтобы уменьшить размерность до .

    В результате: * Разрешение уменьшается в 2 раза (). * Количество каналов удваивается ().

    Это в точности повторяет логику работы блоков в ResNet.

    Сравнение подходов

    | Характеристика | ViT (Original) | DeiT | Swin Transformer | | :--- | :--- | :--- | :--- | | Структура | Изотропная (цилиндр) | Изотропная | Иерархическая (пирамида) | | Attention | Глобальный | Глобальный | Локальный (в окнах) | | Сложность | | | (линейная) | | Обучение | Требует JFT-300M | Работает на ImageNet-1k | Работает на ImageNet-1k | | Ключевая фишка | Чистый Attention | Дистилляция + Токен | Сдвинутые окна |

    Заключение

    Появление DeiT и Swin Transformer ознаменовало второй этап развития визуальных трансформеров. DeiT показал, что трансформеры можно эффективно обучать без датасетов размером с интернет, используя знания, накопленные сверточными сетями. Swin Transformer адаптировал архитектуру под задачи высокого разрешения, вернув проверенную временем иерархическую структуру.

    Эти модели стали стандартом де-факто во многих задачах компьютерного зрения, вытесняя как чистые CNN, так и оригинальный ViT. В следующем практическом занятии мы рассмотрим, как использовать предобученные версии этих моделей из библиотеки timm для решения реальных задач.

    5. Продвинутое применение: трансформеры в задачах детекции объектов (DETR) и сегментации

    Продвинутое применение: трансформеры в задачах детекции объектов (DETR) и сегментации

    Мы прошли долгий путь от понимания базовых механизмов внимания до реализации классификатора Vision Transformer (ViT) и изучения иерархических моделей вроде Swin. До сих пор мы рассматривали изображения целиком: «Что изображено на этой картинке?». Это задача классификации.

    Однако в реальном мире (например, в беспилотных автомобилях или медицинской диагностике) нам часто нужно знать не только что изображено, но и где это находится, и какие именно пиксели к этому относятся. Это задачи детекции объектов (Object Detection) и сегментации (Segmentation).

    До 2020 года в этих областях безраздельно правили сверточные нейросети (CNN) с множеством инженерных надстроек: якорями (anchors), подавлением немаксимумов (NMS) и сложными эвристиками. В этой статье мы разберем, как архитектура Transformer, и в частности модель DETR (DEtection TRansformer), перевернула игру, предложив элегантный подход «от начала до конца» (end-to-end).

    Детекция объектов: Смена парадигмы

    Классические детекторы (такие как Faster R-CNN или YOLO) работают по принципу «сканирования». Они генерируют тысячи потенциальных рамок (bounding boxes) разных размеров и пропорций по всему изображению, а затем пытаются классифицировать содержимое каждой рамки и уточнить её координаты. Это порождает проблему дубликатов: один и тот же объект может быть найден десятком рамок. Чтобы оставить только одну, используется алгоритм Non-Maximum Suppression (NMS), который является ручной эвристикой, а не обучаемой частью сети.

    Трансформеры предлагают другой подход: предсказание множества (Set Prediction). Модель учится выдавать фиксированный набор предсказаний, где каждое предсказание уникально сопоставляется с реальным объектом.

    Архитектура DETR

    Модель DETR, представленная исследователями Facebook AI (ныне Meta AI), объединяет сверточную сеть и трансформер.

    !Общая схема работы DETR: от изображения через CNN и Трансформер к финальным рамкам.

    Пайплайн выглядит так:

  • CNN Backbone: Изображение проходит через обычную сверточную сеть (например, ResNet-50). На выходе мы получаем карту признаков низкого разрешения, но с большим количеством каналов.
  • Transformer Encoder: Карта признаков выравнивается в последовательность векторов (как патчи в ViT), к ним добавляются позиционные эмбеддинги, и всё это обрабатывается энкодером. Это позволяет каждому участку изображения «узнать» о контексте всего изображения.
  • Transformer Decoder: Самая интересная часть. Декодер принимает информацию от энкодера и специальные обучаемые векторы — Object Queries.
  • Prediction Heads: Выходы декодера проходят через простые полносвязные слои (FFN), которые предсказывают класс объекта и координаты рамки .
  • Object Queries: Вопросы к изображению

    В ViT мы использовали один [CLS] токен. В DETR мы используем токенов (обычно ), которые называются Object Queries (запросы объектов).

    Эти запросы — это обучаемые векторы, которые подаются на вход декодеру. Можно представить их как «слотов» или «детективов», каждый из которых учится искать объекты в определенных зонах или определенного типа. В процессе прохождения через слои декодера, эти запросы «общаются» с выходами энкодера (через механизм Cross-Attention), собирая информацию об объектах.

    В конце работы сети каждый из запросов превращается в предсказание: * Либо «Здесь объект класса