跳转至

OneRec

第一章:生成式推荐范式(Generative Recommendation Paradigm)

传统工业推荐系统通常采用多阶段级联架构(cascade architecture),即通过召回(retrieval)→ 粗排(pre-ranking)→ 精排(ranking)等多个阶段逐步筛选候选物品。该架构在工程上具有较高的效率,因为每个阶段只需要处理有限规模的候选集合,从而满足工业系统对高并发(QPS)和低延迟的要求。然而,这种架构存在三个根本性的结构性问题。第一,计算资源碎片化。不同阶段由不同模型负责,系统需要频繁进行候选集合传递、特征读取和模型切换,大量计算资源消耗在通信与存储开销上,而不是模型本身的推理计算。第二,优化目标不一致。召回模型、粗排模型与精排模型通常具有不同的训练目标,例如召回阶段优化召回率,而排序阶段优化点击率或观看时长,这种多目标分离使得整体系统难以实现端到端优化。第三,模型能力受限。由于系统延迟要求严格,每个阶段的模型规模受到限制,难以像自然语言处理领域的大模型那样通过扩大参数规模获得性能提升。因此,传统推荐系统在架构上难以充分利用深度学习和大模型带来的潜在能力提升。

为了解决上述问题,OneRec提出了一种生成式推荐(Generative Recommendation)范式。该范式借鉴了大型语言模型(LLM)的思想,将推荐问题重新表述为序列生成任务。在这一框架中,模型不再通过遍历候选集合并计算排序分数来选择物品,而是直接根据用户上下文信息生成用户可能感兴趣的物品标识。具体而言,给定用户历史行为、用户特征以及上下文信息,模型学习生成一个物品序列,使得生成的序列在用户真实交互数据中具有较高概率。这种建模方式将推荐问题从传统的“候选集合排序问题”转化为“条件序列生成问题”,使推荐系统能够通过统一模型实现端到端优化。

然而,在工业推荐场景中直接生成原始物品ID是不可行的,因为实际系统中的物品规模通常达到数亿甚至数十亿级。如果将每个物品ID视为独立token,则生成空间会过于庞大,导致模型训练困难且泛化能力较差。为了解决这一问题,OneRec引入了语义标识(Semantic ID)机制。具体而言,每个物品不再使用单一的原子ID表示,而是通过层次化语义编码映射为一组离散语义token。例如,一个视频可以表示为三个语义token的组合,如 <a_9><b_3><c_1>。这种表示方式将原始的巨大物品空间转化为多个较小词表的组合空间,从而显著降低生成任务的复杂度。同时,由于语义token来源于物品内容与用户行为的联合表示,语义相似的物品往往共享部分token,因此模型可以在不同物品之间实现知识共享,提高对新物品的泛化能力。

在上述表示方式下,推荐问题可以形式化为一个条件概率生成问题。设用户上下文为 (C_u),物品 (v) 的语义标识为由 (L_t) 个token组成的序列 ((s_1, s_2, \ldots, s_{L_t}))。模型的目标是学习以下概率分布:

\[ P(s_1, s_2, ..., s_{L_t} \mid C_u) \]

该概率通过自回归方式进行建模,即每一步预测下一个语义token:

\[ P(s_1, s_2, ..., s_{L_t} \mid C_u)= \prod_{i=1}^{L_t} P(s_i \mid C_u, s_1, ..., s_{i-1}) \]

在训练阶段,模型通过Next Token Prediction(NTP)目标进行学习,即根据用户上下文与已生成token预测下一个语义token。在推理阶段,模型则通过自回归生成完整的语义token序列,并将其映射回对应的物品。由于语义token空间远小于原始物品空间,这种生成方式不仅具有可行性,还能自然支持多样化推荐与探索机制。

生成式推荐范式还带来了一个重要优势,即统一召回与排序过程。在传统系统中,召回阶段负责从海量物品中筛选候选集合,而排序阶段再对候选集合进行精细排序。相比之下,在OneRec框架中,生成模型直接输出推荐物品序列,从而同时完成候选选择与排序两个任务。模型在训练过程中直接优化最终用户行为目标,例如观看时长或点击率,因此能够实现真正的端到端优化。此外,由于生成模型可以通过beam search或采样策略生成多个候选序列,该框架天然支持多样性控制与探索机制,这在传统排序模型中通常需要额外的启发式策略实现。

