Обучение с подкреплением в рекомендациях: оптимизируем удовлетворённость пользователя за всю сессию — статья на KDD 2026. ai.. ai. recsys.. ai. recsys. генеративный ии.. ai. recsys. генеративный ии. искусственный интеллект.. ai. recsys. генеративный ии. искусственный интеллект. рекомендательные системы.
Обучение с подкреплением в рекомендациях: оптимизируем удовлетворённость пользователя за всю сессию — статья на KDD 2026 - 1

Привет! На связи Артём Матвеев из команды AI VK Research. Мы занимаемся фундаментальными и прикладными исследованиями в области рекомендательных систем, поиска и генеративного искусственного интеллекта

Сегодня я расскажу про нашу работу, которая была принята на воркшоп End-to-End Customer Journey Optimization конференции KDD 2026. KDD — A*-конференция и одна из ведущих мировых площадок в области машинного обучения и искусственного интеллекта, где обсуждают развитие рекомендательных систем, поиска, рекламы и других AI-технологий.

Наша статья называется Session-Level Optimization for Large-Scale Retrieval using REINFORCE with Multi-Step Off-Policy Correction. Рассказываем, как мы научили модель рекомендаций сразу оптимизировать долгосрочную удовлетворённость пользователя (long-term user satisfaction).

Рекомендательные системы

Рекомендательная система решает, что показать пользователю. То, что мы рекомендуем, принято называть айтемом: трек, видео, товар. Айтемов в каталоге миллионы, и пользователь может не найти определённый айтем без помощи — нужны рекомендации, чтобы справиться с информационной перегрузкой.

Устроено это почти всегда каскадом. Сначала работает кандидатогенерация. Она отбирает из миллионов айтемов несколько сотен. Потом работает ранжирование. Оно сортирует выбранное и решает, что показать первым. Так делают, потому что ранжирующая модель тяжёлая, прогнать её по всему каталогу на каждый запрос не получится. Мы остановимся на кандидатогенерации.

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

Рекомендательные системы не живут отдельно от продуктов. Примеры продуктов: VK Видео, VK Музыка, VK Клипы и ещё многие другие. У каждого продукта есть свои ключевые метрики, которые команда продукта растит. И всегда эти метрики формулируются как что-то долгосрочное: вырастить монетизацию, удержать как можно больше пользователей или увеличить время, которое пользователь проводит в приложении.

Рекомендательная система влияет на рост этих метрик. Влияние может варьироваться в зависимости от продукта, но зачастую оно большое.

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

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

Одна и та же рекомендация может привести к разным продолжениям сессии. Предсказать ближайший лайк легче, чем суммарную награду на длинном горизонте

Одна и та же рекомендация может привести к разным продолжениям сессии. Предсказать ближайший лайк легче, чем суммарную награду на длинном горизонте

Вопрос к читателю: почему модель, которая предсказывает самый вероятный лайк прямо сейчас, не максимизирует число лайков за год?

Ответ

Ответ: потому что каждый рекомендуемый айтем может повлиять на пользователя. Например, мы порекомендовали ему такой хороший для него трек с лайком, что после него он вообще ничего лайкать не будет и уйдёт из сервиса навсегда. Настолько его расстроит отсутствие второго такого же шедевра.

Это утрирование, но механизм настоящий. Действие меняет состояние пользователя, а вместе с ним и всё, что произойдёт дальше. Жадный выбор смотрит только на награду за текущий шаг. На то, куда он нас приведёт, он не смотрит.

Обучение с подкреплением

На вопрос, как искать лучший долгосрочный алгоритм, отвечает обучение с подкреплением (Reinforcement Learning, RL).

В RL есть две ключевые сущности — агент (agent) и среда (environment). Среда в каждый момент времени находится в каком-то состоянии x из фиксированного пространства всевозможных состояний mathcal{X}. Агент может делать в этой среде фиксированный набор действий mathcal{A}. За каждое действие в конкретном состоянии он получает награду r(x, a) — произвольное вещественное число. Награду мы выбираем сами в зависимости от задачи.

