
Привет! Меня зовут Михаил Трапезников, я руководитель группы рекомендательных технологий в AI VK.
В одной из прошлых статей мы рассказали, как устроен нейропрофиль пользователя в рекомендациях VK. Обновление стало фундаментом для нового подхода к ранжированию. Сегодня расскажем о том, как нам удалось перейти от бустинга к нейросетям и как устроена архитектура нейроранкера.
После того как модели первичного отбора (двухбашенная модель и «Хеймдаль») сформировали компактный пул наиболее перспективных кандидатов, наступает финальный, самый ответственный этап — тяжёлое ранжирование выдачи. Исторически эту задачу в индустрии решали классические алгоритмы градиентного бустинга на деревьях решений (Gradient Boosting Decision Trees). Схема была стандартной: бустинг принимал кандидатов, собирал сотни агрегированных фич и сжимал всю историю пользователя в одно итоговое число — скор. Однако у бустинга есть два критических ограничения, которые стали непреодолимым барьером для развития Discovery‑платформы:
Бустинг выдаёт плоский, жёстко фиксированный одномерный скор, который невозможно гибко переиспользовать или адаптировать под смежные задачи в рантайме
Бустинг требует колоссального труда инженеров по ручному конструированию признаков (Feature Engineering). Инженеры были вынуждены часами прописывать формулы взаимодействия фич, вычислять их нелинейные комбинации и пытаться вручную скрестить высокоразмерные эмбеддинги трансформеров со строгими табличными данными
Решением стал полный отказ от ручного инжиниринга признаков и переход к многозадачному нейроранжированию. Была построена единая глубокая нейросетевая архитектура, которая самостоятельно выучивает сложные нелинейные зависимости и скрытые признаки напрямую из сырых данных. При этом инженер в рантайме получает уникальную свободу: он может динамически определять, комбинацию каких именно задач и выученных сигналов применить для финальной сортировки ленты в данную секунду.

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

DCDN: Deep Cross‑Division Network
После кусочно‑линейного преобразования данные направляются в кастомное ядро сети. В ранжировании важно учитывать не только отдельные признаки, но и их сочетания. Например, произведение доли лайков на векторную близость между пользователем и объектом. Для моделирования таких зависимостей часто используют простую, но эффективную модель Deep & Cross Network, предложенную Google. Она позволяет с относительно небольшими вычислительными затратами учитывать полиномиальные взаимодействия во входных данных. Для этого в cross‑блоках сети исходный вектор поэлементно комбинируется с результатом преобразования. При этом после каждого такого блока размерность представления не увеличивается — сеть учитывает новые взаимодействия, сохраняя компактность вектора.

За основу была взята известная индустриальная архитектура DCN, которую команда AI VK кардинально модернизировала, создав собственную уникальную версию — DCDN.
Классическая сеть DCN обладает великолепной способностью автоматически моделировать кросс‑признаки в виде полиномов. Каждый новый слой cross‑сети строго отвечает за нарастание степени полинома (перемножение фич между собой). Однако по умолчанию классический DCN умеет оперировать исключительно неотрицательными степенями полиномов. Но в реальных продуктовых рекомендациях огромный пласт фундаментальных признаков завязан на математическую операцию деления. Ярчайший пример — метрика CTR (Click‑Through Rate), которая является чистым отношением кликов к показам:
Чтобы смоделировать деление в стандартной нейросети, требуются глубокие слои и колоссальный объём избыточных параметров. В архитектуру DCDN операция деления была внедрена непосредственно на базовый системный уровень. Это революционное архитектурное изменение позволило нейросети напрямую и с нулевыми вычислительными затратами моделировать полиномы отрицательных степеней.
Теперь сеть способна самостоятельно, в ходе обычного градиентного спуска, воспроизводить любые стандартные относительные признаки (вроде CTR и долей досмотров). Инженерам больше не нужно конструировать их вручную, DCDN извлекает эти нелинейные зависимости автоматически из сырых счётчиков кликов и просмотров.
Трёхголовая архитектура и решение дилеммы «признаки vs головы»
На выходе из полиномиального ядра DCDN признаки направляются в специализированный механизм гетерогенного внимания (Heterogeneous Attention), реализующий концепцию Task Fusion. Такой подход был предложен компанией Google в статье Hiformer. Основная идея в том, что каждый признак или его эмбеддинг обладают независимыми характеристиками, поэтому логично переосмыслить attention‑based подход на случай гетерогенных входных данных. В стандартном подходе с механизмом внимания используют общие матрицы ключей (K), запросов (Q) и значений (V), поскольку рассматривают на входе последовательность данных из одного класса (например, токены, описывающие символы в предложении; токены, описывающие события в истории пользователя и так далее). В случае с признаками ранжирования эти токены описывают, как ни странно, сами признаки. Более того, если признаки f_1 и f_2 поменять местами, то большого изменения в обучении это давать не должно, что означает разную природу каждого токена в такой постановке. Поэтому самым логичным решением для использования механизма внимания является использование разных матриц Q, K, V для каждого признака.

