
Привет! Это Степан Малькевич, руководитель группы рекомендаций ленты ВКонтакте (AI VK).
За прошедшие месяцы 2026 года время в ленте выросло на 11%. За этими цифрами — серия изменений, каждое из которых сделало свой вклад в рост метрик. Сейчас расскажу, что мы обновили и что из этого вышло.
Блендер и алгоритм Брезенхема
Финальную ленту пользователя собирает блендер — механизм, который смешивает разные форматы контента в одну последовательность. В нём выкатили новые ML-модели, и главная из них подбирает персональное соотношение клипов и постов в ленте пользователя.
Два человека могут одинаково любить путешествия, но один читает длинные посты с фотографиями, а второй смотрит короткие видео. Тема общая, формат разный. Модель разбирает поведенческие сигналы: что человек читает и лайкает, какие клипы досматривает, к какому формату возвращается. На выходе — персональная пропорция.
Раньше форматы раскладывал стохастический алгоритм: тип следующей карточки он разыгрывал случайно, с нужными вероятностями. В среднем это даёт правильную пропорцию, но у розыгрыша есть дисперсия.
Розыгрыш заменили на алгоритм Брезенхема. Его придумали для растровой графики: он решает, какие пиксели закрасить, чтобы наклонная линия на сетке выглядела ровной. Разложить два формата в заданной пропорции — та же задача, только вместо пикселей карточки. Алгоритм копит долг по каждому формату и на каждом шаге отдаёт место тому, кто отстал сильнее. Пропорция соблюдается теперь не в среднем, а на любом экране ленты.
Композитный мультитаргет
Ранкер получает набор отобранных публикаций и определяет, в каком порядке они появятся в ленте пользователя. Для его обучения важно определить, какое взаимодействие с постом считать успешным.
Раньше мы использовали для этого классический мультитаргет. В таком подходе модель одновременно обучается на нескольких типах пользовательских действий — лайках, подписках, репостах, скрытиях и других сигналах. При этом каждый сигнал рассматривается отдельно и получает заранее заданный вес. Условно, лайк всегда добавляет один и тот же плюс, скрытие — один и тот же минус, а репост имеет одинаковое значение независимо от того, что ещё пользователь сделал с публикацией.
У такого подхода есть ограничение: пользовательские сигналы не всегда можно интерпретировать по отдельности. Особенно это заметно на неоднозначных действиях. Шер может означать «хочу поделиться, потому что понравилось», а может — «посмотрите, какой кринж». Переход в профиль автора тоже может быть следствием как интереса, так и раздражения. Контекст других действий в классическом мультитаргете при этом теряется.
Поэтому мы перевели ранкер на композитный мультитаргет. Вместо независимого набора целей для каждой пары «пользователь — пост» теперь рассчитывается единый итоговый таргет — числовая оценка того, насколько взаимодействие с публикацией было положительным или отрицательным. Она строится сразу на всей совокупности событий для поста, поэтому вклад одного действия может меняться в зависимости от остальных.
Для расчёта таргета мы оставили универсальные события, которые применимы ко всем типам публикаций, и разделили их на три группы:
однозначно положительные: лайк, репост, добавление в закладки, подписка
однозначно отрицательные: скрытие, жалоба, отписка
неоднозначные: отправка в сообщении, переход в сообщество, переход в профиль автора
Отдельно учитывается время просмотра. Сам по себе клик — довольно противоречивый сигнал: яркий заголовок может заставить человека открыть публикацию, но через две секунды он её закроет. Поэтому действия вроде открытия фотографии или разворачивания текста мы вообще убрали из положительных сигналов модели.
Длительность просмотра помогает отличить реальный интерес от случайного открытия. Для этого добавили несколько событий, связанных со временем: очень короткий просмотр считаем скипом, отдельно отмечаем просмотр без скипа, а длинные и очень длинные просмотры дают дополнительный положительный сигнал.
Как рассчитывается итоговый таргет
Сначала система проверяет однозначные сигналы. Если пользователь одновременно совершил явно положительное и явно отрицательное действие — например, поставил лайк и скрыл публикацию, — однозначно интерпретировать такое взаимодействие нельзя. Поэтому такой пример не используем при расчёте таргета, чтобы не добавлять в обучение шум.
Отдельно обрабатываем скипы. Если пользователь почти сразу пролистал публикацию — это не просто отсутствие интереса, а самостоятельный отрицательный сигнал. Такой пример получает отрицательную оценку.
Дальше учитываются однозначные действия. Их вклад различается: например, подписка или добавление в закладки сильнее говорят об интересе, чем лайк, а отписка — более сильный отрицательный сигнал, чем скрытие поста.
Неоднозначные события получают меньший базовый вес, а главное — их значение зависит от контекста однозначных действий. Если вместе с шером был явный положительный сигнал, вклад репоста усиливается в положительную сторону. Если был явный отрицательный — меняет знак. Если явных сигналов вообще нет, событие учитывается с базовым весом.
Именно здесь проявляется главное отличие композитного подхода. Шер публикации, которую человек затем лайкнул, и шер публикации, которую он тут же скрыл, больше не являются для модели одинаковыми примерами. В классическом мультитаргете тип события один и его вес фиксирован. В композитном итоговая оценка зависит от всей комбинации действий пользователя.
Свой вклад в таргет даёт и длительность просмотра: очень короткий просмотр снижает оценку, длинный — повышает. В результате модель получает не набор независимых меток, а одну оценку взаимодействия, которая учитывает одновременно характер действий, их сочетание и время, проведённое с публикацией.
Что получилось:
CTR в лайк +30%;
CTR в скрытие, скип поста −10%.
Значительно выросли также добавления в закладки, комментарии, репосты и подписки.
ALS: от эвристических весов к интерпретируемым вероятностям
Часть признаков ранкеру дают ALS-разложения. ALS — матричная факторизация: она сжимает историю взаимодействий в компактные векторы пользователей и объектов. Модель не новая, зато устойчивая, поэтому в проде живёт годами. В этом полугодии мы нашли в ней две точки роста, и обе в том, как строится таргет.
В постовом ALS улучшили оценку пользовательских сигналов. Веса событий связали с вероятностью лайка, а скор модели получил понятную интерпретацию.
Авторский ALS сделали устойчивее к числу взаимодействий. Для пары «пользователь — автор» важно отделить сам интерес к автору от того, сколько его публикаций успело попасть в историю взаимодействий. Поэтому вместо простой агрегации сигналов мы перешли к вероятностной оценке, которая учитывает объём накопленных данных и позволяет корректнее сопоставлять авторов с разной частотой публикаций.
Скореры и препроцессоры реализовали через компонент Discovery-платформы Profile Stream и внедрили в модель ранжирования. Новые признаки находятся в топе по важности.
I2I и свежие интересы
Интересы переменчивы: перед отпуском человек читает про Стамбул, а через месяц выбирает краску для стен. Рекомендации, которые опираются только на длинную историю пользователя, замечают такие сдвиги с задержкой.
Одно из изменений — I2I-сервис (item-to-item): он подбирает материалы, похожие на конкретный объект, а не на весь профиль целиком. Один прочитанный пост, который вызвал интерес, становится точкой входа в новую тему — от него система дотягивается до близких публикаций и новых авторов.
Другое — учёт свежих интересов и в ранкере, и в селекторах. Селекторы работают до ранжирования: они набирают пул кандидатов, из которого ранкер потом выбирает. Изменить только ранкер тут мало: если нужного контента нет в пуле, ранжировать нечего.
При этом лента не перестраивается целиком после одного действия: она подмешивает несколько материалов на новую тему и смотрит на реакцию. Отклик есть — направление развивается, отклика нет — гипотеза закрывается. Это защита от эффекта, когда один случайный клик определяет ленту на месяц вперёд.
Холодные пользователи и социальный контекст
Почти вся персонализация строится на истории действий, а у нового или малоактивного пользователя её нет. Для этой группы сделали отдельные модели и динамические квоты: стартовая лента собирается даже на скудных данных. Система показывает разные темы и форматы, а потом читает первые сигналы — что человек открыл, что досмотрел, что смахнул сразу.
Отдельно в ленту добавили социальный контекст: система учитывает лайки и комментарии друзей и подмешивает такие материалы в выдачу, а рядом показывает подсказку, кто из друзей её оценил. Персональные рекомендации это не заменяет, а добавляет ещё один способ найти нужное — через людей, а не только через алгоритмы.

