阿里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。其中QQuery KKey VValue都来自输入序列本身。这种自注意力机制能让序列中的每个位置都关注到所有其他位置从而捕捉全局依赖。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训练时可以用N30或50。这能让模型学到更丰富的上下文信息并在线上对前20位做出更稳健的决策。负样本的构建这是一个极易踩坑的点。你的训练数据中的“列表”是用户真正看到并产生反馈的列表。但线上精排给PRM的候选列表是模型认为最好的N个。这两者分布不同直接使用曝光列表训练会导致模型在线上遇到“全是高精排分物品”的列表时表现不稳定。一个实用的技巧是“在线难负例采样”在构建训练样本时不仅使用真实的曝光列表还从精排候选池中随机采样一些分数较高但未曝光的物品混入列表中进行训练。这能提升模型的判别能力。损失函数的选择ListNet相对温和学习的是整个列表的分数分布。ListMLE直接最大化真实排列顺序的似然概率对顺序更敏感。LambdaRank / LambdaLoss这类方法将评价指标如NDCG的梯度直接融入损失函数是学习排序任务的利器。我的建议对于刚起步可以先用ListNet或ListMLE快速验证流程。当需要直接优化业务指标如NDCG10时再转向LambdaLoss系列。同时可以加入点级损失如点击率的BCE Loss作为辅助任务帮助模型稳定训练。3.3 线上服务与性能优化PRM模型一旦上线它的推理延迟是必须严肃对待的问题。复杂度分析Transformer的自注意力复杂度是 O(N² * d)。当N50 d128时计算量尚可接受。但如果N增大到200计算量将增长16倍。这是线上服务的巨大挑战。工程优化策略模型裁剪与蒸馏训练一个大的、效果好的教师模型然后将其知识蒸馏到一个层数更少、隐藏维度更小的学生模型中用于线上部署。缓存与预计算用户向量和物品的静态特征嵌入可以预先计算并缓存。线上推理时大部分计算是动态的注意力机制。可以考虑使用更高效的注意力实现如FlashAttention。分阶段排序不要对所有精排候选都做重排。可以采用“粗排精排重排”的三级漏斗。即先用一个轻量级模型或规则从几百个候选里快速筛选出80-100个再用PRM对这80-100个进行精细重排得到最终Top-K。这能大幅减少N。并行计算PRM对列表中每个物品的打分是独立的输出层只有中间的注意力层需要交互。可以利用GPU的并行能力一次性处理一个批次Batch的请求每个请求是一个列表从而摊薄开销。实操心得在首次上线PRM时不要追求完美的效果和复杂的特征。先搭建一个最小可行模型MVP只使用物品ID、品类ID和精排分作为特征用2层Transformer列表长度N20。快速验证整个训练-部署-AB测试的 pipeline 是否跑通。效果只要不差于之前的规则打散就是胜利。之后再迭代加入更复杂的特征和优化。4. 业务场景融合与效果评估技术最终要为业务服务。PRM模型不是一个黑盒子它的能力必须与具体的业务场景和商业目标紧密结合。4.1 如何定义“更好”的列表——多目标优化精排模型通常优化的是单一目标如点击率。而重排序阶段是我们引入多目标平衡的最佳时机。PRM如何实现多目标方法一特征融合。将其他业务目标的预估分也作为特征输入PRM。例如除了pCTR还输入pCVR转化率、pRPM单位曝光收入、以及代表多样性的特征如品类与列表中已有品类的重复度。让PRM模型在学习过程中自己探索这些特征与最终列表效果之间的关系。方法二多任务学习。在PRM的输出层不仅预测一个“综合得分”还可以并行预测几个辅助任务如“该物品是否属于新品类”、“该物品的价格是否具有竞争力”。在损失函数中将主排序损失和这些辅助任务的损失加权求和。这样模型的内在表征会学习到与多目标相关的信息。方法三后处理加权。这是一种更工程化的方法。用PRM输出一个基础分然后与其他业务模型的分进行加权融合最终分 α * PRM分 β * 多样性分 γ * 新品分。调整权重α β γ可以实现业务目标的快速调控。虽然不够“端到端”但在需要快速响应运营策略时非常灵活。4.2 效果评估不仅仅是线上AB测试评估一个重排序模型不能只看一个指标。离线评估指标列表级指标NDCGK,MAPK,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。探索机制在重排序阶段可以设计一个简单的探索策略例如以一个小概率ε将精排列表中靠后的某个新物品强行提升到列表前几位进行曝光收集反馈数据。最后我想说的是PRM模型不是一个“即插即用”的银弹。它是一套强大的工具但其效果严重依赖于业务场景、数据质量和工程实现。从简单的规则打散到引入学习型的重排序模型是推荐系统走向深度精细化运营的必然一步。这个过程需要算法、工程、产品同学的紧密合作。先从小流量实验开始搭建起从特征生产、模型训练、在线服务到效果评估的完整闭环然后持续迭代优化。当你看到推荐列表变得更加多样、更有逻辑、更能满足用户深层次需求时你会觉得这一切的折腾都是值得的。重排序这“最后一公里”的优化往往就是用户体验和商业价值提升的关键所在。