Архитектура нейроранкера является строго многозадачной. Модель имеет несколько независимых выходных голов, каждая из которых решает свою изолированную предиктивную задачу:
Голова 1. Предсказывает чистую вероятность явного лайка (Probability of Like)
Голова 2. Оценивает риск получения дизлайка или скрытия контента (Probability of Dislike)
Голова 3. Прогнозирует ожидаемое время вовлечённого просмотра объекта (Predicted Watch Time)
Здесь возникает резонный вопрос, который часто задают исследователи: не заменили ли мы ручное конструирование признаков ручным конструированием целевых голов? Ответ отрицательный, и в этом кроется фундаментальное концептуальное преимущество нейроранжирования.
Раньше инженеры были вынуждены плодить тысячи мелких, специфичных признаков под каждую минорную гипотезу. В многоголовой же архитектуре количество голов жёстко ограничено и фиксировано на уровне макросигналов (лайк, дизлайк, время). Головы оперируют крупными блоками продуктовых сущностей, в то время как весь бесчисленный массив внутренних признаков и нелинейных комбинаций, необходимых для этих предсказаний, нейросеть выучивает абсолютно самостоятельно внутри своего единого DCDN‑ядра.
Чтобы процесс обучения разных голов был стабильным и они не мешали друг другу перетягиванием весов (что является частой проблемой многозадачных сетей), их тренировка сделана полностью независимой. Инженеры применили следующий подход: выходы со всех голов собираются в единый пул признаков, но перед подачей на финальный слой над ними принудительно останавливаются градиенты (stop_gradient). Архитектуры отдельных голов вычисляют свои лоссы и обновляют свои внутренние слои независимо.
Поверх этого изолированного множества скоров обучается финальная компактная нейросеть, которая решает классическую задачу Learning to Rank (LTR). Она выступает в роли судьи: зная независимые предсказания лайков, дизлайков и времени просмотра, LTR‑сеть находит оптимальный, математически обоснованный компромисс между этими противоречивыми сигналами и собирает их в единую финальную оценку для итоговой сортировки ленты. В результате система имеет независимые функции потерь (loss) на каждую голову и один общий LTR‑loss для финального упорядочивания выдачи.

