Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

📖 ⏱️ ~36 min read 🎯 Advanced

个性化重排

📝 Before You Continue: 请先读完 4.1 的贪心重排。本章建立在「重排要兼顾相关性与多样性」的共识上,但把手段从「人设目标函数」升级为「模型从数据端到端学习」。

上一节我们探讨了基于贪心策略的重排序方法。它们通过显式定义多样性、相关性或覆盖度的优化目标,在初始排序列表上做局部调整——计算效率高、可解释性强。但它们在处理 复杂的物品间相互影响深度个性化 时存在局限:

  • 目标函数往往需要 手工设计 ,难以捕捉高阶、非线性的交互模式;
  • 用户个性化信息 深度融入列表级优化也颇具挑战。

本章介绍两个经典的个性化重排模型: PRM(Personalized Re-Ranking Model)PRS(Permutation Retrieve System) ,看模型如何替我们「学会」最优列表。

读完本章,你将能够:

  • 解释 PRM 为何标志着重排从规则/启发式走向数据驱动、端到端学习
  • 描述 PRM 的输入层、编码层(Transformer)、输出层与 个性化向量 PV 的生成方式
  • 写出 自注意力公式,并说明 Softmax 在 PRM 输出层如何隐式建模物品间相对关系
  • 理解 排列变异影响(Permutation-Variant Influence),以及 PRS 为何要直接优化排列
  • 描述 PRS 的两阶段解法:PMatch(FPSA 候选生成)与 PRank(DPWN 排列评估)
  • 完成 4 道分层练习题,巩固 PRM/PRS 的核心机制

4.2.0 从规则到学习:为何需要个性化重排

贪心重排(MMR/DPP)的多样性目标是「通用」的——它对所有用户用同一套相似度与权重。但真实推荐里, 同一个列表对不同用户的最优排列是不同的 :有人爱先看深度长文、有人偏爱短视频;有人对价格敏感、有人不在乎。

这就是「个性化重排」的立身之本: 把用户独有的偏好信号,深度融入整张列表的优化过程。它不再依赖预设的多样性公式,而是让模型直接从海量行为数据中学习「哪些物品组合、以何种顺序,对这个用户最好」。

个性化重排:同一份候选,为不同用户生成不同的最优列表

💡 Key Insight: 规则法问「怎样的一份列表总体更优」;个性化重排问「对这个用户,怎样的一份列表更优」。前者是人群平均,后者是千人千面。

🧠 Mental Model: playlist DJ

把贪心重排想成「通用歌单生成器」——它只保证曲风不重复。把 PRM 想成「懂你的 DJ」——他知道你今晚想先听慢歌再听嗨歌,于是把顺序也排好了。模型学的不是「歌单该长什么样」,而是「的歌单该长什么样」。


4.2.1 Transformer 个性化重排模型(PRM)

PRM(Personalized Re-Ranking Model) 的提出,标志着重排序技术从基于规则/启发式,向数据驱动、端到端学习的重要转变。其核心思想是: 利用 Transformer 强大的序列建模能力,自动学习列表中物品间复杂的相互影响,并把细粒度的用户个性化信息深度融入整个重排序过程 ,通过最大化列表级效用目标(如点击率)进行全局优化。

PRM 的整体架构可分为三层:输入层、编码层、输出层。

输入层:融合个性化与位置

