Как работает 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 Encoder — Vision 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
- Батч из N пар (изображение, текст) подаётся на вход.
- Image Encoder выдаёт матрицу эмбеддингов изображений
Iразмером(N, d). - Text Encoder выдаёт матрицу эмбеддингов текстов
Tразмером(N, d). - Нормализуем эмбеддинги по L2 (длина = 1).
- Считаем матрицу сходств
S = I @ T.T(размерN x N). - Применяем temperature scaling:
S /= τ. - Для каждой строки (изображение) считаем cross-entropy loss с правильным индексом
i(диагональ). - Аналогично для каждого столбца (текст).
- Итоговый 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 классификация:
- Для заданного набора классов (например, «собака», «кошка», «птица») создаём текстовые шаблоны: «a photo of a dog», «a photo of a cat» и т.д.
- Пропускаем изображение через Image Encoder, получаем эмбеддинг.
- Пропускаем все тексты через Text Encoder, получаем эмбеддинги классов.
- Выбираем класс с максимальным косинусным сходством.
Мультимодальный поиск (например, в RAG-системе):
- Пользовательский запрос (текст) кодируется Text Encoder.
- Векторная база данных хранит эмбеддинги изображений (или чанков с изображениями).
- Поиск по косинусной близости возвращает релевантные изображения.
7. Сравнение CLIP с другими моделями
| Модель | Архитектура | Loss | Особенности |
|---|---|---|---|
| CLIP | ViT/ResNet + Transformer | InfoNCE (симметричный) | Огромный датасет, temperature обучаемый |
| ALIGN (Google) | EfficientNet + BERT | Contrastive (асимметричный) | 1.8B пар, шумные данные |
| BLIP | ViT + BERT + декодер | ITC + ITM + LM | Добавляет генерацию подписей и фильтрацию шума |
| SigLIP (Google) | ViT + Transformer | Sigmoid 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 для логирования.
Шаги:
- Загрузить датасет (например,
flickr30kчерез Hugging Face Datasets). - Взять предобученные энкодеры: ViT-B/16 для изображений, BERT-base для текста (заморозить или fine-tune).
- Добавить проекционные головы (Linear + LayerNorm) до размерности 256.
- Реализовать InfoNCE loss с обучаемой температурой.
- Обучать 10 эпох с батчем 64 (насколько позволяет GPU).
- Оценить recall@1, recall@5 на тестовой выборке (text-to-image retrieval).
- Визуализировать матрицу сходств и t-SNE эмбеддингов.
Ожидаемый результат: Модель научится находить правильное изображение по тексту с recall@1 ~20-30% (на маленьком датасете), а t-SNE покажет кластеризацию по семантике.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 358 | Как работают эмбеддинги и какие модели используются для их получения? |
| 362 | Как устроен мультимодальный RAG (текст + изображения)? |
| 365 | Что такое contrastive learning и как он применяется в NLP/CV? |
| 370 | Как обучать модели с использованием triplet loss? |
| 380 | Как работает zero-shot классификация с помощью CLIP? |
Навигация
- Предыдущий: 360
- Следующий: 362
- Индекс: 00. Индекс разборов