Как работает 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

Пошаговый алгоритм:

  1. Определить список классов (например, ["cat", "dog", "car", "bird"]).
  2. Сформировать текстовые промпты для каждого класса. Обычно используют шаблон "a photo of a {class}", но можно несколько вариантов: "a photo of a {class}", "a picture of a {class}", "a {class} in the wild" и т.д. Эмбеддинги нескольких промптов для одного класса усредняются.
  3. Получить текстовые эмбеддинги — прогнать все промпты через text encoder, получить матрицу (число классов, размерность эмбеддинга).
  4. Получить эмбеддинг изображения — прогнать входное изображение через image encoder.
  5. Вычислить косинусное сходство между эмбеддингом изображения и каждым текстовым эмбеддингом.
  6. Выбрать класс с максимальным сходством (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%Выше точностьМеньше открытых реализаций
SigLIPSigmoid 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.

Шаги:

  1. Загрузить модель и процессор.
  2. Подготовить список классов и промпты (например, "a photo of a {class}").
  3. Загрузить тестовые изображения (можно взять из датасета CIFAR-10 или скачать из интернета).
  4. Для каждого изображения вычислить вероятности классов.
  5. Вывести предсказанный класс и confidence.
  6. Оценить accuracy на 50-100 изображениях (вручную разметить ground truth).

Ожидаемый результат Скрипт, который классифицирует изображения с точностью ~70-80% (на стандартных фотографиях). Дополнительно: сравнить с fine-tuned ResNet-50 (обученным на тех же классах) и проанализировать, где CLIP ошибается.

Расширение Добавить ensemble промптов (3 шаблона на класс) и измерить прирост точности.


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

ВопросТема
5Оценка качества retrieval в RAG
10Self-RAG и когда его использовать
12Мультимодальный RAG
20Fine-tuning эмбеддингов
25Prompt engineering для LLM
30Bias в моделях и его mitigation

10. Навигация


Навигация