Хабрахабр

Применение сиамских нейросетей в поиске

В этом посте я расскажу, какие подходы мы в Поиске Mail.ru используем для сравнения текстов. Всем привет! Как только мы научимся хорошо сравнивать разные тексты друг с другом, поисковая система сможет лучше понимать запросы пользователя. Для чего это нужно?

Для начала строго поставить задачу. Что нам для этого нужно? В нашем случае будут сравниваться тексты пользовательских запросов с текстами документов.
Задача определения текстовой релевантности состоит из трёх этапов. Нужно определить для себя, какие тексты мы считаем похожими, а какие не считаем и затем сформулировать стратегию автоматического определения схожести. Следующая, более сложная задача, — поиск связи между разными словами, понимание синонимов. Первый, самый простой: искать совпадающие слова в двух текстах и на основании результатов делать выводы о схожести. И наконец, третий этап: анализ предложения/текста целиком, вычленение смысла и сравнение предложений/текстов по смыслам.

Например, можно перевести тексты в векторное пространство и сравнивать векторы. Один из способов решения этой задачи заключается в нахождении некоторого отображения из пространства текстов в какое-то более простое.

Такая задача сама по себе уже достаточно сложна: чтобы сделать это хорошо, нам нужно научиться получать нормальную форму слов, что само по себе нетривиально. Давайте вернемся к началу и рассмотрим самый простой подход: поиск совпадающих слов в запросах и документах.

Модель прямого сопоставления можно сильно улучшать. Одно из решений — сопоставлять условные синонимы. Например, можно вводить вероятностные предположения на распределение слов в текстах. Можно работать с векторными представлениями и неявно вычленять связи между несовпадающими словами, причём делать это автоматически.

На основе этих данных мы можем делать выводы про связь между разными словами. Так как мы занимаемся поиском, у нас есть много данных о поведении пользователей при получении тех или иных документов в ответ на какие-то запросы.

Возьмём два предложения:

Будем предсказывать клик как сигмоидальное преобразование от суммы этих весов. Присвоим каждой паре слов из запроса и из заголовка некоторый вес, который будет означать, насколько первое слово связано со вторым. Если мы сможем обучить такую модель, то поймём, какие слова являются синонимами, аккуратнее говоря, могут быть связаны, а какие скорее не могут. То есть поставим задачу логистической регрессии, в которой признаки представляются набором пар вида (слово из запроса, слово из заголовка/текста документа).

$\textbf = \sigma \left ( \sum \varphi _{i} \right )\textbf{, где }\varphi _{i}\textbf{ - вес пары слов (слово запроса, слово документа)}$

Теперь нужно создать хороший датасет. Оказывается, достаточно взять историю кликов пользователей, добавить негативные примеры. Как подмешивать негативные примеры? Лучше всего добавлять их в датасет в пропорции 1:1. Причём сами примеры на первом этапе обучения можно делать случайно: к паре запрос-документ находим еще один случайный документ, и считаем такую пару негативом. На более поздних этапах обучения выгодно подавать более сложные примеры: у которых есть пересечения, а также случайные примеры, которые модель считает похожими (hard negative mining).

Пример: синонимы для слова «треугольник».

На данном этапе уже можно выделить неплохую функцию, сопоставляющую слова, но это еще не то, к чему мы стремимся.Такая функция позволяет делать непрямое сопоставление слов, а мы хотим сопоставлять целые предложения.

Давайте сделаем encoder, который принимает текст (запрос или документ) и выдаёт векторное представление, такое, что у похожих текстов векторы будут близкими, а у непохожих — далекими. Здесь нам помогут нейронные сети. Например, в качестве меры похожести можно использовать косинусное расстояние.

Сиамская сеть состоит из encoder’а, который применяется к примерам данных из двух и более семейств и операции сравнения (например, косинусного расстояния). Здесь мы будем использовать аппарат сиамских сетей, потому что их куда проще обучать. При применении encoder’а к элементам из разных семейств используются те же самые веса; это само по себе дает хорошую регуляризацию и сильно уменьшает количество коэффициентов, нужных для обучения.

Encoder производит из текстов векторные представления и обучается так, чтобы косинус между представлениями похожих текстов был максимален, а между представлениями непохожих — минимален.

Для нашей задачи подходит сеть глубокой семантической сложности DSSM. Мы используем её с небольшими изменениями, о которых я скажу ниже.

Оно пропускается через несколько полносвязных слоёв, и сеть обучается так, чтобы максимизировать условную вероятность документа при условии запроса, что эквивалентно максимизации косинусного расстояния между векторными представлениями, полученными полным проходом по сети. Как устроена классическая DSSM: запросы и документы представляются в виде мешка триграмм, из которого получается стандартное векторное представление.

2013 Learning Deep Structured Semantic Models for Web Search using Clickthrough Data
Po-Sen Huang Xiaodong He Jianfeng Gao Li Deng Alex Acero Larry Heck.

А именно, каждое слово в запросе представляем в виде вектора триграмм, а текст в виде вектора слов, таким образом оставляя информацию о том, какое слово где стояло. Мы пошли почти таким же путем. Дальше применяем одномерные свёртки внутри слов, сглаживая представление оных, и операцию глобального максимального пуллинга для агрегации информации о предложении в простом векторном представлении.

Датасет, который мы использовали для обучения, почти полностью совпадает по своей сути с тем, который используется для линейной модели.

Во-первых, придумали режим предобучения. На этом мы не остановились. Так как эти пары из одного семейства, такая сеть обучается проще. Берём для документа список запросов, вводя которые пользователи взаимодействуют с этим документом, и предобучаем нейронную сеть делать эмбеддинги таких пары близкими. Плюс её потом легче дообучать на боевых примерах, когда мы сравниваем запросы и документы.

Пример: на сайт e.mail.ru/login пользователи переходят с запросами: электронная почта, электронная почта вход, электронный адрес, …

Наконец, последняя сложная часть, с которой мы до сих пор боремся и в которой почти достигли успеха, это задача сравнения запроса с каким-нибудь длинным документом. Почему эта задача сложнее? Здесь уже хуже подходит машинерия сиамских сетей, потому что запрос и длинный документ относятся к разным семействам объектов. Тем не менее, мы можем себе позволить почти не менять архитектуру. Нужно лишь добавить свертки еще и по словам, что позволит сохранить больше информации о контексте каждого слова для финального векторного представления текста.

В данный момент мы продолжаем улучшать качество наших моделей модифицируя архитектуры и экспериментируя с источникам данных и механизмами сэмплирования.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть