VLM в Нейро: как мы создавали мультимодальную нейросеть для поиска по картинкам
Сегодня у Поиска большое обновление. Например, ответы Нейро теперь будут появляться сразу в поисковых результатах — для тех запросов, где это полезно и экономит время. Но в рамках этой статьи нас интересует другая часть обновления: Нейро поможет найти ответы в Поиске по картинкам и в Умной камере — с помощью новой мультимодальной модели Яндекса. Пользователь может не только узнать, что изображено на картинке, но и задать вопрос по каждой её детали. Например, гуляя по музею, можно сфотографировать натюрморт голландского живописца и спросить, что символизирует тот или иной предмет на картине.
Меня зовут Роман Исаченко, я работаю в команде компьютерного зрения Яндекса. В этой статье я расскажу, что такое визуально‑текстовые мультимодальные модели (Visual Language Models, VLM), как у нас в Яндексе организован процесс их обучения и какая у них архитектура. Вы узнаете, как Нейро работал с картинками и текстами раньше, и что изменилось с появлением VLM.
Что такое VLM
Сегодня никого уже не удивишь большими языковыми моделями с миллиардами (а то и сотнями миллиардов) параметров. State‑of‑the‑art модели способны решать нетривиальные задачи анализа текстовой информации. Прогресс в развитии области NLP в последние годы поражает воображение.
Один из основных фокусов развития LLM сегодня — это попытка сделать их мультимодальными, тем самым прийти к так называемым omni‑моделям. Такие модели помимо текстовой модальности анализируют и другие — картинки, видео, звук. Верхнеуровнево про такие модели можно думать как про «чёрные ящики», которые принимают на вход данные разных модальностей и могут отдавать их на выходе.
Зачем же нужны такие модели? Во‑первых, это супер общий подход к построению модели глубокого обучения. Последние годы мы можем наблюдать тренд на то, что общие подходы побеждают частные. Большие модели способны решать разнородный спектр задач, для которых раньше приходилось делать частные решения. Во‑вторых, таким способом мы можем на порядки отмасштабировать данные, которые доступны нам для обучения моделей, это важно, т. к. количество текстовых данных конечно. В‑третьих, у нас есть вера в то, что обучение мультимодальной модели может привести к росту качества на каждой отдельной модальности.
Сегодня в терминах концепции «чёрного ящика» мы ограничимся частным случаем, где на вход модели приходит картинка и некоторый текст (будем называть его инстрактом), а на выходе модель будет генерировать только текст (или же просто ответ). Таким образом, схема значительно упрощается.
Тем самым мы не будем рассматривать генеративные картиночные модели, где в последнее время также наблюдается стремительный рост качества —, а именно в диффузионных моделях text‑to‑image и text‑to‑video. Мы поговорим про модели, которые по отношению к картинке являются дискриминативными (то есть анализируют контент изображения).
Перед тем как мы погрузимся в техническую часть вопроса, давайте подумаем, а какие вообще задачи такие модели могут решать. Вот несколько примеров.
В целом спектр задач очень широкий, а сами задачи очень разнородны.
Мы считаем, что VLM — это новая стадия развития области компьютерного зрения. Такие модели могут решать множество стандартных задач компьютерного зрения (классификация, детекция, описание и т. д.) в режимах zero‑shot и one‑shot. И пусть сейчас VLM показывает высокое качество не в каждой стандартной задаче, скорость развития таких моделей достаточно высокая.
Архитектура VLM
Итак, из чего же состоит VLM. Сейчас большинство таких моделей состоят из трёх блоков:
LLM — текстовая модель (в нашем случае — YandexGPT), которая ничего не знает ни про какие картинки.
Картиночный энкодер — картиночная модель (CNN или ViT), которая ничего не знает ни про какие тексты.
Adapter — модель, которая, как кот Леопольд, пытается сделать так, чтобы LLM и картиночный энкодер жили дружно.
Собственно, сам пайплайн довольно прост:
подаём картинку на вход картиночного энкодера;
преобразуем выход картиночного энкодера с помощью адаптера в некоторое представление;
интегрируем выход адаптера в LLM (про то, как именно мы это делаем, описано ниже под катом);
помимо обработки картинки, мы одновременно с этим преобразуем текстовый промпт в последовательность токенов и подаём их на вход LLM.
Пара слов про адаптеры
Самый интересный блок — модель адаптера. Они бывают двух видов:
Prompt‑based адаптеры изначально появились в статьях про модели BLIP-2 и LLaVa. Устроены они очень просто: берём выход картиночного энкодера (вектор, последовательность векторов, тензор — всё зависит от типа архитектуры) и преобразуем в последовательность векторов (токенов), которые подаём на вход LLM. В качестве такого адаптера может выступать просто MLP‑моделька с парой слоёв — даже такой простой адаптер хорошо показывает себя на практике.
Cross‑attention‑based адаптеры устроены чуть сложнее. Они использовались в недавних статьях про Llama 3.2 и NVLM. Они пытаются преобразовать выход картиночного энкодера таким образом, чтобы можно было его подать в cross‑attention‑блок LLM в качестве матриц key / value. В качестве таких адаптеров могут выступать, например, трансформерные архитектуры типа perceiver resampler или Q‑former.
У обоих подходов есть свои плюсы и минусы. На данный момент с помощью prompt‑based адаптеров получается достичь большего качества, но при этом они съедают значимую долю входного контекста LLM. Cross‑attention‑based адаптеры не съедают контекст LLM, но при этом для хорошего качества нужно сделать адаптер с достаточно большим количеством параметров.
Процесс обучения VLM
Итак, с архитектурой определились. Давайте теперь поймём, а как нам это инженерное чудо обучать. VLM не учатся с нуля (мы думаем, это пока что). За их основу берутся предобученные LLM и картиночный энкодер. Используя эти предобученные модели, мы дообучаем нашу VLM на мультимодальном картиночно‑текстовом домене.
Это дообучение состоит из нескольких этапов:
Думаю, что многим эти этапы напоминают обучение самой LLM. Собственно, идеологически они очень близки к тому, что делают с LLM. Давайте вкратце рассмотрим эти этапы.
VLM pretraining
На этом этапе нам нужно добиться двух целей:
связать текстовую и картиночную модальности между собой (напомню, что у нас в модели есть адаптер, который мы не обучали раньше);
загрузить в нашу модель знания о мире (при этом в картинках довольно много своей специфики — как минимум OCR‑навыки).
Здесь есть три вида претрейна, которые чаще всего используются при обучении VLM:
interleaved pretrain. Это аналог LLM pretrain стадии, где мы учим модель на next‑token prediction задачу, подавая на вход веб‑документы. Здесь же в VLM pretrain стадии мы выбираем веб‑документы с картинками и учим модель предсказывать текст. При этом опирается она не только на текст, но и на те изображения, которые расположены на странице. Таких данных достаточно много, поэтому этот вид предобучения легко масштабировать. Однако качество данных тут довольно низкое: как именно его повышать — довольно большая и сложная задача.
image‑text pairs pretrain. Здесь мы учим модель на одну конкретную задачу — описывать изображения (image captioning). То есть нам нужен большой корпус картинок с релевантным к ним описанием. Такая задача более популярна, так как таких корпусов достаточно много — они используются при обучении других моделей (text‑to‑image генерация, image‑to‑text retrieval).
instruct‑based pretrain. На этапе инференса в большинстве случаев мы будем подавать на вход модели не только картинку, но и текст. Почему бы сразу так и не обучать модель? В этом типе претрейна так и делают: обучаются на большом количестве (иногда не самого лучшего качества) данных в виде троек «картинка‑инстракт‑ответ».
А какой же объём данных потребуется, чтобы хорошо обучить VLM‑модель? Это очень сложный вопрос. На этой стадии объём данных варьируется от нескольких миллионов семплов до нескольких миллиардов (хотя бы не триллионов!).
У себя в Яндексе мы используем instruct‑based pretrain с несколькими миллионами семплов. Но очень верим в interleaved pretrain и сейчас активно работаем над этим направлением.
Здесь можно посмотреть примеры таких данных
VLM alignment
После того как мы закончили стадию претрейна, самое время перейти к стадии alignment. Она состоит из SFT‑обучения и дополнительной стадии RL. У нас есть только стадия SFT, так что я остановлюсь на ней. Однако в статьях (например, в этой и этой) всё чаще встречается стадия RL поверх VLM‑моделей, в которой используются те же методы, что и для LLM‑моделей (DPO и различные модификации с подменой первой буквы в названии метода).
Итак, поговорим про SFT. Строго говоря, эта стадия очень похожа на instruct‑based pretrain. Но здесь мы хотим сфокусироваться на данных очень хорошего качества, с хорошим форматированием и структурой ответа, а также с хорошими reasoning‑свойствами (то есть с возможностью не только понимать, что на картинке, но и с возможностью делать какие‑то выводы про изображение). А ещё в идеале не просесть в сценариях text‑only, где картинки не будет. Поэтому сюда же мы замешиваем и text‑only данные высокого качества.
В итоге типичное количество данных на этой стадии — от сотен тысяч до нескольких миллионов. В нашем случае это сотни тысяч примеров.
Как замеряется качество
Теперь поговорим про то, как же замерять качество VLM‑моделей. Мы это делаем с помощью двух подходов:
замеряем численные метрики на опенсорс‑бенчмарках;
сравниваем модели с помощью Side‑by‑Side (SbS) оценки, показывая асессору два ответа модели, чтобы он выбрал лучший из них.
Первый подход позволяет посчитать какие‑то суррогатные метрики (например, accuracy в задаче классификации) на узких срезах, но так как такие бенчмарки в основном англоязычные, они не позволяют сравнить между собой модели на русском языке. Конечно, их можно перевести с помощью переводчика, но сами модели переводчика добавляют много ошибок в данные, поэтому доверять таким переведённым бенчмаркам нельзя.
Второй подход позволяет сделать более глубокий анализ модели, но требует кропотливой (и дорогой) ручной разметки асессорами.
Наша модель — билингвальная, то есть может отвечать как на английском, так и на русском языках. Это позволяет нам замерять англоязычные опенсорсные бенчмарки, а также проводить SbS‑сравнения на русском языке.
Кстати, об SbS. Мы достаточно доверяем этому методу и много в него инвестируем. Вот что мы просим замерять асессоров:
грамотность,
трудночитаемость,
полноту ответа,
соответствие инстракту,
ошибки (логические и фактические),
галлюцинации.
Мы стараемся проверять достаточно полное и разнообразное подмножество навыков нашей модели. Ниже представлено распределение срезов нашей SbS-корзинки.
VLM в Нейро
Выше мы поговорили о том, что такое базовая технология VLM, как обучать и замерять модель. А теперь поговорим, зачем это всё нужно. Тут речь пойдёт про Нейро.
Архитектура пайплайна
Ещё весной мы добавили в Нейро мультимодальность, а именно возможность задавать вопрос не только текстом, но и картинкой. Но до недавних пор технологии, которые использовались под капотом Нейро, не были мультимодальными. Вот так это работало раньше.
Понимаю, что схема немного взрывает мозг, но на самом деле всё не так сложно. Давайте декомпозируем её на пункты.
Пользователь присылал картинку и пользовательский запрос.
Мы отправляли картинку в наш сервис визуального поиска, который возвращал нам много полезной информации про изображение (теги, распознанный текст, объектный ответ).
Используя всю эту информацию и исходный пользовательский запрос, мы с помощью модели рефразера (зафайнтьюненная LLM) формулировали текстовый запрос.
Со сформулированным текстовым запросом мы шли в Поиск и доставали нужные документы (на самом деле выдержки из документов под названием инфоконтексты).
Ну и наконец, используя всю информацию (исходный запрос, информацию из визуального поиска, переформулированный текстовый запрос и инфоконтексты), мы генерировали финальный ответ с помощью модели генератора (зафайнтьюненная LLM).
Как мы видим, в этой схеме используется две LLM (унимодальные модели) и наш сервис визуального поиска. Это решение неплохо работало на большом срезе запросов, но у него был ряд ограничений.
Ниже представлен пример, который ломал старую схему (пусть и немного утрированный).
Тут мы видим, что рефразер, который на вход получает выход визуального поиска, просто не понимает, о чём изначально спросил пользователь. В итоге LLM‑модель, которая ничего не знает про картинку, генерирует неверный поисковый запрос, получив теги про мопса и яблоко одновременно.
Чтобы вырастить качество нашего мультимодального ответа и расширить класс решаемых запросов пользователя, мы добавили в исходную схему VLM. А именно, мы сделали две модификации:
Мы сделали вместо LLM‑рефразера VLM‑рефразер. Фактически мы стали подавать на вход рефразеру помимо текстового результата визуального поиска ещё и исходное изображение.
Добавили в пайплайн отдельную модель VLM‑captioner. Эта модель описывает картинку, и мы используем это описание в качестве дополнительного инфоконтекста финального генератора.
Тут может возникнуть вопрос: почему бы не сделать сам генератор VLM‑based? Идея хорошая, но есть нюанс. Мы наследуемся при обучении генератора от текстовой модели Нейро, которая довольно часто обновляется. И чтобы мы могли чаще и проще обновлять весь пайплайн, нам намного проще добавить в схему отдельный VLM‑блок. Ну и работает такая схема ничуть не хуже.
Обучение моделей VLM‑рефразера и VLM‑captioner — это две отдельные задачи. Для этого мы брали нашу модель базовой VLM, о которой мы говорили выше, и дополнительно дообучали её на соответствующие задачи.
Дообучение каждой из этих моделей потребовало сбора отдельных обучающих выборок размером в несколько десятков тысяч семплов. Кроме этого, нам пришлось существенно доработать нашу инфраструктуру, чтобы сделать весь этот пайплайн вычислительно эффективным.
Замеры качества
Ну и тут у читателя должен возникнуть вопрос: стало ли лучше после добавления VLM в достаточно сложный пайплайн Нейро? И наш ответ: да, причём довольно сильно.
Для замера качества работы нового пайплайна Нейро мы провели SbS‑исследование и сравнили нашу прошлую LLM‑систему с новой VLM‑системой. Этот замер похож на замер базовой технологии, о котором я писал выше, однако здесь мы используем другой набор картинок и запросов — они больше смещены в поисковый сценарий.
Ниже представлено примерное распределение кластеров в данной корзинке.
Наш офлайновый SbS‑замер показывает, что мы интегрально сильно вырастили качество финального ответа. VLM‑пайплайн заметно увеличивает качество ответа, а также покрывает бо́льшее количество сценариев работы.
Более того, мы не ограничились офлайн‑замером. Нас интересовало, заметят ли пользователи технические изменения, которые, на наш взгляд, меняют восприятие продукта. Поэтому мы запустили онлайн‑эксперимент LLM‑пайплайна Нейро против VLM‑пайплайна. По предварительным результатам мы видим следующие изменения:
количество запросов с картинкой выросло на 17%;
количество сессий (несколько последовательных запросов от пользователя) выросло на 4,5%.
Так что теперь у вас самих есть шанс закинуть любую картинку в Нейро и попробовать самостоятельно.
На наш взгляд, VLM — это следующая стадия развития моделей компьютерного зрения. Уже сейчас VLM могут решать многие задачи «из коробки», а с помощью небольшого дообучения эти модели могут достигать state‑of‑the‑art‑качества.
Оценить VLM в работе уже сейчас может каждый пользователь Поиска по картинкам и Умной камеры Яндекса. Мы, конечно же, продолжим совершенствовать технологию и продукты. Поэтому будем рады вашим отзывам и идеям.
Кстати, наша команда компьютерного зрения ведёт канал в Telegram, в котором мы комментируем свежие научные публикации и делимся интересными случаями из практики. Заходите в гости, если тоже интересуетесь CV.