English translation is not available yet. Showing Russian content.

Как работает vision encoder в GPT-4V / LLaVA?

Краткий тезис

Vision encoder — это компонент мультимодальной LLM, который преобразует изображение в последовательность визуальных токенов. В GPT-4V и LLaVA используется ViT-L/14 (Vision Transformer) на базе CLIP, который разбивает изображение на патчи 14×14 пикселей, проецирует их в эмбеддинги через линейный слой, добавляет позиционные кодировки и пропускает через трансформер. Полученные эмбеддинги затем через MLP-проектор отображаются в пространство LLM, где они обрабатываются как обычные текстовые токены. Это позволяет LLM понимать визуальную информацию без модификации архитектуры.


1. Термин: Vision Encoder и его роль в мультимодальных LLM

Vision encoder — это нейросеть, которая извлекает векторные представления (эмбеддинги) из изображений. В контексте мультимодальных LLM (Large Language Models) он выполняет функцию «моста» между пикселями и языковым пространством.

Роль

  • Преобразовать изображение произвольного размера в фиксированное количество токенов (обычно 256–576 для ViT-L/14).
  • Сохранить пространственную структуру и семантику сцены.
  • Обеспечить совместимость с LLM: выходные эмбеддинги должны быть той же размерности, что и эмбеддинги текстовых токенов.

Без vision encoder LLM не может «видеть» — она работает только с текстом. Поэтому vision encoder — критический компонент для задач VQA (Visual Question Answering), image captioning, мультимодального RAG.


2. Архитектура Vision Transformer (ViT) — основа vision encoder

ViT (Vision Transformer) адаптирует архитектуру Transformer для изображений. Основные шаги:

  1. Разбиение на патчи (patch embedding): изображение делится на квадратные патчи фиксированного размера (например, 14×14 пикселей). Для изображения 224×224 получается (224/14)² = 256 патчей.
  2. Линейная проекция: каждый патч (3 канала × 14×14 = 588 значений) преобразуется в одномерный вектор размерности d (обычно 1024) через обучаемый линейный слой.
  3. Добавление позиционных эмбеддингов: поскольку Transformer не учитывает порядок, к каждому вектору патча прибавляется обучаемый позиционный вектор (1D или 2D).
  4. [[Вики/Добавление [CLS] токена|Добавление [CLS] токена]]: специальный токен, который агрегирует информацию со всех патчей и используется для классификации (в CLIP — для контрастивного обучения).
  5. Пропуск через Transformer encoder: стандартные блоки self-attention + MLP (обычно 24 слоя для ViT-L).

Формула для одного патча

x_patch = Flatten(patch)  # размер 588
h = W @ x_patch + b       # линейная проекция, размер d
h += pos_embedding        # позиционный эмбеддинг

Пример кода (PyTorch-like):

class PatchEmbedding(nn.Module):
    def __init__(self, img_size=224, patch_size=14, in_chans=3, embed_dim=1024):
        super().__init__()
        self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)
    def forward(self, x):
        # x: (B, 3, 224, 224) -> (B, embed_dim, 16, 16) -> (B, 256, embed_dim)
        x = self.proj(x)
        x = x.flatten(2).transpose(1, 2)
        return x

3. CLIP: предобучение vision encoder через контрастивное обучение

CLIP (Contrastive Language-Image Pre-training) — модель OpenAI, которая учит vision encoder и text encoder совместно. Vision encoder (ViT-L/14) обучается так, чтобы эмбеддинги изображений были близки к эмбеддингам соответствующих текстовых описаний в общем пространстве.

Процесс обучения

  • Берётся батч из N пар (изображение, текст).
  • Vision encoder и text encoder порождают эмбеддинги размерности d.
  • Считается матрица косинусных сходств N×N.
  • Применяется контрастивная loss (InfoNCE): диагональные элементы (правильные пары) должны быть максимальны, остальные — минимальны.

Результат vision encoder научается выделять семантически значимые признаки, инвариантные к стилю, освещению, ракурсу. Именно этот предобученный encoder используется в GPT-4V и LLaVA.

Параметры ViT-L/14

  • Размер патча: 14×14
  • Число слоёв Transformer: 24
  • Размерность эмбеддингов: 1024
  • Число голов внимания: 16
  • Входное разрешение: 224×224 (но может быть адаптировано)

4. GPT-4V: как используется vision encoder (известные детали)

