老陈在街角开了家小饭馆,请了一个“智能点菜系统”:只要客人进门,系统就推荐利润最高、出餐最快的几道菜。头一周销量猛涨,可一个月后客人越来越少——大家吃腻了,再也不回头。老陈很困惑:数据明明很好,怎么生意反而黄了? 后来他换了个思路:不再只盯着“今天卖出多少”,而是像记老朋友的口味一样记录每位客人的偏好,今天推荐这道,明天换那道,让客人每次来都有新鲜感,愿意常来。这个思路,正是强化学习(Reinforcement Learning, RL)提升推荐系统长期收益的核心。 传统的推荐系统像老陈原来的点菜系统,只看用户“点不点”这一下;而强化学习把推荐看作一场连续剧——用户的状态、系统推荐的物品、用户的反馈、后续的访问,环环相扣。本文用老陈的饭馆作比喻,把 RL4Rec 和 Shooting 框架讲清楚,让你理解如何用长期收益思维改造推荐系统,并应用到实际工作中。
掌握强化学习推荐系统的核心逻辑,能帮助推荐算法工程师从“优化即时点击”升级为“优化用户全生命周期价值”,在信息流、电商、短视频等场景中显著提升留存和长期收益。
可视化演示
动态演示强化学习如何提升推荐系统的长的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
强化学习如何提升推荐系统的长:RLRe RL4Rec的核心动机与长期价 推荐系统的MDP建模与状态动作 核心机制可视化 强化学习如何提升推荐系统的长整体架构与关键组件
长期收益的陷阱
老陈最初的点菜系统只干一件事:客人一进门,就推荐利润最高、炒得最快的菜。这招头几天的确有效,翻台率上去,营业额也好看。可问题随即而来——客人连续吃三顿同样的招牌菜,第四天路过时闻到那个味道就想绕道。老陈这才明白,他只看到了“今天这一单”,却丢了“明天还来不来”。
推荐系统里也存在同样的陷阱。传统的 CTR(点击率)模型优化的是用户下一步会不会点,训练信号来得快、反馈及时,所以业界很依赖它。但用户的感受是连续的:连续被推相似的短视频,用户会疲惫;连续看到同一类商品,用户会厌倦。只优化即时点击率,相当于老陈只优化翻台率,短期热闹,长期却不断透支用户的耐心和信任。这就是推荐系统里的“短视问题”。
要解决短视,就得把“用户未来还会不会回来”放进优化目标。强化学习正是干这个的:它不只看当前这一步的收益,而是把未来若干步的收益都折现到今天,让决策为整条时间线负责。于是在 RL 框架中,我们定义一个“长期折现收益”:
老陈把目标从“今天卖出多少”改成“这个月回头客有多少”之后,点菜系统推荐的菜开始变得丰富,客人也愿意每周都来。推荐系统的道理一模一样:把优化目标从“下一次点击”换成“长期折现收益”,策略才会真正为用户着想。
- 未来奖励序列从当前时刻 t 起,把之后每个交互时刻得到的即时奖励写成 R_{t+1}、R_{t+2}、R_{t+3}……
- 折现因子γ 是 0 到 1 之间的系数,越远期的奖励乘以 γ 的越多次方,价值就越低。
- 累加求和把折扣后的所有远期奖励加起来,得到整条决策轨迹的长期收益。
RL4Rec核心思路
老陈开始记小本子:每个客人进门时的表情、上次点了什么、这次是独自来还是带朋友来。他不再把每个客人当成独立事件,而是当成一部连续剧,每一集都影响下一集。强化学习给推荐系统带来的正是这种“连续剧思维”——把推荐过程建模成一个序列决策问题。
这个序列决策问题的标准数学形式叫马尔可夫决策过程(MDP)。它用一组元素描述整个推荐环境:状态(用户当前的特征和上下文)、动作(推荐哪些物品)、转移概率(用户看到推荐后状态如何变化)、奖励(点击、时长、复访等反馈),以及折扣因子。RL4Rec(RL for Recommender Systems)的所有工作,都是在围绕这五个要素做文章。
用户上一轮的行为会改变下一轮的状态,系统依据状态决定动作,环境反馈奖励并跳到新状态,如此循环往复,构成一条完整的时间线。这个循环可以用一个五元组表示:
老陈的小本子越记越厚,他逐渐能从客人的状态预测出对方会喜欢什么,并据此安排后厨。RL4Rec 也是一样:把推荐读成用户的状态流,在每一个状态上做出让整条轨迹收益最大的决策。
- 状态集合用户的浏览历史、兴趣标签、当前场景等构成了状态空间,相当于老陈本子上记的“客人档案”。
- 动作集合系统可以推荐的视频、商品、文章构成的候选集。
- 转移概率与奖励执行动作后用户反应会带来状态变化 P 和即时奖励 R。
- 折扣因子γ 用来平衡短期和长期收益。
Shooting框架
老陈现在有了丰富的“客人档案”,但他又遇到一个新问题:眼前有十道新菜,到底该给客人推荐哪一道?老陈想到一个办法——周末下午打烊后,他在自家店里做模拟演练:假设给客人推荐这道菜,客人会有什么反应,下次还会不会来,下下次又会点什么。他把这些虚拟未来连在一起看,再决定哪道菜最值得端上桌。
Shooting 框架就是这种“店内推演”的算法化。它不再像传统监督学习那样,预测“这个物品被点击的概率有多大”就立刻做决策,而是先用一个离线模型模拟用户接下来的反应,把候选动作 rollout 出一整条未来轨迹,再计算这条轨迹的长期收益,选择总收益最高的动作。因为轨迹像子弹一样射向未来,"Shooting"(射击)由此得名。
一个动作的长期价值可以用贝尔曼方程表达:当前动作带来的即时收益,加上未来所有状态下最优策略的折现收益。Shooting 框架的核心就是估算这个 Q 值:
老陈靠“店内演练”避开了很多坑:某道菜虽然卖相好,但演练三轮后发现客人日后都不想再来;另一道菜虽不起眼,却能让客人不断回头。Shooting 框架让推荐系统也拥有了这种“先演练、再上菜”的能力,为每个候选物品估算长期价值,而不是只看眼前点击。
- 即时收益当前状态 s 下推荐动作 a 直接带来的用户反馈,比如点击或观看完成。
- 状态转移推荐之后,用户以概率 P 从 s 转移到新状态 s',这代表用户兴趣的变化。
- 未来最优收益进入 s' 后,系统还会选择对后续最有利的动作 a',取其最大 Q 值。
- 贝尔曼方程把即时收益和折现后的未来最优收益相加,就得到动作的长期价值。
状态动作奖励
老陈发现,想让推演靠谱,还得先把三件事定义清楚:客人档案怎么记(状态)、菜单怎么排(动作)、什么算“好”(奖励)。他给每位客人打上标签——“爱吃辣”“带孩子”“周三晚上来”——这就是状态;他把菜品按品类和场合分组——这就是动作空间;他给“当场点头”打 1 分,给“下周又来”打 5 分——这就是奖励。
推荐系统中的状态设计通常包括用户 ID、历史行为序列、物品交互统计、上下文特征等;动作空间是候选物品的集合,可以是一个物品、一页列表或一组排序结果。奖励函数则是最关键的设计:只把点击当奖励,模型就只学点击;把播放时长、完播率、次日复访都揉进奖励,模型才会学“让用户更满意”。
奖励设计可以用加权求和的形式表达。设一次推荐后用户产生了点击、停留和未来回访三种反馈,则奖励为:
老陈把“回头客”权重调高后,系统的推荐风格立刻变了:不再疯狂推销爆辣菜,而是贴心搭配清淡汤品,让客人吃完舒服,下次还想来。奖励函数就是产品价值观的翻译器——你奖励什么,系统就追求什么。
- 点击信号用户是否点击了推荐物品,是最直接也最稀疏的即时反馈。
- 停留信号用户观看时长或页面停留时长,反映更深层的兴趣。
- 回访信号用户在未来一段时间是否再次访问,是长期满意度的代理指标。
- 加权组合把三种反馈按业务权重相加,得到综合奖励。
离线训练
老陈想训练一套新的点菜推荐策略,但他不敢直接拿真实客人做实验——万一把客人吃跑了,生意就没了。好在过去三年的点菜单和客流量记录都还在,老陈把这些“历史日志”翻出来,在纸上复盘:如果当时换一种推荐方式,客人会不会更满意?
推荐系统的离线训练也是同样的逻辑:我们不能直接让新策略在全网流量上试错,于是用过去的行为日志来训练。但这里藏着一个大坑:历史日志是由“旧策略”(行为策略)产生的,旧策略喜欢推爆款,所以日志里大片都是爆款的数据,新策略想学的“多样化推荐”在日志里很少见,直接训练就会学偏。
这个问题可以通过离线策略评估(Off-Policy Evaluation)来纠正。我们用重要性采样给每条样本加权,让日志数据的分布被“修正”成新策略下的分布:
老陈把旧账本当成“模拟演练场”,在纸上反复推演不同策略的效果,选出最稳妥的方案才敢真正上线。离线训练的意义正在于此:用历史数据反复打磨策略,把在线试错的代价降到最低。
- 行为策略产生日志的旧策略记为 μ,它决定了历史数据里每个动作出现的概率。
- 目标策略我们想评估或训练的新策略记为 π,它的行为分布和 μ 不同。
- 重要性权重用 π 除以 μ 得到每个动作的权重,修正分布偏差。
- 加权平均把整条轨迹的权重连乘后乘上回报,再对所有样本取平均,得到新策略的离线收益估计。
在线部署
老陈在纸上演练了无数遍,终于决定把新点菜策略真正用到店里。但这次他学聪明了:先只在周二晚市试运行,只对一部分客人启用新策略,同时盯着“回头率”和“投诉量”两个仪表盘,一旦有问题就立刻切回旧策略。
推荐系统从离线训练到在线部署,也遵循同样的节奏。离线训练好的策略网络还不能直接全量上线,因为离线评估和真实环境总有偏差。正规做法是:先在 5% 或 10% 的小流量上做 AB 实验,用真实用户反馈验证策略效果,同时设置监控和回滚开关,确保策略出问题时能迅速恢复。
在线部署时,系统在每一个用户状态上输出动作分布。策略网络可以看作一个条件概率分布:
老陈的“周二试运行”让他发现:新策略下客人的支付意愿涨了,但出餐速度拖慢。他调整了菜品搭配,最终才全面推广。推荐系统的在线部署也一样——小流量实验不只是验证效果,更是暴露真实问题的安全网。
- Q 值打分用参数为 θ 的网络给当前状态下每个候选动作打分。
- 指数化对分数取指数,拉大高质量动作和高低质量动作之间的差距。
- 归一化除以所有动作的指数和,得到合法的概率分布。
- 策略输出最终得到每个动作的概率,按概率采样或取最大概率动作执行。
冷启动探索
新搬到街对面的小情侣第一次走进老陈的饭馆,老陈的“客人档案”里一片空白。他该推荐什么?如果只推最稳妥的招牌菜,客人也许满意;如果推一道没试过的创意菜,可能收获惊喜,也可能收获差评。老陈决定:用小份量试菜的方式,给他们送一道“今日主厨推荐”,既控制风险,又收集口味的线索。
强化学习中的“探索与利用”权衡,就是老陈面临的这个问题:利用(Exploitation)是推荐已知最可能受欢迎的内容,探索(Exploration)是尝试未知内容以获取新信息。在线推荐系统常用 ε-greedy 策略来控制两者的比例:
老陈的“今日主厨推荐”成了新客人的固定彩蛋,也为他的口味档案积累了宝贵数据。对新用户和新物品来说,探索不是浪费,而是补全信息、走向最优策略的必经之路。
- 最优动作找到当前状态下 Q 值最高的动作,作为利用对象。
- 主概率以 1-ε 的高概率选择该最优动作,保证策略主体是“聪明”的。
- 探索概率以 ε 的总概率在所有动作中随机选择,保证未知内容有机会出现。
- 分情况定义最优动作获得剩余的 1-ε 概率,其他动作平分 ε 的概率。
实践评估
过了一个月,老陈翻开账本:周营业额并没有暴涨,但“每月来 3 次以上的回头客”数量翻了一倍。他意识到,衡量饭馆好坏不能只看单日流水,而要看客人的生命周期价值。如果把每位客人一年的消费折现到今天,老陈的饭馆其实已经脱胎换骨。
推荐系统的实践评估也需要“回头客思维”。离线阶段看 AUC、GAUC、NDCG 等排序指标,但这些只能反映模型对历史数据的拟合程度;在线阶段则要看真实用户行为,包括点击率、人均时长、次日留存、月活跃天数。最核心的是验证长期收益:RL 策略的收益曲线应该在时间轴上越走越高,而不是像即时策略那样冲高回落。
长期价值的量化可以用客户生命周期价值(LTV)来表达,把未来每一期收益按折现率折算到今天:
老陈的店最终靠“回头客+生命周期价值”打败了对街靠促销冲单日销量的大排档。推荐系统也是一样:只有把评估体系从“单次点击”升级到“长期留存和价值贡献”,RL 的长期收益优势才真正被看见。
- 各期收益用户第 t 期带来的收益(消费、广告收入、时长)记为 R_t。
- 折现率d 是资金的时间成本或风险调整系数,把未来的钱折算成今天的价值。
- 累加从第 1 期到第 T 期的折现收益求和,得到生命周期价值。
AI 应用场景
短视频信息流长期留存优化
阶段:奖励设计 + 在线部署
解决的问题:传统排序模型只看即时点击和完播,容易让用户陷入同质化内容,导致疲劳和流失。用 RL 建模“用户的观看状态→推荐视频→互动及复访”的序列过程,奖励函数同时包含完播、点赞、关注和次日回访,策略就能学会更长期的“留人”排序。
具体案例:某短视频 App 在推荐页采用 RL4Rec 思路,把“是否再次打开 App”折算成延迟奖励。小流量 AB 测试显示,实验组次日 DAU 留存提升 1.2 个百分点,人均时长反而略有下降,但整体长期价值提升明显。
电商购物链路的长期价值排序
阶段:状态动作建模 + 离线训练
解决的问题:电商场景中,用户从浏览到下单往往有多步,只预估点击率推荐的商品可能带来高跳出率。用 RL 把状态设计为“用户最近浏览序列+加入购物车行为”,动作为推荐商品集合,奖励设计为加购、支付和复购的折现组合,系统能学会促成完整购物链路。
具体案例:某电商平台的“猜你喜欢”改造成 Shooting 风格的两阶段推荐:先用离线模型 rollout 候选商品的未来贡献,再挑选累计折现收益 Top-K 的商品。上线后支付转化率提升 2.3%,30 天复购率提升 1.5%。
长视频平台“追更”推荐
阶段:探索策略 + 在线监控
解决的问题:长视频平台需要让用户持续追更,而不是看完一集就流失。RL 系统把每集推荐看作序列决策,奖励包含播放完成度、连看率、次日打开率;对新剧集则用 ε-greedy 探索保证冷启动流量。
具体案例:某视频平台对会员频道采用 RL 排序,新上线的剧集获得 8% 的探索流量,配合用户画像做初始状态映射。结果显示,追更率提升 11%,会员次月留存提升 3.8%。
Python 演示
import random class RecEnv: """模拟一个带口味疲劳的推荐环境, 动作是5个内容类别""" def __init__(self): self.fatigue = [0] * 5 self.state = 0 def step(self, action): # 推荐同一类别的次数越多, 奖励越低, 模拟用户吃腻 if self.fatigue[action] < 2: r = 1.0 elif self.fatigue[action] < 4: r = 0.5 else: r = 0.1 self.fatigue[action] += 1 # 用总疲劳度的某一种哈希作为可观测状态 self.state = sum(self.fatigue) % 8 return self.state, r class QLearner: def __init__(self, n_states, n_actions): self.q = [[0.0] * n_actions for _ in range(n_states)] self.lr = 0.05 self.gamma = 0.85 self.eps = 0.1 def act(self, s): if random.random() < self.eps: return random.randrange(len(self.q[s])) return max(range(len(self.q[s])), key=lambda a: self.q[s][a]) def update(self, s, a, r, s2): best = max(self.q[s2]) self.q[s][a] += self.lr * (r + self.gamma * best - self.q[s][a]) def run_greedy(seed=7): random.seed(seed) env = RecEnv() total = 0 for _ in range(300): a = min(range(5), key=lambda i: env.fatigue[i]) _, r = env.step(a) total += r return total def run_rl(seed=7): random.seed(seed) env = RecEnv() agent = QLearner(8, 5) total = 0 for _ in range(300): s = env.state a = agent.act(s) s2, r = env.step(a) agent.update(s, a, r, s2) total += r return total if __name__ == '__main__': g = run_greedy() rl = run_rl() print('greedy total:', g) print('rl total:', rl) print('rl/greedy ratio:', round(rl / g, 3))
self.fatigue = [0] * 5记录每个内容类别被推荐的次数,疲劳越高,用户反馈越差。r = 0.5 if fatigue < 4 else 0.1奖励函数模拟“吃腻”效应:同一类别推得越多,用户越不满意。self.state = sum(self.fatigue) % 8用总疲劳度折算出一个可观测状态,供 Q 表索引。self.q[s][a] += self.lr * (r + self.gamma * best - self.q[s][a])Q-learning 更新公式,把即时奖励和未来最佳收益折现后叠加。def act(self, s)ε-greedy 动作选择,以 0.1 的概率探索,以 0.9 的概率利用当前最优。run_greedy每次都选择当前疲劳最低的内容类别,代表“只看单步最优”的短视策略。run_rl让 Q-learning 从长期的折现收益中学习,通过试错学会轮换推荐内容。
常见误区
误区学完 RL4Rec,有同学觉得“这不就是把损失函数换成播放时长或 GMV 嘛”,本质上还是换个指标做预估。
正解换指标只是“换汤”,RL 的“换药”在于把问题建模成序列决策:当前动作不仅影响当前奖励,还通过状态转移影响未来的所有奖励。Q-learning 的更新公式里有一个 γ 倍的未来项,这才是它与单步监督学习的本质区别。
为何常见:因为大多数推荐模型都是单步预测,刚接触 RL 时容易只盯“奖励函数改了什么”,而忽略了时序结构和 Bellman 方程。
误区总觉得历史数据里有几亿条用户行为,离线训练一个 RL 模型,指标还挺好,直接上线肯定也行。
正解离线日志由旧策略产生,数据分布和目标策略不一致,直接训练会出现严重的分布偏移。必须用重要性采样、离线策略评估等手段进行纠偏,并且把离线结果仅仅当作“候选”,上线前必须小流量验证。
为何常见:因为监督学习里独立同分布假设深入人心,很容易忘记 RL 的数据是策略自己“走”出来的,策略一变,数据分布就跟着变。
误区一听到 ε-greedy 要在 5% 的流量上随机推荐,产品经理就跳起来:“这会拉低点击率!”
正解探索是可控的、信息驱动的。ε 通常设置得很小(0.01~0.1),并且可以只对低风险场景探索,比如对老用户推一个相似品类,而不是对新用户乱推。没有探索,系统永远无法打破路径依赖,也就解决不了冷启动问题。
为何常见:因为大家评估推荐系统时习惯看短期点击率,探索的收益是长期的、难以快速归因的。
误区新用户没行为数据,新物品没人点击,通常觉得这是单独的冷启动模型的事,和 RL 主模型无关。
正解冷启动本质上是“信息不足”,而 RL 的探索机制正是为信息不足设计的。把探索流量纳入 RL 训练,用辅助特征初始化新用户状态,RL 能自然地把冷启动过程当成决策问题来优化。
为何常见:因为工业界常把冷启动单独用规则或 Bandit 模块处理,导致大家误以为它们天然分离。
误区名字听着像“开枪打飞碟”,有同学以为是上线后连续采样试错、实时反馈调整。
正解Shooting 恰恰相反,它强调在离线模拟环境中完成 rollout:用已有的用户行为模型模拟未来若干步效果,从而选出长期价值最高的动作,属于“先思考再行动”的规划。在线试错的成本太高,Shooting 先用离线模拟把试错成本降到最低。
为何常见:因为强化学习本身强调在线交互,而 Shooting 是把交互搬到了虚拟环境,这种“离线 rollout”的设计容易被初学同学混淆。
面试题
Q1. 与即时点击率优化相比,RL4Rec 的核心优势是什么?
- A.能更快看到点击率提升
- B.能建模序列决策的长期收益← 正确答案
- C.完全不需要历史行为日志
- D.离线之后就可以直接上线
答案:B。RL4Rec 的核心是把推荐建模成多步序列决策,优化累积折现收益,而不是单步点击。A 是即时指标的优势,C 和 D 都不符合 RL 依赖数据和需要在线验证的实际情况。
Q2. 推荐系统中的马尔可夫决策过程主要包含哪些要素?
- A.状态集合 S← 正确答案
- B.动作集合 A← 正确答案
- C.转移概率与奖励函数← 正确答案
- D.模型参数量与批次大小
答案:ABC。MDP 五元组是状态 S、动作 A、转移概率 P、奖励 R 和折扣因子 γ。D 是深度学习训练的超参数,不属于 MDP 的要素。
Q3. 折扣因子 γ 在长期收益公式中的关键作用是什么?
- A.让策略网络收敛更快
- B.对远期奖励打折,平衡近期和长期收益← 正确答案
- C.控制随机探索的概率大小
- D.表示用户偏好的稳定程度
答案:B。γ 决定未来奖励折算到当前的价值权重,γ 接近 1 时模型更看重远期收益。探索由 ε 控制,学习率与收敛有关,用户偏好稳定程度不是 γ 的含义。
Q4. Shooting 框架的核心思想是什么?
- A.用截图快速捕捉用户界面变化
- B.离线 rollout 未来轨迹以估计候选动作的长期价值← 正确答案
- C.把排序模型直接部署到线上并实时试错
- D.让运营人员人工标注更多推荐样本
答案:B。Shooting 通过离线模拟器生成未来若干步的用户反馈轨迹,再用轨迹累积收益来选择动作,本质是离线规划。它与在线实时试错和人工标注无直接关系。
Q5. 离线训练时,行为策略 μ 与目标策略 π 不一致,常用的纠偏方法是?
- A.增加神经网络隐藏层数量
- B.使用重要性采样给样本加权← 正确答案
- C.直接丢弃所有历史样本重新收集
- D.把折扣因子调成 0
答案:B。重要性采样通过权重 π(a|s)/μ(a|s) 修正分布偏移,让旧策略的日志能被用来估计新策略的价值。增加层数、丢弃历史和调 γ 都无法解决数据分布不一致的问题。
Q6. 设计推荐系统奖励函数时,应该重点考虑哪些信号?
- A.点击信号← 正确答案
- B.播放时长或阅读完成度← 正确答案
- C.次日回访或复购行为← 正确答案
- D.模型参数量和计算延迟
答案:ABC。奖励函数是业务目标的翻译,点击、时长、回访分别代表即时兴趣、深度沉浸和长期满意度,都应纳入奖励。参数量和延迟是工程指标,不是用户反馈奖励。
Q7. ε-greedy 策略中的 ε 主要控制什么?
- A.模型的学习率
- B.随机探索的概率← 正确答案
- C.折扣因子的大小
- D.训练批次的大小
- E.全量替换旧模型并关闭所有监控
- F.小流量 AB 实验,设置监控指标和回滚开关
- G.把模型参数全部随机初始化后再上线
- H.只保留探索流量,关闭利用流量
答案:B。在线 RL 必须先小流量验证真实效果,配好监控与回滚,才能逐步放量。A 风险极高,C 等于放弃训练结果,D 关闭利用意味着策略不产生实际价值。
Q8. 冷启动阶段,RL 系统可以如何应对新用户和新物品?
- A.用 ε-greedy 保留少量探索流量← 正确答案
- B.用热门内容兜底保证基础体验← 正确答案
- C.在全部流量上放开完全随机探索
- D.用用户和物品的辅助特征初始化状态← 正确答案
答案:ABD。冷启动的解法是“小流量探索+兜底策略+特征初始化”,既控制风险又积累信息。C 全部随机探索会严重伤害用户体验和短期指标,不可取。
Q9. 衡量推荐系统长期收益时,最合适的指标是哪一类?
- A.单次点击率
- B.次日留存和复访率← 正确答案
- C.单次推荐响应耗时
- D.当日新增用户数
答案:B。长期收益关注用户后续是否持续回来、持续消费,次日留存和复访率直接反映这一点。单次点击率是即时指标,响应耗时是性能指标,新增用户数属于增长而非推荐长期收益。