阿里PRM模型:用Transformer实现推荐系统重排序的全局优化
1. 项目概述:从“推什么”到“怎么排”的最后一公里
在推荐系统的江湖里,流传着一句话:“召回决定天花板,排序决定用户体验,而重排序,则是决定最终商业价值的那临门一脚。” 我们做推荐,第一步是“大海捞针”,从百万甚至亿级的商品库里,通过召回策略捞出几百上千个候选;第二步是“精挑细选”,用一个精排模型给这些候选打分,预估用户点击、转化等核心指标,排出一个初步的序。但故事到这里就结束了吗?远远没有。
想象一下,你是一个电商平台的用户,搜索“夏季连衣裙”。精排模型可能会根据你的历史行为,把十几款风格、颜色、价格都极其相似的碎花连衣裙排在最前面。从模型打分来看,这没错,它们都是高点击率、高转化率的“好商品”。但从你的体验来看呢?满屏的“连连看”,你可能会觉得平台品味单一,甚至怀疑是不是在清库存。这就是精排模型的“盲区”:它追求的是单个物品的预估准确率最大化,却忽略了列表整体的多样性、上下文连贯性、以及商业策略的融合。
重排序(Re-ranking)要解决的,正是这个“最后一公里”的问题。它的任务不再是给单个物品打分,而是对精排输出的、已经按分数排好序的列表进行全局优化和重新排列。目标是在保证整体推荐效果(如总点击率)不大幅下降的前提下,引入多样性、新鲜度、品类均衡、价格带分布等业务目标,让最终的推荐列表看起来更“聪明”、更“人性化”。
阿里巴巴的PRM模型(Personalized Re-ranking Model),就是在这个背景下诞生的一把利器。它没有沿用传统的规则打散、启发式算法,而是将Transformer这一在NLP领域大放异彩的架构,创造性地引入了推荐系统的重排序任务中。其核心思想是:将待排序的物品列表视为一个“序列”,利用Transformer强大的序列建模和全局注意力机制,来捕捉列表中任意两个物品之间的相互影响关系,从而学习出一个最优的全局排列。
简单来说,精排模型看的是“用户-单个物品”的关系,而PRM看的是“用户-物品列表”的关系,它要回答的问题是:“当这一批物品同时出现在用户面前时,怎样的排列顺序能带来最好的综合收益?” 这不仅仅是技术上的升级,更是推荐思维从“点”到“面”的跃迁。接下来,我们就深入PRM的内部,看看它是如何实现这一点的。
2. PRM模型核心架构与设计思想拆解
PRM模型的论文全称是《Personalized Re-ranking for Recommendation》,它发表于2019年的RecSys会议。其设计非常巧妙,可以看作是为推荐重排序任务“量身定制”的Transformer。要理解它,我们需要先抛开复杂的公式,从它的输入、处理和输出三个层面来把握其设计精髓。
2.1 输入层:如何为物品制作“身份证”
Transformer的输入是词嵌入(Word Embedding)。在PRM中,输入的则是“物品嵌入”(Item Embedding)。但这里的物品嵌入不是简单的ID Embedding,而是一个融合了多重信息的“特征向量”。通常包括:
- 物品静态特征嵌入:物品ID、品类ID、品牌ID、价格区间等。这些Embedding通过查找预训练好的嵌入表得到。
- 物品动态特征嵌入:物品在精排模型中的预估分数(如pCTR, pCVR)。这是一个极其重要的信号,它代表了精排模型对这个物品的“认可度”。PRM的任务不是推翻精排,而是在此基础上进行优化。
- 位置编码:和原始Transformer一样,PRM需要知道每个物品在初始列表中的位置。因为重排序是对一个有序列表的调整,初始顺序(即精排分的高低)本身就是一个强先验信息。这里使用的是Transformer标准的正弦余弦位置编码。
最终,对于一个长度为N的候选物品列表,输入到PRM的是一个N x d_model的矩阵,其中每一行代表一个物品的“综合身份证”。这个设计的关键在于,它把精排分作为特征输入,而不是作为不可更改的约束。这样模型既能尊重精排的结果,又保留了调整顺序的灵活性。
2.2 核心层:Transformer编码器与个性化注意力
这是PRM的灵魂所在。它使用了Transformer的编码器(Encoder)部分,但做了关键性的改造。
标准的Transformer注意力机制是:Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V。其中Q(Query), K(Key), V(Value)都来自输入序列本身。这种自注意力机制能让序列中的每个位置都关注到所有其他位置,从而捕捉全局依赖。
PRM的个性化注意力机制:PRM认为,在推荐场景下,物品之间的相互影响(是互补还是竞争)是高度依赖于当前用户的。因此,它在计算注意力权重时,引入了一个可学习的“用户向量”作为偏置(Bias)。
具体来说,其注意力分数的计算可以简化为:Attention_Score(i, j) = (E_i W_Q) (E_j W_K)^T / sqrt(d_k) + P_{ij}其中,E_i,E_j是物品i和j的嵌入,W_Q,W_K是可学习参数。而P_{ij}就是一个个性化偏置项,它由用户向量和物品对共同决定。论文中提出了一种计算P的方法,其思想是衡量物品j对于用户u的“个性化影响”。
这个设计的直观理解是:对于用户A,物品i(比如游戏鼠标)和物品j(比如机械键盘)可能是强互补关系,同时出现能相互促进点击;而对于用户B(一个办公族),这两个物品可能就没啥关系。P_{ij}这个偏置项,就是为了建模这种用户个性化的物品间关系。这是PRM区别于直接用原始Transformer做重排序的核心创新点。
注意:在实际实现中,这个个性化偏置项的计算有多种方式,可以是用户向量与物品嵌入的交互,也可以是一个小型的神经网络。其目的都是将用户信息注入到序列物品关系的建模中。
经过多层这样的个性化Transformer编码器后,每个物品的初始嵌入,都被融合了列表中所有其他物品的信息以及用户个性化的影响,生成了一个新的、上下文感知的“增强嵌入”。
2.3 输出层与训练目标:学习“最优排列”
得到了每个物品的增强嵌入后,PRM通过一个简单的全连接层+Softmax,为每个物品输出一个“重排序分数”。
关键问题来了:模型怎么学?我们有什么样的标签来训练这个模型?这是一个重排序任务特有的挑战。我们没有一个天然的“最优顺序”作为监督信号。
PRM采用了列表级的监督信号进行训练。常见的训练目标有两种:
- 基于列表级损失函数:比如
ListNet或ListMLE。这些损失函数不关心每个物品的绝对分数,而是比较模型预测的排列顺序与真实顺序(通常是用户反馈产生的顺序,如点击序列)之间的差异。例如,用户依次点击了物品A、B、C,那么这个[A, B, C]的顺序就可以作为正样本,模型学习去让预测的顺序尽可能接近它。 - 基于用户后续整体行为的奖励:这更接近强化学习的思路。可以将整个推荐列表展示给用户后,用户的后续会话总时长、总转化金额等作为奖励(Reward),通过策略梯度等方法训练模型最大化这个期望奖励。
在阿里巴巴的实践中,更可能采用的是第一种与业务指标结合的混合目标。例如,在电商场景,训练目标可能是最大化“列表整体点击率”或“总成交额”,同时通过损失函数让模型学会拟合那些产生了高价值的真实曝光序列。
最终,在线上服务时,对精排给出的Top-K个候选物品,用训练好的PRM模型为每个物品重新打分,然后按新分数降序排列,就得到了重排序后的最终列表。
3. 从零到一:PRM模型的实操实现要点
理解了原理,我们来看看如果要自己动手实现一个PRM模型,或者在公司业务中尝试引入,需要关注哪些实操要点。这里我结合自己的经验,分享几个关键环节。
3.1 特征工程:比模型结构更重要的基石
“Garbage in, garbage out.” 这句话对PRM尤其适用。模型的输入特征决定了其能力上限。
- 精排分的重要性:必须将精排模型输出的核心预估分(如pCTR, pCVR, pGMV)作为特征输入。这是连接两个阶段的桥梁。你可以直接使用原始分数,也可以将其分桶(binning)后做嵌入。我建议同时输入原始值和分桶嵌入,让模型自己学习如何利用。
- 物品侧特征的深度:不要只停留在ID类特征。尽可能加入丰富的内容特征:
- 多模态特征:商品的封面图通过CV网络(如ResNet)提取的图像嵌入;标题和描述通过NLP模型(如BERT)提取的文本嵌入。这些嵌入可以作为特征向量直接拼接进来。
- 统计特征:物品近7天的曝光点击率、成交转化率、加购率等。这些实时特征能反映物品的近期热度趋势。
- 交叉特征:例如“品类-价格区间”的交叉ID。这能为模型提供一些先验的结构化信息。
- 用户信息的注入方式:除了通过注意力机制中的个性化偏置,也可以将用户画像特征(年龄、性别、消费等级)和近期行为序列的聚合表征(如通过Pooling)作为一个全局向量,与每个物品的初始嵌入进行拼接(Concatenation)后再输入Transformer。这是一种更直接的用户信息融合方式,可以和个性化注意力机制互补。
3.2 模型训练技巧与陷阱
训练一个列表级的模型,比训练点级(Point-wise)的精排模型要复杂。
- 列表长度N的选择:这是一个超参数。N太小,模型学习的全局上下文有限;N太大,计算复杂度呈平方增长,且很多尾部物品可能无关紧要。通常,精排会输出100-300个候选,PRM的重排序列表长度在10-50之间。我的经验是,训练时使用的列表长度应略大于线上服务的长度。例如,线上重排Top-20,训练时可以用N=30或50。这能让模型学到更丰富的上下文信息,并在线上对前20位做出更稳健的决策。
- 负样本的构建:这是一个极易踩坑的点。你的训练数据中的“列表”,是用户真正看到并产生反馈的列表。但线上精排给PRM的候选列表,是模型认为最好的N个。这两者分布不同,直接使用曝光列表训练,会导致模型在线上遇到“全是高精排分物品”的列表时表现不稳定。一个实用的技巧是“在线难负例采样”:在构建训练样本时,不仅使用真实的曝光列表,还从精排候选池中,随机采样一些分数较高但未曝光的物品,混入列表中进行训练。这能提升模型的判别能力。
- 损失函数的选择:
- ListNet:相对温和,学习的是整个列表的分数分布。
- ListMLE:直接最大化真实排列顺序的似然概率,对顺序更敏感。
- LambdaRank / LambdaLoss:这类方法将评价指标(如NDCG)的梯度直接融入损失函数,是学习排序任务的利器。
- 我的建议:对于刚起步,可以先用
ListNet或ListMLE快速验证流程。当需要直接优化业务指标(如NDCG@10)时,再转向LambdaLoss系列。同时,可以加入点级损失(如点击率的BCE Loss)作为辅助任务,帮助模型稳定训练。
3.3 线上服务与性能优化
PRM模型一旦上线,它的推理延迟是必须严肃对待的问题。
- 复杂度分析:Transformer的自注意力复杂度是 O(N² * d)。当N=50, d=128时,计算量尚可接受。但如果N增大到200,计算量将增长16倍。这是线上服务的巨大挑战。
- 工程优化策略:
- 模型裁剪与蒸馏:训练一个大的、效果好的教师模型,然后将其知识蒸馏到一个层数更少、隐藏维度更小的学生模型中,用于线上部署。
- 缓存与预计算:用户向量和物品的静态特征嵌入可以预先计算并缓存。线上推理时,大部分计算是动态的注意力机制。可以考虑使用更高效的注意力实现,如
FlashAttention。 - 分阶段排序:不要对所有精排候选都做重排。可以采用“粗排+精排+重排”的三级漏斗。即先用一个轻量级模型(或规则)从几百个候选里快速筛选出80-100个,再用PRM对这80-100个进行精细重排,得到最终Top-K。这能大幅减少N。
- 并行计算:PRM对列表中每个物品的打分是独立的(输出层),只有中间的注意力层需要交互。可以利用GPU的并行能力,一次性处理一个批次(Batch)的请求,每个请求是一个列表,从而摊薄开销。
实操心得:在首次上线PRM时,不要追求完美的效果和复杂的特征。先搭建一个最小可行模型(MVP):只使用物品ID、品类ID和精排分作为特征,用2层Transformer,列表长度N=20。快速验证整个训练-部署-AB测试的 pipeline 是否跑通。效果只要不差于之前的规则打散,就是胜利。之后再迭代加入更复杂的特征和优化。
4. 业务场景融合与效果评估
技术最终要为业务服务。PRM模型不是一个黑盒子,它的能力必须与具体的业务场景和商业目标紧密结合。
4.1 如何定义“更好”的列表?——多目标优化
精排模型通常优化的是单一目标(如点击率)。而重排序阶段,是我们引入多目标平衡的最佳时机。PRM如何实现多目标?
- 方法一:特征融合。将其他业务目标的预估分也作为特征输入PRM。例如,除了pCTR,还输入pCVR(转化率)、pRPM(单位曝光收入)、以及代表多样性的特征(如品类与列表中已有品类的重复度)。让PRM模型在学习过程中,自己探索这些特征与最终列表效果之间的关系。
- 方法二:多任务学习。在PRM的输出层,不仅预测一个“综合得分”,还可以并行预测几个辅助任务,如“该物品是否属于新品类”、“该物品的价格是否具有竞争力”。在损失函数中,将主排序损失和这些辅助任务的损失加权求和。这样,模型的内在表征会学习到与多目标相关的信息。
- 方法三:后处理加权。这是一种更工程化的方法。用PRM输出一个基础分,然后与其他业务模型的分进行加权融合:
最终分 = α * PRM分 + β * 多样性分 + γ * 新品分。调整权重α, β, γ可以实现业务目标的快速调控。虽然不够“端到端”,但在需要快速响应运营策略时非常灵活。
4.2 效果评估:不仅仅是线上AB测试
评估一个重排序模型,不能只看一个指标。
离线评估指标:
- 列表级指标:
NDCG@K,MAP@K,MRR。这些是排序任务的经典指标,能直接衡量列表顺序的质量。 - 多样性指标:
品类覆盖率、平均品类间隔。计算推荐列表中不同品类的数量,以及相同品类物品之间的平均距离。 - 新颖性指标:
流行度基尼系数、新物品占比。衡量推荐列表是否过于集中在热门商品,以及给新商品多少曝光机会。 - 商业指标模拟:在离线数据上,根据新的列表顺序,模拟计算预期的
人均点击次数、人均成交金额等。
- 列表级指标:
线上AB测试核心指标:
- 核心用户体验指标:
点击率(CTR)、转化率(CVR)、人均停留时长、滑动深度。PRM的首要任务是稳住甚至提升这些基础体验指标。 - 多样性/新颖性指标:
品类点击分布、长尾商品点击占比。通过统计实验组和对照组用户点击物品的分布,来看多样性是否提升。 - 商业指标:
总成交额(GMV)、笔单价。这是业务的终极目标。一个好的重排序,应该能在不损害用户体验的前提下,提升商业价值。 - 长期指标:关注用户
次日/7日留存率。更丰富、更不重复的推荐,理论上应该能提升用户的长期粘性。
- 核心用户体验指标:
避坑指南:线上实验时,经常会出现“CTR微跌,但GMV和时长上涨”的情况。这时候需要业务方和算法同学达成共识:我们的优化第一目标是什么?如果GMV提升显著,且CTR跌幅在统计误差内或可接受范围内,那么这个重排序策略可能就是成功的。切忌盲目追求单一指标的提升。
5. 实战中常见问题与排查思路
在实际部署和迭代PRM模型的过程中,我遇到过不少“坑”。这里总结几个典型问题及其排查思路,希望能帮你少走弯路。
5.1 问题一:模型效果不稳定,线上指标波动大
- 现象:离线评估指标很好,但上线后AB测试效果时好时坏,甚至有时显著负向。
- 可能原因与排查:
- 训练/线上数据分布不一致:这是最常见的原因。检查训练数据中的“列表”是否与线上PRM接收到的列表分布一致。线上列表是精排的Top结果,全是高分物品;而训练数据中的列表是历史曝光列表,包含了很多中等或低分物品。解决方案:采用上文提到的“在线难负例采样”技术,在训练中模拟线上分布。
- 特征穿越:这是数据层面的致命错误。例如,使用了物品在曝光之后才产生的统计特征(如点击率)。这会导致模型学到“未来信息”,离线评估虚高,线上失效。解决方案:严格进行特征的时间点校验,所有特征必须使用曝光时刻之前的数据生成。
- 模型过拟合:离线指标高,线上不涨。检查训练集和验证集的差距。如果模型层数或参数过多,而数据量不足,容易过拟合。解决方案:增加Dropout, 使用早停(Early Stopping), 或者收集更多训练数据。
5.2 问题二:模型倾向于打乱精排顺序,但业务上不允许过度打散
- 现象:PRM输出的列表与精排原始列表差异很大,虽然多样性指标上去了,但核心业务指标(如CTR)下降明显。
- 可能原因与排查:
- 精排分特征权重过低:在PRM模型中,精排分这个特征的贡献度被其他特征(如多样性特征)淹没了。解决方案:可以尝试在损失函数中加入一个“顺序一致性”正则项,惩罚与精排原始顺序偏离过大的预测。或者,在模型结构上,将精排分作为一个特殊的、直接通往输出层的特征(类似残差连接),确保其影响力。
- 业务目标权重失衡:在多目标优化中,赋予多样性等目标的权重过高。解决方案:调整多任务损失函数中的权重,或者在后处理加权中,降低多样性分数的权重。这是一个业务和技术权衡的过程,需要通过AB测试找到一个平衡点。
5.3 问题三:线上服务延迟过高,影响用户体验
- 现象:推荐接口的响应时间(P99)明显变长。
- 可能原因与排查:
- 列表长度N过大:这是主要瓶颈。解决方案:如前所述,采用分阶段策略,先用简单规则或模型做一次粗筛,减少输入PRM的列表长度。
- 模型参数过多:Transformer的参数量主要在于注意力层和FFN层。解决方案:尝试减少
d_model(隐藏层维度)和d_ff(前馈网络维度)的大小。或者使用更高效的注意力变体,如Linformer或Reformer,它们能将复杂度从O(N²)降低到O(N)或O(N log N)。 - 服务框架未优化:未使用GPU推理,或未进行批处理(Batch Inference)。解决方案:将模型部署在GPU推理服务上(如TensorRT, TorchServe),并将多个用户请求组成一个Batch进行并行计算,能极大提升吞吐量,降低平均延迟。
5.4 问题四:如何处理新物品或冷门物品?
- 现象:新上架的商品或历史行为少的商品,在重排序中永远排不到前面。
- 可能原因与排查:
- 特征缺失或弱:新物品的ID嵌入是随机的,统计特征全为零,导致模型无法有效评估。解决方案:
- 使用内容特征:强烈依赖图像、文本等多模态内容特征,这些特征对新物品是立即可用的。
- 冷启动Embedding池:建立一个“品类/品牌默认Embedding池”,新物品可以继承其所属品类或品牌的平均Embedding。
- 探索机制:在重排序阶段,可以设计一个简单的探索策略,例如,以一个小概率ε,将精排列表中靠后的某个新物品,强行提升到列表前几位进行曝光,收集反馈数据。
- 特征缺失或弱:新物品的ID嵌入是随机的,统计特征全为零,导致模型无法有效评估。解决方案:
最后,我想说的是,PRM模型不是一个“即插即用”的银弹。它是一套强大的工具,但其效果严重依赖于业务场景、数据质量和工程实现。从简单的规则打散,到引入学习型的重排序模型,是推荐系统走向深度精细化运营的必然一步。这个过程需要算法、工程、产品同学的紧密合作。先从小流量实验开始,搭建起从特征生产、模型训练、在线服务到效果评估的完整闭环,然后持续迭代优化。当你看到推荐列表变得更加多样、更有逻辑、更能满足用户深层次需求时,你会觉得这一切的折腾都是值得的。重排序这“最后一公里”的优化,往往就是用户体验和商业价值提升的关键所在。