Правило, по которому агент принимает решение, какое действие ему выбрать в текущем состоянии, называется политикой и обозначается pi(a mid x). Это распределение над действиями при условии состояния.

Осталось описать, как среда реагирует на действия агента. Если агент в состоянии x сделал действие a, среда переходит в новое состояние по распределению P(cdot mid x, a). Оно называется вероятностью перехода. Начальное состояние приходит из распределения P_0(x). Награда в общем случае тоже случайна, её распределение обозначим P_r(x, a).

Всё вместе это называется марковским процессом принятия решений (Markov Decision Process, MDP) и задаётся кортежем langle mathcal{X}, mathcal{A}, P_r(x, a), P(cdot mid x, a), P_0(x), gamma rangle. Слово «марковский» означает, что следующее состояние зависит только от текущего состояния и действия. От всей предыстории оно не зависит. Это не ограничение, а требование к состоянию: всю нужную историю надо в него положить. Про gamma чуть ниже.

Запустим агента в среду. Он окажется в начальном состоянии, сделает действие, получит награду, перейдёт в новое состояние и так далее. То, что получится, называется траекторией:

xi=(x_0, a_0, r_0, ldots, x_{T_xi - 1}, a_{T_xi - 1}, r_{T_xi - 1}, x_{T_xi}),,

где x_0 sim P_0(x), a_t sim pi(cdot mid x_t), x_{t+1} sim P(cdot mid x_t, a_t), r_t sim P_r(cdot mid x_t, a_t), а T_xi — длина траектории. Распределение траекторий, которое порождает политика pi, обозначим xi sim P^pi_xi.

Траектория конечна: рано или поздно среда приходит в терминальное состояние. В рекомендациях такого состояния нет, пользователь ходит в сервис годами. Поэтому границу мы проводим сами — траекторией у нас будет сессия.

Награды по траектории надо сложить в одно число. Складываем с дисконтированием:

R_{t_1:t_2}(xi)=sum_{t=t_1}^{t_2} gamma^{t - t_1} r_t.

Здесь gamma in [0, 1) — фактор дисконтирования. Он говорит, насколько нам важна награда через шаг по сравнению с наградой прямо сейчас. При gamma, близкой к нулю, агент смотрит только на ближайшие шаги. При gamma, близкой к единице, — далеко вперёд. Суммарная дисконтированная награда за всю траекторию — это R_{0:T_xi - 1}(xi).

Нам понадобятся две функции ценности. Функция ценности состояния — это ожидаемая суммарная награда, если стартовать из состояния $x$ и дальше действовать по политике pi:

V^pi(x)=mathbb{E}_{xi sim P^pi_xi}left[R_{0:T_xi - 1}(xi) mid x_0=xright].

Функция ценности состояния и действия — то же самое, но первое действие мы фиксируем:

Q^pi(x, a)=mathbb{E}_{xi sim P^pi_xi}left[R_{0:T_xi - 1}(xi) mid x_0=x, a_0=aright]$

Отсюда виден ответ на вопрос из прошлой секции. Жадная модель выбирает действие с максимальной r(x, a). А нужно выбирать с максимальной Q^pi(x, a). Разница между ними — это то, что произойдёт после действия. И знание r ничего не говорит про Q.

Задача RL формулируется как найти политику, которая максимизирует ожидаемую суммарную награду за траекторию:

pi_theta=argmax_pi mathcal{J}(pi)=argmax_pi mathbb{E}_{xi sim P^pi_xi}left[R_{0:T_xi - 1}(xi)right].

Качество политики измеряется как rho^pi=mathbb{E}_{x_0 sim P_0}[V^pi(x_0)].

На рекомендательные системы это переносится напрямую:

  • Агент — рекомендательная система

  • Среда — пользователь

  • Состояние x — история пользователя: что мы ему показали, с чем он провзаимодействовал, какой оставил фидбэк. Фидбэком дальше называю любую реакцию пользователя, которую мы записали в логи: лайк, дослушивание, скип

  • Действие a— айтем, который мы рекомендуем

  • Награда r(x, a) — реакция пользователя на этот айтем

  • Переход P(cdot mid x, a)— к истории дописывается рекомендованный айтем и реакция на него