Вероятностный подход ко времени просмотра
Отдельного разбора заслуживает эволюция блока предсказания времени просмотра (Watch Time). Исторически для решения этой задачи в рекомендациях применялась стандартная регрессия с функцией потерь MSE (Mean Squared Error). Модель пыталась предсказать точное число секунд просмотра, что на практике приводило к посредственным результатам.
Математическая проблема MSE заключается в том, что она по своей природе оптимизирует предсказание под строгое математическое ожидание целевой величины. Однако математическое ожидание — это всего лишь плоская усреднённая характеристика распределения. В реальности поведение пользователей носит ярко выраженный бимодальный или мультимодальный характер, который MSE полностью сглаживает. Анализ логов показал, что время просмотра распределено нетривиально:
Если контент не зацепил пользователя в первые секунды, происходит мгновенный свайп — короткий просмотр, длящийся 1–3 секунды (так называемый скип)
Если контент оказался интересен, пользователь проваливается в глубокое потребление, и время просмотра резко смещается вправо, формируя затяжной колоколообразный хвост
Пытаясь выучить матожидание через MSE, модель выдавала некое среднее значение (например, 15 секунд), которое в реальности не соответствовало ни быстрому скипу, ни долгому вовлечённому просмотру. Было принято стратегическое решение: алгоритм должен выучивать не плоскую сухую статистику, а само вероятностное распределение целиком.
Смесь распределений и иерархический лосс
Время просмотра было формализовано как непрерывная вероятностная смесь двух принципиально разных распределений:
Экспоненциальное распределение. Идеально описывает физику коротких отказов и мгновенных скипов в первые мгновения показа
Смесь гауссиан (нормальных распределений). Массив последовательных гауссиан отвечает за точное моделирование стадий долгого, качественного и вовлечённого удержания внимания
Мы полностью отказались от MSE лосса и перешли к функции потерь, опирающейся на максимизацию правдоподобия (Maximum Likelihood Estimation, MLE). Модель прогнозирует параметры этого сложного составного распределения для каждого айтема. Однако прямое внедрение MLE породило серьёзную проблему: если пользователь совершал мгновенный скип клипа на первой секунде, сеть всё равно тратила свои вычислительные ресурсы и ёмкость, пытаясь детально просчитать и оптимизировать параметры далёких гауссиан его потенциального вовлечённого просмотра.
Чтобы устранить этот архитектурный дефект, в модель была введена строгая иерархичность. Этот подход команда AI VK отдельно исследовала в работе Hierarchical Exponential‑Gaussian Mixture (HEGM). В ней мы подробно рассказываем, как разделение скипов и вовлечённого просмотра вместе с регуляризацией и специальной инициализацией делает модель стабильнее.
Сначала алгоритм вычисляет чистую вероятность быстрого ухода пользователя (скипа). Если вероятность скипа максимальна, вычисление останавливается. Вся оставшаяся доля вероятности иерархически распределяется далее по массиву гауссиан, моделирующих вовлечённое время. Это позволило резко повысить стабильность схождения градиентов и точность прогнозов.
Борьба с вырождением распределений
При переходе на лоссы на базе правдоподобия (MLE) в глубоких сетях всегда возникает опасный риск вырождения распределений. Сеть быстро нащупывает аномальные точки и начинает локально схлопывать дисперсии отдельных гауссиан в бесконечно узкие и острые пики — математические дельта‑функции. Происходит вычислительный взрыв (overflow), и модель полностью ломается. Готового решения, которое устраивало бы нас по стабильности и качеству, в существующих подходах не нашлось, поэтому мы добавили в модель два механизма:
Равномерная пространственная инициализация. Математические ожидания гауссиан принудительно инициализируются строго равномерно по всей временной шкале, не позволяя им изначально кучковаться в районе нуля
Дивергентные штрафы (Penalty). В функцию потерь был жёстко интегрирован специальный регуляризационный штраф на дивергенцию (расхождение) прогнозируемых параметров относительно изначального распределения реальных эмпирических данных. Это удерживает дисперсии от коллапса
Внедрение сложного вероятностного подхода к моделированию распределения времени удержания поверх эмбеддингов трансформера принесло конкретный продуктовый эффект: общее время просмотра (TVT) в VK Клипах выросло на 5,5%. При этом остальные метрики не просели, а даже наоборот: лайки прибавили 5%, а шеры — 15%. Обычно рост времени просмотра оплачивается падением других метрик, а здесь все три сигнала выросли вместе.
Как системы работают вместе в продакшене
Вот пошаговый порядок вызова систем:
Стадия первичного отбора и кандидатизации. Процесс стартует непрерывно на потоковых данных в реальном времени через инструмент Discovery‑платформы Profile Stream. Когда пользователь совершает действия, логи мгновенно обогащаются. Первая стадия двухбашенной модели и кросс‑доменной модели «Хеймдаль» обрабатывают этот поток токенов и формируют первичный пул из нескольких тысяч релевантных кандидатов. Все эти кандидаты базово подходят пользователю по вектору интересов, но их слишком много, и они не упорядочены
Стадия тяжёлого нейроранжирования. Извлечённый пул кандидатов передаётся в многозадачную нейроранжирующую модель DCDN. Именно на этом этапе в рантайме (runtime) к высокоразмерным эмбеддингам трансформеров подмешиваются свежие динамические контекстные признаки. Модель учитывает текущие параметры момента: какое сейчас время года, какая погода на улице (дождь или солнце кардинально меняют паттерн удержания), а также то точечное количество времени, которое человек тратит на медиапотребление прямо в данную секунду. Многоголовая структура просчитывает скоры, а слой Learning to Rank осуществляет финальную компромиссную сортировку и генерирует идеальную персональную ленту, которую видит пользователь на экране смартфона
Замыкание цикла. Обратная связь от взаимодействия пользователя с итоговой лентой (клики, досмотры, скипы) мгновенно логируется и отправляется обратно в облачную инфраструктуру (компонент Cloud Training Discovery‑платформы). Там модели регулярно дообучаются на свежих данных, непрерывно обновляя свои веса
Discovery‑платформа позволяет бесшовно масштабировать эти тяжёлые архитектурные решения сразу на все продукты экосистемы. Новые сервисы могут мгновенно подключаться к нейропрофилю, не переписывая свои локальные рекомендательные движки с нуля.

