English translation is not available yet. Showing Russian content.

Как работает CLIP (Contrastive Language-Image Pre-training) внутренне?

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

CLIP — это мультимодальная модель, которая учится связывать изображения и текст в едином embedding-пространстве с помощью контрастивного обучения (contrastive learning). Модель состоит из двух энкодеров — визуального (например, ViT или ResNet) и текстового (Transformer) — которые обучаются на 400 миллионах пар (изображение, подпись). Основная идея: для батча из N пар максимизировать косинусную близость между правильными парами и минимизировать между неправильными, используя contrastive loss с температурным параметром τ. После обучения CLIP способен выполнять zero-shot классификацию изображений и служить основой для мультимодального RAG.


1. Термин: Contrastive Learning (контрастивное обучение)

Contrastive learning — это парадигма обучения, при которой модель учится различать похожие и непохожие пары объектов. В CLIP похожие пары — это изображение и его текстовая подпись (positive pair), а непохожие — изображение с любой другой подписью из батча (negative pair). Цель: сделать embedding'ы положительных пар ближе друг к другу, а отрицательных — дальше.

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


2. Архитектура CLIP: два энкодера

CLIP состоит из двух независимых энкодеров, которые преобразуют входные данные в векторы фиксированной размерности (обычно 512 или 768).

КомпонентТипВходВыход
Image EncoderVision Transformer (ViT) или ResNetИзображение (224×224 пикселя)Вектор I размерности d
Text EncoderTransformer (обычно 12 слоёв)Текстовая подпись (макс. 77 токенов)Вектор T размерности d

Оба энкодера обучаются совместно, но после обучения могут использоваться независимо. Выходные векторы нормализуются (L2-норма) перед вычислением сходства.

Image Encoder:

  • ViT разбивает изображение на патчи (16×16), добавляет позиционные embedding'и и пропускает через Transformer.
  • ResNet использует свёрточные слои с глобальным пулингом.
  • В оригинальной статье сравниваются обе архитектуры; ViT даёт лучшее качество при больших размерах.

Text Encoder:

  • Стандартный Transformer с causal masking (как в GPT), но без авторегрессии — используется embedding последнего токена (или среднее по всем токенам) как представление всего текста.
  • Максимальная длина — 77 токенов (ограничение для эффективности).

3. Датасет и предобучение

CLIP обучается на собственном датасете WIT (WebImageText), собранном из интернета. Размер: 400 миллионов пар (изображение, текст). Тексты — это alt-тексты, подписи, описания, найденные рядом с изображениями.

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

  1. Батч из N случайных пар (обычно N = 32768).
  2. Для каждой пары вычисляются embeddingI_i и T_i.
  3. Строится матрица сходства S размером N×N, где S_ij = cos(I_i, T_j).
  4. Правильные пары — диагональ матрицы (i=j). Остальные — отрицательные.
  5. Оптимизируется contrastive loss (подробнее в разделе 4).

Важно: батч должен быть большим, чтобы было много отрицательных примеров. CLIP использует огромные батчи (до 32768) для эффективного контрастивного обучения.


4. Contrastive Loss и формула

Основная функция потерь — InfoNCE loss (или multimodal contrastive loss). Для каждого изображения i в батче:

loss_i = -log( exp(sim(I_i, T_i)/τ) / Σ_j exp(sim(I_i, T_j)/τ) )

Где:

  • sim(I_i, T_j) — косинусное сходство между embedding'ом изображения i и текста j.
  • τтемпература (temperature), масштабирующий параметр.
  • Сумма в знаменателе по всем текстам батча (включая правильный).

Аналогичный loss считается для каждого текста (симметрично: для текста i сравниваем со всеми изображениями). Итоговый loss — среднее по всем 2N направлениям (imagetext и textimage).

Интуиция: loss_i мал, когда сходство правильной пары велико, а сходства с неправильными — малы. Логарифм и экспонента превращают это в задачу классификации: для каждого изображения модель должна выбрать правильный текст из N вариантов.

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

import torch
import torch.nn.functional as F

def contrastive_loss(image_embeds, text_embeds, temperature=0.07):
    # image_embeds, text_embeds: (batch_size, dim)
    # Нормализация
    image_embeds = F.normalize(image_embeds, dim=-1)
    text_embeds = F.normalize(text_embeds, dim=-1)
    
    # Матрица сходства
    logits = torch.matmul(image_embeds, text_embeds.T) / temperature  # (N, N)
    
    # Целевые метки: диагональ
    labels = torch.arange(logits.size(0)).to(logits.device)
    
    # Cross-entropy loss для image->text и text->image
    loss_i = F.cross_entropy(logits, labels)
    loss_t = F.cross_entropy(logits.T, labels)
    return (loss_i + loss_t) / 2