OpenAI не раскрыла полную архитектуру GPT-4V, но по косвенным данным (статьи, утечки, анализ поведения) можно восстановить:

  • Vision encoder: CLIP ViT-L/14 (возможно, более новая версия ViT-bigG или SigLIP).
  • Проектор: двухслойный MLP с GELU-активацией, который отображает эмбеддинги патчей (1024-d) в пространство LLM (например, 4096-d для GPT-4).
  • Входной формат: изображение сначала ресайзится до 224×224 (или 336×336), затем encoder выдаёт 256 (или 576) токенов. Эти токены вставляются в последовательность текстовых токенов перед ответом.
  • Обработка: LLM (GPT-4) видит эти токены как обычные текстовые — cross-attention не используется, только self-attention внутри LLM. Это значит, что визуальные токены участвуют в вычислении внимания наравне с текстовыми.

Особенности GPT-4V

  • Поддержка нескольких изображений в одном запросе.
  • Возможность указывать bounding boxes, маски, стрелки на изображении (через специальные токены).
  • Высокое качество понимания сцены, но ограниченное разрешение (детали мелких объектов могут теряться).

5. LLaVA: архитектура и этапы обучения

LLaVA (Large Language and Vision Assistant) — открытая мультимодальная модель, построенная по принципу «vision encoder + проектор + LLM». Архитектура:

  • Vision encoder: CLIP ViT-L/14 (заморожен на первом этапе).
  • Проектор: простой двухслойный MLP (размерность 1024 → 4096 для LLaMA-2).
  • LLM: Vicuna (на базе LLaMA-2) или LLaMA-3.

Обучение в два этапа

  1. Pre-training (выравнивание): на датасете CC3M (Conceptual Captions) — 3 млн пар изображение-подпись. Замораживается vision encoder и LLM, обучается только проектор. Цель: научиться проецировать визуальные эмбеддинги в пространство LLM так, чтобы LLM могла генерировать осмысленные подписи.

  2. Fine-tuning (инструкция): на датасете LLaVA-Instruct-150k — вопросы и ответы по изображениям. Размораживается LLM (или часть слоёв) и проектор, vision encoder остаётся замороженным. Цель: научиться отвечать на вопросы, следовать инструкциям, поддерживать диалог.

Формат входных данных

USER: <image>\nWhat is in this image?
ASSISTANT: A cat sitting on a mat.

Токен <image> заменяется на 256 визуальных токенов от проектора.


6. Проектор (MLP): преобразование визуальных эмбеддингов в токены LLM

Проектор — это небольшая нейросеть (обычно 1–2 слоя MLP), которая отображает эмбеддинги vision encoder в пространство LLM. Зачем он нужен?

  • Размерность эмбеддингов vision encoder (1024) отличается от размерности LLM (4096 для LLaMA-2, 768 для GPT-2).
  • LLM ожидает на входе токены определённой размерности, поэтому нужно линейное преобразование.
  • Проектор также может выполнять нелинейное преобразование, чтобы лучше адаптировать визуальные признаки к языковому контексту.

Пример проектора в LLaVA

class Projector(nn.Module):
    def __init__(self, vision_dim=1024, llm_dim=4096):
        super().__init__()
        self.fc1 = nn.Linear(vision_dim, llm_dim)
        self.gelu = nn.GELU()
        self.fc2 = nn.Linear(llm_dim, llm_dim)
    def forward(self, x):
        # x: (B, num_patches, vision_dim)
        x = self.fc1(x)
        x = self.gelu(x)
        x = self.fc2(x)
        return x

Количество визуальных токенов для изображения 224×224 с патчем 14×14 получается 256 токенов. Это сопоставимо с длиной текстового запроса (обычно 100–500 токенов). Такое количество позволяет LLM обрабатывать изображение без перегрузки контекста.


7. Сравнение GPT-4V и LLaVA

ХарактеристикаGPT-4VLLaVA
Vision encoderCLIP ViT-L/14 (предп.)CLIP ViT-L/14
ПроекторMLP (2 слоя)MLP (2 слоя)
LLMGPT-4 (проприетарная)Vicuna / LLaMA-2/3 (открытая)
Разрешение224×224 (адапт.)224×224
Количество токенов256–576256
ОбучениеНеизвестно (вероятно, end-to-end)2 этапа: pre-train + fine-tune
ДоступностьAPI (платный)Открытые веса
ПроизводительностьВысокая (SOTA)Хорошая (близка к GPT-4V на многих бенчмарках)
Поддержка нескольких изображенийДаДа (в LLaVA-1.5)

Ключевое различие GPT-4V, вероятно, обучался end-to-end (vision encoder тоже дообучался), что даёт более глубокую интеграцию. LLaVA замораживает vision encoder, что упрощает обучение, но может ограничивать качество.


