Нейронная Сеть CLIP от OpenAI: Классификатор, который не нужно обучать. Да здравствует Обучение без Обучения

  • Tutorial

Можете представить себе классификатор изображений, который решает практически любую задачу, и который вообще не нужно обучать? Представили? Выходит, что это должен быть универсальный классификатор? Все верно! Это новая нейросеть CLIP от OpenAI. Разбор CLIP из рубрики: Разбираем и Собираем Нейронные Сети на примере Звездных Войн!

Никогда не работали с нейронными сетями, но хотите получить решение высокой точности для классификации? Нет данных, нет разметки, но срочно нужен классификатор изображений для конкретной задачи? Хотите построить стартап — поисковик будущего, который найдет соответствующие фотографии или кадры из фильмов по текстовому описанию, например, "Дарт Вейдер душит очередного штурмовика", и сделать это лучше чем Google? Удивлены качеством изображений, сгенерированных DALL•E (смотри обложку поста) по описанию "комната с белыми креслами и картиной Дарта Вейдера на стене"? Интересно как можно численно оценить качество подобной генерации? Хотите узнать, как достичь высокой точности на датасете ImageNet, не обучая нейросеть ни на одном изображении из ImageNet?

Готов туториал: Собираем нейросети. Классификатор животных из мультфильмов. Без данных и за 5 минут. CLIP: Обучение без Обучения + код

Подробно и доступно разбираем что такое "обучение без обучения" и саму нейросеть CLIP от OpenAI. Стираем границы между Текстом и Изображением. Внимание: статья подходит под любой уровень: от нулевого до профи.


Если тебе интересно машинное обучение, то приглашаю в 
«Мишин Лернинг» — мой субъективный телеграм-канал об искусстве глубокого обучения, нейронных сетях и новостях из мира искусственного интеллекта.

Зачем нам CLIP и чем плох старый добрый "классификатор"?

Пример классификации изображений нейронной сетью CLIP методом "обучения без обучения" на различных датасетах, включая ImageNet
Пример классификации изображений нейронной сетью CLIP методом "обучения без обучения" на различных датасетах, включая ImageNet

Сегодня мало кого удивишь результатами классификации, так как deep learning произвел революцию в компьютерном зрении и нейронные сети уже давно превзошли по точности человека1! Подход, который используют чаще всего для обучения нейросетевых классификаторов, — это классическое "обучение с учителем". Классификатор обучают предсказывать фиксированный набор заранее определенных классов объектов, а учителем выступает разметка (принадлежность изображения к какому-то классу). Например, сеть учат распознавать (угадывать) только один класс из:

Такой подход не является универсальным. Обученный классификатор в рамках "классической" парадигмы обучения с учителем способен классифицировать только те объекты, классы которых были в датасете на момент обучения. Сама архитектура нейронной сети устроена так, что выходной слой содержит столько нейронов, сколько классов было в датасете во время тренировки. Тут приведу описание последнего слоя таких сетей из статьи Краткий курс машинного обучения или как создать нейронную сеть для решения скоринг задачи:

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

Именно в этом и кроется ограниченность такого подхода к классификации. Если нужно добавить новые классы к имеющимся, или заменить исходные классы на новые, оставив знания (веса) нейронной сети, полученные на исходном изображении, нужно прибегать, например, к linear probe в рамках парадигмы transfer learning. Сама идея transfer learning стара как мир, и заключается в том, чтобы знания, полученные при решении одной задачи, применить к новой, но схожей задаче. А linear probe — простейший из подходов в transfer learning, который использует репрезентацию, подготовленную исходной моделью, с дальнейшим обучением линейного классификатора (linear classifier) на основе этой репрезентации.

Подробнее для тех, кто не знаком со сверточными сетями

По сути, изображение входит в сеть (например ResNet-50 или ResNet-101) в виде тензора, например 224x224x3. Очевидно, что перед входом в сеть этот тензор стоит интерпретировать, как исходное изображение, высота 224 и ширина 224 которого, несет пространственный смысл, а глубина в три канала отвечает за цвет (red, green, blue). Дальше этот тензор, протекающий (калька с названия фреймворка tensorflow кажется мне оригинальной в этом контексте), или двигающийся по сети в прямом распространении, будет чаще всего сужаться по высоте и ширине, и углубляться по количеству каналов, и будет нести уже не цветовой смысл, а некоторую репрезентацию (от простых паттернов до сложных объектов, таких, как лица, силуэты, колеса, крылья).

