В Главе 2 Книги 1 мы разобрали, как трансформер работает с текстом: текст разбивается на токены, токены превращаются в эмбеддинги, эмбеддинги обрабатываются механизмом внимания.
Для картинок логика та же - но с одним важным отличием. У текста токены уже есть: это слова или их части. У картинки нет «слов». Есть пиксели - сотни тысяч или миллионы чисел.
Как быть? Ответ придумали в 2020 году в статье «An Image is Worth 16x16 Words». Название говорит само за себя.
Идея Vision Transformer (ViT)
изображение разрезается на маленькие квадратные фрагменты - патчи. Каждый патч (например, 16×16 пикселей) становится аналогом токена. Дальше - всё как в текстовом трансформере: каждый патч превращается в вектор (через линейный слой), добавляется информация о позиции (где этот патч был - в левом верхнем углу или в правом нижнем), и векторы подаются на вход трансформеру.
Метафора
Представьте, что вы читаете книгу, но буквы в ней не привычные, а составлены из маленьких кусочков фотографии. Каждый кусочек - это патч. Вы не можете прочитать его как букву, но можете понять, что на нём изображено: кусочек неба, кусочек травы, кусочек морды кота. А трансформер собирает эти кусочки в цельную картинку.
Что ViT умеет?
Он может классифицировать изображение (кот или собака?), находить на нём объекты (где кот, а где миска?), сегментировать (выделить контур кота). Но ViT не умеет отвечать на вопросы про картинку. Он только «видит», но не «понимает» в языковом смысле. Для этого нужен следующий уровень - связь с текстом.
Проблема: модель может видеть картинку, но как объяснить ей, что на этой картинке «кот», а на другой - «собака»? Нужно связать изображения со словами.
В 2021 году OpenAI выпустила CLIP (Contrastive Language-Image Pre-training). Идея гениальна в своей простоте.
Как обучается CLIP
Берутся миллионы пар «картинка - текстовое описание» из интернета. Модель учится так, чтобы вектор картинки был близок к вектору её описания, и далёк от векторов описаний других картинок. В результате у CLIP появляется единое пространство эмбеддингов, где и картинки, и текст находятся на одной карте смыслов.
Метафора
Представьте, что вы учите ребёнка словам. Вы показываете картинку кота и говорите «кот». Показываете картинку собаки и говорите «собака». Через какое-то время ребёнок видит новую картинку кота и сам говорит «кот». CLIP делает то же самое, только на масштабе миллиардов картинок.
Что даёт CLIP
Поиск картинок по тексту: вы пишете «рыжий кот на диване», CLIP находит самые похожие картинки.
Классификация без обучения: вы даёте CLIP картинку и список возможных классов (кот, собака, птица). CLIP выбирает тот класс, чей текстовый эмбеддинг ближе к эмбеддингу картинки.
Мост между модальностями: CLIP превращает картинку в вектор, который понимает LLM. Это ключевой компонент мультимодальных LLM.
Как это устроено технически (на пальцах)
CLIP состоит из двух частей:
1. Vision encoder (обычно ViT) - превращает картинку в вектор.
2. Text encoder (обычно трансформер) - превращает текст в вектор.
Обе части обучаются одновременно. Берётся батч из N пар (картинка, описание). Модель вычисляет N векторов для картинок и N векторов для текстов. Задача: для каждой из N правильных пар сделать косинусное расстояние маленьким, а для N×(N-1) неправильных пар - большим.
Это называется контрастивным обучением. CLIP не учится предсказывать следующий токен, как LLM. Он учится различать: «эта картинка подходит к этому тексту, а эта - нет». CLIP не заменяет LLM. Он - переводчик.
Важно понять: CLIP не умеет генерировать текст. Он не отвечает на вопросы. Его единственная задача - взять картинку и превратить её в вектор, который «понимает» LLM.
Это как если бы у вас был переводчик с китайского на английский. Вы говорите по-английски (LLM), собеседник говорит по-китайски (картинка). Переводчик (CLIP) переводит его речь на английский. Вы не учите китайский - вы просто получаете готовые английские фразы.
Так и здесь: LLM не учится «видеть». Она получает от CLIP уже готовые эмбеддинги, похожие на текстовые. Для неё это просто ещё одна последовательность токенов. Она не знает, что эти токены пришли из картинки.
Почему это важно для мультимодальных LLM
В мультимодальных LLM (LLaVA, GPT-4V, Gemini) CLIP (или его аналог) работает так:
Картинка → Vision encoder (CLIP) → вектор картинки.
Маленький нейросетевой слой (проектор) переводит вектор картинки в пространство эмбеддингов LLM.
LLM получает эти векторы как «псевдо-токены» и генерирует ответ, учитывая и текст, и картинку.
Без CLIP LLM была бы слепа к визуальной информации.
Пример из практики
Вы загружаете в LLaVA фото грустного кота. CLIP превращает фото в вектор. Проектор переводит его в эмбеддинг, понятный LLM. LLM «видит» этот эмбеддинг и генерирует: «На фото грустный кот. Вероятно, он хочет есть или ему одиноко».
LLM не рассуждала о пикселях. Она работала с абстрактным вектором, который CLIP извлёк из картинки.
Ограничения CLIP
Плох на редких объектах. Если вы покажете редкую породу собаки, которой не было в 400 миллионах пар обучения, CLIP может её не узнать или перепутать с похожей.
Не понимает сцен. CLIP видит объекты («кот», «диван»), но не всегда улавливает отношения («кот лежит на диване» против «диван лежит на коте»).
Не локализует. CLIP не скажет, где на картинке находится кот. Для этого нужны другие модели (например, SAM).