Вас много — «Я» один

Как научить поисковую систему понимать все и сразу

Поисковый алгоритм скрывается за ширмой пользовательского интерфейса. Год за годом его учат все лучше понимать человеческие вопросы и отвечать на них как можно быстрее. Как алгоритм учится сам у себя и у людей, рассказывают руководитель службы качества ранжирования Екатерина Серажим и руководитель группы нейросетевых технологий Александр Готманов. Этой статьей N + 1 продолжает серию совместных материалов с Яндексом о технологиях, которые стоят за работой поиска в интернете.

Задача

Основная поисковая задача Яндекса — находить максимально релевантные запросу документы. В этом ему помогают нейронные сети. Для них запрос и документ — это объекты, между содержанием которых ищется смысловая связь. Иногда понимать смысл заголовка документа необязательно: нейронная сеть не требуется, чтобы предсказать, что Википедия будет релевантна запросу «Википедия». Но бывают и более сложные случаи.

Например, нейронная сеть должна понять, что ответом на запрос «ягоды годжи» будет «Дереза обыкновенная». Или же «догадаться», что хорошим ответом на запрос «движение кораблей онлайн в реальном времени» будет документ с тайтлом «MarineTraffic: Global Ship Tracking Intelligence». Поскольку солидная часть запросов встречается всего один раз, иногда просто невозможно воспользоваться предыдущим опытом и ответить то же самое. Многие запросы приходится обрабатывать с нуля и искать ответ среди огромного числа документов в сети.

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

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

Помимо выбора множества релевантных документов, нейросеть должна еще и распределить их в порядке соответствия пользовательскому запросу. Задача следующего уровня для нейросети — поиск документов, которые будут соответствовать не только запросу, но и персональным предпочтениям пользователя.

Архитектура

Поиск Яндекса — это система, которая работает постоянно и под большой нагрузкой. Как рассказывает Александр, в сутки только основному веб-поиску приходится обрабатывать сотни миллионов запросов. Из них значительная часть никогда не встречалась ранее.

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

Для достижения этой цели Яндекс используют не одну нейросеть, а целый ансамбль низкоуровневых нейронных моделей, каждая из которых под своим углом описывает связь между запросом и документом. Затем полученные от них данные обрабатываются верхнеуровневой моделью. Она определяет, какой модели следует больше верить и с каким весом какой признак использовать. По словам Екатерины и Александра, такой эмпирический ансамбль работает лучше одной «большой» нейросети.

Нейронная сеть — это алгоритм, который работает не со словами и предложения, а с длинными векторами. Преобразованием текстов векторы занимаются особые словари. BPE — Byte Pair Encoding — один из алгоритмов, применяемых Яндексом для построения словарей. Суть алгоритма заключается в пошаговой замене самой распространенной пары последовательных байтов на незанятый байт. В Яндексе с его помощью выделяются максимально информативные части и сочетания слов. Для них выучиваются векторные представления.

Нейронная сеть должна превратить входные данные в один или два вектора, чтобы затем получить на выходе одно число. Здесь на помощь приходит пулинг — один из способов объединения векторов. К примеру, векторы можно сложить (не путать с конкатенацией). Можно также брать покомпонентные минимумы или максимумы. Саму конкатенацию — «приклеивание» одного вектора к другому, тоже используют в случаях, если есть два вектора из двух разных текстов.

К полученным векторам затем применяются несколько слоев нейронной сети. Каждый слой — это одно матричное умножение и одно нелинейное преобразование, которое может различаться в зависимости от задачи. В матричном умножении заключается основная вычислительная сложность применения нейросети. При этом матрицы могут быть разреженными, то есть содержать большое количество нулей, только на первом слое. На всех последующих слоях они плотные. Размерность этих матриц составляет несколько сотен на несколько сотен. Яндекс активно использует метод каскадной нейронной сети — векторы или их части из предыдущих слоев могут перебрасываться непосредственно на следующие слои. Такой подход часто работает лучше обычных методов. При этом Яндексу, по словам Александра, удается уместить эти вычисления в несколько миллисекунд без использования специализированных ускорителей (GPU-карт).

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

Обучение

Один из самых простых способов оценить вероятность, что документ оказался релевантным для пользователя — использовать информацию о кликах и других действиях в системе (разумеется, обезличенно). При огромном количестве пользователей нейросеть получила бы бесчисленное множество данных для самообучения. На них можно было бы обучить ее предсказывать, куда кликнет пользователь. Но, как утверждает Серажим, зачастую это имеет мало общего с тем, насколько релевантен этот документ на самом деле. С одной стороны, пользователь мог кликнуть на документ по одному ему известным причинам. С другой, то, что пользователь не кликнул на документ, не значит, что он нерелевантен. Как рассказывает Готманов, нейронная сеть, которая учится предсказывать клики, часто выучивает что-то и про релевантность. Но связь между ними непрямая и ее не всегда можно разглядеть.

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

Рассматривать можно не только связь документа и запроса. Вокруг документа можно построить облако запросов, по которым пользователи на него переходили. Исходная задача сводится к поиску расстояния между текущим запросом и этим облаком.

Другим способом обучения является анализ пользовательской сессии. Пользовательская сессия — это более «целостная» единица поведения, чем один запрос. В ее рамках, как правило, легче найти смысловую связь с веб-страницей. Используя несложные эвристики, можно понять, что цепочка пользовательских действий связана с одной и той же задачей. Чтобы затем в рамках этой сессии определить, на каком документе пользователь не решил свою задачу и на каком он все-таки нашел требуемый ответ. Этот документ можно назвать релевантным и назначить его положительным примером для обучения нейросети.

Сейчас Яндекс применяет для обучения композитные выборки. Сначала модель учится на огромном множестве простых примеров. Это позволяет ей запоминать базовые закономерности. Затем модель доучивается на небольшом множестве экспертных оценок. Их составляют компетентные в тематике конкретного запроса люди. С помощью такого подхода составляют модели, которые очень хорошо определяют семантическую связь между запросом и документом.

Тестирование

Первое, что должен сделать исследователь после обучения нейронной сети, — понять, насколько хорошо она аппроксимирует целевую функцию, которую он ей дал. Если рассматривать результат работы нейросети только в рамках успеха-неуспеха, то получим бинарную функцию. Единичкой будет положительный пример, нулем — отрицательный. Для того же, чтобы понять, насколько хорошо нейронная сеть приближает целевую функцию, вводится функция ошибки. Разработчик следит за тем, как сильно она убывает в процессе обучения нейросети.

В случае бинарной классификации часто используется функция logloss.

Для других задач, например регрессии, применяют функцию MSE (среднеквадратичная ошибка).

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

Если модель успешно справляется и с этой задачей, ей предстоят испытания трафиком. К примеру, бета-тестирование. Для пользователей новый алгоритм остается пока недоступным. На модель имитируется поток запросов, так называемый синтетический трафик. В ходе ее работы оценивается, насколько она справилась с ними лучше, чем действующая модель. Этот метод обычно применяется для оценки работы некоторого набора улучшений сразу.

Если этот этап успешно пройден моделью, следующим шагом для нее является А/В-тестирование — испытание настоящими пользователями. Весь трафик делится на контрольную и экспериментальную группу. Специалисты следят за изменениями в экспериментальной группе и смотрят, будут ли пользователи чаще и успешнее находить ответы на свои вопросы. Постоянная работа над улучшением поиска позволяет как разработчикам, так и пользователям верить, что «найдется все».

Богдан Сиротич

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.
Дивный новый mundus

Текстовый квест о суровом мире латыни