На последнем слое изображение представляется в виде n-мерного вектора. Размерность этого вектора может быть 1280 или 4096, или еще какой-нибудь другой (зависит от архитектуры сети). Это самая высокоуровневая репрезентация. Исходное изображение, пройдя через всю нейронную сеть до последнего слоя, становится такой векторной репрезентацией. Каждое число в этом векторе можно интерпретировать как выраженность того или иного признака. Сеть, подготавливающую эти признаки (или фичи), называют фича-экстрактором. По этим признакам (фичам) последний линейный слой нейронной сети и делает вывод о том, что находится на изображении: человек или пароход.

Предположим, что мы хотим сделать классификатор X-Wing, A-wing и TIE fighter из Звездных Войн. Нам не обязательно обучать всю сеть с нуля. Особенно, если мы смогли собрать только по восемь примеров изображений каждого корабля. Давайте воспользуемся сетью, предобученной на миллионе изображений, которая уже умеет готовить векторную репрезентацию. Иными словами, заберем выход предпоследнего слоя сети, через которую прошло наше изображение. Теперь нам нужно будет добавить эти классы в последний слой (добавить нейроны, отвечающие за эти классы).

Осталось лишь обучить веса парочки нейронов, чтобы они научились интерпретировать векторную репрезентацию с предпоследнего слоя, и на основе этого решать что именно находится на изображении. И такой подход, скорее всего, будет неплохо работать, так как A-wing похож на лодку, X-Wing — на самолет, а TIE fighter — на пару спутниковых антенн с глазом между ними, только все это на черном космическом фоне. Именно это и есть linear probe, о котором писалось выше. Более точно такой подход называют few-shot linear probes, так как у нас есть лишь несколько примеров для каждого класса. А если точнее, то в этом примере по восемь.

Хотелось еще уточнить, что transfer learning применим лишь для схожих задач. Если мы захотим сетью, предобученной на кошечках и собачках, классифицировать типы галактик, мы вряд ли добьемся успеха, так как сеть, просто не умеет выделять нужные признаки.

Подводя промежуточный итог, мы можем взять предобученную нейронную сеть, новые размеченные данные, и при помощи few-shot linear probes получить нужный нам классификатор. Но в любом случаем нам нужны будут новые данные, чем больше, тем лучше. И необходимо производить процесс обучения на этих данных.

От Ограничений к Универсальности

Возможно ли добиться такого же, или даже лучшего результата, вообще не обучая сеть на новых данных и используя для обработки изображений ту же самую архитектуру нейронной сети. Например, получить готовый классификатор на архитектуре ResNet-50 или ResNet-101, или на любой другой архитектуре, и при это не обучать сеть под новую задачу! Да, именно, совсем не обучать! Подход, о котором пойдет речь дальше, я буду называть "обучение без обучения" или zero-shot transfer learning.

Собираем нейросети. Классификатор животных из мультфильмов. Без данных и за 5 минут. CLIP: Обучение без Обучения + код

Ресерчеры из OpenAI показали, что обучение на парах изображение-текст, даже необработанный текст — это многообещающая альтернатива "классическим" классификаторам. Задача предварительного обучения (предобучения), заключается в том, чтобы для каждого изображения из пары изображение-текст угадать, какое текстовое описание (promt) соответствует именно ему. Сеть, способную решать эту задачу, предобучили на 400М пар изображение-текст, собранных из интернета. Такая сеть будет способна ранжировать по метрике схожести визуальные и текстовые концепции. Затем такую модель можно с легкостью использовать для огромного спектра задач в режиме "обучения без обучения".

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

Далее, в режиме классификатора на новом датасете, предобученный текстовый кодировщик (трансформер) автоматически подготавливает линейный классификатор в режиме "обучение без обучения", готовя векторную репрезентацию (embedding) на основе классов нового датасета, пропущенных через этот кодировщик в текстовой форме!

Исследователи из OpenAI добились точности оригинального ResNet-50 на ImageNet в режиме "обучения без обучения", то есть без необходимости использовать хотя бы один пример из 1,28 миллиона обучающих примеров, на которых он был обучен оригинальный ResNet-50!

Разбираем CLIP