Что дал отказ от бустинга
Бустинг сжимал всю историю пользователя в одно число. Это число нельзя было ни разобрать на части, ни переиспользовать в смежной задаче, а каждое улучшение качества упиралось в новую пачку признаков, которые инженер выписывал руками. Нейроранкер даёт вместо одного скора набор осмысленных предсказаний и свободу в том, как их сложить. Соберём переход по частям:
Признаки переехали в архитектуру. Операция деления встроена в ядро DCND на системном уровне, поэтому сеть сама выводит относительные величины вроде CTR и доли досмотров прямо из сырых счётчиков кликов и показов. Ручной инжиниринг дробей больше не нужен
Плоский скор превратился в набор сигналов. Три головы отвечают за вероятность лайка, риск дизлайка и ожидаемое время просмотра. Они обучаются изолированно через stop_gradient, а компромисс между ними ищет отдельная LTR‑сеть. Комбинацию сигналов для финальной сортировки можно поменять в рантайме, и переобучать ядро для этого не нужно
Время просмотра описано распределением, а не средним. Смесь экспоненты и гауссиан плюс иерархический лосс на правдоподобие снимают главную беду MSE: среднее между мгновенным скипом и долгим вовлечённым просмотром не описывает ни один из этих сценариев
Устойчивость обучения пришлось собирать самим. MLE в глубокой сети схлопывает дисперсии гауссиан в дельта‑функции. Готового рецепта в статьях не нашлось, поэтому мы равномерно инициализируем матожидания по всей временной шкале и штрафуем модель за расхождение с эмпирическим распределением
Ранкер работает в связке с нейропрофилем, а не рядом с ним. Динамический вектор пользователя из трансформеров первичного отбора подмешивается в скрытое представление ранкера прямо в рантайме. Кросс‑доменный интент доезжает до финальной сортировки выдачи, а не остаётся на этапе отбора кандидатов
Что из этого стоит забрать себе
На практике почти любой продуктовый ранкер упирается в те же четыре стены:
Посчитайте, сколько ваших признаков — дроби. Если существенная их часть построена на отношениях, сеть без встроенного деления потратит лишние слои и параметры на то, чтобы приблизить простую арифметику
Посмотрите на форму целевой переменной, а не только на её среднее. Если распределение бимодальное, MSE сведёт прогноз в середину, где нет ни одного реального пользователя
Защиту от вырождения закладывайте вместе с лоссом. После перехода на правдоподобие вопрос не в том, схлопнутся ли дисперсии, а в том, на каком шаге обучения это случится
Разводите задачи по градиентам. Независимые лоссы на каждую голову и один общий LTR‑лосс сверху избавляют от перетягивания весов между конфликтующими целями.
Главный итог — не отдельная метрика, а смена способа работы над качеством. Раньше шаг вперёд означал новую партию ручных признаков: инженер руками выписывал формулы взаимодействия фич и подбирал их нелинейные комбинации. Теперь это новая голова или новая формула смешивания сигналов, а нелинейности сеть находит сама. Плата за такую свободу — внимание к устойчивости обучения и аккуратная изоляция задач друг от друга. Взамен потолок качества поднимается заметно выше, чем от очередной ручной фичи.