Состояние — вся история целиком, поэтому марковость выполняется по построению.

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

Policy gradient

Как искать оптимальную политику? Параметризуем её нейросетью pi_theta(a mid x) и будем оптимизировать mathcal{J}(pi_theta) градиентным подъёмом. Проблема в том, что theta входит не в саму награду. Она входит в распределение, по которому берётся матожидание. Продифференцировать напрямую не получается.

Обойти это позволяют policy gradient методы. Градиент по алгоритму REINFORCE выглядит так:

nabla_theta mathcal{J}(pi_theta)=mathbb{E}_{xi sim P^{pi_theta}_xi}left[sum_{t=0}^{T_xi - 1} gamma^t R_{t:T_xi - 1}(xi) nabla_theta log pi_theta(a_t mid x_t)right].

Мы берём траекторию. Для каждого шага увеличиваем логарифм вероятности выбранного действия. Вес при этом равен награде, набранной после этого шага. Действие, за которым последовало много хорошего, становится вероятнее. Действие, за которым не последовало ничего, — нет.

В матожидании стоит xi sim P^{pi_theta}_xi. Формула требует траекторий, порождённых той самой политикой, которую мы оптимизируем. Как раз этого у нас и нет. Есть только логи, собранные моделью, которая уже работает на пользователях.

Off-policy обучение и оценка

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

Вместо этого у нас есть логи. Их собрала та политика, которая работала на пользователях. Её называют behavior policy и обозначают pi_b. Но оптимизируем мы другую политику, pi_theta, её называют target policy. Обучение в таком режиме называется off-policy.

Мы учимся на данных, которые породила одна политика, а применять будем в мире, где действует другая. Матожидание в формуле градиента берётся по другому распределению. Теория перестаёт работать, и формулу нужно исправить.

Importance sampling

Помогает приём из статистики. Пусть мы хотим посчитать матожидание f(z) по распределению p, а семплы у нас есть только из q. Тогда:

mathbb{E}_{z sim p}[f(z)]=mathbb{E}_{z sim q}left[frac{p(z)}{q(z)} f(z)right].

Проверяется подстановкой: домножили и поделили на q(z) под интегралом. Приём называется importance sampling, а отношение p(z)/q(z) — importance weight.

Подставим сюда траектории. Вероятность траектории раскладывается в произведение по шагам. Множители, которые от политики не зависят, сокращаются. Это переходы среды P и начальное состояние P_0. Остаётся произведение отношений вероятностей действий:

omega_{t_1:t_2}(xi)=prod_{tau=t_1}^{t_2} frac{pi_theta(a_tau mid x_tau)}{pi_b(a_tau mid x_tau)}.

Отсюда получаем off-policy REINFORCE:

nabla_theta mathcal{J}(pi_theta)=mathbb{E}_{xi sim P^{pi_b}_xi}left[sum_{t=0}^{T_xi - 1} gamma^t omega_{t:T_xi - 1}(xi) R_{t:T_xi - 1}(xi) nabla_theta log pi_theta(a_t mid x_t)right].

Траектории берутся из логов. Разница между политиками компенсируется весами.

Настоящую pi_b мы при этом не знаем. В логах записано, что показали и что произошло. Но не записано, с какой вероятностью система выбрала именно этот айтем. Behavior policy приходится оценивать отдельной моделью hat{pi}_b. Это источник смещения.

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

Chen et al. в Top-K Off-Policy Correction for a REINFORCE Recommender System предложили оставить в весе только один множитель, за текущий шаг. Все остальные выбрасываются. Дисперсия падает, зато появляется смещение.

Off-policy оценка

Обучить политику — это половина задачи. Дальше надо понять, стала ли она лучше. Желательно до выкатки на пользователей.

Есть логи, собранные pi_b. Есть новая политика pi_theta. Надо оценить rho^{pi_theta} — её среднюю суммарную награду. Прогнать pi_theta по логам не получится. Она порекомендует не то, что было показано на самом деле, а награду мы знаем только для показанного. Это называется off-policy evaluation, или OPE.

Direct method (DM). Награду для новых действий мы не знаем — научим модель её предсказывать. Обучаем модель среды, гоняем по ней целевую политику и смотрим, сколько она набирает:

hat{rho}^{pi_theta}_{DM}=frac{1}{N} sum_{i=1}^{N} hat{V}^{pi_theta}(x_i).

Дисперсия у такой оценки низкая. Но модель среды обучалась на данных behavior policy. Целевая политика может увести её туда, где она ничего не видела. Смещение получается неконтролируемым.

Inverse propensity scoring (IPS). Тот же importance sampling, что и в обучении. Только перевзвешиваем мы не градиент, а саму награду. Мы используем пошаговый вариант:

hat{rho}^{pi_theta}_{text{step-IS}}=frac{1}{N} sum_{i=1}^{N} sum_{t=0}^{T_{xi_i} - 1} gamma^t omega^{(i)}_{0:t} r^{(i)}_t.

Если behavior policy известна точно, оценка несмещённая. Проблемы те же, что и в обучении. Веса не ограничены, дисперсия огромная. К тому же pi_b мы заменяем оценкой и получаем смещение.

Doubly robust (DR). DM даёт низкую дисперсию, IPS — несмещённость. Оценка, которая их объединяет, называется doubly robust:

hat{rho}^{pi_theta}_{DR}=frac{1}{N} sum_{i=1}^{N} sum_{t=0}^{T_{xi_i} - 1} left[gamma^t omega^{(i)}_{0:t} r^{(i)}_t - gamma^t left(omega^{(i)}_{0:t} hat{Q}^{pi_theta}(x^{(i)}_t, a^{(i)}_t) - omega^{(i)}_{0:t-1} hat{V}^{pi_theta}(x^{(i)}_t)right)right].

Название идёт от главного свойства: оценка несмещённая, если не смещён хотя бы один из компонентов. Либо мы точно знаем behavior policy, либо у нас точная модель среды. Достаточно одного. Формально смещение DR выписали Farajtabar et al. В нём стоит произведение двух множителей: ошибки в оценке behavior policy и ошибки модели среды. Если хотя бы один из них равен нулю, всё выражение обнуляется.

IPS, DM и DR в такой постановке — это работы из общего RL, не из рекомендаций. В рекомендациях DR применяли, но только для контекстных бандитов, то есть на горизонте в один шаг. Для полноценных траекторий, насколько мы знаем, этого не делали. Мы адаптировали DR к этому случаю.

Подход: авторегрессивный REINFORCE с многошаговой off-policy коррекцией

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

Постановка

Состояние x_t — история пользователя до текущего шага. Действие a_t in mathcal{A} — это трек, который выбрала модель. Фидбэк состоит из бинарного лайка mathbb{1}{like_t} и доли прослушивания ratio_t in [0, 1]. Награду мы определяем так:

r_t=r(x_t, a_t)=mathbb{1}{like_t} + frac{1}{10} ratio_t, quad r_t in [0, 1.1].

Лайк — сильный сигнал, но редкий. Доля прослушивания — слабый, зато есть всегда. Лайк задаёт основную часть награды, а доля прослушивания не даёт ей быть нулевой почти везде. Следующее состояние x_{t+1} получается дописыванием трека и фидбэка в историю.

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

Максимизируем ожидаемую дисконтированную награду за сессию, gamma=0,9.

Behavior policy

Чтобы считать importance weights, нужна hat{pi}_b.

Это двухбашенная модель f_b. Пользовательская башня — это каузальный трансформер-декодер. На вход идёт хронологическая последовательность событий. Каждое событие — это контекст (органическое или рекомендательное), информация о треке (ID и длительность) и фидбэк (лайк и квантованная доля прослушивания). Вторая башня — обычный MLP над признаками трека. Близость считается скалярным произведением эмбеддингов пользователя и кандидата: f_b(x, c)=langle e_{b,x}, e_{b,c} rangle.

Учим на next-item prediction с logQ-коррекцией и семплированными негативами. Лосс считаем только на неорганических таргетах. Каузальная маска позволяет закодировать все состояния пользователя за один форвард.

Вероятность действия получается софтмаксом по каталогу:

hat{pi}_b(a mid x_t)=frac{exp{f_b(x_t, a)}}{sum_{a' in mathcal{A}} exp{f_b(x_t, a')}}.

Target policy

Целевая политика — та же архитектура, инициализированная весами обученной behavior policy. Дальше f_b замораживается и используется только для расчёта весов. А f_theta учится через off-policy REINFORCE.

Первое отличие от прошлых работ — в устройстве обучения. Chen et al. строили отдельный обучающий пример на каждую пару «состояние — действие». Мы обрабатываем всю последовательность пользователя за один форвард авторегрессивно, как языковую модель.

Авторегрессивное off‑policy обучение. Importance weights считаются через замороженный behavior‑трансформер. Целевая политика — такая же архитектура, обучается REINFORCE‑лоссом. Идущие подряд неорганические события образуют сессии, органические попадают только в историю.

Авторегрессивное off‑policy обучение. Importance weights считаются через замороженный behavior‑трансформер. Целевая политика — такая же архитектура, обучается REINFORCE‑лоссом. Идущие подряд неорганические события образуют сессии, органические попадают только в историю.

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

Отсюда же отличие — многошаговая коррекция. Вместо всех T_xi - t множителей берём не больше K:

omega_{t:t+K-1}(xi)=prod_{tau=t}^{min(t+K-1,, T_xi - 1)} frac{pi_theta(a_tau mid x_tau)}{hat{pi}_b(a_tau mid x_tau)}.

Дальше веса обрезаются сверху: bar{omega}=min(c, omega), где c — порог клиппинга.

Параметр K — компромисс между двумя крайностями. При K=1 мы получаем то, что делали Chen et al.: низкая дисперсия, но заметное смещение. При K=T_xi - t получаем полный importance sampling по всей траектории со всеми его проблемами. В экспериментах видно, что оптимум посередине.

Градиент по мини-батчу mathcal{B}, где mathcal{S}(u) — множество сессий пользователя u:

widehat{nabla_theta mathcal{J}}(mathcal{B}) propto sum_{u in mathcal{B}} sum_{xi in mathcal{S}(u)} sum_{t=0}^{T_xi - 1} gamma^t bar{omega}_{t:t+K-1}(xi) R_{t:T_xi - 1}(xi) nabla_theta log pi_theta(a_t mid x_t).

Нормируем на суммарный вес всех слагаемых в батче.

Модель пользователя

Для DM и DR нам нужна модель среды. В рекомендациях среда — это пользователь. Нам надо предсказывать его реакцию.

Модель принимает состояние x_t и кандидата a_t. Предсказывает она не награду напрямую, а лайк и долю прослушивания по отдельности:

hat{f}_t sim hat{P}_{feedback}(cdot mid x_t, a_t)=hat{P}_{like}(cdot mid x_t, a_t) times hat{P}_{ratio}(cdot mid x_t, a_t).

Модель обратной связи. По истории пользователям и кандидатам трансформер предсказывает фидбэк на каждый таргет. Две головы: лайк и доля прослушивания.

Модель обратной связи. По истории пользователям и кандидатам трансформер предсказывает фидбэк на каждый таргет. Две головы: лайк и доля прослушивания.

Политика f_theta принимает на вход фидбэк по каждому прошлому взаимодействию — лайк и долю. Чтобы прогнать её по сгенерированной траектории, нужен фидбэк в том же формате, а не одно число награды.

Это тоже каузальный трансформер. Он должен предсказывать фидбэк для каждого действия и при этом «видеть» фидбэк по всем прошлым рекомендациям. Поэтому вход организован парами «действие — фидбэк»: каждое событие даёт два токена. Скрытые состояния на позициях действий проецируются в логи лайка и доли прослушивания, лоссы — BCE (Binary Cross-Entropy). Предсказанная награда собирается обратно: hat{r}_t=mathbb{1}{widehat{like}_t} + frac{1}{10} widehat{ratio}_t.

С чем сравниваем

Два бейзлайна на обычном обучении с учителем, оба с той же архитектурой и той же инициализацией от f_b:

  • NIP-CE — продолжает next-item prediction на неорганических таргетах;

  • Positive-CE — учится только на положительных взаимодействиях, где r(x_t, a_t) geq 0,1. Это типовой рецепт обучения кандидатогенератора.

Обоим даём столько же данных, времени и компьюта, сколько и REINFORCE. Иначе сравнение некорректное.

Эксперименты

Исследовательский вопрос такой: можно ли улучшить долгосрочную удовлетворённость пользователя за счёт policy gradient, не просев по стандартным recall-метрикам и не потратив дополнительных данных, времени и компьюта?

Данные

Считали на Yambda-5B — публичном датасете с пятью миллиардами взаимодействий. Взяли самую большую версию специально.

В рекомендациях есть давняя проблема воспроизводимости. Значительная часть результатов получена на маленьких академических датасетах, и выводы из них далеко не всегда переносятся на большие сервисы. Модель, которая обыгрывает всех на ста тысячах взаимодействий, может ничего не дать на пяти миллиардах.

Чтобы не получить утечку, разбиваем по времени: последняя неделя — тест, всё остальное — трейн. Историю каждого пользователя режем на куски по 512 подряд идущих событий.

Метрики

Метрики делятся на два класса.

Recall-метрики нужны, чтобы убедиться, что RL-оптимизация не сломала качество кандидатогенерации. Оценивать долгосрочный эффект они не могут в принципе. Они смотрят на политику в конечном наборе точек, порождённых другой политикой.

Recall@100 считаем по индексу из 500 тысяч самых популярных треков за период обучения. Если таргет в индекс не попал, оцениваем так, как будто он туда добавлен. Иначе такие таргеты перестают быть валидными кандидатами. Наборов таргетов четыре:

  • mathcal{D}_{all} — все неорганические пары. Показывает, насколько хорошо модель клонирует behavior policy

  • mathcal{D}_{pos} — положительные пары, r_t geq 0,1. Это стандартная оценка кандидатогенератора

  • mathcal{D}_{p00-05} и mathcal{D}_{p95-100} — срезы по будущей награде, 5 и 95 перцентили распределения R_{t:T_xi-1}(xi). Действия, после которых сессия принесла мало и много соответственно

Хорошая RL-модель не должна просесть на mathcal{D}_{p95-100} и должна просесть на mathcal{D}_{p00-05}: реже воспроизводить действия, за которыми ничего хорошего не следует.

OPE-метрики — это Step-IS, DM и DR. Step-IS считаем с клиппингом весов на 10. DM работает через обученную модель пользователя. V^pi и Q^pi оцениваем Монте-Карло роллаутами с жадным декодированием.

Recall-метрики

Модель

mathcal{D}_{all}

mathcal{D}_{pos}

mathcal{D}_{p00-05}

mathcal{D}_{p95-100}

NIP-CE

0,3153

0,3217

0,2814

0,2679

Positive-CE

0,3029

0,3298

0,2634

0,2662

REINFORCE

0,3086

0,3174

0,2653

0,2655

На mathcal{D}_{all} выигрывает NIP-CE, на mathcal{D}_{pos} — Positive-CE. Каждый обучался под свой набор таргетов. REINFORCE отстаёт от них совсем немного, то есть качество кандидатогенерации мы не сломали.

На mathcal{D}_{p00-05} NIP-CE заметно выше остальных двух. Positive-CE и REINFORCE реже воспроизводят действия, за которыми следует плохая сессия. Для RL-модели это прямое следствие целевой функции. Чем меньше награды набрано после действия, тем меньше вес у соответствующего слагаемого в градиенте. На mathcal{D}_{p95-100} все три модели примерно равны.

Off-policy оценка

Сначала проверим модель пользователя — на ней держатся DM и DR.

Модель

Ratio MAE

Like PR-AUC

Reward MAE

Модель пользователя

0,1771

0,2432

0,0340

Ошибка на доле прослушивания — 0.1771. Это плотная часть награды, её надо предсказывать точно. С лайком тяжелее из-за разреженности. Лайкнутых треков в данных 1,13%, то есть PR-AUC случайного угадывания около 0.0113. На этом фоне 0.2432 — сильно выше случайного. MAE по награде 0.0340, и модель можно использовать для DM и DR.

Модель

Behavior Return

Step-IS

DM

DR

Behavior policy

0,5855

NIP-CE

1,3065

0,5279

0,6046

Positive-CE

1,3317

0,5384

0,6184

REINFORCE

1,4677

0,5395

0,6306

REINFORCE лучше всех по всем трём оценкам. Явная оптимизация дисконтированной награды за сессию улучшает долгосрочную полезность по сравнению с обучением с учителем.

Positive-CE обходит NIP-CE везде. Оптимизация немедленного положительного фидбэка частично улучшает и сессионные метрики. Но выигрыш меньше, чем у REINFORCE. Это разница между локальной оптимизацией положительных действий и явной оптимизацией суммарной награды за сессию.

Behavior Return — средняя награда настоящей behavior policy на тестовых данных. Она равна 0,5855, и с этим числом мы сравниваем масштаб оценок. Step-IS даёт 1,3–1,5, то есть промахивается сильно. Сказываются клиппинг весов и то, что настоящую behavior policy мы подменяем оценкой. DM попадает в масштаб гораздо лучше, то есть у него эмпирически меньше смещение. Ближе всех оказывается DR. Это согласуется с его устройством: он комбинирует исторические семплы и модельные оценки и частично гасит смещения обоих.

Что влияет на результат

Off-policy коррекция

Модель

Step-IS

DM

DR

r^pi_{mathcal{D}_{p95-100}}@100

С off-policy коррекцией

1,4677

0,5395

0,6306

0,2655

Без коррекции

1,2900

0,5315

0,6130

0,2689

Без importance weights модель игнорирует сдвиг между behavior и target политиками. Все три OPE-оценки падают.

При этом вариант без коррекции выше по recall на срезе высокой награды. Лучше воспроизводить прибыльные действия behavior policy не значит быть лучшей политикой. Такие срезы полезны как диагностика, но не как основная метрика.

Число множителей в весе

K

Step-IS

DM

DR

r^pi_{mathcal{D}_{all}}@100

1

1,4109

0,5385

0,6250

0,3106

5

1,4728

0,5390

0,6292

0,3092

10

1,4677

0,5395

0,6306

0,3086

15

1,4536

0,5395

0,6295

0,3085

Одного множителя мало — это постановка Chen et al., и она проигрывает. Лучший результат на десяти. Дальше прироста нет, а дисперсия растёт. В основных экспериментах берём K=10.

Клиппинг весов

Порог

Step-IS

DM

DR

r^pi_{mathcal{D}_{all}}@100

0,50

1,4677

0,5395

0,6306

0,3086

1,00

1,4558

0,5388

0,6295

0,3051

5,00

1,2700

0,5364

0,6249

0,2895

10,00

1,1611

0,5352

0,6306

0,2810

Чем выше порог, тем больше сохраняется крупных весов. Но тем больше дисперсия градиента и тем хуже качество кандидатогенерации. Порог 0.5 даёт лучший баланс, его и используем.

Итог и дальнейшая работа

Мы сформулировали рекомендации как RL-задачу на уровне сессии и обучили двухбашенный кандидатогенератор авторегрессивно, через off-policy REINFORCE, на заранее собранных логах. 

Обучение выявило особенность: Importance weight приближается не одним множителем, а несколькими. Оптимум оказывается посередине между одним множителем и полным произведением по всей траектории. 

Модель пользователя позволила перенести doubly robust оценку в рекомендации, где раньше её применяли только для контекстных бандитов.

На Yambda-5B RL-агент выигрывает у next-item prediction и next-positive prediction по всем off-policy оценкам сессионной награды. По recall-метрикам заметно не проседает.

Главное ограничение работы — всё посчитано офлайн. OPE-оценки полезны, но онлайн-эксперимент не заменяют. Поэтому следующий шаг — посмотреть, как эти офлайн-метрики коррелируют с результатами A/B-теста в кандидатогенерации на платформе коротких видео.

Статью подготовили: Артём Матвеев, Сергей Макеев, Алексей Красильников, Владимир Байкалов, Сергей Лямаев, Кирилл Хрыльченко.

Автор: AIgent_Smith

Источник