Как LLM видят изображения
LLM понимает только последовательности токенов, поэтому картинку превращают в «визуальные слова»: ViT режет её на патчи, CLIP учит энкодер смыслу изображений, а проектор подаёт визуальные токены в языковую модель (VLM).
Интуиция
Языковая модель — это машина предсказания следующего токена. У неё нет глаз: на вход она принимает только последовательность векторов-эмбеддингов. Значит, чтобы модель «увидела» фотографию, картинку нужно превратить в такую же последовательность векторов, как и текст.
Представь, что описываешь картину другу по телефону: ты мысленно делишь её на фрагменты — «слева домик, над ним красная крыша, справа солнце» — и передаёшь кусок за куском. Современные мультимодальные модели (multimodal LLM, VLM — visual language model) делают буквально то же самое: изображение режется на маленькие квадратики, и каждый квадратик становится «визуальным словом» в общей последовательности.
Как это работает: ViT и CLIP
Основа почти всех VLM — Vision Transformer (ViT). Он поступает с картинкой так:
- изображение режется на патчи (patch) фиксированного размера — обычно 14×14 или 16×16 пикселей;
- пиксели каждого патча вытягиваются в один длинный вектор и умножаются на обучаемую матрицу — это линейная проекция (linear projection) в пространство эмбеддингов;
- к каждому вектору добавляется позиционный эмбеддинг (где патч стоял в картинке), и дальше работает обычный трансформер.
Число визуальных токенов легко посчитать:
где H×W — разрешение картинки, P — размер патча. Например, 336×336 при патче 14 даёт 24 × 24 = 576 токенов — ровно столько «стоит» одна картинка в классической LLaVA.
Но откуда энкодер знает смысл патчей? Здесь ключевую роль сыграл CLIP — модель, обученную контрастивно (contrastive learning) на сотнях миллионов пар «картинка–подпись»: эмбеддинги правильных пар сближаются, эмбеддинги неправильных — раздвигаются. После такого претрейна эмбеддинг картинки живёт в одном пространстве с текстом, и появляется zero-shot классификация: сравниваем эмбеддинг фото с эмбеддингами фраз «фото кошки», «фото собаки» — и берём ближайший, без всякого дообучения.
Архитектура VLM: LLaVA-подход
Самый распространённый рецепт сборки VLM (его популяризовала LLaVA) — три детали:
- Замороженный vision-энкодер (обычно CLIP ViT) — превращает картинку в набор патч-эмбеддингов;
- Проектор (адаптер) — маленький MLP или cross-attention-модуль (как Q-Former в BLIP-2), который переводит визуальные эмбеддинги в пространство эмбеддингов LLM: выравнивает и размерность, и «язык» векторов;
- Обычная LLM — получает визуальные токены вперемешку с текстовыми и генерирует ответ как обычно.
Обучают такую модель в два этапа. Сначала alignment-претрейн: на парах «картинка–подпись» учится только проектор, а энкодер и LLM заморожены — дёшево и быстро. Затем visual instruction tuning: SFT на диалогах с картинками («что на фото?», «прочитай таблицу»), где обычно размораживают и LLM. После этого модель не просто «подписывает» картинки, а умеет разговаривать о них.
Сколько стоит картинка
Одна картинка — это сотни, а то и тысячи токенов: число зависит от разрешения и размера патча. Это прямо влияет на цену запроса в API и на то, сколько картинок влезет в контекст. Для изображений высокого разрешения используют tiling: картинка режется на несколько фрагментов стандартного размера (плюс уменьшенная «глобальная» копия), каждый кодируется отдельно — деталей видно больше, но и токенов кратно больше. Токенизация текста устроена иначе — про неё см. BPE.
Типичные слабости VLM
Знать их полезно и для собеседования, и для продакшна: мелкий текст (буквы меньше патча «растворяются» при сжатии в вектор), точный счёт объектов, пространственные отношения («слева от», «за») и галлюцинации деталей — модель уверенно «додумывает» то, чего на картинке нет, опираясь на языковой приор.
- «Как картинка попадает в LLM?» — режется на патчи → каждый патч линейно проецируется в вектор (ViT) → проектор выравнивает векторы с пространством LLM → визуальные токены идут в последовательность вместе с текстовыми.
- «Что даёт CLIP-претрейн?» — контрастивное обучение на парах картинка–текст кладёт изображения и подписи в общее пространство: энкодер «знает смысл» картинки, работает zero-shot классификация.
- «Почему картинка дорогая по токенам?» — токенов N = (H/P)×(W/P): сотни на одну картинку, при tiling — тысячи; это и цена API, и съеденный контекст.
- «Почему VLM не читает мелкий текст?» — детали меньше патча теряются при кодировании; лечится повышением разрешения/tiling или связкой с OCR.