快手推荐系统模型速览

推荐模型的一个大概结构如图所示。

我们将要介绍快手的几个推荐系统模型。QARM和OneRec。

我们将按时间顺序介绍。

QARM

QARM= Quantitative Alignment Multi-Modal Recommendation

作者认为由于计算代价过大,导致业内通常使用非端到端的模型——二步部署方案,先使用MLLM提取embedding,再进一步训练。

Feature->Encoder->Embedding->Model

作者认为这种非端到端的模型有以下问题:

(1)embedding不匹配。

MLLM通常是由图文匹配训练的,而基于ID的特征并不是。

(2)embedding遗忘。

新添加的多模态特征不会随着推荐系统的训练而更新,而其他基于离散ID的特征(用户ID、物品ID等)可以实时端到端优化。

算法

检索模型遵循的经典设计:

这也就是推荐系统常用的“双塔模型”。

QARM整体架构:

对齐

首先通过以下方式生成高质量的项目对:

  • 基于User2Item检索模型,针对每位用户正向点击的目标项目,从其最近50次正向点击的项目集合中,选取在ID表示空间内相似度最高的项目作为触发项。

  • 基于Item2Item检索模型,利用已学成稳定且高相似度的物品对作为数据源,例如从我们的Swing检索模型中导出的数据。

再通过对比学习进行批量(为$\beta$)训练:
$$
\begin{align}
M _ {trigger}&=MLLM(T _ {trigger}^{text},T _ {trigger}^{audio},T _ {trigger}^{image})\\
M _ {target}&=MLLM(T _ {target}^{text},T _ {target}^{audio},T _ {target}^{image})\\
\mathcal{L} _ {align}&=Batch\_Contrastive(M _ {trigger},M _ {target},\beta)
\end{align}
$$

Quantitative Code

作者首先是将多模态表征量化压缩成语义ID, 再将语义ID输入到推荐模型中。

作者采用了两种量化机制。

一种是最常用的VQ,首先训练一个codebook,然后利用top-k最近邻搜索来哈希表示。

由于预训练的MLLM已经能表示复杂项目的相关系数,故不再训练codebook,而直接采用所有项目的对齐作为codebook。

另一种是RQ,即Residual-Quantized。出自RQ-VAE。

具体而言,

端到端训练

最后将这几个编码作为新的ID特征送入模型中,进行端到端训练:

OneRec

虽然也是快手出品,但研究团队完全换了一批人。

该模型用统一的生成模型替换了级联学习框架。是第一个端到端的生成模型。

该模型基于tranformer。首先使用QARM的对齐和Quantitative Code的方法来作为Tokenizer,转化为模型可以接受的输入。

完成模型的预训练之后, 由于模型是只预测next-token。所以还会再利用 DPO 等强化学习进行对齐训练。最后,在预测的时候, 通过 beam search 筛选出视频流。

Tokenizer

编码器部分

多尺度特征工程

用户静态路径

用户静态路径生成核心用户特征的紧凑表示,包含用户标识符(uid)、年龄(age)、性别(gender)等,随后将其变换为模型的隐藏维度。

短期路径

挑选用户最近交互的 ($L_s=20$) 个视频的 <video identifier, author identifier, tag, timestamp, playtime, duration, labels> 等信息进行融合:

正反馈路径

将用户给与最多正反馈的 ($L_p=200$) 个视频的 <video identifier, author identifier, tag, timestamp, playtime, duration, labels> 等信息进行融合:

对于以上三个部分,变换方式都是:$f_u$为各特征拼接,$h_u=Dense(LeakyReLU(Dense(f_u)))$。

终身路径

终身行为路径旨在处理包含多达 100,000 个视频序列的超长用户交互历史。直接对此类序列应用注意力机制在计算上是不可行的。

行为压缩

使用类似QARM的分层 K-均值,使用最接近簇中心的项目作为该簇的代表。

特征聚合

依旧使用上面的:$f_u$为各特征拼接,$h_u=Dense(LeakyReLU(Dense(f_u)))$。

最后再通过 QFormer 压缩。

解码器

对于每个目标视频 $m$,解码器输入序列通过将可学习的序列起始 token 与视频的语义标识符连接而构造:

$$
S_m = \{s_{\text{EOS}}^1, s_m^1, s_m^2, \dots, s_m^{L_s}\}
$$

$$
d_m^{(0)} = \text{Emb_lookup}(S_m)
$$

解码器通过 $L_{\text{dec}}$ Transformer 层处理此序列。每层执行顺序操作:

$$
d_m^{(l+1)} = d_m^{(l)} + \text{CausalSelfAttn}(d_m^{(l)})
$$

$$
d_m^{(l+1)} = d_m^{(l+1)} + \text{CrossAttn}(d_m^{(l+1)}, Z_{\text{enc}}, Z_{\text{enc}})
$$

$$
d_m^{(l+1)} = d_m^{(l+1)} + \text{MoE}(\text{RMSNorm}(d_m^{(l+1)}))
$$

每个解码器层都包含一个混合专家模型 (MoE) 前馈网络,以增强模型容量,同时保持计算效率。MoE 层采用 $N_{\text{experts}}$ 个专家网络,并采用 top-k 路由策略:

$$
\text{MoE}(x) = \sum_{j=1}^k \text{Gate}_j(x) \cdot \text{Expert}_j(x)
$$

其中 $\text{Gate}_j(x)$ 表示由路由机制确定的权重,$\text{Expert}_j(x)$ 表示第 $j$ 个选定的专家网络的输出。并使用了DeepseekV3的无损失的负载均衡策略。

强化学习

在训练过程中,这些塔使用相应的目标标签作为辅助任务计算二元交叉熵(BCE)损失。每个塔的隐状态,连同用户和物品的表示,被输入到最终层的多层感知机(MLP)中。该 MLP 之后是一个单塔输出 P-Score,它使用所有目标的标签计算二元交叉熵损失。

使用的是GRPO的修改版(被称为早起阶段GRPO,ECPO),具体而言,多了31式:

生成格式正则化

引入强化学习与 ECPO会显著增加了非法输出的生成,即在推
理过程中生成没有对应物品 ID 的语义 ID 序列。

这是由于挤压效应引起的,即当A<0时,一部分合法token被挤压到非法token,使得模型难以区分合法token。

作者直接引入格式奖励以鼓励模型正确生成。具体而言,对合法样本设置为1,对非法样本设置为0,即丢弃。

参考文献

OneRec Technical Report.http://arxiv.org/abs/2506.13695

OneRec: Unifying Retrieve and Rank with Generative Recommender and Preference Alignment.https://arxiv.org/abs/2502.18965


快手推荐系统模型速览
https://lijianxiong.space/2025/20250714/
作者
LJX
发布于
2025年7月14日
许可协议