Что из этого следует
В рекомендациях заметный результат не всегда требует больших релизов: система развивается постоянно, и эффект часто складывается из множества небольших улучшений. Четыре вывода, которые применимы для других команд.
Таргет дисциплинирует систему сильнее любых правил. Проще перестать вознаграждать модель за то поведение, которое не нравится: убрать из положительных сигналов открытие фотографии и разворачивание текста, а трактовку остальных поставить в зависимость от контекста.
Сигналы зависят друг от друга, и это стоит учитывать явно. Один и тот же шер означает разное в зависимости от того, что ещё человек сделал с постом. Модель, которая обрабатывает события независимо, эту разницу увидеть не способна в принципе — сколько ни подбирай веса.
Интерпретируемый скор проще валидировать и масштабировать. Переход к оценке вероятности лайка дал скору понятную и проверяемую семантику. Это упростило отладку и переиспользование признака, а также позволило сделать источниковый ALS устойчивее к разному объёму взаимодействий с авторами.
Дисперсия — это дефект, а не свойство. Правильная в среднем пропорция ничего не значит для человека, который видит один экран. Иногда самый быстрый прирост даёт не новая модель, а замена случайности на детерминированный алгоритм.
Такой темп изменений в одном сервисе держится на общей инфраструктуре: лента едет на Discovery-платформе AI VK, где рекомендации, поиск и реклама всех продуктов группы строятся на одном фундаменте.
Рост времени в ленте не главное для команды, смысл в другом: человек быстрее находит подходящее и меньше листает мимо. Хорошие рекомендации держат баланс между прошлым и настоящим, знакомым и новым, разными форматами контента. Ни одно отдельное изменение не задаёт этот баланс целиком.
Если у вас есть опыт перехода с независимого мультитаргета на композитный — особенно подбор весов и работа с противоречивым фидбэком, — приходите в комментарии, интересно сверить решения.

