Все мы видели удивительные возможности StableDiffusion (и даже Dall-E) в генерации изображений. Есть еще одна модель, которая работает в тандеме с моделями и относительно стабилизировала свои позиции в компьютерном зрении — CLIP (Contrastive Language-Image Pretraining). В Stable Diffusion текстовое приглашение кодируется с использованием CLIP. В DALL-E CLIP используется для оценки сгенерированных изображений.

Что такое CLIP?
Контрастное предварительное обучение языку и изображению (сокращенно CLIP) – это мультимодальный (текст и изображения) с открытым исходным кодом режим с нулевым шансом. -арт-модель, представленная OpenAI в феврале 2021 года.

Эта модель выполняет простое предварительное обучение для прогнозирования того, какая подпись соответствует какому изображению и наоборот (следовательно, контрастная) на огромном наборе данных из 400 миллионов пар (изображение, текст) [ImageNet имеет 1,2 миллиона наборов обучающих данных], собранных из Интернета в эффективном режиме. и масштабируемый способ способен очень хорошо работать даже с нулевым выстрелом при решении различных задач, таких как классификация текста.

Мультимодальность.Мультимодальная архитектура использует более одного домена для изучения конкретной задачи. CLIP сочетает в себе обработку естественного языка и компьютерное зрение.

Нулевой выстрел:Нулевой выстрел — это способ обобщать невидимые ярлыки без специального обучения их классификации. Например, все модели ImageNet обучены распознавать 1000 конкретных классов. CLIP не связан этим ограничением.

Эти представления изображений настолько ценны, что их можно использовать в различных задачах, таких как классификация изображений, поиск изображений, обнаружение объектов, распознавание лиц, сжатие изображений, генерация изображений, распознавание текста и многие другие.

Чем она лучше других моделей?

  1. Классификация с нулевым выстрелом — она соответствует точности оригинального ResNet-50 с нулевым выстрелом ImageNet без необходимости использования какого-либо из 1,28 миллиона обучающих примеров, на которых он обучался. В наборе оценки из 27 наборов данных классификатор CLIP с нулевым выстрелом превосходит полностью контролируемый линейный классификатор, оснащенный функциями ResNet-50, в 16 наборах данных, включая ImageNet.

2. Сдвиг устойчивости к естественному распределению

В этих собранных наборах данных точность моделей ImageNet значительно ниже ожиданий, установленных набором проверки ImageNet.

Как это работает?
1. Контрастная предварительная тренировка —

Учитывая пакет из N пар (изображение, текст), CLIP обучен предсказывать, какое из N * N возможных пар (изображение, текст) в пакете действительно произошло. Для этого CLIP изучает мультимодальное пространство внедрения путем совместного обучения кодировщика изображений и кодировщика текста, чтобы максимизировать косинусное сходство вложений изображения и текста N действительных пар в пакете, одновременно минимизируя косинусное подобие вложений N^2 — N неправильных пар. Они оптимизируют симметричную кросс-энтропийную потерю по этим показателям сходства.

# Step 1 - Get a batch of n sample images and text
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts

# Step 2 - Get backbone models for images and texts
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer

# Step 3 - extract feature representations of each modality with dif dimensions
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]

# Step 4 - Learn joint multimodal embedding [n, d_e]
# W_i[d_i, d_e] - learned proj of image to embed which is learnt during training
# W_t[d_t, d_e] - learned proj of text to embed which is learnt during training
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)

# Step 5 - Get scaled pairwise cosine similarities/Logits [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)

# Step 6 - Get symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

Какие выполняются дополнения данных?
Они также упрощают функцию преобразования изображений. Случайное
обрезание квадратов изображений с измененным размером — единственное увеличение данных, используемое во время обучения.

Какие и как обучаются различные модели?
Они обучают серию из 5 ResNet и 3 Vision Transformers. Для ResNet они обучают ResNet-50, ResNet-101, а затем еще 3, которые следуют масштабированию модели в стиле EfficientNet и используют примерно в 4, 16 и 64 раза больше вычислений, чем ResNet-50. Они обозначаются как РН50х4, РН50х16 ​​и РН50х64 соответственно. Для Vision Transformers мы обучаем ViT-B/32, ViT-B/16 и ViT-L/14.

Кодировщик текста представляет собой модель Transformer с некоторыми изменениями архитектуры. В качестве базового размера используется 12-слойная модель с параметрами 63М и 8 головками внимания. Преобразователь работает с представлением текста в кодировке пар байтов нижнего регистра (BPE) с размером словарного запаса 49 КБ.

Они обучают все модели в течение 32 эпох. Они используют оптимизатор Адама с несвязанной регуляризацией убывания веса, применяемой ко всем весам, которые
не являются приростами или смещениями, и уменьшают скорость обучения с использованием косинусного графика. Начальные гиперпараметры были установлены с использованием комбинации поиска по сетке, случайного поиска и ручной настройки базовой модели ResNet-50 при обучении в течение 1 эпохи.

Как мы можем использовать CLIP?
Мы можем использовать CLIP напрямую либо в качестве классификатора с нулевым выстрелом, либо для получения вложений для данного изображения или текста. Ниже приведен пример, который получает встраивания с помощью encode_image. Мы собираемся передать в модель 8 примеров изображений и их текстовые описания и сравнить сходство между соответствующими функциями.

import torch
import clip
from PIL import Image

print(clip.available_models())
# ['RN50', 'RN101', 'RN50x4', 'RN50x16', 'RN50x64', 'ViT-B/32', 'ViT-B/16', 'ViT-L/14', 'ViT-L/14@336px']

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
image_input = torch.tensor(np.stack(images)).cuda()
text_tokens = clip.tokenize(["This is " + desc for desc in texts]).cuda()

with torch.no_grad():
    image_features = model.encode_image(image_input).float()
    text_features = model.encode_text(text_tokens).float()

image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)

similarity = text_features.cpu().numpy() @ image_features.cpu().numpy().T

Блокнот для полного примера кодирования находится [здесь], где мы также видим пример классификации с нулевым выстрелом.

Некоторые интересные примеры использования —

Точная настройка CLIP

Многие активные исследования все еще продолжаются, чтобы точно настроить CLIP, чтобы избежать катастрофического забывания предварительного обучения.
[1] .pdf»
[2] https://arxiv.org/pdf/2111.07991.pdf

Ссылки
[1] https://github.com/openai/CLIP/
[2] https://www.kdnuggets.com/2021/03 /beginners-guide-clip-model.html
[3] https://towardsdatascience.com/clip-the-most-influential-ai-model-from-openai-and-how-to-use -it-f8ee408958b1