English translation is not available yet. Showing Russian content.

Как работает CLIP и как training contrastive loss выравнивает текст и изображения?

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

CLIP (Contrastive Language-Image Pre-training) — это мультимодальная модель, которая учится сопоставлять текстовые и визуальные представления, используя contrastive loss (контрастивную функцию потерь). В процессе обучения на миллионах пар (изображение, подпись) модель максимизирует косинусную близость между правильными парами и минимизирует её для неправильных. Ключевой элемент — InfoNCE loss с temperature scaling, который «заостряет» распределение сходств и улучшает разделимость классов. В результате эмбеддинги текста и изображений оказываются выровнены в общем пространстве, что позволяет выполнять zero-shot классификацию и retrieval|мультимодальный поиск.


1. Что такое CLIP и зачем он нужен

CLIP — модель от OpenAI (2021), которая решает задачу мультимодального выравнивания: научиться представлять текст и изображения в едином векторном пространстве. До CLIP большинство моделей для задач «текст → изображение» (поиск, классификация) требовали размеченных датасетов под каждую задачу. CLIP же обучается на 400 миллионах пар (изображение, текст), собранных из интернета, и может zero-shot (без дополнительного обучения) переноситься на новые визуальные задачи.

Архитектура CLIP состоит из двух независимых энкодеров:

  • Text Encoder — обычно Transformer (например, GPT-2 или BERT), который преобразует текст в вектор фиксированной размерности.
  • Image EncoderVision Transformer (ViT) или ResNet, который преобразует изображение в вектор той же размерности.

Оба энкодера обучаются совместно, чтобы их выходные эмбеддинги были согласованы.


2. Contrastive learning и InfoNCE loss

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

InfoNCE loss (Noise Contrastive Estimation) — стандартная функция потерь для контрастивного обучения. Для батча из N пар она выглядит так:

L = - (1/N) * sum_{i=1..N} log( exp(sim(I_i, T_i)/τ) / sum_{j=1..N} exp(sim(I_i, T_j)/τ) )

где:

  • sim(I_i, T_i) — косинусное сходство между эмбеддингом i-го изображения и i-го текста.
  • τ (tau) — temperature (температура), скалярный гиперпараметр.
  • Знаменатель — сумма по всем текстам в батче (включая правильный).

Аналогичный loss считается и для текстовой стороны (симметричный вариант). Итоговый loss — среднее двух направлений.

Интуиция: для каждого изображения мы «вытягиваем» его правильный текст (увеличиваем сходство) и «отталкиваем» все остальные тексты (уменьшаем сходство). Чем больше батч, тем больше отрицательных примеров и тем лучше обучение.


3. Temperature scaling (масштабирование температуры)

Temperature scaling — это деление логарифмов сходства на температуру τ перед softmax. Маленькая τ (например, 0.07) делает распределение softmax более «острым» (sharp): правильная пара получает почти всю вероятность, а неправильные — почти нулевую. Большая τ сглаживает распределение.

В CLIP температура τ — обучаемый параметр (инициализируется как 0.07). Она позволяет модели автоматически подстраивать «жёсткость» контрастивного обучения. Если τ слишком мала, градиенты становятся очень большими и обучение нестабильно; если слишком велика — модель не различает пары.

Формула с temperature:

p(i, j) = exp(sim(I_i, T_j)/τ) / sum_{k} exp(sim(I_i, T_k)/τ)

На практике τ часто инициализируют как логарифм обратной температуры (logit_scale) и обучают как параметр.


4. Процесс обучения: как формируются пары и считается loss

  1. Батч из N пар (изображение, текст) подаётся на вход.
  2. Image Encoder выдаёт матрицу эмбеддингов изображений I размером (N, d).
  3. Text Encoder выдаёт матрицу эмбеддингов текстов T размером (N, d).
  4. Нормализуем эмбеддинги по L2 (длина = 1).
  5. Считаем матрицу сходств S = I @ T.T (размер N x N).
  6. Применяем temperature scaling: S /= τ.
  7. Для каждой строки (изображение) считаем cross-entropy loss с правильным индексом i (диагональ).
  8. Аналогично для каждого столбца (текст).
  9. Итоговый loss = (loss_image_to_text + loss_text_to_image) / 2.

Пример кода на Python (упрощённый):

import torch
import torch.nn.functional as F

