Airbnb: глубокое обучение в поиске — +0,6% бронирований от новой архитектуры и +14% бронирований новых объявлений
Итоги второй волны зафиксированы в онлайн A/B-тестах. Двухбашенная архитектура: +0,6% бронирований и +0,75% выручки при −33% к p99-латентности скоринга; любопытный побочный эффект — средняя цена бронируемого жилья снизилась на 2,3%, то есть модель стала точнее попадать в ценовые предпочтения гостей. Механизм холодного старта поднял бронирования новых объявлений на 14% (и долю их показов на первой странице — тоже на 14%), добавив +0,38% к общим бронированиям и оздоровив сторону предложения. Position dropout принёс ещё +0,7% бронирований и неожиданные +1,8% выручки; бронирования бутик-отелей — сегмента, страдавшего от смещения, — выросли на 1,1%. Важно правильно читать масштаб: доли процента здесь — не «маленькие результаты». На объёмах Airbnb +0,6% бронирований — это огромные абсолютные значения, а сумма последовательных приростов (+0,6%, +0,38%, +0,7% только по второй статье) складывается в двузначный кумулятивный эффект за годы. Сама команда называет применение нейросетей к поиску одной из самых успешных ML-историй компании. Рамки здесь тоже видны честно: все цифры — самоотчёт компании по внутренним A/B-тестам, но детальность методологии и публикация провалов дают этим цифрам больше веса, чем типичному пресс-релизу. На наш взгляд, главная ценность пары статей — не в конкретных архитектурах (двухбашенные сети и борьба с position bias давно стали индустриальным стандартом), а в задокументированной культуре: единственным арбитром каждого изменения был онлайн-тест на деньгах (бронированиях), офлайн-метрики выступали лишь фильтром гипотез. Показателен кейс «мягкой монотонности» по цене: интуитивно правильная и красивая офлайн идея потеряла 0,67% бронирований в проде — без дисциплины онлайн-проверки она бы осталась в системе. Второе наше наблюдение: Airbnb фактически опубликовала «карту граблей» для всех, кто выводит нейросети в поисковое ранжирование, — от переобучения на ID до сатурации без нормализации. Компании, которые повторяют этот путь, экономят месяцы не на чужих успехах, а на чужих тупиках; в этом смысле честная публикация провалов — редкий пример инженерного альтруизма, который одновременно работает на HR-бренд.
- Applying Deep Learning to Airbnb Search (KDD 2019) — Airbnb / arXiv (Haldar et al.), 2018-10-22
- Improving Deep Learning for Airbnb Search (KDD 2020) — Airbnb / arXiv (Haldar et al.), 2020-02-13
- Listing Embeddings in Search Ranking (800 млн сессий, +21% CTR карусели) — Airbnb Engineering Blog (Mihajlo Grbovic), 2018-03-13
Контекст
Поисковое ранжирование — главный ML-механизм Airbnb: именно оно решает, какие из миллионов объявлений увидит гость на первой странице выдачи, а значит — кто из хостов получит бронирование. Инвестиции в поиск здесь конвертируются в деньги напрямую, поэтому история его эволюции задокументирована командой с редкой для индустрии откровенностью: в двух программных статьях на конференции KDD — «Applying Deep Learning to Airbnb Search» (препринт arXiv — октябрь 2018, KDD 2019) и «Improving Deep Learning for Airbnb Search» (arXiv — февраль 2020, KDD 2020), обе за авторством Малая Халдара и коллег.
Эти работы нетипичны для жанра: вместо демонстрации «прорывной архитектуры» команда описывает многолетний путь итераций с точными процентами прироста бронирований в онлайн A/B-тестах — и с не меньшей детальностью разбирает провалившиеся эксперименты. Авторы прямо формулируют: «глубокое обучение оказалось для нас крутым обучением» (deep learning was steep learning for us), а свою методологию сводят к принципу «пользователи ведут, модель следует» — сначала найти проблему в данных о реальном поведении гостей, потом менять архитектуру, а не наоборот.
К моменту первой статьи у Airbnb уже была развитая ML-инфраструктура вокруг поиска. С 2017 года в продакшене работала real-time персонализация на эмбеддингах объявлений: команда Михайло Грбовича обучила 32-мерные векторные представления жилья на более чем 800 миллионах кликовых сессий по 4,5 миллиона активных объявлений — карусель «похожего жилья» на этих эмбеддингах прибавила 21% CTR. Ранжированием же выдачи с определённого момента управляла модель градиентного бустинга (GBDT), сменившая ручную скоринговую функцию, — и её запуск команда называет одним из крупнейших разовых скачков бронирований в истории компании. Проблемы начались после этого успеха.
Проблема
Первая модель на градиентном бустинге дала мощный скачок, но затем прирост иссяк: команда наращивала усилия, а A/B-тесты раз за разом выходили нейтральными. Это классическое плато зрелой ML-системы — когда тюнинг фич и гиперпараметров перестаёт двигать бизнес-метрику, и встаёт вопрос о смене парадигмы с непредсказуемым исходом.
При этом задача поиска Airbnb сопротивляется готовым рецептам из литературы по ранжированию. У пользователя почти не бывает повторных запросов одного и того же «товара»: гость, съездивший в Париж, в следующий раз ищет Рим. Предложение жёстко ограничено: одно жильё на одни даты может забронировать только один гость, поэтому выдача не может просто показывать «самое популярное». Маркетплейс двусторонний — ранжирование балансирует интересы гостей и хостов, а сигналы поведения (клики, сохранения, запросы на бронирование) зашумлены и смещены.
Два системных смещения заслуживали отдельной атаки. Первое — холодный старт: новые объявления без истории взаимодействий проигрывали в NDCG около 6% относительно обжитых; ирония в том, что сами поведенческие фичи, дающие модели силу (их удаление стоило 4,5% NDCG), хоронили новичков на дне выдачи — а без новых объявлений задыхается рост предложения. Второе — позиционное смещение: гости чаще бронируют то, что показано выше, поэтому обучающие данные завышают качество тайтлов с верхних позиций, и модель, обученная на таких логах, самоподтверждает старые ошибки ранжирования.
Решение
Переход к нейросетям шёл итерациями, и каждая проверялась онлайн A/B-тестом на бронированиях. Первая попытка — простая сеть с одним скрытым слоем из 32 ReLU-нейронов — оказалась нейтральной по бронированиям против GBDT. Прорыв дал Lambdarank NN: ранжирующая функция потерь на парах «забронировано/не забронировано» с весами по разнице NDCG. Затем — ансамбль, где индексы листьев GBDT и предсказания факторизационной машины подавались в сеть как фичи. Финал первой статьи — глубокая сеть: 195 фич (после разворачивания категориальных в эмбеддинги), два скрытых слоя на 127 и 83 ReLU, обучение на 1,7 млрд пар «показ—результат». DNN дала прирост, сопоставимый со стекингом всех предыдущих моделей, — при кратно более простой системе.
Не меньше места в статьях занимают тупики. Эмбеддинги ID объявлений — стандартный приём индустрии — приводили к переобучению: даже самое популярное жильё бронируется максимум 365 раз в год, сигнала на ID не хватает. Multi-task-обучение (предсказывать и бронирования, и длинные просмотры) резко нарастило просмотры — а бронирования не сдвинуло. Все варианты dropout ухудшали офлайн-метрики; residual-связи, архитектура Deep & Wide и attention-сети «не сдвинули стрелку». Отдельные уроки — про данные и инженерию: без нормализации фич обучение насыщалось на середине, а перевод конвейера с CSV на Protobuf ускорил обучение в 17 раз и поднял утилизацию GPU до ~90%.
Вторая статья (KDD 2020) — следующий виток. Двухбашенная архитектура разделила модель на «башню запроса» и «башню объявления», каждая сводит свою сторону к 100-мерному вектору; релевантность считается как расстояние между векторами. Это не только качество (+0,7% NDCG онлайн), но и производительность: сложность скоринга падает с O(N·H·(Q+L)) до O(N·H_l·L + H_q·Q), что срезало 99-й перцентиль латентности на 33%.
Для холодного старта построили механизм оценки вовлечённости новых объявлений: вместо отсутствующей истории модель получает прогноз взаимодействий, рассчитанный по соседним объявлениям. Позиционное смещение победили приёмом position dropout: позиция показа подаётся в модель как фича, но при обучении случайно зануляется (подобранная доля — 0,15), чтобы модель не выучила «верх выдачи = хорошо». И снова зафиксированы провалы: жёсткая монотонность по цене обвалила бронирования на 1,6%, «мягкая» версия — красивая офлайн — в проде дала −0,67%, тест откатили.
Результат
Итоги второй волны зафиксированы в онлайн A/B-тестах. Двухбашенная архитектура: +0,6% бронирований и +0,75% выручки при −33% к p99-латентности скоринга; любопытный побочный эффект — средняя цена бронируемого жилья снизилась на 2,3%, то есть модель стала точнее попадать в ценовые предпочтения гостей. Механизм холодного старта поднял бронирования новых объявлений на 14% (и долю их показов на первой странице — тоже на 14%), добавив +0,38% к общим бронированиям и оздоровив сторону предложения. Position dropout принёс ещё +0,7% бронирований и неожиданные +1,8% выручки; бронирования бутик-отелей — сегмента, страдавшего от смещения, — выросли на 1,1%.
Важно правильно читать масштаб: доли процента здесь — не «маленькие результаты». На объёмах Airbnb +0,6% бронирований — это огромные абсолютные значения, а сумма последовательных приростов (+0,6%, +0,38%, +0,7% только по второй статье) складывается в двузначный кумулятивный эффект за годы. Сама команда называет применение нейросетей к поиску одной из самых успешных ML-историй компании. Рамки здесь тоже видны честно: все цифры — самоотчёт компании по внутренним A/B-тестам, но детальность методологии и публикация провалов дают этим цифрам больше веса, чем типичному пресс-релизу.
На наш взгляд, главная ценность пары статей — не в конкретных архитектурах (двухбашенные сети и борьба с position bias давно стали индустриальным стандартом), а в задокументированной культуре: единственным арбитром каждого изменения был онлайн-тест на деньгах (бронированиях), офлайн-метрики выступали лишь фильтром гипотез. Показателен кейс «мягкой монотонности» по цене: интуитивно правильная и красивая офлайн идея потеряла 0,67% бронирований в проде — без дисциплины онлайн-проверки она бы осталась в системе.
Второе наше наблюдение: Airbnb фактически опубликовала «карту граблей» для всех, кто выводит нейросети в поисковое ранжирование, — от переобучения на ID до сатурации без нормализации. Компании, которые повторяют этот путь, экономят месяцы не на чужих успехах, а на чужих тупиках; в этом смысле честная публикация провалов — редкий пример инженерного альтруизма, который одновременно работает на HR-бренд.
Уроки для индустрии
- Плато после первого успеха — норма: когда GBDT перестал давать прирост, выходом стала смена парадигмы (нейросети), а не бесконечный тюнинг фич.
- Каждое улучшение проверяйте онлайн-метрикой денег (бронирования), а не только офлайн NDCG: «мягкая монотонность» по цене была лучше офлайн и провалилась в проде на −0,67%.
- Холодный старт — отдельная задача с отдельным механизмом: оценка вовлечённости для новых объявлений дала +14% их бронирований и оздоровила маркетплейс.
- Позиционное смещение съедает качество обучающих данных: простой приём position dropout (доля 0,15) конвертировался в +0,7% бронирований и +1,8% выручки.
- Архитектура может окупаться производительностью: двухбашенная сеть не только прибавила бронирования, но и срезала p99-латентность на 33% за счёт снижения сложности скоринга.
- Стандартные приёмы не переносятся бездумно: эмбеддинги ID объявлений переобучались (жильё бронируется максимум 365 раз в год), а dropout ухудшал офлайн-метрики.
- Публикуйте и провалы: серия статей Airbnb ценна тем, что описывает тупики (residual, Deep & Wide, attention, multi-task), которые сэкономят месяцы другим командам.
Частые вопросы
Сколько бронирований принесли нейросети в поиске Airbnb?
В онлайн A/B-тестах из статей KDD: двухбашенная архитектура дала +0,6% бронирований и +0,75% выручки, механизм холодного старта — +0,38% к общим бронированиям (+14% у новых объявлений), position dropout — ещё +0,7% бронирований и +1,8% выручки. На масштабе Airbnb каждая доля процента — большие абсолютные значения.
Почему Airbnb ушла от градиентного бустинга к нейросетям?
Первая GBDT-модель дала один из крупнейших скачков бронирований в истории компании, но затем прирост иссяк — долгие серии нейтральных A/B-тестов. Нейросети, обученные на 1,7 млрд пар «показ—результат», возобновили рост метрик; финальная DNN дала прирост, сопоставимый со стекингом всех предыдущих моделей.
Что такое двухбашенная архитектура и что она дала?
Модель разделена на «башню запроса» и «башню объявления», каждая сводит свою сторону к 100-мерному вектору; релевантность — расстояние между векторами. Итог: +0,6% бронирований, +0,75% выручки и −33% к 99-му перцентилю латентности скоринга за счёт снижения вычислительной сложности.
Как Airbnb решила проблему холодного старта новых объявлений?
Новые объявления проигрывали ~6% NDCG из-за отсутствия истории взаимодействий. Команда построила механизм оценки вовлечённости: модель получает прогноз взаимодействий, рассчитанный по похожим соседним объявлениям. Бронирования новых объявлений выросли на 14%.
Были ли у Airbnb неудачные ML-эксперименты в поиске?
Да, и они описаны в статьях: эмбеддинги ID объявлений переобучались, multi-task-обучение нарастило просмотры без бронирований, residual-связи, Deep & Wide и attention «не сдвинули стрелку», жёсткая монотонность по цене дала −1,6% бронирований, «мягкая» — −0,67%; оба теста откатили.