Если уже все понятно, то поздравляю, Вы неплохо знаете нейронные сети. А если нет, то не страшно, давайте разберем и поймем. Добро пожаловать в раздел "Разбираем". Мы подробно обсудим:

  • What's in the Box? Что представляет из себя CLIP, какая у него архитектура?

  • Предобучение – мать учения. Как его предобучают на парах изображение-текст?

  • Обучение без Обучения. Как получить классификатор в режиме "обучение без обучения" для своей задачи не имея никаких данных?

  • Результаты. Какая точность у классификатора CLIP на различных датасетах, на которых он не обучался?

  • Beyond the Infinite. Какие задачи может решать CLIP, кроме классификации?

What's in the Box? 

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

Фреймворком не в том смысле, в котором PyTrorch и TensorFlow, а в том, в котором говорят, например, про GANы. Как многие из нас знают, GAN представляет из себя, по крайней мере, две нейронных сети (генератор и дискриминатор), которые тренируются в определенном режиме. Затем чаще всего используется именно одна сеть — генератор. А вторая играла важную, но все же вспомогательную роль (относительно самой задачи) на этапе тренировки. Для генератора и дискриминатора могут использоваться разные архитектуры. Именно режим обучения этих двух нейронных сетей мы и называем фреймворком GAN, а не сами нейронные сети, выбранные для решения генеративной или дискриминативной задачи. Подобная аналогия уместна и в нашем случае. CLIP — это не столько нейросеть, сколько режим тренировки и требования к выбору нейросетей для совместного обучения.

CLIP — есть поэлементное cosine similarity текстовых и визуальных репрезентаций
CLIP — есть поэлементное cosine similarity текстовых и визуальных репрезентаций

Для начала нам нужно выбрать две архитектуры нейронных сетей для того, чтобы объединить их в гибрид или нейрохимеру под названием CLIP. Одна сеть должна принимать изображение, и готовить на основе него некую векторную репрезентацию, вторая — должна съедать текст, и готовить уже на основании него некую векторную репрезентацию той же размерности, что и правая сеть. Так как подобрать две нейронные сети из разных областей (CV и NLP), обладающих одной и той же размерностью выходных фич, будет нереально, то стоит добавить еще слой к каждой из архитектур, который подготовит репрезентацию одинаковой размерности. Будем называть эти слои линейными преобразованиями для согласования размерностей.

Популярным выбором фича-экстрактора для изображений, пока еще2 являются сверточные сети. Авторы берут различные архитектуры ResNet не из-за их точности (она по сегодняшним меркам не самая лучшая), а из-за популярности и распространенности ResNet'ов, их количества benchmark этой архитектуры на разных датасетах. Но опять же, в качестве фича-экстрактора изображений, может выступать и другая архитектура. Авторы советуют для этой цели использовать ResNet или Vision Transformer2.

С выбором фича-экстрактора для текста тоже все понятно. Это же OpenAI. Тут к гадалке не ходи, точно будет GPT. Как и изображения, проходящие через сверточную нейронную сеть предстают перед последним решающим линейным слоем в виде вектора фич (или векторной репрезентации), так и текст, пройдя через внутренности трансформера или безвременно ушедших рекуррентных сетей, тоже будет представлен в виде некой векторной репрезентации. Авторы советуют для этой цели использовать CBOW или Text Transformer.

Картина. Дарт Вейдер убивает своего сына
Картина. Дарт Вейдер убивает своего сына

Основная идея CLIP — создание единого векторного пространства для текстовых и визуальных репрезентаций!
Ведь нам совершенно не важно, показали ли нам эту картинку, прочитали ли мы текст "Картина. Дарт Вейдер убивает своего сына", или мы услышали это предложение от кого-то. Скорее всего, мы все представим нечто похожее.
Именно в этом и есть идея CLIP — построить мост между изображением и текстом!

Предобучение – мать учения

На этапе предобчуения готовится батч размером N, содержащий N пар (image, text) из датасета 400М пар изображение-текст, собранных из сети интернет. N изображений и N текстовые описания (promt) проходят через соответствующие им Image Encoder и Text Encoder. После этого они проходят упомянутые выше линейные преобразования для согласования размерностей и нормализируются. И в самом конце готовится попарная матрица, элементами (j, k) которой являются cosine similarity между векторной репрезентацией j-го изображения и k-го текстового описания. Очевидно, что на главной диагонали матрицы находятся правильные пары (image, text). Теперь осталось лишь максимизировать cosine similarity правильных N пар на главной диагонали, и минимизировать cosine similarity всех прочих N2-N пар. Это делается через минимизацию перекрестной энтропии по каждой вертикали и горизонтали этой матрицы. Так и осуществляют сontrastive pre-training нейрохимеры CLIP.