def clip_loss(image_embeds, text_embeds, temperature=0.07):
    # image_embeds, text_embeds: (batch_size, embed_dim)
    # Нормализация
    image_embeds = F.normalize(image_embeds, dim=-1)
    text_embeds = F.normalize(text_embeds, dim=-1)
    
    # Матрица сходств
    logits = image_embeds @ text_embeds.T / temperature  # (N, N)
    
    # Целевые метки — диагональ
    labels = torch.arange(logits.shape[0], device=logits.device)
    
    # Loss в обе стороны
    loss_i = F.cross_entropy(logits, labels)          # image -> text
    loss_t = F.cross_entropy(logits.T, labels)        # text -> image
    
    return (loss_i + loss_t) / 2

5. Выравнивание эмбеддингов: alignment и uniformity

После обучения эмбеддинги текста и изображений оказываются в общем пространстве, где:

  • Alignment (согласованность): эмбеддинги правильных пар близки (высокое косинусное сходство).
  • Uniformity (равномерность): эмбеддинги разных пар равномерно распределены по гиперсфере, что предотвращает коллапс (когда все векторы сливаются).

InfoNCE loss автоматически способствует и alignment (за счёт притяжения положительных пар) и uniformity (за счёт отталкивания отрицательных). Это ключевое свойство контрастивного обучения.


6. Инференс: zero-shot классификация и мультимодальный поиск

Zero-shot классификация:

  1. Для заданного набора классов (например, «собака», «кошка», «птица») создаём текстовые шаблоны: «a photo of a dog», «a photo of a cat» и т.д.
  2. Пропускаем изображение через Image Encoder, получаем эмбеддинг.
  3. Пропускаем все тексты через Text Encoder, получаем эмбеддинги классов.
  4. Выбираем класс с максимальным косинусным сходством.

Мультимодальный поиск (например, в RAG-системе):

  • Пользовательский запрос (текст) кодируется Text Encoder.
  • Векторная база данных хранит эмбеддинги изображений (или чанков с изображениями).
  • Поиск по косинусной близости возвращает релевантные изображения.

7. Сравнение CLIP с другими моделями

МодельАрхитектураLossОсобенности
CLIPViT/ResNet + TransformerInfoNCE (симметричный)Огромный датасет, temperature обучаемый
ALIGN (Google)EfficientNet + BERTContrastive (асимметричный)1.8B пар, шумные данные
BLIPViT + BERT + декодерITC + ITM + LMДобавляет генерацию подписей и фильтрацию шума
SigLIP (Google)ViT + TransformerSigmoid loss (бинарная классификация)Не требует больших батчей, стабильнее

SigLIP заменяет softmax на сигмоидную бинарную потерю, что позволяет обучаться с меньшим размером батча. CLIP требует больших батчей (например, 32k) для эффективного контрастивного обучения.


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

  • Чувствительность к текстовым шаблонам: zero-shot точность сильно зависит от формулировки промпта (например, «a photo of a dog» vs «a dog»).
  • Плохая работа с абстрактными понятиями: модель лучше различает конкретные объекты, чем сложные сцены или отношения.
  • Неспособность к тонкому пониманию текста: CLIP не понимает порядок слов (bag-of-words bias) и может путать «a dog chasing a cat» и «a cat chasing a dog».
  • Дороговизна обучения: требует огромных вычислительных ресурсов (256 GPU V100 в течение 12 дней для оригинального CLIP).

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

Задача: Обучить упрощённый CLIP на небольшом датасете (например, Flickr30k или собственных парах) и оценить качество retrieval.

Инструменты: PyTorch, Hugging Face Transformers (ViT и BERT), torchvision, Weights & Biases для логирования.

Шаги:

  1. Загрузить датасет (например, flickr30k через Hugging Face Datasets).
  2. Взять предобученные энкодеры: ViT-B/16 для изображений, BERT-base для текста (заморозить или fine-tune).
  3. Добавить проекционные головы (Linear + LayerNorm) до размерности 256.
  4. Реализовать InfoNCE loss с обучаемой температурой.
  5. Обучать 10 эпох с батчем 64 (насколько позволяет GPU).
  6. Оценить recall@1, recall@5 на тестовой выборке (text-to-image retrieval).
  7. Визуализировать матрицу сходств и t-SNE эмбеддингов.

Ожидаемый результат: Модель научится находить правильное изображение по тексту с recall@1 ~20-30% (на маленьком датасете), а t-SNE покажет кластеризацию по семантике.


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

ВопросТема
358Как работают эмбеддинги и какие модели используются для их получения?
362Как устроен мультимодальный RAG (текст + изображения)?
365Что такое contrastive learning и как он применяется в NLP/CV?
370Как обучать модели с использованием triplet loss?
380Как работает zero-shot классификация с помощью CLIP?

Навигация