中文翻译暂不可用,显示俄语原文。
Как работает 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 Encoder | Vision Transformer (ViT) или ResNet | Изображение (224×224 пикселя) | Вектор I размерности d |
| Text Encoder | Transformer (обычно 12 слоёв) | Текстовая подпись (макс. 77 токенов) | Вектор T размерности d |
Оба энкодера обучаются совместно, но после обучения могут использоваться независимо. Выходные векторы нормализуются (L2-норма) перед вычислением сходства.
- ViT разбивает изображение на патчи (16×16), добавляет позиционные embedding'и и пропускает через Transformer.
- ResNet использует свёрточные слои с глобальным пулингом.
- В оригинальной статье сравниваются обе архитектуры; ViT даёт лучшее качество при больших размерах.
- Стандартный Transformer с causal masking (как в GPT), но без авторегрессии — используется embedding последнего токена (или среднее по всем токенам) как представление всего текста.
- Максимальная длина — 77 токенов (ограничение для эффективности).
3. Датасет и предобучение
CLIP обучается на собственном датасете WIT (WebImageText), собранном из интернета. Размер: 400 миллионов пар (изображение, текст). Тексты — это alt-тексты, подписи, описания, найденные рядом с изображениями.
Процесс предобучения:
- Батч из N случайных пар (обычно N = 32768).
- Для каждой пары вычисляются embedding'и
I_iиT_i. - Строится матрица сходства
Sразмером N×N, гдеS_ij = cos(I_i, T_j). - Правильные пары — диагональ матрицы (i=j). Остальные — отрицательные.
- Оптимизируется 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 направлениям (image→text и text→image).
Интуиция: 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 классификацию без дополнительного обучения. Процесс:
- Для задачи классификации (например, CIFAR-10) формируются текстовые шаблоны: "a photo of a {class}" для каждого класса.
- Все текстовые шаблоны кодируются текстовым энкодером → получаем embedding'ы классов.
- Изображение кодируется визуальным энкодером → получаем embedding изображения.
- Вычисляется косинусное сходство между embedding'ом изображения и каждым embedding'ом класса.
- Класс с максимальным сходством — предсказание.
Пример:
- Классы: "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:
- Все изображения индексируются через image encoder CLIP → векторная БД.
- Текстовый запрос кодируется text encoder CLIP → поиск ближайших изображений.
- Найденные изображения и их подписи подаются в LLM для генерации ответа.
9. Пет-проект для закрепления
Задача: Реализовать zero-shot классификацию изображений с помощью предобученного CLIP (например, через библиотеку open_clip или transformers).
Инструменты:
- Python, PyTorch
- Библиотека open_clip (или transformers с моделью
clip-vit-base-patch32) - Датасет: CIFAR-10 (10 классов) или собственные изображения
Шаги:
- Установить
open_clip:pip install open-clip-torch - Загрузить модель и преобразования:
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') - Загрузить изображение, применить
preprocess, получить embedding. - Создать текстовые шаблоны для классов CIFAR-10 (например, "a photo of a {class}").
- Токенизировать шаблоны, получить текстовые embedding'и.
- Вычислить сходство, выбрать класс с максимальным значением.
- Оценить 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) |
| 538 | ImageBind: объединение шести модальностей |
| 540 | Примеры мультимодального RAG в production |
| 531 | Что такое Agentic RAG и его компоненты |
11. Навигация
- Предыдущий: 535
- Следующий: 537
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 535
- Следующий: 537
- Индекс: 00. Индекс разборов