解决的问题

近期生成式的自回归召回被证明是一种有效的提升推荐系统效果的方式。然而过往的推荐系统采用召回-粗排-精排的级联结构,导致某一级的上限受到前面一级的限制。生成式的模型也仅被用在召回阶段。本文提出了一个端到端的生成模型OneRec,在真实场景超越了以往的复杂的级联推荐系统。

方法

OneRec的整体架构

特征工程

用户侧特征:用户的正向历史行为 Hu={v1h,v2h,..,vnh}H_u = \{v_1^h, v_2^h, .., v_n^h\}Hu={v1h,v2h,..,vnh},其中vvv代表用户有效观看或有互动(点赞、关注、分享)行为的视频。OneRec的输出是一个视频列表,由一个session的视频组成S={v1,v2,...,vm}S=\{v_1, v_2, ..., v_m\}S={v1,v2,...,vm}
对每个视频viv_ivi,我们用多模态embedding ei∈Rde_i \in R^deiRd来表示,embedding是与真实的user-item行为分布对齐过的。过往的生成式召回框架会用RQ-VAE来基于预训练好的embedding来编码推荐侧语义token,然而RQ-VAE会出现名为沙漏现象的码书分布不均衡问题。我们将RQ-VAE的方法改进为使用一个多层的平衡的量化机制,用残差K-means量化算法来进行embedding的转换。
在第一层,初始的残差定义为ri1=eir_i^1 = e_iri1=ei,对每一层我们都有一个码书Cl={c1l,...,cKl}C_l = \{c_1^l, ..., c_K^l\}Cl={c1l,...,cKl},其中KKK是码书的大小。距离最近的聚类中心点的index是由sil=argmink∣∣ril−ckl∣∣22s_i^l = argmin_k ||r_i^l - c_k^l||_2^2sil=argmink∣∣rilckl22决定的,而下一层的残差定义为ril+1=ril−csillr_i^{l+1} = r_i^l - c_{s_i^l}^lril+1=rilcsill,于是码书的token就这样一层一层地生成下来。
为了构建一个平衡的码书Cl={c1l,...,cKl}C_l = \{c_1^l, ..., c_K^l\}Cl={c1l,...,cKl},我们使用下面的平衡的K-means算法。
balanced K-means Clustering
算法的主要目的是平衡每个cluster的embedding数量。

样本

相比于传统推荐方法里point-wise的推荐,我们使用session-wise生成的方式来进行视频推荐。一个session指的是一次用户请求返回的一个batch的视频,通常是5个到10个,一个session内的视频通常会考虑到用户兴趣、连贯性和多样性等多种因素。因此session-wise的输出和样本能够使模型习得视频之间的依赖。我们设置了一些规则来定义高质量session,包括:

  • 用户在session内实际观看的视频数量大于等于5个
  • 用户观看这一session内视频的总时长超过某个阈值
  • 用户对这一session内的视频有显式的交互行为,例如点赞收藏或分享
    如上图(a)部分所示,我们的模型使用的是基于transformer的结构。Encoder用来建模用户历史,decoder用来生成session视频序列。Encoder部分使用了stacked multi-head self-attention和普通前馈网络。而Decoder以自回归的形式生成目标session的视频序列。对于decoder中的前馈网络,我们使用MoE架构来减少算力消耗。
    在训练阶段,我们在序列开头添加一个s[BOS]s_{[BOS]}s[BOS],于是decoder的输入就是Sˉ={s[BOS],s11,s12,...,s1L,s[BOS],s21,s22,...,s2L,...,s[BOS],sm1,sm2,...,smL}\bar{S} = \{s_{[BOS]}, s_1^1, s_1^2, ..., s_1^L, s_{[BOS]}, s_2^1, s_2^2, ..., s_2^L, ..., s_{[BOS]}, s_m^1, s_m^2, ..., s_m^L\}Sˉ={s[BOS],s11,s12,...,s1L,s[BOS],s21,s22,...,s2L,...,s[BOS],sm1,sm2,...,smL}
    我们使用交叉熵loss作为next-token prediction的loss:
    LNTP=−∑i=1m∑j=1LlogP(sij+1∣[s[BOS],s11,s12,...,s1L,...,s[BOS],s11,...,sij];Θ)L_{NTP} = -\sum^m_{i=1}\sum^L_{j=1}logP(s_i^{j+1}| [s_{[BOS]}, s_1^1, s_1^2, ..., s_1^L, ..., s_{[BOS]}, s_1^1, ..., s_i^j];\Theta)LNTP=i=1mj=1LlogP(sij+1[s[BOS],s11,s12,...,s1L,...,s[BOS],s11,...,sij];Θ)
    在经过亿些轮次的训练之后我们得到了seed模型MtM_tMt