5. Температура τ (temperature)

Температура — это обучаемый параметр (или фиксированный), который масштабирует логиты (сходства) перед softmax. В CLIP τ — обучаемый скаляр, инициализируемый обычно значением 0.07.

Влияние τ:

  • Малая τ (< 0.07): softmax становится «острее» — модель сильнее наказывает за путаницу между парами, но может переобучаться.
  • Большая τ (> 0.07): softmax «мягче» — модель учится более гладким представлениям, но может не различать тонкие различия.

В CLIP τ обучается вместе с остальными весами, что позволяет модели автоматически подобрать оптимальный масштаб.


6. Zero-shot transfer (перенос без дообучения)

После предобучения CLIP может выполнять zero-shot классификацию без дополнительного обучения. Процесс:

  1. Для задачи классификации (например, CIFAR-10) формируются текстовые шаблоны: "a photo of a {class}" для каждого класса.
  2. Все текстовые шаблоны кодируются текстовым энкодером → получаем embedding'ы классов.
  3. Изображение кодируется визуальным энкодером → получаем embedding изображения.
  4. Вычисляется косинусное сходство между embedding'ом изображения и каждым embedding'ом класса.
  5. Класс с максимальным сходством — предсказание.

Пример:

  • Классы: "dog", "cat", "bird"
  • Текстовые шаблоны: "a photo of a dog", "a photo of a cat", "a photo of a bird"
  • Изображение собаки → сходство с "dog" выше, чем с "cat" и "bird".

Это позволяет CLIP работать с любыми классами, описанными текстом, без переобучения.


7. Ограничения CLIP

ОграничениеОписание
Сложные визуальные концепцииCLIP плохо справляется с задачами, требующими точного подсчёта объектов, понимания пространственных отношений (слева/справа) или атрибутов (цвет, форма).
Длина текстаМаксимум 77 токенов — длинные описания обрезаются.
ДанныеОбучался на интернет-данных, поэтому наследует их bias (культурные, гендерные стереотипы).
Не является генеративной модельюCLIP не умеет генерировать изображения или текст, только сравнивать.
Чувствительность к шаблонамZero-shot качество сильно зависит от формулировки текстового шаблона (prompt engineering).

8. Связь с Agentic RAG и мультимодальным RAG

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

  • Использовать CLIP для поиска изображений по текстовому запросу (image retrieval).
  • Комбинировать текстовый и визуальный контекст для ответа на вопросы, содержащие картинки.
  • Применять CLIP для ранжирования кандидатов в мультимодальных базах знаний.

Пример архитектуры мультимодального RAG с CLIP:

  1. Все изображения индексируются через image encoder CLIP → векторная БД.
  2. Текстовый запрос кодируется text encoder CLIP → поиск ближайших изображений.
  3. Найденные изображения и их подписи подаются в LLM для генерации ответа.

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

Задача: Реализовать zero-shot классификацию изображений с помощью предобученного CLIP (например, через библиотеку open_clip или transformers).

Инструменты:

  • Python, PyTorch
  • Библиотека open_clip (или transformers с моделью clip-vit-base-patch32)
  • Датасет: CIFAR-10 (10 классов) или собственные изображения

Шаги:

  1. Установить open_clip: pip install open-clip-torch
  2. Загрузить модель и преобразования:
    import open_clip
    model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k')
    tokenizer = open_clip.get_tokenizer('ViT-B-32')
    
  3. Загрузить изображение, применить preprocess, получить embedding.
  4. Создать текстовые шаблоны для классов CIFAR-10 (например, "a photo of a {class}").
  5. Токенизировать шаблоны, получить текстовые embedding'и.
  6. Вычислить сходство, выбрать класс с максимальным значением.
  7. Оценить accuracy на тестовой выборке.

Ожидаемый результат: accuracy ~80-90% на CIFAR-10 без какого-либо дообучения. Можно поэкспериментировать с разными шаблонами (например, "a blurry photo of a {class}") и наблюдать изменение качества.

Расширение: Интегрировать CLIP в простой мультимодальный RAG: создать векторную БД из изображений (например, Unsplash dataset), реализовать поиск по текстовому запросу и вывод top-3 изображений.


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

ВопросТема
535Мультимодальные эмбеддинги и их роль в RAG
537Обучение vision-language моделей (fine-tuning CLIP)
538ImageBind: объединение шести модальностей
540Примеры мультимодального RAG в production
531Что такое Agentic RAG и его компоненты

11. Навигация


Навигация