Миллионы клиентов используют Thumbtack каждый год, чтобы найти и заказать профессионалов и местные предприятия, которые помогут им ухаживать за своим домом. На Thumbtack клиенты могут найти профессионалов примерно для 500 категорий услуг. Когда клиент ищет профессионалов (профессионалов) в своем районе в определенной категории, мы визуализируем упорядоченный список результатов поиска профессионалов в своем районе.

В Thumbtack поисковое ранжирование относится к проблеме поиска наиболее подходящих специалистов для поискового запроса клиента и упорядочения их на основе их релевантности. Чем актуальнее профессионалы, тем проще клиентам найти и заказать подходящих специалистов для своей работы. Таким образом, поисковое ранжирование является важной проблемой оптимизации, которая напрямую влияет как на количество проектов, выполняемых с помощью Thumbtack, так и на глобальную конверсию на нашей платформе.

Недавно мы успешно протестировали и выпустили собранную сеть Deep Cross Network (DCN V2) [1]. Это был первый раз, когда мы протестировали почти современную модель машинного обучения (ML) на основе нейронных сетей для улучшения поискового рейтинга. В этом сообщении блога мы описываем наш опыт значительного улучшения поискового рейтинга с использованием ML за последние 2 года и некоторые из наших знаний, полученных в ходе этого процесса.

Контекст проблемы

В 2019 году мы впервые перешли на использование машинного обучения для повышения ранжирования в поиске. Несколько тщательно разработанных функций были использованы для включения набора моделей машинного обучения на основе логистической регрессии для прогнозирования релевантности профессионалов в определенной категории. Поскольку в 2020 году мы продолжали экспериментировать с несколькими новыми функциями, итерации экспериментов по ранжированию не приводили к победам в тестах A/B. Улучшения в офлайн-метриках не привели к победам в онлайн-тестах A/B, и казалось, что мы уперлись в кирпичную стену.

Различные этапы, связанные с поиском наиболее подходящих специалистов для поискового запроса, включали:

  1. Селектор кандидатов: выбирает первоначальный набор специалистов в категории.
  2. Кандидат обогащения: дополняет набор информацией из других микрослужб, например доступный бюджет из службы бюджетов.
  3. Фильтр кандидатов: фильтрует набор на основе политик фильтрации, например, отфильтровывает специалистов, которые не ориентируются на предпочтения, указанные клиентом.
  4. Featurizer: вычисляйте или извлекайте функции, необходимые для моделей машинного обучения.
  5. Простой ранжировщик: предскажите релевантность каждого специалиста поисковому запросу с помощью простого набора моделей логистической регрессии и упорядочения на основе релевантности.
  6. Повторное ранжирование на основе правил: повторное ранжирование списка специалистов на основе определенных правил рынка.

В этом посте мы сосредоточимся на развитии этапов характеризации и ранжирования всего процесса. Уровни выбора кандидатов/обогащения/фильтрации и политики выходят за рамки этого поста.

Задачи

Как упоминалось выше, небольшие улучшения в офлайн-метриках с использованием новых функций не привели к победам в онлайн-тестах A/B в 2020 году. Поскольку мы использовали относительно простой ранкер, состоящий из набора моделей логистической регрессии с небольшим набором созданных вручную функций, было явно много возможностей, которые мы могли бы изучить. Вот некоторые из проблем, которые обсуждались:

А. Экспериментальный процесс

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

B. Сложность модели

Ранние автономные эксперименты с нелинейными древовидными моделями машинного обучения, такими как Случайные леса, дали многообещающие результаты. Но в то время наш алгоритм машинного обучения (логистическая регрессия) был написан на Go и встроен в наш сервис ранжирования. Нам не хватало инфраструктуры для обслуживания нелинейных моделей в производстве в масштабе, необходимом для ранжирования.

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

C. Предвзятость позиции

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

Развитие процессов экспериментирования

Офлайн-экспериментация. Блокноты Python, используемые для экспериментов с новыми функциями и новыми моделями, со временем могут раздуваться. Вложив средства в оптимизацию блокнотов, внедрив отслеживание экспериментов с помощью MLFlow и абстрагировав код обучения модели в стандартизированную библиотеку, мы смогли ускорить проведение экспериментов в автономном режиме.

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

