列表式重评分 vs 多样性打散:区别与联系
一、你的理解是对的,但不完全
你的理解基本正确 :列表式重评分确实是为了确保多样性。但更准确地说,它是多样性控制的一种方式,而不是传统意义上的"打散"。
二、两种多样性机制对比
2.1 列表式重评分(Listwise Rescoring)
本质 :调整分数,让多样性通过分数体现
工作方式:
候选列表(已按分数排序)
↓
按Key分组(如作者ID)
↓
组内按分数排序
↓
根据位置调整分数(衰减)
↓
重新按分数排序
↓
多样性自然体现
特点:
- ✅ 间接多样性:通过降低同组候选的分数来实现
- ✅ 保留排序:仍然按分数排序,只是分数被调整了
- ✅ 平滑衰减:使用指数衰减,平滑过渡
- ✅ 位置感知:根据候选在组内的位置调整
示例:
排序前:
推文A(作者1,分数10.0)
推文B(作者1,分数9.5)
推文C(作者2,分数9.0)
列表式重评分后:
推文A(作者1,分数10.0 × 1.0 = 10.0)
推文C(作者2,分数9.0 × 1.0 = 9.0)
推文B(作者1,分数9.5 × 0.84 = 7.98)
最终排序:A → C → B(作者多样性)
2.2 多样性打散(Diversity Shuffling/MMR)
本质 :重新选择顺序,直接确保多样性
工作方式:
候选列表(已按分数排序)
↓
使用MMR算法重新选择
↓
score = relevance + diversityWeight × distance
↓
逐个选择最合适的候选
↓
直接打散,确保多样性
特点:
- ✅ 直接多样性:通过MMR算法直接选择多样化的候选
- ✅ 重新排序:不依赖原始分数排序
- ✅ 距离计算:基于嵌入向量计算距离
- ✅ 贪心选择:逐个选择最优候选
示例(MMR算法):
候选:
推文A(作者1,分数10.0,嵌入[0.8, 0.6])
推文B(作者1,分数9.5,嵌入[0.7, 0.5])
推文C(作者2,分数9.0,嵌入[0.9, 0.7])
MMR选择:
1. 选择A(分数最高)
2. 选择C(虽然B分数更高,但与A距离更远,多样性更好)
3. 选择B
最终顺序:A → C → B(直接打散)
三、X推荐系统中的多样性机制
3.1 多样性机制的层次
X推荐系统使用了多层多样性机制:
┌─────────────────────────────────────────────────────────┐
│ 层次1: 列表式重评分(评分阶段) │
│ - AuthorBasedListwiseRescoringProvider │
│ - CandidateSourceDiversityListwiseRescoringProvider │
│ - ContentExplorationListwiseRescoringProvider │
│ 方式:调整分数,间接实现多样性 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 层次2: 多样性重评分(评分阶段) │
│ - DiversityRescoringFeatureHydrator (MMR算法) │
│ - CategoryDiversityRescoringFeatureHydrator │
│ 方式:使用MMR算法重新计算分数,直接实现多样性 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 层次3: 选择器调整(选择阶段) │
│ - SortFixedPositionContentExplorationMixedCandidates │
│ - KeepTopKCandidatesPerCommunity │
│ 方式:在最终选择时调整位置,确保多样性 │
└─────────────────────────────────────────────────────────┘
3.2 列表式重评分 vs MMR多样性重评分
| 特性 | 列表式重评分 | MMR多样性重评分 |
|---|---|---|
| 实现方式 | 调整分数 | 重新计算分数 |
| 算法 | 位置衰减 | MMR(贪心选择) |
| 输入 | 已有分数 | 相关性分数 + 嵌入向量 |
| 输出 | 调整后的分数 | 重新计算的分数 |
| 多样性保证 | 间接(通过分数) | 直接(通过选择) |
| 计算复杂度 | O(n log n) | O(n²) |
| 适用场景 | 作者多样性、源多样性 | 内容多样性(嵌入) |
3.3 实际使用
在代码中,两者是互补的:
scala
// 列表式重评分(在 HeuristicScorer 中)
val rescorers = Seq(
RescoreListwise(AuthorBasedListwiseRescoringProvider(...)), // 列表式
RescoreListwise(CandidateSourceDiversityListwiseRescoringProvider(...)), // 列表式
// ...
)
// 多样性重评分(在 postSelectionFeatureHydration 中)
override val postSelectionFeatureHydration = Seq(
// ...
ParamGatedBulkCandidateFeatureHydrator(
TwhinDiversityRescoringParam,
DiversityRescoringFeatureHydrator // MMR算法
),
ParamGatedBulkCandidateFeatureHydrator(
CategoryDiversityRescoringParam,
CategoryDiversityRescoringFeatureHydrator // 类别多样性
),
)
四、为什么需要两种机制?
4.1 列表式重评分的优势
- 计算效率高:只需要分组和排序,复杂度低
- 参数简单:只需要衰减因子和最低值
- 易于理解:逻辑直观,易于调试
- 适合简单多样性:作者多样性、源多样性等
4.2 MMR多样性重评分的优势
- 更精确:基于嵌入向量计算相似度,更准确
- 全局优化:考虑整个候选列表,全局最优
- 适合复杂多样性:内容多样性、语义多样性等
- 可解释性强:距离计算直观
4.3 组合使用的效果
两者组合使用可以实现多层次多样性:
列表式重评分(作者多样性)
↓
MMR多样性重评分(内容多样性)
↓
最终结果:既保证作者多样性,又保证内容多样性
五、传统"打散" vs X的多样性机制
5.1 传统打散
定义:在排序后,通过规则重新调整位置
示例:
排序后:[A, B, C, D, E]
打散规则:同一作者不能连续出现
打散后:[A, C, B, E, D]
特点:
- 硬性规则
- 可能破坏相关性排序
- 简单直接
5.2 X的多样性机制
定义:在评分阶段就考虑多样性,通过分数调整实现
示例:
评分阶段:
- 列表式重评分:降低同作者推文的分数
- MMR重评分:考虑内容相似度
排序后自然多样性:[A, C, B, E, D]
特点:
- 软性调整(通过分数)
- 保留相关性排序
- 更复杂但更灵活
六、总结
6.1 你的理解
✅ 正确:列表式重评分确实是为了确保多样性
6.2 更准确的描述
列表式重评分是多样性控制的一种方式 ,它通过调整分数来实现多样性,而不是传统意义上的"打散"(重新排列位置)。
6.3 关键区别
| 维度 | 列表式重评分 | 传统打散 |
|---|---|---|
| 时机 | 评分阶段 | 排序后 |
| 方式 | 调整分数 | 调整位置 |
| 机制 | 位置衰减 | 硬性规则 |
| 效果 | 间接多样性 | 直接打散 |
6.4 X的多样性策略
X使用了多层次多样性机制:
- 列表式重评分:通过分数调整实现简单多样性(作者、源等)
- MMR多样性重评分:通过算法选择实现复杂多样性(内容、语义等)
- 选择器调整:在最终选择时进一步调整
这种设计既保证了多样性,又保留了相关性排序,比传统打散更加灵活和有效。
结论 :列表式重评分本质上是多样性控制 ,但它是通过调整分数 而不是打散位置来实现的,这是它与传统"打散"的关键区别。