Как работает Zero-shot classification для изображений (CLIP vs другие методы)?
Краткий тезис
Zero-shot classification — это способность модели классифицировать изображения по классам, которые она не видела во время обучения. CLIP (Contrastive Language-Image Pre-training) решает эту задачу, сопоставляя эмбеддинги изображений и текстовых описаний классов. В отличие от традиционных методов, CLIP не требует переобучения для новых классов, а просто использует текстовые промпты. Однако точность может быть ниже, чем у fine-tuned моделей, особенно на узких доменах, и сильно зависит от качества промптов.
1. Термин: Zero-shot classification
Zero-shot classification — это задача отнесения изображения к одному из классов, которые не были представлены в обучающей выборке модели. Модель должна обобщить знания, полученные на других данных, и применить их к новым категориям. Например, модель, обученная на тысячах общих категорий (собаки, машины, еда), должна классифицировать «капибару» или «киборга», не видя их раньше.
Ключевое отличие от few-shot (несколько примеров нового класса) и full-shot (полный набор размеченных данных) — отсутствие каких-либо labelled примеров для целевых классов. Zero-shot опирается на семантическую связь между визуальными признаками и текстовыми описаниями.
2. Как работает CLIP
CLIP — это модель, обученная на 400 миллионах пар (изображение, текст) из интернета. Архитектура состоит из двух энкодеров:
- Image encoder (обычно Vision Transformer ViT или ResNet) — преобразует изображение в вектор фиксированной размерности (например, 512).
- Text encoder (Transformer) — преобразует текст (например, «a photo of a cat») в вектор той же размерности.
Обучение происходит с контрастивной потерей (contrastive loss): для каждой пары (изображение, текст) в батче модель учится делать эмбеддинги изображения и текста близкими, а для всех остальных пар в батче — далёкими. В результате формируется общее мультимодальное пространство эмбеддингов, где семантически близкие изображения и тексты находятся рядом.
3. Процесс zero-shot классификации с CLIP
Пошаговый алгоритм:
- Определить список классов (например,
["cat", "dog", "car", "bird"]). - Сформировать текстовые промпты для каждого класса. Обычно используют шаблон
"a photo of a {class}", но можно несколько вариантов: "a photo of a {class}", "a picture of a {class}", "a {class} in the wild" и т.д. Эмбеддинги нескольких промптов для одного класса усредняются. - Получить текстовые эмбеддинги — прогнать все промпты через text encoder, получить матрицу (число классов, размерность эмбеддинга).
- Получить эмбеддинг изображения — прогнать входное изображение через image encoder.
- Вычислить косинусное сходство между эмбеддингом изображения и каждым текстовым эмбеддингом.
- Выбрать класс с максимальным сходством (argmax).
Пример кода на Python с Hugging Face transformers:
from transformers import CLIPProcessor, CLIPModel
from PIL import Image
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
classes = ["cat", "dog", "car"]
prompts = [f"a photo of a {c}" for c in classes]
inputs = processor(text=prompts, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # shape (1, num_classes)
probs = logits_per_image.softmax(dim=1)
predicted_class = classes[probs.argmax().item()]
4. Сравнение CLIP с другими методами zero-shot
| Метод | Принцип | Требует обучения на новых классах? | Точность на ImageNet (top-1) | Плюсы | Минусы |
|---|---|---|---|---|---|
| CLIP | Контрастивное обучение image+text | Нет | ~70-80% | Гибкость, масштабируемость, мультимодальность | Чувствительность к промптам, bias |
| ALIGN (Google) | Аналогично CLIP, больше данных (1.8B пар) | Нет | ~76% | Выше точность | Меньше открытых реализаций |
| SigLIP | Sigmoid loss вместо softmax | Нет | ~78% (ViT-L) | Лучше для больших батчей | Сложнее в обучении |
| Traditional classifier (ResNet + softmax) | Обучен на фиксированных классах | Да (переобучение) | ~80%+ (fine-tuned) | Высокая точность на своих классах | Не zero-shot, требует переобучения |
| Word embedding methods (например, w2v + visual features) | Ручное выравнивание пространств | Частично | ~50-60% | Простота | Низкая точность |
Вывод CLIP — де-факто стандарт для zero-shot классификации изображений. Другие VLM (ALIGN, SigLIP) дают схожие или немного лучшие результаты, но CLIP наиболее доступен и изучен.
5. Ограничения CLIP
- Чувствительность к промптам Разные шаблоны могут сильно менять результат. Например,
"a photo of a cat"vs"a cat"vs"cat"дают разные эмбеддинги. - Проблемы с абстрактными или редкими классами. CLIP хуже справляется с классами, которые редко встречаются в интернете (например, «схема электрической цепи»).
- Bias обучающих данных Модель может наследовать стереотипы (например, связывать «врач» с мужчинами).
- Ограниченная точность на узких доменах На медицинских, спутниковых или промышленных изображениях точность может падать до 40-50%.
- Размер модели Большие версии CLIP (ViT-L) требуют значительных вычислительных ресурсов.
6. Улучшение точности zero-shot
- Fine-tuning на домене Дообучение CLIP на небольшом количестве пар (изображение, текст) из целевой области повышает точность, сохраняя zero-shot способность для других классов.
- Prompt engineering Использование нескольких шаблонов на класс и усреднение эмбеддингов (ensemble). Автоматический поиск оптимальных промптов через learnable prompts (CoOp, CoCoOp).
- Linear probe Заморозить image encoder, добавить линейный слой поверх эмбеддингов и обучить его на нескольких примерах (few-shot).
- Комбинирование с LLM Использовать LLM для генерации более точных текстовых описаний классов (например, «a small furry animal with whiskers and a tail» вместо «cat»).
7. Применение в контексте Agentic RAG
В Agentic RAG CLIP может выступать как мультимодальный модуль для:
- Классификации входных изображений Агент получает изображение, использует CLIP для определения его типа (документ, фотография, график) и направляет в соответствующий RAG-пайплайн.
- Поиска изображений по текстовому запросу CLIP эмбеддинги изображений хранятся в векторной БД, и агент может искать релевантные картинки по текстовому описанию.
- Фильтрации результатов retrieval Если RAG возвращает изображения, CLIP может оценить их релевантность запросу и отсеять нерелевантные.
Пример: агент получает запрос «найди фотографии пустыни». Он генерирует текстовый эмбеддинг через CLIP text encoder, ищет ближайшие image эмбеддинги в БД, возвращает top-5 изображений.
8. Пет-проект для закрепления
Задача Реализовать zero-shot классификатор изображений на основе CLIP для набора из 10 классов (например, животные: «лев», «тигр», «медведь», «волк», «лиса», «олень», «заяц», «белка», «ёж», «енот»).
Инструменты Python, transformers, torch, PIL, matplotlib. Можно использовать предобученную модель openai/clip-vit-base-patch32.
Шаги:
- Загрузить модель и процессор.
- Подготовить список классов и промпты (например,
"a photo of a {class}"). - Загрузить тестовые изображения (можно взять из датасета CIFAR-10 или скачать из интернета).
- Для каждого изображения вычислить вероятности классов.
- Вывести предсказанный класс и confidence.
- Оценить accuracy на 50-100 изображениях (вручную разметить ground truth).
Ожидаемый результат Скрипт, который классифицирует изображения с точностью ~70-80% (на стандартных фотографиях). Дополнительно: сравнить с fine-tuned ResNet-50 (обученным на тех же классах) и проанализировать, где CLIP ошибается.
Расширение Добавить ensemble промптов (3 шаблона на класс) и измерить прирост точности.
9. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 5 | Оценка качества retrieval в RAG |
| 10 | Self-RAG и когда его использовать |
| 12 | Мультимодальный RAG |
| 20 | Fine-tuning эмбеддингов |
| 25 | Prompt engineering для LLM |
| 30 | Bias в моделях и его mitigation |
10. Навигация
- Предыдущий: 556
- Следующий: 558
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 556
- Следующий: 558
- Индекс: 00. Индекс разборов