8. Ограничения vision encoder

  1. Фиксированное разрешение: ViT-L/14 работает на 224×224. Если изображение больше, его приходится ресайзить, теряя детали. Мелкие объекты (текст, лица) могут стать неразличимыми.
  2. Потеря пространственной информации: хотя позиционные эмбеддинги сохраняют грубую структуру, детали расположения объектов могут размываться.
  3. Ограниченное количество токенов: 256 токенов — это компрессия изображения в ~16×16 сетку. Для сложных сцен этого может не хватить.
  4. Зависимость от предобучения: CLIP обучался на парах изображение-текст из интернета, поэтому может быть смещён в сторону западного контента и не понимать специфические домены (медицина, спутниковые снимки).
  5. Отсутствие cross-attention: в отличие от моделей типа Flamingo, где визуальные токены взаимодействуют с текстом через cross-attention, в GPT-4V/LLaVA они просто вставляются в последовательность. Это может снижать способность LLM фокусироваться на конкретных регионах изображения.

9. Альтернативные подходы: Q-Former и другие vision encoders

Q-Former (Querying Transformer) — используется в BLIP-2. Это лёгкий трансформер, который «запрашивает» информацию из vision encoder через обучаемые query-токены. Преимущества:

  • Меньше визуальных токенов (32–64), что снижает нагрузку на LLM.
  • Лучшая компрессия и извлечение релевантных признаков.
  • Возможность дообучать Q-Former без изменения vision encoder.

Другие vision encoders

  • SigLIP (Google) — улучшенная версия CLIP с сигмоидной loss, более эффективен.
  • InternViT (InternLM) — большой ViT с 6 млрд параметров, используется в InternVL.
  • DINOv2 — self-supervised ViT, хорош для понимания структуры, но хуже для семантики.

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

МодельVision encoderПроекторЧисло токеновОсобенность
GPT-4VCLIP ViT-L/14MLP256End-to-end обучение
LLaVACLIP ViT-L/14MLP256Простота, открытость
BLIP-2ViT-g/14Q-Former32Компактность, эффективность
FlamingoNFNet-F6Perceiver Resampler64Cross-attention с текстом

10. Роль vision encoder в Agentic RAG (мультимодальный retrieval)

В Agentic RAG агент может получать изображения от пользователя или извлекать их из базы знаний. Vision encoder используется для:

  • Индексации изображений: эмбеддинги изображений (от vision encoder) сохраняются в векторной БД.
  • Поиска по изображению: query-изображение кодируется, ищутся похожие изображения.
  • Мультимодального поиска: комбинированный запрос (текст + изображение) — эмбеддинги объединяются (конкатенация, взвешенная сумма) и ищутся в едином пространстве.
  • Извлечения информации: vision encoder может выделять текст на изображении (OCR), объекты, сцены, которые затем передаются LLM для ответа.

Пример пайплайна

  1. Пользователь загружает фото товара.
  2. Vision encoder (CLIP) превращает фото в эмбеддинг.
  3. Retrieval находит похожие товары в БД.
  4. LLM (с vision encoder) анализирует найденные изображения и генерирует ответ.

11. Пет-проект для закрепления

Задача Реализовать простую мультимодальную модель «vision encoder + проектор + LLM» для ответов на вопросы по изображениям (VQA). Использовать предобученный CLIP ViT и небольшую LLM (например, GPT-2 или TinyLLaMA).

Инструменты

  • Python, PyTorch, Hugging Face Transformers, CLIP (openai/clip-vit-large-patch14).
  • Датасет: COCO VQA (или его подмножество).
  • Библиотека для обучения: Hugging Face Trainer или собственный цикл.

Шаги:

  1. Загрузить CLIP vision encoder и заморозить его.
  2. Создать проектор (MLP 1024 → 768 для GPT-2).
  3. Загрузить GPT-2 (или TinyLLaMA) и заморозить её (кроме embedding layer, если нужно).
  4. Написать класс MultimodalModel, который:
    • Принимает изображение и текст вопроса.
    • Кодирует изображение через CLIP → проектор → визуальные токены.
    • Добавляет токены вопроса и визуальные токены в одну последовательность.
    • Пропускает через LLM и получает ответ.
  5. Обучить проектор на датасете VQA (1000–5000 примеров) с loss cross-entropy на токенах ответа.
  6. Протестировать на новых изображениях.

Ожидаемый результат Модель сможет отвечать на простые вопросы («Что на картинке?», «Какого цвета объект?») с точностью ~60–70% на тестовой выборке. Вы получите практическое понимание, как работает проекция визуальных признаков в языковое пространство.


12. Связь с другими вопросами

ВопросТема
537Как работает мультимодальный эмбеддинг?
539Как обучать vision encoder для RAG?
540Что такое Q-Former и как он используется?
541Как интегрировать изображения в RAG-систему?
542Сравнение GPT-4V и LLaVA: производительность и стоимость
543Как fine-tune vision encoder под специфический домен?

Навигация