输入层的核心任务,是为初始列表 中每个物品 准备一个信息丰富的初始表示,需包含两个关键方面:

  1. 物品自身特征( :物品 ID 嵌入、类别、标签、统计特征等基础信息。
  2. 用户对该物品的个性化偏好( :编码用户 与物品 的互动关系与偏好程度,是 PRM 实现个性化的关键,后面详述。

PRM 将物品原始特征向量 与个性化向量 拼接(Concatenate) ,形成更全面的基础表示 。此外,初始列表本身包含潜在序列信息(排名靠前的物品可能更相关),因此引入可学习的 位置嵌入(PE) ,为每个位置赋予向量。最终输入表示为:

这一组合通常再经一个简单前馈网络做维度调整,以适配 Transformer 编码器输入。

编码层:Transformer 建模物品相互影响

输入层提供了带个性化与位置信息的物品序列。编码层的核心目标,是利用 Transformer 的序列建模能力 ,使列表中的所有物品相互关联,捕捉它们之间复杂的、高阶的相互影响。这一点对重排至关重要,因为:

  • 用户是否点击第 个物品,很可能受第 个(甚至更远)物品的显著影响(替代品、互补品、或提供多样性);
  • 这种影响往往是 长距离 的,不受物品初始物理位置限制。

Transformer 的核心机制是 自注意力(Self-Attention) :序列中每个物品可关注所有其他物品(含自己),通过计算查询向量 与其他物品键向量 的相似度得到注意力权重,决定聚合多少来自其他物品的 信息:

PRM 采用 多头注意力 ,组织在标准 Transformer 编码器块(含多头自注意力 + 前馈网络)中,并堆叠多层,逐层提炼更高阶的物品间依赖。最终输出每个物品的高级表示 ,融合了物品特征、用户个性化偏好与整列表上下文交互信息。

Analysis: 相对 MMR/DPP 的「两两相似度」,PRM 的自注意力能建模任意高阶、非线性的物品间依赖,且天然融入用户信号。代价是需要训练数据、推理成本高于规则法,且注意力权重不如 MMR 公式直观——可解释性下降。适合数据充足、对个性化收益敏感的核心场景。

输出层:Softmax 列表级打分

PRM 对每个物品的高级表示 施加线性变换(),映射为标量分数(logit),再输入 Softmax

Softmax 在此扮演两个关键角色:

  1. 归一化 :将所有分数转为概率分布,所有物品概率之和为 1;
  2. 隐含相对关系建模 :每个物品的最终概率不仅取决于自身分数,也取决于它与列表中所有其他物品分数的相对比较——这天然契合重排序需评估物品间相对重要性的需求。

个性化向量(PV)的生成

回顾整个流程, PV 是 PRM 区别于普通重排、实现真正「个性化」的关键。PV 从何而来?PRM 采用了一个巧妙且实用的策略: 利用预训练的点击率预估模型来生成 PV

  1. 预训练模型的作用 :在海量用户历史行为数据上训练,学习预测给定用户 及其行为历史 ,用户点击候选物品 的概率
  2. 提取个性化向量 :PRM 不直接使用 预训练模型预测的点击概率本身,而是提取该模型在输出最终点击概率(通常经 Sigmoid) 之前的那个隐藏层激活值。该向量蕴含了「用户 对物品 偏好程度」的丰富抽象信息,作为物品 相对用户 的个性化向量
  3. 输入 PRM :对初始列表每个物品 都通过上述预训练模型算出 ,作为关键输入送入 PRM 输入层。

核心代码(节选):

# 用户侧 Embedding -> [B, max_len, D],使每个位置都携带同一用户上下文
user_part_embedding = tf.tile(tf.expand_dims(user_part_embedding, axis=1),
                              [1, max_seq_len, 1])
# 页面级序列表示:用户 + 物品特征 + PV + Item Embedding 拼接
page_embedding = concat_func(
    [user_part_embedding, item_part_embedding, pv_embeddings, item_embeddings],
    axis=-1)                                                # ← KEY LINE: 融合四类信号
# 位置编码相加,形成 Transformer 最终输入
enc_inputs = add_func([page_embedding, position_embedding])  # ← KEY LINE: 注入位置信息
# Transformer 编码层堆叠
for _ in range(transformer_blocks):
    enc_inputs = TransformerEncoder(
        intermediate_dim, nums_head, dropout_rate,
        activation="relu", normalize_first=True, is_residual=True)(enc_inputs)
# 打分头:每个位置映射成一个概率
enc_output = tf.keras.layers.Dense(intermediate_dim, activation='tanh')(enc_inputs)
enc_output = tf.keras.layers.Dense(1)(enc_output)
score_output = tf.keras.layers.Activation(activation='softmax')(
    tf.keras.layers.Flatten()(enc_output))                  # ← KEY LINE: 列表级相对打分

源码实验显示,PRM 相比基线在 map@5 等指标上带来稳定提升,验证了端到端个性化重排的有效性。

下面用交互演示直观感受 PRM 如何以 Transformer 逐步「读」完整列表、再为每个位置输出重排后的相对概率:

点击「下一步」观察:初始列表如何带上 PV 与位置嵌入进入编码器,自注意力如何在各层逐步聚合跨物品信息,最后 Softmax 如何把分数转为重排后的相对概率。


4.2.2 基于排列组合的重排模型(PRS)

虽然 PRM 通过 Transformer 实现了端到端个性化重排,但它仍有一个根本性局限: 缺乏对排列组合影响的深度理解

想象一个场景:用户面对列表 [A, B, C] 时毫无购买欲望,但看到 [B, A, C] 这个排列时却买了 A。这种现象被称为 排列变异影响(Permutation-Variant Influence)——一种可能的解释是:把价格较高的 B 放在前面,会让用户觉得 A 相对便宜,从而激发购买欲。

排列变异影响:相同物品、不同顺序,用户行为截然不同

传统重排(含 PRM)主要关注 单个物品的分数优化 ,却忽略了 物品排列顺序本身 对用户行为的影响 。PRS 的设计思路是:评估所有可能的物品排列组合,选择用户体验最佳的那一个。但 个物品的排列有 种,计算上不可行,因此 PRS 提出 两阶段**解法:

  1. PMatch 阶段 :通过搜索算法快速筛选少数候选排列;
  2. PRank 阶段 :用神经网络模型评估这些候选排列的质量,选出最优解。

PRS 整体框架

PRS 两阶段框架:PMatch 生成候选排列,PRank 评估选出最优

PMatch 阶段:候选排列生成(FPSA)

PMatch(Permutation-Matching)的目标,是从指数级排列空间中高效识别候选排列。它采用 FPSA(Fast Permutation Searching Algorithm) ,结合 beam search 与两个用户行为预测模型。

离线训练:双模型预测体系

  1. CTR 模型 :预测用户点击某物品的概率
  2. Next 模型 :预测用户浏览完当前物品后继续浏览下一个的概率

两者均用标准 point-wise 建模(Sigmoid 激活 + 交叉熵损失):

Next 模型反映了用户浏览的 连续性 :物品不仅要能吸引点击,还要能引导用户继续浏览后续内容。

在线服务:FPSA 算法

FPSA 把用户浏览行为建模为 序列决策过程——物品在序列中的价值不仅取决于自身特征,更取决于它在整个浏览路径中的作用。其核心是一个 beam search 逐步构建候选排列,每步基于奖励函数剪枝。奖励融合两个指标:

  • rPV(Page View Reward) :衡量排列能带来的总浏览深度,鼓励能引导深度浏览的组合;
  • rIPV(Item Page View Reward) :衡量排列中物品被点击的总概率,确保商业价值。

FPSA 核心代码(节选):

def fpsa_algorithm(items, ctr_scores, next_scores, beam_size=5, max_length=10,
                   alpha=0.5, beta=0.5):
    """Fast Permutation Searching Algorithm(Beam Search 生成候选排列)。"""
    S = [()]                       # 候选排列集合,初始为「空序列」
    for i in range(1, max_length + 1):
        St = S.copy()
        S, R = [], {}
        for O in St:
            for ci in items:
                if ci not in O:
                    Ot = O + (ci,)   # 把未出现物品 ci 追加到尾部
                    r = calculate_estimated_reward(Ot, ctr_scores, next_scores, alpha, beta)
                    R[Ot], S.append(Ot) = r, Ot
        # Beam Search 截断:按奖励保留前 beam_size 个
        S = sorted(S, key=lambda x: R[x], reverse=True)[:beam_size]  # ← KEY LINE
    return S

def calculate_estimated_reward(O, ctr_scores, next_scores, alpha, beta):
    r_pv, r_ipv, p_expose = 1.0, 0.0, 1.0
    for ci in O:
        p_ctr, p_next = ctr_scores[ci], next_scores[ci]
        r_ipv += p_expose * p_ctr                 # 累加期望点击
        p_expose *= p_next                        # 曝光链概率随位置递减
    r_pv = p_expose                              # 浏览到末尾的概率
    return alpha * r_pv + beta * r_ipv           # 线性融合 PV 与 IPV

Analysis: FPSA 用 beam search 把 降到可控的候选集,是工程上「组合爆炸」的务实解法。但它依赖 CTR/Next 两个 point-wise 模型的精度,且奖励为线性融合,可能漏掉非线性的排列收益。

PRank 阶段:排列评估(DPWN)

PRank(Permutation-Ranking)接收 PMatch 生成的候选排列,用神经网络 DPWN(Deep Permutation-Wise Network) 评估每个排列质量。

DPWN 的设计理念:排列中每个物品的价值不仅取决于自身特征,更取决于它在 整个序列上下文中的位置和作用。为此采用 Bi-LSTM 架构:

  1. 序列编码层 :双向 LSTM 计算第 个物品的上下文表示:
  2. 特征融合层,融合序列表示与用户/物品特征。
  3. 预测层 :通过 MLP 预测每个位置点击概率

List Reward(LR) 是 PRank 的核心评估指标,定义为排列中所有物品预测点击概率之和:

在线服务时,PRank 计算每个候选排列的 LR,选择 LR 最高的排列作为最终输出。

💡 Key Insight: PRS 与 PRM 的根本分野在于——PRM 优化「每个物品的相对分数」,默认位置由分数决定;PRS 直接优化「排列顺序本身带来的体验收益**(LR)」,把顺序当作一等公民。前者重「选哪些」,后者重「怎么排」。

🧠 Mental Model: 货架陈列 vs 单品定价

PRM 像一位给每件商品定价的经理——他尽量让每件都标得准,但货架顺序只是按价格排。PRS 像一位讲究陈列的店长——他清楚「把贵的最终季款放前面,能让中间的平价款显得划算」,于是为整组商品的摆放顺序单独做优化。


⚠️ Common Mistakes in 4.2

#MistakeExampleWhy It's WrongFix
1以为 PRM 自带个性化「PRM 输入只有物品特征也能个性化」个性化来自 PV,PV 缺失则退化为普通重排必须接入预训练 CTR 模型的隐藏层作 PV
2混淆 PRM 与排序模型「PRM 就是个 CTR 预估」PRM 优化列表级相对关系,排序是逐点记住 PRM 输出是 Softmax 相对概率
3忽视排列变异影响「[A,B,C] 和 [B,A,C] 效果一样」顺序会改变用户相对价格/偏好感知PRS 类方法才把顺序当优化目标
4低估 组合爆炸「直接枚举所有排列选最优」10! ≈ 360万,20! 不可算用 PMatch 的 beam search 截候选
5把 PRS 当单阶段「PRank 直接搜排列」无 PMatch 候选生成,PRank 无从评估两阶段缺一不可

本章小结

📌 Key Takeaways

ConceptKey PointsWhy It Matters
个性化重排动机规则法对所有人同目标,缺乏千人千面把用户偏好深度融入列表优化
PRM 输入层,融合四类信号PV 是个性化核心
PRM 编码层Transformer 多头自注意力建模高阶相互影响捕捉跨物品、长距离依赖
PRM 输出层Softmax → 列表级相对概率隐式建模物品间相对重要性
PV 生成取预训练 CTR 模型隐藏层激活复用已有排序知识做个性化
排列变异影响同物品不同序→不同行为PRS 存在的动机
PRS 两阶段PMatch(FPSA+beam)→PRank(DPWN+LR)化解 组合爆炸

❓ FAQ

Q1: PRM 和 4.1 的 DPP 能一起用吗?

A: 可以且常见。DPP/MMR 常作为 PRM 的基线或后处理:先用 PRM 学列表级偏好,再用 DPP 做多样性约束兜底。二者互补——一个管个性化、一个管集合多样性。

Q2: PV 为什么取隐藏层而不是最终点击概率?

A: 最终点击概率是被 Sigmoid 压扁的标量,信息高度压缩;隐藏层激活是高维抽象向量,保留了「用户为何偏好该物品」的丰富语义,更适合作为 PRM 的个性化输入。

Q3: PRS 的 beam search 会不会漏掉真正最优排列?

A: 会。beam 只保留奖励前 的局部候选,是近似。但相比 全枚举,这是工程上必要的trade-off;实践中配合好的奖励函数,top 候选已足够优质。

前后关联

  • 4.1 (贪心重排)是 PRM/PRS 的对照基线——规则法轻量,个性化法表达力强。
  • Part 3 排序 提供 PRM 所需的预训练 CTR 模型与精排分数,是 PV 的来源。
  • Part 5 趋势 (生成式范式)将「列表生成」进一步端到端化,PRS 的排列优化思想在生成式架构中以自回归方式自然涌现。
  • 下篇生成式推荐 用单一序列模型替代「召回→排序→重排」级联,重排的目标被直接编进生成目标。

Practice Problems

Work through all problems in order — they get progressively harder. Each has a complete solution you can reveal after trying it yourself.


Problem 4.2.1 — 区分两类重排 🟢 Easy

判断下列描述更接近 (a) 贪心重排(MMR/DPP) 还是 (b) 个性化重排(PRM/PRS) ,并说明理由:

  • (i) 系统对每个用户都用同一套相似度矩阵与固定 做重排。
  • (ii) 系统为每位用户提取预训练 CTR 模型的隐藏层向量,作为重排输入。
💡 Solution (click to reveal)

Approach: 抓住「是否融入用户个性化、是否数据驱动」。

  • (i) 贪心重排 :固定相似度与 对所有用户一致,不带个性化,属规则/启发式。
  • (ii) 个性化重排(PRM) :从预训练 CTR 模型取隐藏层作 PV,是 PRM 的标志性做法,深度融入用户偏好。

Key points:

  • 有无「按用户定制的个性化信号」是两类方法的本质分水岭。
  • PV 的存在 ≈ PRM;固定目标函数 ≈ 贪心法。

Problem 4.2.2 — PRM 输入表示 🟢 Easy

PRM 中某物品 的最终输入表示 由哪些部分相加/拼接而成?写出公式并说明每一项解决什么问题。

💡 Solution (click to reveal)

Approach: 回忆 4.2.1 输入层。

公式:

  • 拼接 :融合「物品是什么」与「用户多偏好它」(个性化),解决「千人千面」问题;
  • 位置嵌入 :注入列表中的位置信息,解决「Transformer 本身不含顺序」的问题。

Key points:

  • 拼接(concat)用于融合不同来源特征,相加用于注入位置。
  • 三者缺一不可:无 PV 则无个性化,无 PE 则无序感。

Problem 4.2.3 — 排列变异影响分析 🟡 Medium

某电商列表有物品 [A(贵), B(平价), C(平价)]。产品经理发现把 [A, B, C] 改成 [B, A, C] 后,A 的点击率明显上升。请用「排列变异影响」解释这一现象,并指出该现象对重排方法选型的启示。

💡 Solution (click to reveal)

Approach: 用 4.2.2 的排列变异影响框架。

  • 解释 :A 是贵价品。当 A 排在第一([A,B,C])时,用户先看到高价,阈值被抬高;改成 [B,A,C] 后,用户先看平价 B,再看到 A 时产生「相对便宜」的错觉,购买欲被激发——即 顺序改变了用户对价值的相对感知 ,这就是排列变异影响。
  • 启示 :传统逐点打分(含 PRM 的分数优化)默认「顺序不影响单品价值」,会漏掉这种收益。需要像 PRS 那样把「排列顺序」本身作为优化目标(用 LR 评估整列收益),才能捕捉顺序带来的体验增益。

Key points:

  • 排列变异影响 = 同物品、不同序 → 不同行为。
  • 它指向「顺序是一等优化目标」的方法(PRS),而非仅优化单品分数的方法。

🏆 Challenge: 设计一个混合重排方案 🔴 Hard

某信息流产品希望同时获得「个性化」(PRM 所长)与「强集合多样性」(DPP 所长),并控制推理延迟。请写一段方案论证:如何将 PRM 与 DPP 结合(顺序/并联/级联),并指出每种子方案的一个风险点与缓解手段(150 字内)。

💡 Hint

常见三种结合:(1) 级联——PRM 出分后 DPP 做多样性后处理,风险是 DPP 可能破坏 PRM 学到的个性化顺序,缓解用软约束;(2) 并联——两路打分加权融合,风险是权重难调,缓解用离线网格搜索;(3) DPP 核矩阵注入 PV——把 PRM 的 PV 编码进 ,风险是核矩阵需重算,缓解用增量更新。论证聚焦一种即可。