В качестве базового текстового энкодера взят обычный трансформер на 63М параметров с 12 слоями, 8 головами и эмбеддингами в 512 (для пар с более тяжёлыми картиночными энкодерами параметры побольше). Что важно, attention span этого трансформера всего 76 токенов, то есть он работает с сильно более короткими по сравнению с бертом текстами. При этом, что нехарактерно для энкодеров, “на будущее” используется masked attention, чтобы можно было инициализировать предобученной моделью или добавить дополнительный objective, если вдруг захочется.
Оба энкодера обучали с нуля, не загружая в них какие-либо претренированные веса. Нелинейных преобразований текстовых или картиночных эмбеддингов не было, трансформаций данных тоже, кроме случайных кропов для отмасштабированных картинок.
Самый толстый ViT обучался 12 дней на 256 V100, а RN50x64 — 18 дней на 592 V100.
Изначально были выложены версии CLIP с ViT-B/32 + RN50 (ResNet-50), затем в режиме постепенных выкладываний выложили RN101 и RN50x4, а в июле 2021 также выложили RN50x16 и ViT-B/16. Ну то есть более тяжёлой RN50x64 и самой нормальной ViT-L/14 и тем более ViT-L/14@336px нету (
https://github.com/openai/CLIP/blob/main/clip/clip.py#L29).
OpenAI style.
Такое предобучение даёт неожиданно хорошие в плане zero-shot learning результаты и иногда сопоставимо с полностью supervised результатами. И собственно анализ этого и занимает большую часть работы.
При всей своей идейной и технической простоте модель получилась реально очень универсальная и с потенциально огромным количеством применений. Welcome to the age of Foundation Models (
https://arxiv.org/abs/2108.07258).
Во-первых, модель можно использовать для классификации по заранее неопределённому числу классов. Заготоваливаете текстовые описания классов, а потом считаете близость эмбеддингов картинок к эмбеддингам этих классов и выбираете ближайший из всех. Или ещё лучше делаете промпт вида “A photo of a {label}” по нужным вам классам, и это даёт более высокое качество классификации. Или даже на “A photo of a {label}, a type of pet.” если релевантно, тогда ещё лучше. В общем здесь тоже как и в GPT-3 можно заниматься prompt engineering. Привет, Software 3.0. Или делаете разные промпты и ансамблируете, так тоже лучше.
Если сравнить с supervised бейзлайном на ResNet-50, то CLIP бьёт его на большом числе датасетов, а на STL10 вроде как даже получили новый SoTA без обучающих примеров. CLIP значительно превосходит бейзлайн на двух датасетах с разпознаванием действий. Авторы спекулируют, что supervision из тектовых описаний лучше работает для концепций с глаголами по сравнению с сигналом из объект-центричных датасетов типа ImageNet.
Можно также делать few-shot learning (обучаем логрегрессию на фичах CLIP), но тут неожиданно оказывается, что zero-shot performance CLIP соответствует 4-shot при таком подходе, то есть 1- и 2-shot learning дают худший результат, чем вообще без такого дообучения.
Качество zero-shot learning скейлится с увеличением сложности модели (речь про картиночную часть), и видимо есть куда продолжать.
Отдельно от zero-shot изучали качество фич с помощью linear probing (обучаем линейный классификатор на фичах). В целом по 27 датасетам, на которых сравнивались, фичи ViT бьют фичи резнетов, а также фичи EfficientNet (+NoisyStudent), SimCLRv2, BYOL, MoCo, BiT-M и не только. Хорошие фичи, короче :)
Среди датасетов в основном различные классификации, от общих (типа ImageNet или CIFAR) до специальных (марки машин, виды растений, объекты на спутниковых снимках) или даже не очень классификаций (номера домов в SVNH, подсчёт объектов в CLEVR).
Подробно изучают устойчивость к distribution shift, показывают, что хотя до идеала далеко, модель всё равно ощутимо лучше многих перечисленных выше. Причём если начинать файнтюнить, то преимущество теряется. Возможно, это связано с тем, что при обучении на конкретном датасете модель всё-таки ловит какие-то spurious штуки, связанные с этим датасетом. CLIP эту проблему обходит.