Матрица поэлементных cosine similarity между парами векторных репрезентаций изображений и текстовых описаний
Матрица поэлементных cosine similarity между парами векторных репрезентаций изображений и текстовых описаний
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter

# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]

# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)

# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)

# 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

Иногда сама реализация — лучшее описание. Давайте разберем Numpy-like pseudocode архитектуры CLIP.

  1. I_f и T_f — это векторные репрезентации изображений и текстовых описаний, прошедшие соответствующие им Image Encoder и Text Encoder

  2. I_e и T_e — это нормализированные (до единичной длины) репрезентации одинаковой размерности, подготовленные линейными преобразованиями для согласования размерностей.

  3. logits — это матрица поэлементных cosine similarity между парами векторных репрезентаций изображений и текстовых описаний умноженный на параметр температуры3. Как получить эту матрицу? Очень просто, давайте теперь это возьмем и тензорно умножим. Это будет outer product между I_e и T_e.

  4. labels — это просто вектор, описывающий координаты правильных пар по вертикали и диагонали матрицы поэлементных cosine similarity. e.g.: np.arange(7) # array([0, 1, 2, 3, 4, 5, 6])

  5. loss_i и loss_t — это перекрестные энтропии по изображения и текстовым описаниям, вычисленные из ligits по вертикали и горизонтали этой матрицы (axis=0 и axis=1)

  6. loss — средняя энтропия по изображениям и текстовым описаниям.

Детали обучения. Можно пропустить

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

Все модели обучались в течение 32 эпох. Обучение производили оптимизатором Adam, и использовали decoupled weight decay regularization и learning rate decay, используя косинусный отжиг (lr_scheduler). Ребята использовали очень большой размер мини-батча 32 768 (это и мини-батчем назвать сложно), используя mixed-precision. Стоит сказать, что под расчет матрицы сходства (поэлементных cosine similarity) был выделен отдельный графический процессор. Ну, это вполне логично, учитывая размер "мини-батча" в квадрате.

Самая большая модель семейства ResNet: RN50x64 обучалась на 592 графических процессорах V100, и предобучение заняло 18 дней, в то время как для самого большого Vision Transformer потребовалось 12 дней на 256 видеоускорителях V100.

Обучение без Обучения

Обычно в компьютерном зрении, используют понятие zero-shot learning, подразумевают возможность модели генерализовать знания, и применять их к объектам, классов которых не было в исходном датасете. Ресерчеры из OpenAI пошли еще дальше, и решили использовать знания своей модели CLIP для применения к целым датасетам, которые не были использованы при предобучении. Это позволяет рассматривать термин zero-shot learning в куда более широком смысле. Мы стали свидетелями нового направления в deep learning — обучения без обучения. Я считаю, что подобный подход является очень перспективным. Просто представьте какой огромный класс задач можно будет решить, не прибегая собственно к обучению?

Давайте теперь разберем, как именно должно реализовываться обучение без обучения, и как получить классификатор под новый класс задач, и как его использовать. На самом деле все очень просто. Уже понятно, что нейрогибрид CLIP способен принимать изображение и текстовые описания. На выходе для каждой картинки мы можем получить метрику схожести всех текстовых описаний, что мы подали в модель. Например, мы подаем на вход изображение собаки и несколько текстовых описаний: a photo of a plane, a photo of a car, a photo of a dog, ..., a photo of a bird. Если CLIP хорошо предобучен, то мы можем ожидать, что для фотографии собаки максимальную численную схожесть получит вариант a photo of a dog. Двигаясь дальше в нашем рассуждении, мы можем подавать на вход и другие изображения, получать (ранжируя, сортируя по метрике схожести) текст, который будет ближе всего соответствовать новому изображению. А не является ли это классификацией изображений на классы, описанные на естественном языке?

Разница между классическим подходом к классификации и гибридным подходом CLIP
Разница между классическим подходом к классификации и гибридным подходом CLIP

