端到端生成式推荐 —— OneRec-v2 精读笔记

文章链接:https://arxiv.org/pdf/2508.20900

机构:快手

发布时间:2025.08

参考文献:

Copyright (c) Wang-Luning. All Rights Reserved.

OneRec存在如下问题:

OneRec-v2通过如下主要的优化点来改进:

image-20260213124002485

 

Lazy Decoder-Only模型架构:

首先考虑在流式训练场景下,模型训练样本的组织形式

image-20260213124043961

 

接下来考虑Lazy Decoder-only架构的细节。

OneRec-v1中使用Encoder-Decoder架构的动机在于,用户上下文特征(包括历史物品序列、用户画像特征等)和目标推荐物品之间存在较大差异,因此使用Encoder专门用于处理用户上下文特征,Decoder专门用于基于处理后的上下文特征来做目标SID生成。但这样会使得大部分计算资源花费在了Encoder处理巨大的用户上下文特征序列上,而真正用于生成SID和计算loss的资源比例就很小了,使得在固定总算力下真正用在生成上的比例很小,某种程度上属于浪费了算力,且难以实现模型规模的扩展。

为了将计算集中在真正和目标生成相关的SID token上,这里提出了Lazy Decoder-Only模型架构,它和传统的Encoder-Decoder架构和Decoder-Only架构都有所区别。它将context信息当成一种静态的条件信息,且只能通过cross-attention来访问到这些信息,从而避免context序列内部进行大量冗余的计算,同时保留了模型对于复杂context信息的有效捕捉。另外,decoder的cross-attention模块中去除了K/V projection层,直接拿context张量(的一部分)作为各层的K/V参与attn计算,从而避免在每层都单独对于巨大的context张量做projection产生KV的资源消耗,再结合GQA可以大幅减少处理用户context的资源消耗(“Lazy”这个名字含义也就是免去每层内使用kv projection算kv)。

 

d

 

 

 

基于真实用户交互的偏好对齐

在后训练中,RSFT和OneRec-v1保持一致,持续拿线上数据使用和预训练相同的NTP loss做微调。而RL部分不同于v1中仅基于奖励模型获得reward,v2使用了用户反馈信号(视频观看时长)作为reward

在短视频场景下,每个视频的播放时长(Playtime)是最dense的反馈信号,且和app留存率等关键线上指标高度相关。因此这里基于视频播放时长设计了一个简单但有效的reward,而没有使用参数化的奖励模型。

image-20260213164803801

由于视频播放时间(Playtime)受到视频时长(Duration)的影响导致偏差,因此本身时长差异巨大的视频的播放时间是没什么可比性的(短的视频即使质量再高,它的播放时长最高也超不过它本身的时长,很难比得过那些本身很长的视频)。因此,首先将用户历史交互视频按本身时长进行分桶,时长接近的视频放到一个桶中,然后衡量视频在桶中的相对质量高低。由于视频时长遵从长尾分布,因此使用对数策略来进行分桶,随着时长增大桶的大小按指数递增,使得每个桶里的视频数量尽可能均衡。

具体而言,对于一个时长为d的视频,将其映射到桶F(d)的映射为:

F(d)=logβ(d+ϵ)

其中β是对数底数,用于控制桶的大小粒度,ϵ为用于稳定极短视频的数值计算的小常数。

设用户历史交互序列为Hu={(dk,pk)}k=1N,其中dk,pk分别表示第k个视频的时长和用户播放它的时间。对于每个时长桶b,定义该桶内的播放时间经验分布为(用来描绘类似时长的视频一般会被播放多久):

Pu,b={pj|(dj,pj)Hu,F(dj)=b}

对于某目标视频i,已知它的时长di和它被用户播放的时长pi。首先找到其对应的时长桶b=F(di),然后计算它的播放时长pi在该桶内所处于百分位(也即在类似时长的视频中,这个视频的播放时长能排到前百分之多少,衡量该视频的相对质量)。具体而言,百分位等级qi(衡量它超越了桶内百分之多少的视频)的计算为:

qi=|{pjPu,b|pjpi}||Pu,b|=桶内比目标视频播放时长短的视频数量该桶内视频总数

可见qi越大说明该视频的质量越高。

qi的大小在桶中处于前τb=25%(也即它超越了75%的类似时长视频)且无负面反馈信号则认定其为正样本,设置其优势Ai=1;若该视频存在明确负面反馈(例如被点踩),则无条件设置其优势Ai=1;其余情况则将其过滤掉,也即设置Ai=0

可见,这种策略下筛选出来的正样本和负样本都是很突出的,能够代表很强的正向或负向偏好信号。

 

具体到RL算法上,使用了新提出的GBPO(Gradient-Bounded Policy Optimization)

image-20260213175134542

可见,GBPO移除了πθπold比例项上的clip操作,转而在πold上引入了一个动态的约束边界。

对于OneRec生成的曝光样本,可以使用其在曝光时刻的生成概率为πθold。但也有很多样本来自传统流水线的推荐结果,由于推荐系统的复杂度而难以计算它的生成概率,因此将πθold简化为当前OneRec模型生成它的概率:πθold=sg(πθ)。可见,在这种情况下,比例πθπold1

在GRPO等算法中,比例为1的样本被视为非常稳定的训练样本,因此不会对它进行截断处理。但是在实践中这种样本也有可能带来梯度爆炸。对于某个token i来说,其带来的损失与对应的梯度为:

JECPOi(θ)=Aiπθsg(πθ)θJECPOi(θ)=Ai1πθπθθ

问题出在梯度中的1πθ项处,这一项使得生成该token的概率πθ越小则梯度越大。对于Ai>0的正样本来说,当前生成它的概率小意味着模型还有较大提升空间,因此梯度大点是合理的。但对于负样本来说,πθ小说明它本身已经被模型充分抑制了,在这种情况下过大的梯度会导致模型进一步过拟合。可见,传统的clip方法仍不能避免比例为1时可能带来的有害梯度爆炸的问题。

借鉴BCELoss的梯度表达式,其形式和上述ECPO loss类似,且也存在对于负样本的惩罚,但区别在于负样本的梯度的系数由1pθ变成了11pθ,这恰恰避免了上文所述的问题:这样可以使的负样本生成概率πθ较小时11πθ也较小,抑制它们的梯度也就较小,符合“当前模型对它抑制已经相当充分了,不需要再做大的更新来进一步加剧了”,从而使得训练更加稳定:

LBCE(y,pθ)=[ylogpθ+(1y)log(1pθ)]θLBCE={1pθpθθ,y=111pθpθθ,y=0

因此,参考BCELoss的梯度形式设计了GBPO,从而约束了RL的梯度:

image-20260213183117223