Цифровая эпоха — это эффективный, быстрый, удобный и эффективный образ жизни по всем направлениям. Каждый тип бизнеса, большой или малый, в различных отраслях, вносит изменения в электронную коммерцию. Обнаружение продукта на платформе электронной коммерции становится все более важным для обеспечения лучшего покупательского опыта для клиентов и предоставления релевантных результатов поиска, ведущих к более высоким коэффициентам конверсии.
Релевантность поиска решает проблему: насколько релевантны результаты поиска на основе пользовательского запроса?
Область релевантности поиска является развивающейся областью и включает в себя простые методы, основанные на эвристике, а именно вычисляемые метрики, которые используются для вычисления набора метрик кода и их объединения путем создания правил обнаружения; хотя они имеют разумную точность, недавняя тенденция представлена использованием машинного обучения, где метрики кода используются в качестве предикторов неприятного запаха артефактов кода.
Learning to Rank (LTR) — важная и мощная техника, использующая контролируемое машинное обучение для решения проблемы релевантности поиска. Подход LTR использует машинное обучение для автоматической настройки факторов релевантности, что не только облегчает проблемы, связанные с ручными процессами, такими как повышение и блокировка, но также обещает значительно улучшить релевантность с использованием современных методов моделирования.
Существуют значительные практические препятствия для использования LTR. Прежде всего, возможности LTR — это строительные блоки библиотеки и уровня API со справочной документацией, которая будет иметь смысл только для очень опытного поискового инженера. Во-вторых, компонент LTR на самом деле не обучает никакие модели; вам остается самостоятельно создать конвейер обучения модели с нуля. Наконец, чтобы выяснить, как все эти части сочетаются друг с другом для создания комплексного решения LTR, требуется значительный объем инженерных знаний и знаний в области обработки данных.
В этом сообщении в блоге представлены рекомендации по внедрению комплексного решения Learning to Rank, которое значительно сокращает объем усилий, необходимых для внедрения и ввода в действие LTR. В сочетании с выводами, полученными из сигналов о поведении пользователей, LTR обеспечивает значительный прирост релевантности поиска. Вот шаги типичного рабочего процесса обучения модели LTR.
Обучение ранжированию компонентов
Подготовка тренировочных данных
Как и в любом упражнении по машинному обучению, нам необходимо подготовить обучающие данные, на которых будет обучаться наша модель. Этот набор данных состоит из нескольких компонентов, которые описаны ниже.
Суждения
Для начала нам нужен набор релевантных «суждений», известный как основная истина. Эти суждения в основном основаны на курируемой релевантности документов для каждого запроса и могут рассматриваться как выражение «идеального» порядка. Такое «идеальное» упорядочение может быть трудно получить, так как может потребоваться много ручных усилий и времени, чтобы составить истинный список. Другой вариант — использовать генерируемые пользователем сигналы, которые можно использовать в качестве неявных меток. Этот подход обычно приводит к более низкому качеству суждений и более зашумлен. Одним из таких пользовательских сигналов, который вы можете использовать, являются клики; которому дана пара запрос-документ, количество кликов используется в качестве обучающей метки. Большее количество кликов указывает на более высокую релевантность. Мы будем использовать машинное обучение, чтобы изучить сложную функцию, которая оптимизирует ранжирование результатов/документов для этих запросов, так что «релевантные» документы с большей вероятностью будут ранжироваться перед нерелевантными документами.
Функции
Вторая часть обучающих данных — это признаки. Функции — это сигналы, которые объясняют оценки релевантности документа. Функции определяются в формате JSON и загружаются в вашу поисковую систему.
Поисковая система использует определение функции для извлечения значений из документов. Учитывая суждения, также известные как пары запрос-документ, определение признаков используется для вывода векторов признаков для каждого запроса. Набор суждений + признаков (запрос, документ, вектор признаков) формирует обучающие данные для модели LTR.
Обучение модели
После того, как вы подготовили тренировочный набор, вы можете обучить свою модель. Обучение моделей происходит вне поисковой системы. Вы не используете плагин LTR для обучения моделей. Вы можете обучать модели, используя выбранную вами технологию, и загружать артефакты обученных моделей, используя один из доступных форматов сериализации (RankLib, XGBoost и другие).
Использование обученной модели
После того, как вы обучили свою модель, вам необходимо загрузить ее в поисковую систему. Вы не хотите выполнять модель ML для каждого результата в вашем индексе. Эти модели интенсивно используют ЦП, и их сложность напрямую зависит от того, сколько продуктов они должны исследовать и ранжировать. Это нормально для десятков и сотен, но не для тысяч или миллионов. Вот почему вы не можете использовать полную LTR-модель для всех соответствующих продуктов. Чаще всего вы будете выполнять свою модель на первых N базового запроса релевантности. Этот процесс называется переоценкой
Оценка модели
Учитывая пользовательский запрос, например «черные джоггеры», мы хотим максимизировать порядок релевантности возвращенных продуктов. Насколько хорош наш список по сравнению с идеальным списком? Предположим, что мы знаем идеальный список суждений, мы можем определить общую оценку для идеального списка. Затем мы вычисляем ту же оценку для нашего списка целевых выражений и сравниваем, насколько она близка к идеальной оценке. Этот показатель называется кумулятивным приростом документа (DCG).
Возвращаясь к нашему поисковому запросу «черные спортивные штаны», допустим, мы получили 6 результатов. Также давайте предположим, что мы знаем идеальную релевантность этих элементов. Имея эту информацию, мы можем рассчитать метрику DCG для нашего списка выражений. Точно так же мы рассчитаем показатель DCG для нашего списка идеальных суждений и назовем его кумулятивным приростом идеального документа (IDCG). Обратите внимание, что в этом расчете мы предполагаем, что более релевантные результаты находятся на более высоких позициях. Наконец, мы рассчитываем совокупный доход чистого документа (NDCG) как отношение DCG к IDCG. Наша цель — оптимизировать этот показатель NDCG.
Пример обучения ранжированию
Возьмем пример из набора данных IMDB. Этот набор данных содержит список около 5000 фильмов, и мы попытаемся создать каталог поиска, в котором пользователи смогут искать фильмы по названию. Наша цель - предоставить нашим пользователям наилучший список фильмов, упорядоченных по их релевантности, соответствующей поисковому запросу. При построении такой системы нам нужно сначала начать с наших обучающих данных, и, как упоминалось в этой статье ранее, мы начнем со списка суждений. Списки суждений — это идеальные результаты, которые мы должны получить на основе запроса и их оценки релевантности. Например: когда пользователи ищут Рэмбо, мы можем указать, какие фильмы должны возвращаться для Рэмбо, исходя из ожиданий нашего пользователя от поиска. Relevancy_score устанавливает идеальный порядок результатов. Например, если мы оцениваем документы от 0 до 4, где 4 точно соответствует.
Образцы суждений
query, document, relevancy_score # document_id rambo, Rambo, 4 # 7555 rambo, Rambo III, 3 # 1370 rambo, Rambo: First Blood Part II, 3 # 1369 rambo, First Blood, 3 # 1368
Определение функции
Далее нам нужно определить наши функции и загрузить их в нашу поисковую систему. Вот два примера функций, которые оценивают, насколько хорошо запрос соответствует полям заголовка и обзора, и основаны на оценке TF*IDF.
# Feature definition for TF*IDF score on matching on title field { "query": { "match": { "title": "{{keywords}}" } } } # Feature definition for TF*IDF score on matching on overview field { "query": { "match": { "overview": "{{keywords}}" } } }
Извлечение признаков (суждения + признаки)
После того, как вы определили функции, вам нужно извлечь значения функций для каждого запроса в вашем списке суждений. Мы хотим получить значения характеристик для всех документов, которые имеют суждение по каждому поисковому запросу, по одному поисковому запросу за раз. Например, наш список суждений содержит один запрос «Рэмбо», поэтому мы запустим его в нашей поисковой системе, чтобы извлечь значения признаков для каждого соответствующего документа.
ПРИМЕЧАНИЕ. В результатах поиска может быть больше документов, чем в вашем списке суждений, поэтому вы можете отфильтровать их.
https://<your_solr_server>/solr/tmdb/query?q=rambo&fl=id,score,[features] # The output will include feature values as a comma-separated list:{ "responseHeader":{ "status":0, "QTime":0, "params":{ "q":"rambo", "fl":"id,score,[features]" } }, "response":{ "numFound":2,"start":0,"maxScore":1.959392, "docs":[ { "id":"
7555", "score":1.959392, "[features]": "title_score=
9.8376875,overview_score=
12.318446" }, { "id":"
1370", "score":1.5513437, "[features]": "title_score=
10.7808075,overview_score=
9.510193" }, .......
] } }
Как только вы получите значения функций, вы можете соединить свой список суждений со значениями функций, чтобы создать обучающий набор.
query, document, relevancy_score, title_score, overview_score rambo, Rambo, 4, 9.8376875, 12.318446 rambo, Rambo III, 3, 10.7808075, 9.510193 rambo, Rambo: First Blood Part II, 3, 10.7808075, 6.8449354 rambo, First Blood, 3, 10.7808075, 0.0
Тренировочные данные
Данные обучения должны быть отформатированы в соответствии с используемой библиотекой. Например, если вы используете RankLib, вам необходимо отформатировать данные вида
<target> qid:<qid> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info>
Глядя на приведенный выше набор данных, relevancy_score является ‹target›, каждый запрос индексируется в int, например, «Рэмбо» будет qid:1, «Звездные войны» будет qid:2 и так далее. Функции помечаются порядковыми номерами, начинающимися с 1. Таким образом, 1:9,8376875 представляет функцию title_score, значение которой равно 9,8376875, и так далее. Все, что после #, является комментарием. Приведенный выше тренировочный набор можно преобразовать в набор, который выглядит следующим образом:
4 qid:1 1:9.8376875 2:12.318446 # 7555 Rambo 3 qid:1 1:10.7808075 2:9.510193 # 1370 Rambo III 3 qid:1 1:10.7808075 2:6.8449354 # 1369 Rambo: First Blood Part II 3 qid:1 1:10.7808075 2:0.0 # 1368 First Blood
Обучение модели
Вам нужно обучить модель вне вашей поисковой системы. Вы можете обучить простую линейную модель, использовать XGBoost или RankLib, которые имеют несколько вариантов, включая LambdaMART. Вот пример использования RankLib для обучения вашей модели.
java -jar RankLib-2.8.jar -ranker %s -train%rs -save %s -frate 1.0" % (whichModel, judgmentsWithFeaturesFile, modelOutput)
ranker: Укажите, какой алгоритм ранжирования использовать. В настоящее время существует 9 алгоритмов, которые вы можете выбрать (пример: LambdaMART, AdaRank)
train: указывает местоположение ваших тренировочных данных
сохранить: сохранить изученную модель в указанный файл
Некоторые соображения. Нормализация признаков преобразует значения признаков в более согласованный диапазон (например, от 0 до 1 или от -1 до 1) во время обучения, чтобы лучше понять их относительное влияние. Некоторые модели, особенно линейные (например, SVMRank), для правильной работы полагаются на нормализацию. Убедитесь, что ваши данные подготовлены в соответствии с требованиями ваших алгоритмов ранжирования.
Ranklib выведет модель в собственном формате сериализации. Например, вывод модели LambdaMART выглядит так:
## LambdaMART ## No. of trees = 1000 ## No. of leaves = 10 ## No. of threshold candidates = 256 ## Learning rate = 0.1 ## Stop early = 100 <ensemble> <tree id="1" weight="0.1"> <split> <feature> 2 </feature> ...
Загрузить модель
После того, как вы обучили свою модель, вам необходимо загрузить артефакты модели. Вот пример
POST _ltr/_featureset/movie_features/_createmodel { "model": { "name": "my_ranklib_model", "model": { "type": "model/ranklib", "definition": "## LambdaMART\n ## No. of trees = 1000 ## No. of leaves = 10 ## No. of threshold candidates = 256 ## Learning rate = 0.1 ## Stop early = 100 <ensemble> <tree id="1" weight="0.1"> <split> <feature> 2 </feature> ... " } } }
Выполнение запроса на переоценку
Чтобы переранжировать результаты запроса, добавьте в поиск параметр rq
, например:
https://<your_solr_server>/solr/tmdb/query?q=rambo&rq=\{!ltr model=
my_ranklib_modelreRankDocs=100}&fl=id,score
Предупреждение
У LTR есть некоторые недостатки, особенно при использовании с кликами по результатам поиска. Это касается как обучения модели, так и ее оценки. Например, когда им предлагают весь богатый урожай в мире, пользователи, как правило, выбирают то, что находится сверху. Это означает, что если Google перестанет предлагать что-либо, кроме кнопки Мне повезет, поведение пользователей практически не изменится (за исключением того, что показатель отказов будет ниже). Это может привести к смещению результатов в сторону того, что ваш поиск уже возвращает, тем самым уменьшая смысл. Этот момент необходимо учитывать при подготовке суждений.
Вывод
LTR — это мощная техника машинного обучения, которая использует контролируемое машинное обучение для обучения модели нахождению «относительного порядка». ваших результатов поиска. Это может обеспечить существенные преимущества для вашей поисковой системы. Используя хорошо спроектированный конвейер, вы можете внедрить возможности машинного обучения в свой рабочий процесс, чтобы обеспечить лучший пользовательский опыт для ваших покупателей.