Эволюция пространства функций. Вооружившись возможностью более легко тестировать новые функции в рабочей среде, мы расширили набор функций с нескольких тщательно созданных вручную функций (‹10) до изолированной программной среды, содержащей более 100 функций.

В Thumbtack есть 3 широкие категории функций, которые можно использовать для ранжирования результатов поиска:

Функции клиента:функции, связанные с клиентом, делающим поисковый запрос

Pro-функции:функции, относящиеся к рейтингу Pro в поисковом запросе.

Функции запроса:функции, связанные с поисковым запросом с участием определенного клиента и списка подходящих специалистов.

Каждая категория объектов имеет 2 подкатегории типов объектов:

Функции клиента

Описательные атрибуты клиента: Атрибуты о клиенте

Совокупные/изученные характеристики клиентов: Совокупное или изученное поведение клиентов

Профессиональные функции

Описательные профессиональные атрибуты: Атрибуты о профессионале

Совокупные/обученные профессиональные функции: Совокупное или изученное профессиональное поведение

Функции запроса

Описательные атрибуты запроса: Атрибуты запроса

Запрос определенных функций Pro: Вычисленные функции Pro, специфичные для поискового запроса

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

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

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

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

  1. Мы объединили это с евангелизацией неопределенности ранжирования экспериментов и признанием того факта, что только 1 из 3 или 1 из 4 экспериментов может быть успешным. Это означало евангелизацию идеи систематического исследования нашего пространства гипотез по мере того, как мы быстро пробовали новые идеи.
  2. Мы поставили перед командой цели, касающиеся скорости экспериментов в целом, например, 6+ рейтинговых экспериментов каждые 6 месяцев надеясь, что 1 или 2 могут быть успешными, а не надеясь, что конкретные идеи экспериментов будут реализованы. преуспевать.

Развитие моделирования

В 2020 году, зная, что мы хотим иметь возможность исследовать сложные нелинейные модели, мы хотели быстро отказаться от ансамблевых моделей логистической регрессии, которые изначально были встроены в наш сервис ранжирования в Go. Это привело нас к созданию механизма хранилища функций, о котором мы упоминали ранее. Чтобы обслуживать сложные нелинейные модели, мы также создали слой вывода модели, поддерживаемый AWS SageMaker, таким образом извлекая вывод модели из службы ранжирования. На приведенной ниже диаграмме вы можете увидеть текущую эволюцию этапов, связанных с ранжированием в поиске, которые теперь включают хранилища функций для пользовательских и профессиональных функций, а также службу вывода моделей, которая может обслуживать сложные нелинейные модели.

Модели машинного обучения на основе дерева. Модели машинного обучения на основе дерева — это класс алгоритмов, которые обычно создают древовидные структуры решений для прогнозирования. Поскольку мы использовали Scikit Learn, первоначальное автономное изучение древовидных моделей началось с Случайных лесов, но быстро перешло к использованию Градиентных деревьев решений. Это была первая нелинейная модель, которую мы успешно внедрили в начале 2021 года, подняв глобальную конверсию через поисковый рейтинг на 1,4% по сравнению с базовым уровнем (это также включало набор новых функций).

По мере того, как мы добавляли больше функций и обучали более сложные модели, мы быстро оценили 2 фактора:

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

Оптимизация модели. Изучая пространство автономных функций, состоящее из более чем 200 функций, и оптимизируя наши древовидные модели, мы сделали некоторые практические выводы:

  1. Когда мы использовали методы объяснимости модели, такие как графики частичной зависимости и SHAP, мы заметили, что изменения выходных данных модели не были более линейно коррелированы с определенными числовыми характеристиками таким образом, чтобы это соответствовало ожидаемому опыту продукта. Мы решили эту проблему, наложив монотонные ограничения на эти функции, и быстро заметили прирост производительности.
  2. Выбор более 200 функций был непростым делом, поэтому мы начали с Рекурсивного исключения функций. Но Boruta SHAP, надежная стратегия выбора признаков, использующая алгоритм выбора признаков Boruta со значениями Шепли для вычисления важности признаков, обычно превосходит другие методы. Теперь это стало нашей стратегией выбора функций.

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

  1. Измерение: в конце 2020 года мы создали адаптированную версию алгоритма RandPair [2], чтобы мы могли случайным образом поменять местами несколько результатов поиска и оценить влияние смещения позиций на нашей платформе.
  2. Смягчение. В 2021 году, используя оценки смещения позиции, мы создали набор функций, которые откалиброваны для смещения позиции (например, рейтинга кликов), что привело к небольшому повышению производительности нашей модели. Мы также исследовали и модифицировали функцию потерь для XGBoost с помощью Inverse Propensity Scoring [3], что привело к заметному улучшению производительности.