奖励模型

目前我们已经利用高质量session训练出了一个基础模型,保证了生成session的质量。在此基础上我们希望用DPO算法进一步提升模型能力。在传统NLP领域,偏好数据很容易通过打标获得。然而在推荐领域由于user-item交互的稀疏性,我们需要一个奖励模型来进行打分。本文提出了DPO过程中的session-wise的奖励模型

奖励模型训练

我们用R(u,S)R(u, S)R(u,S)来表示为不同用户选择偏好数据的奖励模型。为了让奖励模型能够给session打分,我们首先抽取session中每个item的target-aware表示ei=vi⊙ue_i = v_i \odot uei=viu,然后我们就能够得到一个session的target-aware表示h={e1,e2,...,em}h = \{e_1, e_2, ..., e_m\}h={e1,e2,...,em},然后在session内进行self-attention hf=Selfattention(hWsQ,hWsK,hWsV)h_f = Selfattention(hW_s^Q, hW_s^K, hW_s^V)hf=Selfattention(hWsQ,hWsK,hWsV)
然后我们用不同的塔(sigmoid + MLP)来对多个目标进行预测,用预测结果和gt直接构建二分类交叉熵loss:
LRM=−∑swt,vtr,wtr,ltr,...xtr(yxtrlog(r^xtr)+(1−yxtr)log(1−r^xtr))L_{RM} = - \sum^{xtr}_{swt, vtr, wtr, ltr, ...}(y^{xtr}log(\hat{r}^{xtr}) + (1-y^{xtr})log(1-\hat{r}^{xtr}))LRM=swt,vtr,wtr,ltr,...xtr(yxtrlog(r^xtr)+(1yxtr)log(1r^xtr))

模型迭代

基于当前基础的OneRec模型MtM_tMt,我们通过beam search为一个用户生成了N个不同的session:Sun∼Mt(Hu)S_u^n \sim M_t(H_u)SunMt(Hu),然后为生成的每个session计算奖励,然后我们用得分最高的session和得分最低的session为一个用户构建一个偏好对Dtpairs=(Suw,Sul,Hu)D_t^{pairs} = (S_u^w, S_u^l, H_u)Dtpairs=(Suw,Sul,Hu)。得到这些偏好对之后我们就可以构建DPO loss来迭代模型了:
LDPO=−logσ(βlogMt+1(Suw∣Hu)Mt(Suw∣Hu)−βlogMt+1(Sul∣Hu)Mt(Sul∣Hu))L_{DPO} = -log\sigma(\beta log\frac{M_{t+1}(S_u^w|H_u)}{M_t(S_u^w|H_u)} - \beta log\frac{M_{t+1}(S_u^l|H_u)}{M_t(S_u^l|H_u)})LDPO=logσ(βlogMt(SuwHu)Mt+1(SuwHu)βlogMt(SulHu)Mt+1(SulHu))

模型部署

为了平衡线上的稳定性和模型性能,我们在线上部署了OneRec-1B,部署的核心模块共3个:1) 训练系统 2) 线上服务系统 3) DPO采样服务器
OneRec部署架构

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