Как уже можно догадаться, в этом и заключается процесс обучения без обучения нового классификатора! Берем сеть CLIP, один раз прогоняем через Text Encoder, и получаем векторные репрезентации текстовых описаний. Ведь этот процесс не нужно повторять, так как для каждого изображения в новом датасете мы будем будем искать максимально соответствующее текстовое описание все в том же списке. Получение векторов классов на основании текстовых описаний и есть процесс обучения без обучения.

Это возможно лишь потому, что исходная нейросеть предобучалась на колоссальном по размеру датасете пар изображение-текст, и способна не только понимать, что на изображении котик или собачка, как это делают большинство классификаторов, а полностью репрезентировать весь контекст! Какая собака на фото? Какого она цвета? Каким объективом она снята? С какого ракурса? Что находится за собакой? Какое время года на снимке? В каких годах было сделано это фото? Куда направлен взгляд у собаки? Какие внутренние или внешние мотивации заставили собаку принять именно эту позу? Если ответов на все эти вопросы нет в векторной репрезентации, то CLIP не сможет подобрать правильное наиболее подходящее описание. Выбрать то, что соответствует изображению больше: "черная собака на фоне осеннего леса" или "нарисованный пес ест мороженное".

Как мы видим, CLIP справляется с этой задачей в большинстве случаев. Вот пример того, как CLIP находит текстовое описание, максимально соответсвующее фотографиям из различных датасетов. Обратите внимание, что запрос формулируется очень специфически: а photo of a ____ или a centered satellite photo of ____. Как можно догадаться, подобная формулировка позволяет более узко и специфично производить настройку или адаптацию под конкретный датасет во время обучения без обучения. Черт возьми, это чуть ли не машинное обучение на словах! Правильная словесная формулировка и описание классов — готовый классификатор.

Машинное обучение на словах!
Машинное обучение на словах!

Справедливости ради, стоит заметить, что CLIP не способен классифицировать опухоли. Я, кстати, тоже. И это вполне естественно. Ведь сама идея transfer learning заключается в переносе знаний только на похожий класс задач. Вывод такой:

  • Нужно автоматически отличать нарисованных английских кокер-спаниелей, от нарисованных американских кокер-спаниелей, но нет времени возиться с парсингом датасета и с обучением нейронной сети? — Пожалуйста, CLIP!

  • Никогда не работали с нейронными сетями, но хотите получить решение высокой точности для классификации? — Нет проблем, CLIP!

  • Хотите построить стартап — поисковик будущего, который найдет соответствующие фотографии или кадры из фильмов по текстовому описанию, например, "Дарт Вейдер душит очередного штурмовика", и сделать это лучше чем Google? — Я бы начал с CLIP!

  • Нужно классифицировать галактики или медицинские снимки? — Забыли про CLIP. Идем искать лучше датасеты, и читайте пейперы.

Результаты

Возникает пару логичных вопросов. Давайте попробуем ответить на них в форме диалога.

— Может быть лучше взять предобученную на ImageNet сеть, какой-нибудь ResNet-50, и просто сделать linear probe, разметив пару десятков изображений новых классов?
— Может быть и лучше. Давайте посмотрим на результаты подобного эксперимента.

Zero-shot CLIP превосходит few-shot linear probes! CLIP без обучения работает лучше, чем CLIP, Image Encoder которого был взят как фича-экстрактор, и обучен под новые классы (4-shot linear probes), размеченными по 4 изображения на класс. Качество Zero-shot CLIP сопоставимо с BiT-M после 16-shot linear probes. При этом, если продолжать few-shot learning на CLIP, он начинает быстро обгонять другие модели, обучаемые тем же linear probes на том же количестве новых размеченных данных.

— Что касается обучения на фичах классического ResNet-50 слоя logistic regression, если есть огромный датасет. Возможно решение старой-доброй линейной классификации на фичах ResNet-50 будет работать лучше, чем обучение без обучения на CLIP? Ведь CLIP в глаза эти датасеты не видел?
— Да.. Но нет.. Вот Mnist лучше обучать. А StanfordCars лучше не обучать, если хочется иметь большую точность. Да и даже к ResNet-50 на ImageNet есть очень большие вопросы..

Обучение без обучения на CLIP может конкурировать с baseline(слоя logistic regression на фичах классического ResNet-50) полученным обычным обучением с учителем. Перед вами список из 27 датасетов. Обучение без обучения на CLIP превосходит baseline классификаторы, полученные обучением с учителем на 16 из 27 датасетов, включая ImageNet! В качестве фича-экстрактора выступает ResNet-50. Интересно и то, что CLIP значительно превосходит baseline по двум датасетам Kinetics700 и UCF101 в задаче "распознавания действий на видео". Это связано с тем, что естественный язык обеспечивает более подробную репрезентацию для этой задачи.

— Но все же, если у меня есть огромный датасет, и огромные вычислительные мощности, не лучше ли будет работать классификатор, обученный на этом датасете с нуля методом обучения с учителем?
— Да, скорее всего так и будет. Можно взять топовую нейроархитектуру, и обучить классификатор конкретно под нужный датасет. И, конечно, он будет работать лучше. Лучше, но не робастнее (не устойчивее). Если есть уверенность, что распределение данных не будет сильно меняться, то CLIP не нужен.

Zero-shot CLIP оказывается более устойчивым к сдвигу распределений, чем модель обученная на ImageNet.
Zero-shot CLIP оказывается более устойчивым к сдвигу распределений, чем модель обученная на ImageNet.

Zero-shot CLIP оказывается более устойчивым к сдвигу распределений, чем модель обученная на ImageNet.

Продемонстрируем сдвиг по фазе в распределении изображений бананов. Этот класс общий для шести датасетов. Качество лучшей модели CLIP (ViT-L / 14 @ 336p) с обучением без обучения, сопоставимо с моделью ResNet-101, которая имеет такую ​​же точность на исходном датасете ImageNet. Предположим, что вы решили сделать приложение для распознавания бананов. Это всего лишь пример. И воспользовались неплохой архитектурой, которая показывает отличный результат на ImageNet. Но может оказаться так, что в реальности приложение будут использовать в таких условиях, что распределение изображений будет больше походить на распределения из датасетов ObjectNet или ImageNet-A. Вполне возможный кейс. Если нет уверенности в распределении, то лучше будет выбрать CLIP.

Идеальная по устойчивости модель (пунктирная линия) одинаково хорошо работает в распределении ImageNet и в других аналогичных распределениях изображений по совместным классам. Модели CLIP с обучением без обучения оказываются робастнее обычных моделей, обученных на ImageNet, и даже моделей, к которым применялись известные методы повышения устойчивости. Из этого стоит сделать вывод, что CLIP является не только прорывом в области классификации через обучение без обучения, но и бьет рекорды по устойчивости, благодаря обучению не на сырых классах, а на парах изображение-текст, содержащих куда более обширный контекст. Теперь важность контекста стала очевидна не только для NLP, но и для CV.

За пределами классификации и почему CLIP — лучший друг DALL·E?

Если вы не знакомы с нейронной сетью дали DALL·E, то советую ознакомиться с материалом, который я делал пару недель назад. Там подробно описано то, как подобная архитектура работает, и на что она способна.

DALL·E от OpenAi: Генерация изображений из текста. Один из важнейших прорывов ИИ в начале 2021 года

В отличие от задачи Image Captioning (описание изображений на естественном языке), нейросеть DALL·E решает куда более сложную (обратную) задачу — генерацию изображений по текстовому описанию.

Разберем конкретный пример. DALL·E попросили сгенерировать изображения по описанию: a living room with two black armchairs and a painting of darth vader. the painting is mounted above a coffee table. Качество результатов говорит само за себя

Исследователи из OpenAI утверждают, что сами не отбирали лучшие картинки, сгенерированные DALL·E. Но все ли изображения, которые генерирует DALL·E, удовлетворяют нас не только качеством, но и соответствием текстовому описанию?

Как видно, не все кресла получились черные, и не все изображения содержат кофейный столик. На самом деле DALL·E не всегда генерирует то, что было в тексте.

Ресерчеры из OpenAI придумали отличный подход. Нам показываются 32 лучших примера из 512-ти сгенерированных DALL·E, отобранных нейросетью CLIP. По сути, можно сказать, что CLIP выступает в дискриминантной роли, выбирая те изображения, чья метрика схожести с исходным текстовым описанием (promt) максимальна.

Два возможных режима использования гибридной нейронной сети CLIP
Два возможных режима использования гибридной нейронной сети CLIP