综上所述,生成式推荐范式通过三个关键思想重构了推荐系统架构:第一,将推荐任务从候选排序问题转化为条件序列生成问题;第二,通过语义token化技术将超大规模物品空间压缩为可生成的离散token序列;第三,通过自回归生成模型统一完成召回与排序过程。这一框架不仅实现了端到端优化,还使推荐系统能够借鉴大型生成模型的训练范式和扩展能力,为工业推荐系统向大模型架构演进提供了新的技术路径。

第二章:Semantic Tokenizer(语义标识生成机制)

在生成式推荐框架中,模型的输出不再是传统推荐系统中的原子物品ID,而是一个由多个离散token组成的语义序列。因此,在训练生成模型之前,需要首先构建一个能够将物品映射为语义token序列的Semantic Tokenizer。该模块的目标是将原始物品的多模态信息与用户行为信号融合,生成具有语义结构的离散表示,使生成模型能够在较小的词表空间中完成推荐任务。整体而言,Semantic Tokenizer包含两个核心阶段:多模态协同表示学习(Collaborative-aware Multimodal Representation)以及RQ-Kmeans层次化量化(Residual Quantization Tokenization)

首先,需要构建能够表达物品语义的连续表示。对于短视频推荐场景,每个视频包含丰富的多模态信息,例如标题(caption)、标签(tag)、语音识别文本(ASR)、图像文本识别(OCR)、封面图像以及视频帧等。这些信息被输入到多模态模型中进行统一编码。具体而言,OneRec采用多模态视觉语言模型提取视频内容特征,得到一组token级表示:

\[ M \in \mathbb{R}^{N_M \times d_t} \]

其中 (N_M) 表示多模态token数量,(d_t) 表示token维度。在实际实现中,多模态模型会输出上千个token表示,为了降低后续计算复杂度,需要进一步进行特征压缩。因此,引入了Query Transformer(QFormer)结构,通过少量可学习查询向量对原始多模态token进行交叉注意力压缩。其计算过程可以表示为:

\[ Q^{(i+1)} = \text{CrossAttn}(Q^{(i)}, M, M) \]

随后通过前馈网络进行非线性变换:

\[ Q^{(i+1)} = \text{FFN}(\text{RMSNorm}(Q^{(i+1)})) \]

经过若干层迭代后,可以得到压缩后的多模态表示:

\[ \tilde{M} = Q^{(N_c+1)} \in \mathbb{R}^{\tilde{N}_M \times d_t} \]

其中 (\tilde{N}_M) 是压缩后的token数量(通常远小于 (N_M))。该表示包含视频的视觉、文本以及语音等多模态语义信息。

然而,仅依赖多模态信息仍然无法完全反映用户真实兴趣,因为推荐系统中的重要信号往往来自用户行为数据。因此,OneRec进一步引入协同信息对齐(Collaborative Alignment)机制,使多模态表示能够反映用户交互模式。具体方法是构建一个高质量的视频对数据集 (D_{pair}),其中每一对视频 ((i,j)) 表示两个在用户行为中具有高度相似性的内容,例如用户连续观看的视频或协同过滤中高度相似的视频。通过这些视频对,可以使用对比学习方式对齐其多模态表示:

