# Создание собственного Vision Transformer с нуля: руководство

Источник: https://www.youtube.com/watch?v=4XgDdxpXHEQ
Канал: freeCodeCamp.org
Опубликовано: 25.02.2025

---

## 🤖 Создание Vision Transformer с нуля: глубокое погружение
[[JUMP:0:00]]

Vision Transformer (ViT) сегодня радикально меняет сферу компьютерного зрения, привнося механизмы самовнимания (self-attention) в обработку изображений. В данном руководстве Tunga Barak демонстрирует процесс создания модели Vision Transformer (ViT) с нуля. В ходе обучения разбираются ключевые компоненты: от патч-эмбеддингов (patch embeddings) и многоголового внимания (multi-head attention) до сборки полноценной архитектуры, а также проводится сравнение с известными моделями, такими как CLIP и SigLIP.

### 🧩 Основы работы Vision Transformer
[[JUMP:0:39]]

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

*   **Разбиение на патчи:** Изображение представляется как пазл, где каждый фрагмент является отдельным токеном.
*   **Эмбеддинги:** Каждый патч преобразуется в вектор, отражающий его смысл, с добавлением позиционных эмбеддингов, чтобы модель понимала расположение фрагмента в исходном изображении.
*   **Самообслуживание (Self-attention):** Позволяет патчам взаимодействовать друг с другом и учитывать контекст всей сцены.
*   **CLS-токен:** Специальный токен, который собирает информацию со всех патчей, формируя итоговое представление всего изображения в одном векторе.

### 💡 Особенности модели SigLIP
[[JUMP:2:41]]

В качестве основного примера для реализации выбрана модель **SigLIP** (Sigmoid Loss for Language Image Pre-training) от Google — улучшенная версия знаменитой модели CLIP от OpenAI.

По словам ведущего, ключевая проблема оригинального CLIP заключается в использовании функции потерь `softmax`, которая требует сравнения каждого изображения со всеми текстовыми описаниями в пакете (batch), что крайне затратно вычислительно. SigLIP заменяет это на `sigmoid` loss, позволяя модели фокусироваться на индивидуальных парах «изображение-текст», не отвлекаясь на весь остальной пакет.

Это делает процесс обучения:

1.  **Более эффективным:** Не нужно сравнивать всё сразу.
2.  **Гибким:** Позволяет параллелить вычисления, распределяя матрицы по разным устройствам.

### 🛠 Процесс реализации: шаг за шагом
[[JUMP:11:58]]

Разработка ViT ведется с использованием библиотеки `Transformers` от **Hugging Face**. Процесс можно разделить на несколько ключевых этапов:

#### 1. Подготовка данных
[[JUMP:15:27]]

Изображения нельзя подавать в модель напрямую. Необходима предобработка:

*   **Изменение размера:** До 224x224 пикселей.
*   **Нормализация:** Используются средние значения и стандартные отклонения из датасета `ImageNet`, что считается отраслевым стандартом.
*   **Размерности:** Добавляется `batch dimension`, даже если обрабатывается всего один объект, так как трансформеры ожидают данные «пачками».

#### 2. Архитектура эмбеддингов
[[JUMP:19:34]]

Для преобразования изображения в эмбеддинги используется `convolutional 2D` слой.

*   Размер ядра (kernel) и шаг (stride) устанавливаются равными размеру патча (в данном случае 16x16), что предотвращает их перекрытие.
*   В результате изображение размером 224x224 дает 196 патчей (14x14) с вектором размерностью 768.

#### 3. Механизм внимания (Self-Attention)
[[JUMP:32:12]]

Это «ядро» модели, где каждый патч генерирует три вектора:

*   **Key (ключ):** Информация, которую содержит токен.
*   **Query (запрос):** Информация, которую токен ищет.
*   **Value (значение):** Информация, которая агрегируется, если запрос и ключ совпадают.

Для соответствия весам оригинальных моделей Hugging Face реализация многоголового внимания (multi-head attention) выполняется векторизованно, что эффективнее с точки зрения работы с памятью.

### 🏁 Итоги разработки
[[JUMP:56:19]]

На финальном этапе все компоненты (эмбеддинги, энкодер из 12 слоев и выходная нормализация) объединяются в единый класс `SigLip Vision Transformer`. Успешность реализации подтверждается проверкой: при загрузке предобученных весов Hugging Face разница между результатами собственной модели и оригинальной практически нулевая.

Готовая модель может использоваться как классификатор изображений или как «зрение» для мультимодальных языковых моделей.