Всем привет! Меня зовут Дима. Я работаю в Поиске Okko и в этой статье хочу рассказать, насколько картиночные модели полезны для задачи Поиска и для чего мы используем их в наших пайплайнах.
Данный материал может быть полезен тем, кто только начинает разрабатывать аналогичные системы, и, возможно, сомневается в полезности кроссмодальных факторов в текстовом поиске.
Небольшое предисловие
Поиск в Okko — это многоуровневая система, которая включает в себя: отбор кандидатов, работу вспомогательных нейронок и моделей для создания фичей, финальную ранжирующую модель и многое другое. Но, чаще всего, когда говорят о моделях поиска, представляют нечто связанное с текстом, где ищут наиболее близкие к запросу строки в наборе строк. Посмотрим, как выглядит такой поиск в простейшем представлении.
Кажется, что такой подход является исчерпывающим. Но, если искать подобный матчинг не между текстом и текстом, а между текстом и картинкой? Именно с таким вопросом, в своё время, исследователи обратились к этой задаче.
На данный момент существует много вариантов решения, но одним из хороших считается подход, предложенный OpenAI к задаче классификации картинок с помощью модели CLIP.
CLIP
CLIP [1] является совокупностью из двух нейронных сетей, Image Encoder и Text Encoder, что проиллюстрировано на картинке ниже.
Как же работает такая сеть? Мы подаем на вход в Image Encoder изображение, кодируем его и на выходе получаем вектор. Тот же трюк проделываем с возможными описаниями для нашего изображения, прогоняем их через Text Encoder и получаем всевозможные вектора описаний. После чего мы сравниваем векторные представления описаний и картинки по косинусной близости, где ближайший по скору текст и будет описанием изображения. На картинке сверху видно, как находится описание для фотографии собаки.
Важно заметить, что вектора картинок и вектора описаний вкладываются в пространстве максимально близко, что позволяет проделать нам тоже самое с изображениями и искать их через текстовое описание, то есть по тексту «фотография собаки» мы найдем необходимую нам картинку!
Давайте же чуть подробнее разберём, как теперь обучить нашу сеть, чтобы мы могли добиться такого эффекта! На картинке ниже можно увидеть матрицу на которой отражены наши закодированные представления, где на главной диагонали находятся пары картинка-текст, которые соответствуют друг другу. Следовательно, теперь нужно только максимизировать косинусную близость по главной диагонали и минимизировать её для всех остальных пар в матрице, сближая картинку с её описанием и отдаляя от других описаний. Примерно так мы и получаем CLIP!
Эта модель примечательна ещё тем, что может выдавать значительное качество, даже не обучаясь на специализированных датасетах, за счет качественного предобучения, которое мы рассмотрели выше. Несмотря на то, что CLIP не учился на одном из основных для компьютерного зрения датасете ImageNet [2] он может выбивать качество, сравнимое с обученным на ImageNet классификатором ResNet50 [3],выигравшему соревнование на этом наборе данных в 2015 году и ставшим бенчмарком для проверки качества таких моделей.
Но чем СLIP может быть полезен?
Базово такая модель способна помочь сопоставлять текстовые запросы и объекты на изображении. Такими изображениями стали для нас обложки фильмов и сериалов в сервисе. С их помощью можно узнать какую-то дополнительную информацию о кино в сервисе и дать возможность искать не только через название, но и, косвенно, через содержание фильма, которое может быть заложено в обложке!
При помощи «коробочной» модели CLIP по полным текстовым запросам можно найти объекты и сделать вывод, что такой подход работает с обложками, на которых убраны текстовые названия фильмов.
Но есть и проблемы предобученной модели, с которыми пришлось столкнуться.
Понимает все картинки слишком буквально (описывает содержимое изображения как совокупность элементов на ней).
Иногда не находит нужной информации на изображениях.
Ничего не знает о домене кино.
Плохо понимает русский язык.
Плохо работает с частичными запросами, которые зачастую попадают в Поиск. Например, «ман» — Манюня; «волш» — Волшебный участок, «ласт» — Ласт квест.
Внизу можно увидеть пару примеров таких проблем.
Как использовать такую модель
В качестве бейзлайна новой фичи в Поиске мы решили матчить наши обложки к запросу с помощью CLIP. Для этого будем учить нашу модель на задаче ранжирования по кликовым взаимодействиям из Поиска и попытаемся понять, насколько каждая из обложек релевантна и конверсионна для конкретного запроса в пользовательской выдаче. Такой метод должен не только помочь пользователям предлагать конверсионную выдачу, но и узнавать что-то новое о наших фильмах через запросы.
Подготовка данных
Мы агрегировали кликовый сигнал по запросам за последние несколько месяцев, где:
есть значимое количество кликовых взаимодействий с выдачей — данные не являются шумом;
есть клики по фильму в выдаче — кино подходит к запросу;
отсутствует сдвиг на конкретные позиции.
В итоге мы получили несколько сотен тысяч пар запрос-фильм, на которых можно учить модель.
Как решили учить?
Для обучения мы приняли следующую схему.
Оптимизировали LambdaRank [4] (NDCG) для выдач обложек на запрос по их кликовым взаимодействиям.
Ранжировали обложки по скалярному произведению их векторного представления с векторным представлением запроса (по их близости запросу).
Первые результаты
Мы обучили модель и оценили её качество, получив значительные приросты относительно необученной модели. Осталось сравнить такой метод с текстовым ранжированием.
Сравнение качества модели
На том же датасете, который собрали для обучения CLIP, мы обучили модель. Только не на обложках, а на парах запрос-название фильма и запрос-описание фильма.
Из результатов ниже видно, что модель CLIP показывает себя лучше, чем текстовая модель, использующая текст названий напрямую, и сравнима с использующей текстовые описания моделью!
Поиск с использованием обученной модели
В таблицах ниже можно увидеть, как изменились выдачи на запросы необученной и обученной модели CLIP.
Видно, что выдача стала существенно релевантнее!
Обратный поиск
Давайте посмотрим, как такая модель работает наоборот. Поищем по картинке самые близкие запросы.
Проверка CLIP как фичи в ранжирующей модели Поиска
Мы проверили нашу большую ранжирующую модель Поиска без применения фичи CLIP модели и с её использованием. Итоговые результаты:
В целом, применение CLIP-модели улучшило нашу ранжирующую модель на порядка 1% по запросам! Давайте подробнее рассмотрим, что это за запросы и какую дополнительную информацию мы извлекаем.
Из таблицы с запросами видно, что основными точками роста стали общие запросы (запросы к странам, жанрам и др.), а также запросы к конкретным персонам, которых люди могли искать и чью фильмографию ожидали бы увидеть.
Заключение
Применение модели CLIP для задачи текстового поиска может быть хорошим подспорьем не только в поисковых системах, но и для получения неожиданных инсайтов. Модель, которую мы получили для обложек фильмов, помогла не только улучшить существующее качество поиска, но и понять новые закономерности о фильмах и сериалах в сервисе. Кроме этого, удалось поднять качество на таких «поисковых» сущностях как «запросы к жанрам», «запросы к странам» и «запросы к персонам».
Использование мультимодальных моделей позволяет сделать шаг к пониманию более широкого класса запросов и контента в сервисе, что недоступно моделям с одной модальностью. Для мультимодальных моделей, где одна из модальностей текст, через него можно изучить другую модальность и расширить наше понимание, какие именно закономерности выводятся через различные представления (пример обратного поиска в статье). Это преимущество таких моделей и новый способ взглянуть на данные в целом!
А какими мультимодальными моделями пользовались вы? Какие подходы к задаче поиска вы находили интересными? Делитесь в комментариях!