\[ L_{I2I} = -\frac{1}{|B|} \sum_{(i,j)\in B} \log \frac{ \exp(\text{sim}(\tilde{M}_i,\tilde{M}*j)/\tau) }{ \sum*{(i',j')\in B} \exp(\text{sim}(\tilde{M}*i,\tilde{M}*{j'})/\tau) } \]

其中 (B) 表示一个batch的视频对集合,(\text{sim}(\cdot,\cdot)) 表示相似度函数(通常为余弦相似度),(\tau) 为温度参数。该损失函数促使协同相似的视频在表示空间中更加接近,从而将用户行为模式融入多模态表示中。

此外,为了保证多模态表示仍然能够保持对视频内容的语义理解能力,还引入了一个caption生成损失。通过使用语言模型根据视频表示预测其标题token序列,从而避免表示过度偏向协同信号而丧失内容语义。该损失可以表示为:

\[ L_{\text{caption}} = -\sum_k \log P(t_{k+1} \mid t_1,t_2,\ldots,t_k) \]

其中 (t_k) 表示caption中的第 (k) 个token。最终,多模态表示训练目标为:

\[ L = L_{I2I} + L_{\text{caption}} \]

经过上述训练后,每个视频都会获得一个融合了内容语义与用户行为信息的连续表示 (\tilde{M}_i)。

接下来,需要将连续表示转换为离散token序列,以便生成模型进行自回归预测。OneRec采用Residual Quantization K-means(RQ-Kmeans)方法构建语义token。该方法通过多层残差量化逐步逼近原始向量,使每一层量化都捕捉不同粒度的语义信息。

首先,在第一层量化中,将视频表示作为初始残差:

\[ R^{(1)} = { \tilde{M}_i \mid \forall i } \]

然后对所有残差向量执行K-means聚类,得到第一层码本:

\[ C^{(1)} = \text{K-means}(R^{(1)}, N_t) \]

其中 (N_t) 表示聚类中心数量。对于视频 (i),选择距离最近的中心作为第一层语义token:

\[ s_i^{(1)} = \arg\min_k | R_i^{(1)} - c_k^{(1)} | \]

随后计算新的残差:

\[ R_i^{(2)} = R_i^{(1)} - c_{s_i^{(1)}}^{(1)} \]

第二层量化在新的残差上重复上述过程:

\[ s_i^{(2)} = \arg\min_k | R_i^{(2)} - c_k^{(2)} | \]

残差更新为:

\[ R_i^{(3)} = R_i^{(2)} - c_{s_i^{(2)}}^{(2)} \]

这一过程通常持续 (L_t) 层。最终,每个视频都会获得一个层次化语义标识:

\[ v_i \rightarrow (s_i^{(1)}, s_i^{(2)}, \ldots, s_i^{(L_t)}) \]

在OneRec系统中通常设置 (L_t = 3),因此每个视频被表示为三个语义token,例如:

video_123 → <a_9><b_3><c_1>

这种表示方式具有三个重要性质。首先,它将原本规模达到数亿甚至数十亿的物品ID空间压缩为多个较小词表的组合空间,从而使生成任务可行。其次,语义相似的视频往往共享部分token,因此模型可以通过token级共享实现知识迁移。最后,新视频只需要计算其多模态表示并进行量化即可获得语义ID,从而天然支持冷启动场景。

综上,Semantic Tokenizer通过多模态语义理解与协同信号对齐获得高质量连续表示,并通过RQ-Kmeans残差量化将其映射为层次化语义token序列。这一模块为后续生成模型提供了离散预测目标,是OneRec生成式推荐框架的基础组件。

第三章:User Encoder(用户兴趣建模与KV上下文构建)

在OneRec的生成式推荐框架中,Encoder模块的核心任务并不是直接预测物品,而是对用户兴趣进行压缩建模,并生成供Decoder使用的上下文表示。具体而言,Encoder会将用户的多尺度行为信息编码为一组隐藏向量,并进一步映射为Decoder cross-attention所需的Key(K)和Value(V)矩阵。Decoder在生成语义token时通过Query(Q)对这些KV进行注意力查询,从而在生成过程中持续利用用户兴趣信息。

Encoder的输入主要来源于用户行为日志与用户属性信息。由于用户兴趣在不同时间尺度上具有不同特征,OneRec将用户信息划分为多个行为路径(pathway),分别捕获不同粒度的用户兴趣模式。这种多路径设计可以避免单一序列建模带来的信息混杂问题,并提高用户兴趣表示的表达能力。

首先是用户静态特征路径(User Static Pathway)。该路径主要用于建模用户的基本属性信息,例如用户ID、年龄、性别等离散特征。这些特征首先被映射为embedding向量,然后通过全连接网络进行非线性变换。设用户静态特征embedding为:

\[ f_u = [e_{uid}; e_{gender}; e_{age}; \ldots] \]

其中每个特征embedding通常为固定维度向量,例如64维。随后通过两层全连接网络进行特征融合:

\[ h_u = \text{Dense}(\text{LeakyReLU}(\text{Dense}(f_u))) \]

最终得到用户静态表示:

\[ h_u \in \mathbb{R}^{1 \times d_{model}} \]

该向量表示用户长期稳定的基本属性特征。

第二个路径是短期行为路径(Short-term Pathway)。该路径用于建模用户最近一段时间的行为模式,因为用户近期行为通常最能反映当前兴趣。在OneRec中,系统会提取最近 (L_s) 个用户交互行为(例如 (L_s=20))。对于每个行为记录,会构建包含多种特征的表示:

\[ f_s = [e^{vid}; e^{aid}; e^{tag}; e^{ts}; e^{playtime}; e^{dur}; e^{label}] \]

其中:

  • (vid):视频ID或语义ID
  • (aid):作者ID
  • (tag):内容标签
  • (ts):时间戳
  • (playtime):观看时长
  • (dur):视频时长
  • (label):用户行为标签(like、share、comment等)

这些特征首先被拼接为一个行为向量,然后通过神经网络进行编码:

\[ h_s = \text{Dense}(\text{LeakyReLU}(\text{Dense}(f_s))) \]

得到短期行为序列表示:

\[ H_s = [h_s^{(1)}, h_s^{(2)}, ..., h_s^{(L_s)}] \]

该序列表示用户近期行为模式。

第三个路径是正反馈行为路径(Positive-feedback Pathway)。在推荐系统中,一些行为比普通点击具有更强的兴趣信号,例如点赞、关注、分享等。因此,OneRec将这些高价值行为单独建模,以更准确地捕获用户兴趣中心。设用户正反馈行为集合为:

\[ H_p = {v_1, v_2, ..., v_{L_p}} \]

对应的embedding序列表示为:

\[ E_p = [e(v_1), e(v_2), ..., e(v_{L_p})] \]

然后通过Transformer或自注意力机制进行兴趣聚合:

\[ H_p' = \text{SelfAttention}(E_p) \]

该路径能够强调用户最感兴趣的内容类别。

第四个路径是长期行为路径(Lifelong Pathway)。该路径用于建模用户长期兴趣模式,例如用户在历史上经常观看的内容类型。由于长期行为序列通常较长,需要进行一定程度的压缩,例如通过采样或聚类选取代表性历史行为。设长期行为序列为:

\[ H_l = [v_1, v_2, ..., v_{L_l}] \]

其embedding表示为:

\[ E_l = [e(v_1), e(v_2), ..., e(v_{L_l})] \]

随后通过Transformer编码器进行兴趣建模:

\[ H_l' = \text{Transformer}(E_l) \]

该路径提供稳定的长期兴趣结构。

在获得上述多路径表示后,OneRec会将所有路径的输出拼接为统一的上下文表示:

\[ H_{context} = [h_u; H_s; H_p'; H_l'] \]

该表示包含用户静态信息、短期兴趣、强反馈兴趣以及长期兴趣四种不同尺度的用户特征。随后,这些表示会通过Encoder Transformer进行进一步的上下文建模:

\[ H'*{context} = \text{TransformerEncoder}(H*{context}) \]

Encoder的输出是一组隐藏状态向量:

\[ H'_{context} = [h_1, h_2, ..., h_n] \]

这些隐藏状态随后被线性映射为Decoder cross-attention所需的Key和Value矩阵:

\[ K = W_K H'_{context} \]
\[ V = W_V H'_{context} \]

其中 (W_K) 和 (W_V) 为可学习投影矩阵。最终得到:

\[ K,V \in \mathbb{R}^{n \times d_{model}} \]

这些KV矩阵可以理解为用户兴趣记忆(User Interest Memory)。在Decoder生成语义token的过程中,每一步都会通过cross-attention从该记忆中提取相关信息,从而使生成的推荐结果与用户兴趣保持一致。

从整体上看,User Encoder的作用可以总结为三个方面。第一,通过多路径特征工程建模不同时间尺度的用户兴趣;第二,通过Transformer结构对多源信息进行融合与压缩;第三,将用户兴趣表示转换为Decoder可访问的Key-Value上下文记忆。通过这种设计,OneRec能够在生成过程中持续利用用户行为信息,实现基于用户兴趣的条件生成推荐。

第四章:Autoregressive Decoder 与训练过程

在完成用户兴趣编码之后,OneRec通过Decoder模块执行自回归生成(autoregressive generation),逐步生成目标物品的语义token序列。Decoder的核心任务是在给定用户上下文表示的条件下,通过Next Token Prediction(NTP)逐步生成语义token,并最终构成完整的物品标识。与传统推荐系统不同,这里并不存在显式的候选集合排序过程,而是通过序列生成直接得到推荐物品。

Decoder的输入由两部分组成:第一部分是用户Encoder生成的上下文Key-Value矩阵,用于表示用户兴趣;第二部分是已经生成的语义token序列。在训练阶段,真实物品的语义token序列会作为监督信号输入模型。设目标物品的语义ID序列为:

\[ s = (s_1, s_2, \ldots, s_{L_t}) \]

其中 (L_t) 为语义token层数,在OneRec系统中通常为3。Decoder在训练时会将序列组织为:

\[ [BOS, s_1, s_2] \]

其中 (BOS) 表示序列起始标记。模型需要根据用户上下文以及已有token预测下一个token。例如,当输入为:

[BOS]

模型需要预测:

s_1

当输入为:

[BOS, s_1]

模型需要预测:

s_2

当输入为:

[BOS, s_1, s_2]

模型需要预测:

s_3

因此,整个生成过程可以建模为条件概率分布:

\[ P(s_1, s_2, ..., s_{L_t} \mid C_u)= \prod_{i=1}^{L_t} P(s_i \mid C_u, s_1, ..., s_{i-1}) \]

其中 (C_u) 表示用户上下文信息。

Decoder采用Transformer结构,每一层由三个主要模块组成:cross-attention、causal self-attention以及前馈网络(FFN)。设Decoder第 (l) 层输入隐藏状态为:

\[ h^{(l-1)} \]

首先进行cross-attention操作,使当前生成状态能够访问用户上下文信息:

\[ h_{cross}^{(l)}= h^{(l-1)} + \text{CrossAttn}( \text{RMSNorm}(h^{(l-1)}), K_l, V_l ) \]

其中:

  • (K_l, V_l) 为Encoder生成的上下文Key和Value
  • Query来自Decoder当前隐藏状态

该步骤使Decoder能够根据用户兴趣调整生成结果。

随后执行causal self-attention,用于建模已生成token之间的依赖关系:

\[ h_{self}^{(l)}= h_{cross}^{(l)} + \text{SelfAttn}( \text{RMSNorm}(h_{cross}^{(l)}) ) \]

在self-attention中使用因果mask(causal mask),保证每个位置只能访问之前的token,从而实现自回归生成。

接下来通过前馈网络进行非线性变换:

\[ h^{(l)}= h_{self}^{(l)} + \text{FFN}( \text{RMSNorm}(h_{self}^{(l)}) ) \]

经过 (N) 层Decoder block之后,得到最终隐藏表示:

\[ h^{(N)} \]

该表示随后通过线性投影映射到token词表空间:

\[ z = W_o h^{(N)} \]

再通过softmax得到每个语义token的概率分布:

\[ P(s_i | \cdot) = \text{softmax}(z) \]

模型训练目标是最大化真实token序列的概率,对应的损失函数为Next Token Prediction交叉熵损失

\[ L_{NTP}=* \sum_{i=1}^{L_t} \log P(s_i \mid C_u, s_1, ..., s_{i-1}) \]

在实际训练中通常采用teacher forcing策略。也就是说,在预测第 (i) 个token时,Decoder输入的历史token为真实token,而不是模型预测的token。例如,对于语义序列:

<a_9><b_3><c_1>

训练样本将被拆解为三个预测任务:

输入:

[BOS]

预测:

<a_9>

输入:

[BOS, a_9]

预测:

<b_3>

输入:

[BOS, a_9, b_3]

预测:

<c_1>

这种训练方式能够显著提高模型收敛速度并减少误差传播。

为了提高模型容量,OneRec在Decoder中引入了Mixture-of-Experts(MoE)结构。在部分Decoder层中,传统的FFN模块会被MoE模块替代。设专家集合为:

\[ E = {E_1, E_2, ..., E_M} \]

每个token通过门控网络选择部分专家进行计算:

\[ y = \sum_{j \in TopK(g(x))} g_j(x) E_j(x) \]

其中:

  • (g(x)) 为门控网络
  • (TopK) 表示选择权重最高的K个专家

这种结构可以显著增加模型参数规模,同时保持计算成本可控。

总体而言,Decoder训练阶段的目标是学习一个条件生成模型,使其能够根据用户兴趣逐步生成语义token序列。生成过程通过cross-attention持续访问用户兴趣记忆,通过causal self-attention建模token依赖关系,并通过MoE模块提高模型容量。训练完成后,在推理阶段模型即可通过自回归生成语义token序列,并将其映射回具体推荐物品。

第五章:Session-wise Generation(会话级生成机制)

在完成语义token生成模型的训练之后,OneRec并不只用于预测单个物品,而是进一步扩展为会话级推荐(session-wise generation)。这一机制是OneRec区别于传统Next-item推荐模型的重要设计。传统序列推荐通常只预测用户接下来最可能点击的单个物品,而实际推荐系统往往需要一次性生成一组推荐列表(例如首页视频流)。如果简单地逐个预测物品并拼接成列表,容易出现内容重复、主题单一或排序不合理的问题。因此,OneRec通过会话级生成方式,使模型能够直接学习生成完整推荐列表的结构。 OneRec 的 Session-wise Generation 在训练阶段的本质仍是 point-wise 的逐物品 next-token prediction,"会话级"的含义主要体现在训练数据的组织方式(避免对历史曝光的重复学习)

"会话级"在训练中主要解决的是数据组织问题,而非改变预测粒度。 具体来说,如果用户连续三次曝光了序列 A→B→C,朴素的做法会导致 A→B 这个模式被重复学习多次,引入偏差并降低效率。因此,文章提出 New Impression Only Organization:以用户历史行为 HuH_u

若用户连续经历了多次曝光(impression),每次曝光都记录了一组被展示的物品,则在构造训练样本时,用户的历史曝光序列整体作为 Encoder 的上下文输入,而 Decoder 的预测目标只对准最新一次曝光中的物品。这样做的核心原因是避免"重复监督信号"——如果每一次中间曝光都单独构造一条样本,那么同一段用户历史行为(如 A→B 这个片段)会在多条样本中反复出现,导致模型在该模式上过度拟合,梯度估计产生系统性偏差。因此"只训练最新曝光"是一种对训练信号的去重与对齐

Hu​ 作为 Encoder 输入上下文,训练目标仅为 最新一次曝光的物品列表中的物品,每个物品独立作为 decoder 的预测目标。

在OneRec中,一个推荐会话被定义为用户在一次浏览请求中看到的一组物品。例如,一个会话可以表示为:

S = {v1, v2, v3, ..., vm}

其中 (m) 表示推荐列表长度。每个物品 (v_i) 都具有对应的语义token表示:

\[ v_i \rightarrow (s_{i,1}, s_{i,2}, ..., s_{i,L_t}) \]

因此,一个完整的推荐会话可以被表示为一个token序列:

\[ T = [s_{1,1}, s_{1,2}, ..., s_{1,L_t}, s_{2,1}, ..., s_{2,L_t}, ... s_{m,1}, ..., s_{m,L_t}] \]

在这种表示方式下,推荐列表生成问题被转化为更长序列的自回归生成问题。模型需要学习条件概率:

\[ P(T \mid C_u) \]

其中 (C_u) 为用户上下文信息。

为了训练这种会话级生成模型,需要构建合适的训练样本。传统推荐数据通常按曝光日志(impression log)组织,即每次推荐都会记录一组被展示的物品。但如果直接将每个曝光列表都作为训练样本,会出现严重的重复训练问题。例如,如果一个用户连续三次曝光了物品序列:

A → B → C

那么模型在训练中会重复学习模式 (A \rightarrow B),从而降低训练效率并可能引入偏差。因此,OneRec提出一种新的数据组织方式:只对最新曝光进行预测训练(New Impression Only Organization)。在这种方式下,用户历史行为作为上下文输入,而训练目标仅包含当前最新曝光的物品序列。

设用户历史行为为:

\[ H_u = (v_1, v_2, ..., v_n) \]

当前会话推荐列表为:

\[ S = (v_{n+1}, v_{n+2}, ..., v_{n+m}) \]

模型训练目标为:

\[ P(S \mid H_u) \]

即根据用户历史行为生成当前推荐列表。

在实际训练中,推荐列表中的每个物品仍然会被展开为语义token序列,因此生成目标为:

\[ P(s_{1,1}, ..., s_{m,L_t} \mid C_u) \]

模型通过自回归方式逐步生成token。与传统单物品预测不同,这种方式能够让模型同时学习:

  1. 用户兴趣
  2. 推荐列表内部顺序关系
  3. 内容多样性

换句话说,模型不仅学习“用户喜欢什么”,还学习“这些内容应该以怎样的顺序出现”。

在推理阶段,模型通过自回归方式生成语义token序列。通常会使用beam search或采样策略生成多个候选序列。生成流程如下:

第一步,输入用户上下文:

context = encoder(user_features)

第二步,Decoder从BOS token开始生成:

[BOS] → s1

第三步,继续生成后续token:

[BOS, s1] → s2

第四步,直到生成完整token序列:

[BOS, s1, s2, ..., sk]

随后将token序列按物品结构进行分组。例如当 (L_t=3) 时,每三个token对应一个物品:

<a9><b3><c1> → video_1
<a2><b5><c4> → video_2

最终形成推荐列表:

[video_1, video_2, video_3, ...]

这种生成方式带来了几个重要优势。首先,由于生成空间是语义token组合空间,而不是原始物品ID空间,因此模型能够在生成过程中自然探索新内容。其次,由于整个推荐列表是通过同一生成过程得到的,模型能够自动学习列表内部的结构关系,例如多样性或主题分布,而无需额外的reranking策略。最后,会话级生成使模型能够利用上下文信息生成更连贯的推荐序列,从而提高用户体验。

总体而言,Session-wise Generation使OneRec从“单物品预测模型”升级为“推荐列表生成模型”。通过将推荐列表视为一个序列生成任务,模型能够同时学习用户兴趣建模、内容排序和列表结构,从而实现更加统一和高效的推荐框架。

第六章:Preference Alignment(偏好对齐与强化学习优化)

在完成生成模型的预训练之后,OneRec仍然面临一个关键问题:Next Token Prediction 的训练目标与真实推荐目标之间存在差距。在预训练阶段,模型优化的是生成真实语义token序列的概率,即最大化真实曝光数据的似然。然而,真实曝光数据并不一定完全代表用户最满意的推荐结果。例如,在工业推荐系统中,一个视频被曝光并不意味着用户真正喜欢该内容,用户可能很快划走、停留时间很短,或者没有产生进一步交互。因此,如果仅依赖监督学习,模型可能学习到的是“历史曝光模式”,而不是“用户真实偏好”。

为了解决这一问题,OneRec在预训练之后引入了Preference Alignment(偏好对齐)阶段,其核心思想与大语言模型中的RLHF(Reinforcement Learning from Human Feedback)类似:通过用户行为信号构建偏好数据,并利用强化学习或偏好优化方法,使生成模型更好地符合真实用户兴趣。换句话说,该阶段的目标是让模型从“模仿历史数据”转变为“优化用户体验指标”。

从整体上看,Preference Alignment的流程可以分为四个关键步骤:

  1. 使用当前生成模型生成候选推荐列表
  2. 使用奖励模型(Reward Model)评估每个候选列表
  3. 构造偏好对(chosen / rejected)样本
  4. 使用Direct Preference Optimization(DPO)更新生成模型

这一过程通常会进行多轮迭代,因此被称为Iterative Preference Alignment(IPA)

首先,在偏好对齐阶段,需要从当前生成模型中采样多个候选推荐序列。具体来说,对于同一个用户上下文 (C_u),Decoder可以通过beam search或采样策略生成多个语义token序列:

\[ T^{(1)}, T^{(2)}, ..., T^{(k)} \]

每个序列都对应一个推荐列表。例如:

```id="genlist" T1 → [video_a, video_b, video_c] T2 → [video_d, video_e, video_f] T3 → [video_a, video_g, video_h]

接下来,需要对这些候选序列进行质量评估。OneRec使用一个**Reward Model(奖励模型)**对每个候选推荐序列进行打分。奖励模型通常根据用户行为信号训练,例如观看时长、点赞、分享、关注等指标。对于生成序列 (T),奖励模型输出一个评分:

$$
r = R(C_u, T)
$$

其中 (R) 表示奖励模型。评分越高,表示该推荐列表越符合用户兴趣。

得到多个候选序列的评分后,可以从中构造偏好对(preference pair)。具体而言,在同一用户上下文下,从候选序列中选出评分最高的序列作为“优选样本(chosen)”,评分最低的序列作为“拒绝样本(rejected)”。设:

$$
T^+ = \arg\max_i r_i
$$

$$
T^- = \arg\min_i r_i
$$

其中 (T^+) 表示用户更偏好的推荐结果,(T^-) 表示相对较差的推荐结果。

在获得偏好对数据之后,就可以利用**Direct Preference Optimization(DPO)**对生成模型进行训练。DPO是一种无需显式强化学习策略梯度的偏好优化方法,其核心思想是直接优化模型在偏好对上的概率差异。设生成模型参数为 (\theta),参考模型参数为 (\theta_{ref}),则DPO目标函数可以表示为:

$$
L_{DPO} =

* \log
  \sigma
  \left(
  \beta
  \left[
  \log \frac{P_\theta(T^+|C_u)}{P_\theta(T^-|C_u)}
*

\log \frac{P_{\theta_{ref}}(T^+|C_u)}{P_{\theta_{ref}}(T^-|C_u)}
\right]
\right)
$$

其中:

* (\sigma(\cdot)) 为sigmoid函数
* (\beta) 为温度系数
* (P_\theta(T|C_u)) 为生成模型生成序列 (T) 的概率

该目标函数鼓励模型提高优选序列的生成概率,同时降低劣质序列的生成概率。

需要注意的是,在推荐系统场景中,构造偏好对数据比自然语言任务更加困难。原因在于推荐系统通常只有一次曝光机会,用户无法同时看到“chosen”和“rejected”两个推荐列表。因此,OneRec采用一种**自生成负样本(self-hard negative sampling)**策略:利用当前模型生成的候选列表作为对比样本,并通过奖励模型进行排序,从而构造个性化偏好数据。

随着训练不断进行,生成模型会逐渐产生更符合用户兴趣的推荐结果。与此同时,新的生成结果又会产生新的候选序列,从而形成新的偏好对数据。这种过程形成一个闭环:

```id="ipa"
生成候选列表
→ 奖励模型评分
→ 构造偏好对
→ DPO训练
→ 更新生成模型
→ 再次生成候选列表

通过这种迭代优化机制,模型能够不断提升推荐质量。

总体而言,Preference Alignment阶段的核心作用是将生成模型从“数据驱动学习”转变为“用户反馈驱动优化”。预训练阶段通过监督学习让模型掌握基本的推荐能力,而偏好对齐阶段则利用真实用户行为信号对模型进行精细调整,使生成结果更加符合用户兴趣。通过结合生成式推荐框架与偏好优化方法,OneRec能够在工业场景中实现端到端推荐系统的持续自我改进能力。

补充:

Decoder 训练样本的构成与强化学习的角色

一、Decoder 训练样本的本质:以曝光序列为骨架

在 OneRec 的预训练阶段,Decoder 的训练目标是当次曝光 session 中物品的 semantic token 序列。也就是说,无论用户对这些物品有没有产生点赞、评论等进一步行为,只要该物品出现在本次曝光列表中,它的 token 序列就构成预测目标的一部分。

这里的直觉是:预训练阶段的目标是让模型学会"从用户上下文中生成合理的物品序列"这一基础能力,而不是直接优化用户偏好。曝光数据是最丰富、最易获取的监督信号,因此作为预训练的骨架是合理的起点。

你担忧的问题——"曝光不等于喜欢"——是完全成立的,这正是 OneRec 需要 post-training 阶段的根本原因,后文会详细展开。


二、不同交互行为的信息去哪了?

这是理解 OneRec 架构的一个关键点:用户的不同交互行为(点赞、点击、完播、评论等)不是以特殊符号编码进 Decoder 的 token 序列,而是通过 Encoder 的特征工程注入模型。

具体来看,Encoder 中的 Short-term Pathway 和 Positive-feedback Pathway 在处理用户历史序列时,每个历史物品都附带了一个 label 特征向量 \(e^s_{\text{label}}\),其中包含了点赞、关注、转发、不喜欢、评论、进入主页等多种交互信号。不同行为对应不同的 embedding,拼接后经过 Dense 层变换,统一进入 Encoder 的 Transformer 层做 Self-Attention 建模。

因此,用户历史中"这个视频只是曝光"和"这个视频点了赞"的区别,是通过 label embedding 的差异在 Encoder 的表示空间中加以区分的,而非在 Decoder 侧以特殊分隔符标注。Decoder 只负责生成物品的 semantic token,它所接收的用户意图信号全部来自 Encoder 输出的 \(\mathbf{z}_{enc}\),通过 Cross-Attention 注入。


三、RSFT:对"曝光即目标"的第一层修正

进入 post-training 阶段,OneRec 做了第一步质量过滤,即 Reject Sampling Fine-Tuning(RSFT):将所有曝光 session 按播放时长排序,直接丢弃最低 50% 的 session,只保留用户实际深度参与的 session 作为训练目标。

这相当于用行为反馈对训练样本做了隐式的质量筛选——播放时长短的 session,大概率对应用户并不感兴趣的推荐结果,拿这类样本训练只会强化错误的分布。RSFT 并未改变损失函数的形式,仍然是 NTP 损失,但改变了"哪些 session 值得被学习"这一根本问题。


四、RL:对训练-推荐目标差距的根本性修正

你对强化学习角色的判断是精准的。RSFT 仍然受限于曝光空间,模型学到的是"过去系统推荐过、且用户看得还不错的内容"的分布,它无法主动探索那些从未曝光过但用户可能更喜欢的物品。这个上限问题,OneRec 用 on-policy RL 来突破。

RL 阶段的逻辑链条如下:模型在生成空间(不限于历史曝光)中采样生成物品,Reward System 对每个生成物品计算 P-Score(综合点击、完播、点赞等多目标的个性化偏好分),以此作为奖励信号,通过 ECPO 算法更新策略。

这个设计在概念上对应了你所描述的"训练目标与推荐系统真实期望之间的差距":预训练的目标是拟合历史曝光分布(有偏),RL 的目标是最大化用户真实偏好(无偏)。二者之间的差距,正是 RL 所要填补的空间。值得注意的是,P-Score 本身也是一个学习得到的综合评分模型,而非简单的加权求和,这使得奖励信号更具个性化,也更接近 Pareto 最优的多目标平衡。


小结

一句话概括整个训练体系的设计逻辑:预训练用曝光数据教会模型"能生成什么",RSFT 用质量过滤告诉模型"什么值得生成",RL 用奖励信号引导模型迈向"用户真正想要什么"。 三个阶段层层递进,共同缩小训练分布与推荐系统真实目标之间的差距。