Модели машинного обучения на основе нейронных сетей: в начале 2021 года, когда мы изначально оптимизировали древовидные модели, мы приложили некоторые усилия для изучения нейронных сетей для решения нашей задачи. В то время мы использовали около 20 функций, и древовидные модели превосходили модели нейронных сетей по таким показателям, как NDCG и потеря журнала. Учитывая меньшее функциональное пространство, усилия, затраченные на обучение нейронных моделей, и отсутствие инфраструктуры для поддержки масштабируемых производственных развертываний, мы решили отложить дальнейшие исследования. В этом году, с более богатым функциональным пространством, насчитывающим более 100 функций, и улучшенными возможностями вывода моделей, мы решили, что настало время реинвестировать в нейронные сети.

Модель DCN V2 способна эффективно изучать взаимодействие прогностических функций более экономичным способом [1]. После захватывающих результатов исследования мы решили проверить это. Вот некоторые из наших первоначальных результатов тестирования:

  1. Оценка в автономном режиме. Удивительно, но во время автономной оценки, несмотря на то, что DCN V2 превзошел наш базовый показатель, основанный на XGBoost, по потере журнала на 0,7%, он не улучшил другие ключевые показатели, такие как NDCG или MRR. Хотя обычно это заставило бы нас задуматься, мы решили создать модель для онлайн-тестирования, поскольку она также послужила бы способом создания основы для обслуживания нейронных моделей в производственной среде.
  2. Онлайн-оценка: A/B-тестирование DCN V2 показало, что при добавлении в наш рейтинговый ансамбль он может повысить глобальную конверсию на 0,5%. Это привело к тому, что мы успешно создали нашу первую почти современную модель машинного обучения для поискового ранжирования в Thumbtack!

Заключение и будущее направление

За последние 2 года мы работали над более чем 20 итерациями экспериментов по ранжированию и отправили 6 из них в производство. Улучшение поискового рейтинга с течением времени в совокупности привело к относительному повышению коэффициента конверсии на 4,5%, как было измерено с помощью A/B-тестов.

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

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

Хотите оставаться на связи с Thumbtack? Подпишитесь на нас в LinkedIn или ознакомьтесь с нашими последними вакансиями на thumbtack.com/careers.

Благодарность

Эволюция поискового рейтинга в Thumbtack является результатом прямого и косвенного вклада нынешних и бывших сотрудников, включая, помимо прочего: Сэмюэля Ошина, Тима Хуанга, Дерека Чжао, Ричарда Демсин-Джонса, Марка Эндрю Яо, Александра Приймака, Эмбер (Анью ) Ван, Дхананджай Сатхе, Линг Се, София Басси, Уэйд Фуллер, Том Шулл, Карен Ло, Эрик Ортис, Бхарадвадж Рамачандран, Абхилаш Арора, Майкл Энтони, Адам Холлок, Джозеф Цай, Алпеш Гаглани.

Ссылки

[1] Ван, Руокси и др. «Dcn v2: улучшенная глубокая и кросс-сеть и практические уроки для веб-обучения для ранжирования систем». Материалы веб-конференции 2021. 2021.

[2] Ван, Сюаньхуэй и др. «Оценка смещения позиции для непредвзятого обучения для ранжирования в личном поиске». Материалы одиннадцатой международной конференции ACM по поиску в Интернете и интеллектуальному анализу данных. 2018 г.

[3] Ху, Зиниу и др. «Беспристрастный лямбдамарт: беспристрастный алгоритм попарного обучения для ранжирования». Конференция World Wide Web. 2019 г.