Этот пример отлично показывает, как можно использовать CLIP, в режиме поиска лучших изображение, а не лучших описаний. В таком режиме, можно интерпретировать работу CLIP, как поисковик изображений по текстовому описанию.

Заключение

Как мы видим, нейрогибридная сеть CLIP — это действительно новый взгляд на объединение NLP и CV. Последние несколько лет мы наблюдали триумфы в области обработки естественного языка, и языковые модели действительно наделали много шума, совершив новую революцию и, в очередной раз, отложив новую "зиму" искусственного интеллекта в долгий ящик. Совсем недавно мы начали наблюдать явление, когда технологии, вроде бы изначально присущие только NLP, стали бить рекорды в компьютерном зрении: Vision Transformers. Методы few-shot и zero-shot learning проникают в сферу компьютерного зрения уже благодаря гибридным nlp и cv моделям. Посмотрим, что нас ждет дальше, и какие еще модели и методы пополнят наши славные ряды!
Кто теперь с нами? CLIP — устойчивый классификатор, который не нужно даже обучать, и лучший друг DALL·E!

Полезные ссылки

Чтобы сделать публикацию еще более полезной, я добавил образовательные материалы, которые могут быть интересны начинающим и продолжающим свой путь в мир машинного обучения:

Собираем нейросети. Классификатор животных из мультфильмов. Без данных и за 5 минут. CLIP: Обучение без Обучения + код

Новая специализация TensorFlow: Advanced Techniques от deeplearning aiоснованной самим Andrew Ng

YouTube-Лекция: Нейронные сети: как их создают и где применяют? Два часа о “самом главном”

Сноски
  1. Даже нетренированный и знакомый со всеми нюансами машинного обучения человек, такой как Andrej Karpathy обладает 95% точностью top-5 на датсаете ImageNet. На начало 2021 года искусственный интеллект достиг точности в 98.8% top-5 (EfficientNet-L2) на датсаете ImageNet.

  2. Vision Transformers могут начать вытеснять сверточные нейронные сети. И в ближайшее время мы увидим все больше интереса именно к этим архитектурам. Создатели CLIP обучили CLIP-ViT на основе Vision Transformer'ов. Это три модели обученные на разрешении 224x224 : ViT-B/32, ViT-B/16, ViT-L/14, и модель ViT-L/14, fine-tune которой производился на изображениях 336х336.

  3. Можно заметить, что cosine similarity умножается на некоторый параметр τ np.exp(t), которые выполняет функцию температуры. Параметр температуры τ, контролирует диапазон logits в softmax.

Ну вот и все! Надеюсь, что материал оказался полезным. Спасибо за прочтение!

Что ты думаешь о CLIP? Как тебе идея "обучения без обучения"? Где, по-твоему, может быть полезна такая технология? Насколько тебя впечатлили результаты? Есть ли какие-то вопросы? Интересна ли тебе новая рубрика "Разбираем и Собираем Нейронные Сети"? Какие темы тебе были бы интересны? Давай обсудим в комментариях!

Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 19

    +2
    P.S. Статья появилась, именно благодаря таким запросам. Так, что если тебя интересует какая-то тема в машинном обучении — предлагай!
    image
      +1
      На минуту впал в ступор от скриншота, пытаясь нажать стрелку вверх. :-)
        +2
        Забавно! Меня самого, кстати, мой же скрин тоже сбил с толку)
      +3
      Я не соглашусь что CLIP — обучение без учителя. Мы можем конфигурировать вывод некой сети доп. Linear слоем (обычный TL), программным фильтром, который, например, будет считать расстояния в N-размерности embedding-ов, или их комбинацией, как CLIP, но факт остается — сначала с учителем (картинка <-> текст), потом настройка текстом (фильтр). Тем не менее, интересно, спасибо за труд)
        +1
        Большое спасибо за интерес к теме! Старался подробно и доступно разобрать детали. Согласен с тем, что сам процесс предобучения CLIP — supervised contrastive learning на парах изображение-текст. А процесс инференса CLIP под конкретную задачу или датасет может быть выполнен, как через обучение без учителя, так и через использование нового линейного слоя. Сами авторы делали и то и другое. И показали, что для большего класса задач, обучение без учителя показывает отличные результаты.
        +1

        Если правильно понял суть, то работает это следующим образом: когда мы хотим найти картинку, где дарт вейдер душит штурмовика, то сеть найдёт (даст макс скор) картинку, где максимально точно раскрыты понятия "дарт вейдер", "герой 1 душит героя 2", "штурмовик"?
        Если так, то чем это отличается от старого доброго классификатора, обученного под эти понятия и функции, которая на основе скоров на эти три класса даст итоговый класс?

          0
          Спасибо за интерес к теме! Разница в том, что CLIP считатет этот скор, как cosine similarity в общем пространстве визуальных и текстовых репрезентаций.

          1. Работа в этом направлении велась. Но, то, что Вы описываете не может быть «классическим» классификатором. Описанное Вами решение должно быть детектором + графом «вещь, свойство — отношение». Вот пример подобной работы: image

          2. Были попытки решения подобной задачи и через Dense Captioning:
          image

          Все эти варианты не являются старыми добрыми классификаторами по своей природе. Да и требуют они достаточно сложной и специфической разметки. CLIP же на этапе предобучения требует лишь пары изображения-текст, которых полно в интернете, откуда они и были взяты. Кроме того, CLIP, в отличие от подобных подходов, отлично показывает себя в режиме «обучение без обучения».
          +4
          Что-то меня подход Open-AI к публикациям изумляет. «У нас есть такая модель! Но мы вам её не покажем. И API не дадим. И про архитектуру расскажем совсем чуть-чуть. Зато смотрите какая она классная — вот картиночки. Что? Как проверить? А зачем вам — джентельменам надо верить на слово.»
            0
            Прекрасно Вас понимаю. GPT-3 — не для смертных. DALL·E — еще не понятно, надеюсь, что хоть маленькую версию дадут в доступ. CLIP — доступен, например TorchScript для ViT-B/32 версии CLIP. Можно юзать.
            +4
            Если будет интересно, то могу сделать статью Собираем CLIP, где покажу как его юзать и подготовлю примеры кода.
              0
              О, действительно, CLIP доступен, проморгал ссылку на гитхаб. Спасибо.
                0
                Не за что! В этот раз, действительно, OpenAI оказался не совсем ClosedAI.
              0
              Если есть предложения по поводу примеров, на чем продемонстрировать работу CLIP и какой классификатор собрать используя обучение без обучения, то пишите.
                +1
                Спасибо за статью. А можно вопрос? CLIP доступен уже в предобученном виде на огромном количестве пар фото-текст? Также его можно обучить самому на своей базе размеченных фото?
                  +2
                  Добрый день! Не за что! Да, все верно!
                  1. CLIP, предобученный на 400М пар изображение-текст, доступен. Можно использовать в режиме обучения без обучения (например ViT-B/32 CLIP).
                  2. Можно взять предобученный CLIP и режиме few-shot linear probes обучить голову на своей базе размеченных фото.

                  Могу сделать туториал с кодом, где покажу как можно получить свой классификатор на CLIP в режиме обучения без обучения.
                    +1
                    Туториал тоже нужная вещь. Спасибо!
                      +1
                      Можно использовать в режиме обучения без обучения (например ViT-B/32 CLIP).


                      Не могли бы еще раз уточнить, чтобы лучше встало на места? Предобученный contrastive CLIP может давать предсказания (inferences) для новых тэгов, которых не было в обучении, просто потому что векторизация тега будет по размерности встроена в существующее пространство параметров модели? То же, для новых фотографий, и даже пар новое фото — новый тэг? Или новые фото уже не укладываются в схему «обучение без обучения»?

                      А если набор специфичен, то нужно дообучать линейный слой выходов? Например, www.tassphoto.com/en/feature/337476/video-launching-ceremony-for-russian-navy-patrol-boat-sergei-kotov/page/1

                      Тут никто, по сути, кроме фото-корреспондента не совсем понимает, что происходит. А это «Спуск на воду нового патрульного катера Сергей Котов». Вряд ли дефолтный CLIP тут что-то даст близкое к истинному происходящему. Верно я понял?
                        +1
                        Я понял вашу мысль, а давайте попробуем. Загрузим эти фотки, где «спуск на воду патрульного катера», и фотки с открытия какой-то стройки или открытия парка. Подберем правильные формулировки. И посмотрим. Код доступен. Будет интересно!
                  +3
                  Туториал готов: habr.com/ru/post/540312

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое