PPO 搬到推荐系统后为什么水土不服——从小红书 SAGE 看生成式推荐的非对称优化设计

生成式推荐的三阶段训练流程——SFT 建立基础生成能力,Value-Aware FT 注入商业价值信号,RL 探索历史日志之外的高价值路径——已经是跨团队的工业共识。GPR、GR4AD、UniVA 三篇论文独立收敛到了这个结构。但如果仔细看这三个阶段各自的成熟度,差距非常明显:SFT 有十年的推荐系统监督学习积累,Value FT 本质上是加权采样的变体,只有 RL 阶段还在摸索期。

为什么 RL 最难?因为推荐系统的 RL 面对的环境和 NLP 完全不同,但大家一直在照搬 NLP 的优化器。PPO 在 ChatGPT 的 RLHF 里跑得很好,GRPO 在 DeepSeek-R1 的数学推理里跑得很好——然后工程师们把它原封不动地搬到推荐系统里,发现效果远不如预期。

小红书团队的 SAGE(Sequence-level Adaptive Gradient Evolution)指出了一个被忽视的根因:PPO 的对称 clipping 假设,和推荐系统的数据分布有根本性冲突。 对称 clipping 意味着正向更新和负向更新被限制在同样大小的边界内。这在 NLP 里是合理的——生成一个好答案和避免一个差答案的重要性大致对称。但在推荐系统里,正反馈和负反馈的信息价值是高度不对称的。

SAGE 的方案是:打破对称,让正向更新(特别是冷启动物品的成功推荐)获得超线性激励,同时让负向更新根据推荐列表的多样性动态调整惩罚力度——同质化的失败被严惩,探索性的失败被宽容。在三个 Amazon 数据集上,冷启动召回率提升 43-63%,推荐多样性提升 5.9-10.4%。

这篇文章拆解 SAGE 的技术方案,分析它和现有工业系统(GPR、GR4AD)的 RL 阶段的异同,以及它最大的未解问题——没有线上 A/B 结果。

对称 clipping 为什么在推荐里失效

PPO 的核心机制回顾

PPO 的目标函数里有一个 clip 操作,把策略更新比值 r = pi_new / pi_old 限制在 [1-epsilon, 1+epsilon] 范围内。直觉上,这是一个信任域约束:每次更新不要跑太远,避免策略崩溃。

关键假设是 epsilon 的上下界是对称的。这意味着:

  • 正向更新(好的生成结果被强化)最多把概率提升 epsilon 倍
  • 负向更新(差的生成结果被抑制)最多把概率降低 epsilon 倍

在 NLP 的 RLHF 里,这个对称性大致成立。一个好答案和一个差答案对训练信号的贡献大小差不多。但推荐系统的数据分布有两个 NLP 不具备的特征,让对称假设从根本上失效。

推荐特有的不对称性

正反馈稀疏且价值不均匀。 在推荐系统里,绝大多数物品的正反馈极度稀疏——冷启动物品可能只有个位数的正反馈。一个冷门物品被成功推荐的信息价值远高于一个热门物品被成功推荐。但对称 clipping 给两者同样的梯度上界 1+epsilon。这意味着冷启动物品即使偶尔获得正反馈,策略更新也被截断在和热门物品同样的幅度内——它永远无法突破初始的低概率状态。

负反馈高度同质化。 推荐系统的负反馈大量来自于同质化推荐——用户看到一堆几乎一样的商品,对所有的都没有正反馈。但对称 clipping 对所有负反馈施加同样的惩罚力度。它无法区分两种本质不同的失败:模型尝试推荐了一个新品类但用户不感兴趣(探索性失败),和模型懒洋洋地推了十个同类商品用户全部忽略(同质化失败)。前者应该被宽容甚至鼓励,后者应该被严惩。对称惩罚会错误地抑制探索性行为,加剧信息茧房。

graph LR
    subgraph symmetric["对称 Clipping (PPO/GBPO)"]
        direction TB
        SP["正反馈: 上界 1+epsilon"]
        SN["负反馈: 下界 1-epsilon"]
        SP --- SN
        SR["冷启动成功 = 热门成功 = 同一上界"]
        SF["探索失败 = 同质化失败 = 同一下界"]
        SR -.-> COLD1["冷启动物品无法突破"]
        SF -.-> DIV1["多样性持续坍塌"]
    end

    subgraph asymmetric["非对称 Clipping (SAGE)"]
        direction TB
        AP["正反馈: 上界 1+epsilon+boost"]
        AN["负反馈: 下界随熵值动态调整"]
        AP --- AN
        AR["冷启动成功 获得超线性激励"]
        AF["低熵失败 严惩 / 高熵失败 宽容"]
        AR -.-> COLD2["冷启动物品突破曝光阈值"]
        AF -.-> DIV2["多样性持续改善"]
    end

    style SP fill:#f8f9fa,stroke:#868e96,stroke-width:1px
    style SN fill:#f8f9fa,stroke:#868e96,stroke-width:1px
    style SR fill:#ffe3e3,stroke:#c92a2a,stroke-width:1px
    style SF fill:#ffe3e3,stroke:#c92a2a,stroke-width:1px
    style COLD1 fill:#ffe3e3,stroke:#c92a2a,stroke-width:1px
    style DIV1 fill:#ffe3e3,stroke:#c92a2a,stroke-width:1px
    style AP fill:#d3f9d8,stroke:#2f9e44,stroke-width:2px
    style AN fill:#e5dbff,stroke:#5f3dc4,stroke-width:2px
    style AR fill:#d3f9d8,stroke:#2f9e44,stroke-width:1px
    style AF fill:#e5dbff,stroke:#5f3dc4,stroke-width:1px
    style COLD2 fill:#d3f9d8,stroke:#2f9e44,stroke-width:1px
    style DIV2 fill:#d3f9d8,stroke:#2f9e44,stroke-width:1px

和现有广告 GR 系统的 RL 方案对比

在之前的文章里分析过三篇广告 GR 论文的 RL 方案:GPR 的 HEPO 解决层级信用分配,GR4AD 的 RSPO 做列表级目标对齐,UniVA 的 MCTS-PPO 改善探索覆盖。这三个方案都在 clipping 之上做文章——改奖励信号的计算方式、改探索策略——但没有质疑 clipping 本身的对称性。

SAGE 的切入点更底层:它认为问题出在 PPO 的核心机制上,不是奖励信号不够好,而是梯度约束的形状就是错的。这是一个更激进的判断,但消融实验支持了它——光把 clipping 从对称改成非对称,冷启动召回率就跳了 49-63%。

SAGE 的三个技术模块

模块一:序列级概率比值

传统 PPO 在 token 级别计算重要性采样比值 r_t。但在推荐系统中,奖励是给整个推荐列表(slate)的,不是给单个 token 的。Token 级比值直接用于 slate 级奖励,会引入巨大的方差。

SAGE 用几何平均把 token 级比值聚合到序列级:

r_slate = (r_1 x r_2 x … x r_T) ^ (1/T)

几何平均相比算术平均的优势:对异常值鲁棒(单个 token 的比值极端时不会主导整体),保持了概率链式法则的乘法结构,而且天然消除序列长度差异——不管推荐列表对应的 token 序列是 50 个还是 200 个 token,r_slate 的量级是可比的。

这个设计不复杂,但很实用。GPR 的 HEPO 也面对同样的 token-level vs slate-level 的粒度不匹配问题,但选择了不同的路径(过程奖励而非序列级比值)。两种方案理论上正交,可以组合。

模块二:多目标信号解耦

推荐系统通常有多个优化目标——点击率、完播率、评论率、转化率,各目标的权重由业务方设定。最直接的做法是加权求和后做 group normalization。SAGE 指出这会导致”奖励坍塌”:不同行为模式的奖励被归一化到同一个尺度后,区分度消失。

SAGE 的方案是”先解耦后聚合”:对每个目标独立做 group normalization(保留各自的分布特征),再用业务权重加权求和,最后做一次 batch normalization。这样每个目标的优势信号在标准化阶段保持了独立性,不会被其他目标的分布特征稀释。

这个问题在广告系统里特别严重——eCPM = pCTR x pCVR x Bid 涉及至少三个目标,加上用户体验指标可能有五六个。GPR 在 Value-Aware FT 阶段用行为类型加权来处理多目标,但在 RL 阶段没有明确的多目标解耦机制。SAGE 的 decouple-then-aggregate 更系统。

模块三:非对称自适应边界——核心创新

这是 SAGE 最关键的部分,分两个 case。

graph TB
    subgraph sage_flow["SAGE 优化流程"]
        direction TB
        INPUT["模型生成推荐列表 Slate"] --> REWARD["多目标奖励计算"]
        REWARD --> DECOUPLE["信号解耦: 各目标独立标准化"]
        DECOUPLE --> ADVANTAGE["聚合优势值 A_SAGE"]
        ADVANTAGE --> CHECK{"A_SAGE > 0 ?"}
        CHECK -->|Yes| BOOST["正向 Boost"]
        CHECK -->|No| ENTROPY["计算列表熵 H"]
        BOOST --> UPDATE["策略更新"]
        ENTROPY --> PENALTY["熵感知惩罚"]
        PENALTY --> UPDATE
    end

    subgraph boost_detail["Case A: 正向冷启动助推"]
        direction TB
        B1["上界从 1+epsilon 扩展到 1+epsilon+boost"]
        B2["冷启动成功推荐获得超线性激励"]
        B3["突破初始低概率状态"]
        B1 --> B2 --> B3
    end

    subgraph penalty_detail["Case B: 熵感知多样性惩罚"]
        direction TB
        E1["H 低: 同质化推荐 严厉惩罚"]
        E2["H 高: 探索性推荐 温和惩罚"]
        E1 --- E2
    end

    style INPUT fill:#d3f9d8,stroke:#2f9e44,stroke-width:2px
    style REWARD fill:#ffe8cc,stroke:#d9480f,stroke-width:2px
    style DECOUPLE fill:#e5dbff,stroke:#5f3dc4,stroke-width:2px
    style ADVANTAGE fill:#e5dbff,stroke:#5f3dc4,stroke-width:2px
    style CHECK fill:#ffe3e3,stroke:#c92a2a,stroke-width:2px
    style BOOST fill:#d3f9d8,stroke:#2f9e44,stroke-width:2px
    style ENTROPY fill:#ffe8cc,stroke:#d9480f,stroke-width:2px
    style PENALTY fill:#ffe3e3,stroke:#c92a2a,stroke-width:2px
    style UPDATE fill:#c5f6fa,stroke:#0c8599,stroke-width:2px
    style B1 fill:#d3f9d8,stroke:#2f9e44,stroke-width:1px
    style B2 fill:#d3f9d8,stroke:#2f9e44,stroke-width:1px
    style B3 fill:#d3f9d8,stroke:#2f9e44,stroke-width:1px
    style E1 fill:#ffe3e3,stroke:#c92a2a,stroke-width:1px
    style E2 fill:#d3f9d8,stroke:#2f9e44,stroke-width:1px

Case A:正向冷启动助推。 当 A_SAGE > 0(推荐列表获得正反馈)时,SAGE 引入一个 boost factor,把 clipping 上界从 1+epsilon 扩展到 1+epsilon+boost。效果是:如果模型成功推荐了一个冷启动物品(导致 r_slate 较高),策略更新不会在 1+epsilon 处被截断,而是可以持续到 1+epsilon+boost。这给了冷启动物品突破初始低概率状态的动量——用论文的话说,“超线性激励”。

消融实验直接量化了这个效果:去掉 boost factor,冷启动召回率暴跌 50%。这不是边际改善,是核心功能的开关。

Case B:熵感知多样性惩罚。 当 A_SAGE < 0(推荐列表获得负反馈)时,SAGE 不是用固定的下界 1-epsilon 做惩罚,而是先计算推荐列表的信息熵 H(S)。如果 H(S) 低(列表中物品高度同质化),说明模型在”信息茧房”里重复推荐相似内容,此时动态扩大负向边界,施加更强的惩罚。如果 H(S) 高(列表多样性好),说明是”诚实的探索失败”——模型尝试了多样的推荐但用户不买账,此时保持温和的惩罚。

这个设计的精妙之处在于:它让优化器具备了区分”为什么失败”的能力,而不是一刀切地惩罚所有失败。

原生文本 vs Semantic ID:一个更激进的选择

SAGE 论文的另一个重要立场是废弃 Semantic ID,直接用物品的原生文本描述(标题、标签等)作为生成目标。这和 GPR、GR4AD、UniVA 的路线完全相反——后三者都在 Semantic ID 框架内做优化。

SAGE 给出的理由是:Semantic ID 在工业规模下有三个灾难性问题——碰撞冲突(多个物品被编码为同一 ID)、词表维护成本(每天新增上亿内容时不可控)、语义断裂(量化过程丢失 LLM 能理解的语义信息)。用原生文本可以直接利用 LLM 预训练获得的语义知识。

但这个选择有明显的 tradeoff:

维度Semantic ID (GPR/GR4AD)原生文本 (SAGE)
生成效率3-5 个 token 确定一个物品几十到上百 token
语义利用弱(量化后语义损失)强(直接用 LLM 预训练知识)
碰撞问题存在(GR4AD: 85.44%)不存在
词表维护需要持续更新无额外维护
线上延迟低(3 步 beam search)高(长序列生成)
生产验证有(GPR GMV +5%, GR4AD 收入 +4.2%)无线上 A/B

GPR 和 GR4AD 选择 Semantic ID 不是因为不知道原生文本的优势,而是因为广告系统的 100ms 延迟预算下,长文本生成的 serving 成本不可接受。SAGE 论文没有讨论 serving 延迟——这是离线评估论文的典型盲区。

两条路线不一定互斥。SAGE 的非对称优化器设计和动作空间的选择是正交的——论文自己也做了验证:把 SAGE 优化器插到 OneRec 的 Semantic ID 框架里(OneRec-SAGE),同样拿到了冷启动和多样性的显著提升。这说明 SAGE 的核心贡献是优化器本身,不是废弃 Semantic ID。

实验数据:亮点与缺口

冷启动和多样性的提升幅度

SAGE 在三个 Amazon 数据集上的核心指标:

对比维度SAGE vs GBPO
冷启动召回率+49% (Beauty) / +63% (Sports) / +43% (Toys)
推荐多样性 (Entropy@10)+5.9% / +10.4% / +7.4%
Top-K 准确率 (Recall@5)全面优于所有 baseline

冷启动 +49-63% 的幅度在推荐系统文献里非常罕见。消融实验也干净——去掉 boost factor 冷启动直接腰斩,去掉熵感知惩罚多样性下降 22%,去掉信号解耦各指标均有下滑。三个模块缺一不可。

在工业级 RecIF-Bench(1.2 亿次真实交互)上,SAGE 同样保持了优势。特别是在指令遵循(Instruction-conditioned)子任务中,原生文本方案的优势被放大——这支持了 LLM 语义知识被 Semantic ID 阻断的判断。

最大的缺口:没有线上 A/B

把 SAGE 和已有工业论文放在一起比较时,一个关键差距非常明显:

论文线上 A/B 结果部署规模
GPR (微信视频号)GMV 累计 +5%亿级用户全量
GR4AD (快手)广告收入 +4.2%亿级用户全量
UniVA (腾讯广告)GMV +1.5%亿级用户全量
OneTrans (字节)Per-user GMV +5.68%全量部署
SAGE (小红书)离线评估

离线指标和线上指标之间有巨大的鸿沟。离线评估用的是固定的历史日志,模型的推荐结果不会影响后续的用户行为。但线上系统是一个动态的闭环——今天推荐了什么影响明天的用户行为,进而影响后天的训练数据。SAGE 的 boost factor 在线上会不会导致冷启动物品的过度曝光?熵感知惩罚的超参数在流量波动时是否稳定?这些问题只有线上实验能回答。

这不是否定 SAGE 的价值——它提出的问题(PPO 对称 clipping 在推荐系统里失效)是真实的,给出的方案(非对称自适应边界)在消融实验里得到了干净的验证。但从”有意思的学术想法”到”经过工业验证的生产方案”之间,还有 serving 延迟、系统稳定性、长期效果评估这些关键环节没有走完。

对从业者的启示

推荐 RL 不能照搬 NLP——这个判断已经足够确凿

把 SAGE 和 GPR/GR4AD 的 RL 方案放在一起看,一个跨论文的共识非常清晰:推荐系统的 RL 阶段需要针对推荐场景做根本性的改造,不是调超参数的问题。

GPR 的 HEPO 改的是奖励信号(层级过程奖励),GR4AD 的 RSPO 改的是优化目标(列表级 NDCG),UniVA 的 MCTS-PPO 改的是探索策略(树搜索),SAGE 改的是梯度约束的形状(非对称 clipping)。四篇论文从四个不同的角度到达了同一个结论:PPO 原版在推荐系统里不够用。

RL 方案改的是什么解决的推荐特有问题
HEPO (GPR)奖励信号层级信用分配
RSPO (GR4AD)优化目标列表级排序对齐
MCTS-PPO (UniVA)探索策略低概率分支覆盖
SAGE (小红书)梯度约束形状冷启动压制 + 多样性坍塌

四者理论上正交,可以组合。如果你正在搭建生成式推荐系统的 RL 阶段,最务实的起点是 HEPO(实现成本最低:一个稀疏计数表),然后看冷启动和多样性是否是你系统的瓶颈——如果是,SAGE 的非对称 clipping 值得尝试。

Text vs Semantic ID 的选择取决于 serving 预算

SAGE 废弃 Semantic ID 的选择在学术评估里优势明显,但在工业部署里要看你的延迟预算。如果你的系统要求 100ms 内返回结果(广告系统的典型要求),长文本生成的 serving 成本可能不可接受。如果你的场景对延迟不那么敏感(比如 feed 流推荐的预加载),原生文本方案值得认真评估——它消除了 Semantic ID 的碰撞问题和维护成本,同时释放了 LLM 的语义理解能力。

不过 SAGE 最有价值的贡献不在于 Text vs SID 的选择,而在于非对称优化器本身。论文验证了 SAGE 优化器可以即插即用到 Semantic ID 框架里(OneRec-SAGE),效果同样显著。优化器和动作空间的选择是独立的两个维度。

回到最开始的问题:生成式推荐的 RL 阶段为什么是最不成熟的?因为推荐系统和 NLP 在数据分布上有根本性差异——正反馈的稀疏性和不均匀性、负反馈的同质化、多目标的奖励混淆——而社区一直在用为 NLP 设计的优化器来做推荐。SAGE 不一定是最终答案,但它指出了正确的问题方向。下一步需要的是线上验证:非对称 clipping 在真实流量中的长期效果,以及 boost factor 和熵感知惩罚的超参数在不同场景下的鲁棒性。


References: