Listwise系列相关文章(置顶)
1.Listwise 模型时间线梳理
2.Listwise 排序之 LambdaRank:最大化 NDCG 的秘诀
引言
LambdaRank 是一种用于排序学习(Learning to Rank, LTR)的模型,特别适用于推荐系统和信息检索任务。它通过直接优化排序评价指标(如 NDCG),确保模型的学习目标与实际应用目标一致。LambdaRank 的核心思想是使用梯度下降法来最小化损失函数,从而调整商品评分,使得高相关性的商品排在前面。
1. 背景与动机
传统的排序学习方法通常使用点对点或列表级别的损失函数,但这些方法往往不能直接优化最终的排序评价指标(如 NDCG)。LambdaRank 通过引入 Lambda 权重 λ i j \lambda_{ij} λij,能够直接优化 NDCG 等排序评价指标,从而更有效地捕捉用户的偏好和行为模式。
传统排序学习方法为何不能直接优化 NDCG ?
要理解为什么传统排序学习方法(如点对点、点级和列表级方法)不能直接优化最终的排序评价指标(如 NDCG),需要深入探讨这些方法的工作原理及其局限性。NDCG 是一种衡量推荐列表质量的全局评价指标,而传统方法在设计上往往侧重于局部优化或使用间接手段,导致它们难以直接针对 NDCG 进行优化。
1.1 NDCG 的特点
NDCG(Normalized Discounted Cumulative Gain)是一种常用的排序质量评估标准,用于衡量推荐列表中相关商品的位置分布情况。具体解释可以参考笔者文章
【召回评价指标NDCG、MAP】其公式如下:
DCG = ∑ i = 1 n 2 r e l i − 1 log 2 ( i + 1 ) \text{DCG} = \sum_{i=1}^{n} \frac{2^{rel_i} - 1}{\log_2(i+1)} DCG=i=1∑nlog2(i+1)2reli−1
NDCG = DCG IDCG \text{NDCG} = \frac{\text{DCG}}{\text{IDCG}} NDCG=IDCGDCG
- r e l i rel_i reli 是第 i i i 个商品的相关性得分。
- n n n 是推荐列表的长度。
- IDCG \text{IDCG} IDCG 是理想情况下的 DCG 值,即所有相关商品都排在最前面。
NDCG 考虑了每个商品的相关性得分,并根据其位置进行了折扣处理。排在前面的商品有更高的权重,因此如果高相关性的商品排在前面,NDCG 值会更高。这是一个全局评价指标,因为它考虑了整个推荐列表的整体结构和位置分布。
1.2 传统排序学习方法的局限性
1.2.1 点对点方法(Pairwise Methods)
- 工作原理:这类方法通过比较商品对之间的相对顺序来优化模型。例如,如果商品 A A A 应该排在商品 B B B 前面,则损失函数会惩罚不正确的排序。
- 局限性:
- 局部优化:只关注商品对之间的相对顺序,而忽略了整个列表的整体质量。这种方法无法直接捕捉到 NDCG 所需的全局信息,因为它没有考虑商品在整个列表中的具体位置。
- 难以直接优化全局评价指标:由于 NDCG 是一个全局评价指标,依赖于所有商品的位置分布,而点对点方法只能优化局部的相对顺序,因此难以直接优化 NDCG。
1.2.2 点级方法(Pointwise Methods)
- 工作原理:这类方法将排序问题视为回归或分类问题,直接预测每个商品的相关性得分。
- 局限性:
- 忽略相对顺序:只关注单个商品的相关性得分,忽略了商品之间的相对顺序。这种方法无法有效捕捉到 NDCG 所需的全局信息,因为它没有考虑商品在整个列表中的相对位置。
- 难以捕捉全局信息:NDCG 不仅取决于单个商品的相关性得分,还取决于它们在整个列表中的位置分布。点级方法无法有效捕捉这种全局信息。
1.2.3 列表级方法(Listwise Methods)
- 工作原理:这类方法直接优化整个推荐列表的质量,通常使用复杂的损失函数来评估整个列表的表现。
- 局限性:
- 计算复杂度高:需要同时考虑多个商品的相对顺序,计算复杂度较高,尤其是在推荐列表较长的情况下。
- 难以解释:损失函数复杂,难以直观理解其优化过程,且不一定能直接对应到 NDCG 等具体的评价指标。
- 间接优化:虽然列表级方法试图优化整个列表的质量,但它们使用的损失函数通常是基于其他评价指标(如交叉熵等),而不是直接针对 NDCG 进行优化。
1.3. LambdaRank 的优势
LambdaRank 通过引入 Lambda 权重 λ i j \lambda_{ij} λij,能够直接优化 NDCG 等排序评价指标,从而克服了传统方法的局限性。具体优势如下:
- 直接优化 NDCG:通过引入 Lambda 权重,LambdaRank 衡量交换商品 i i i 和商品 j j j 的位置对 NDCG 的影响。如果交换这对商品的位置会导致 NDCG 显著下降,那么 λ i j \lambda_{ij} λij 的值会较大,确保模型更关注这对商品的相对顺序。
- 全局与局部结合:通过求和符号 ∑ i , j \sum_{i,j} ∑i,j,LambdaRank 遍历所有商品对,确保模型从全局角度优化整个推荐列表的排序质量。
- 高效计算:虽然涉及所有商品对,但通过引入 λ i j \lambda_{ij} λij,模型可以忽略那些对 NDCG 影响较小的商品对,提高计算效率。
- 稳定更新:通过 Sigmoid 函数将评分差值映射到概率空间,避免极端值对模型的影响,使得参数更新更加稳定和合理。
1.4. 总结
传统排序学习方法(如点对点、点级和列表级方法)之所以不能直接优化 NDCG,主要是因为它们在设计上侧重于局部优化或使用间接手段,无法有效捕捉 NDCG 所需的全局信息。LambdaRank 通过引入 Lambda 权重和精心设计的损失函数,能够直接优化 NDCG 等排序评价指标,确保模型的学习目标与最终的应用目标高度一致,从而更有效地捕捉用户的偏好和行为模式,提高推荐系统的性能。
2. NDCG(Normalized Discounted Cumulative Gain)
NDCG 是一种常用的排序质量评估标准,用于衡量推荐列表中相关商品的位置分布情况。其公式如下:
DCG = ∑ i = 1 n 2 r e l i − 1 log 2 ( i + 1 ) \text{DCG} = \sum_{i=1}^{n} \frac{2^{rel_i} - 1}{\log_2(i+1)} DCG=i=1∑nlog2(i+1)2reli−1
NDCG = DCG IDCG \text{NDCG} = \frac{\text{DCG}}{\text{IDCG}} NDCG=IDCGDCG
- r e l i rel_i reli 是第 i i i 个商品的相关性得分。
- n n n 是推荐列表的长度。
- IDCG \text{IDCG} IDCG 是理想情况下的 DCG 值,即所有相关商品都排在最前面。
NDCG 考虑了每个商品的相关性得分,并根据其位置进行了折扣处理。排在前面的商品有更高的权重,因此如果高相关性的商品排在前面,NDCG 值会更高。
3. Lambda 权重
Lambda 权重 λ i j \lambda_{ij} λij 衡量了交换商品 i i i 和商品 j j j 的位置对整个推荐列表 NDCG 值的影响。具体来说:
- 变化量: λ i j \lambda_{ij} λij 反映了交换商品 i i i 和商品 j j j 的位置后,NDCG 值的变化量。
- 重要性:如果交换 i i i 和 j j j 的位置会导致 NDCG 显著下降,那么 λ i j \lambda_{ij} λij 的值会较大;反之则较小。这确保了模型更关注那些对排序质量影响较大的商品对。
计算 Lambda 权重的具体公式为:
Δ NDCG i j = ( 2 r e l i − 2 r e l j ) ⋅ ( 1 log 2 ( r j + 1 ) − 1 log 2 ( r i + 1 ) ) \Delta \text{NDCG}_{ij} = (2^{rel_i} - 2^{rel_j}) \cdot \left( \frac{1}{\log_2(r_j + 1)} - \frac{1}{\log_2(r_i + 1)} \right) ΔNDCGij=(2reli−2relj)⋅(log2(rj+1)1−log2(ri+1)1)
λ i j = ∣ Δ NDCG i j ∣ \lambda_{ij} = \left| \Delta \text{NDCG}_{ij} \right| λij=∣ΔNDCGij∣
4. 损失函数
LambdaRank 的损失函数设计是为了最小化 NDCG 下降的可能性,并最大化 NDCG 上升的可能性。具体公式如下:
L LambdaRank = − ∑ i , j λ i j ⋅ ( σ ( Δ s i j ) − σ ( − Δ s i j ) ) L_{\text{LambdaRank}} = -\sum_{i,j} \lambda_{ij} \cdot (\sigma(\Delta s_{ij}) - \sigma(-\Delta s_{ij})) LLambdaRank=−i,j∑λij⋅(σ(Δsij)−σ(−Δsij))
其中:
- λ i j \lambda_{ij} λij 是根据 NDCG 变化量计算的权重。
- σ ( x ) \sigma(x) σ(x) 是 Sigmoid 函数,用于将评分差值映射到概率空间。
- Δ s i j = s i − s j \Delta s_{ij} = s_i - s_j Δsij=si−sj 是商品 i i i 和商品 j j j 的评分差值。
公式说明
- 求和符号 ∑ :遍历所有商品对,确保模型从全局角度优化整个推荐列表的排序质量。
- 负号 - :将最大化 NDCG 的问题转化为最小化损失的问题,使得模型能够通过最小化损失函数来优化排序质量。
- Lambda λ i j \lambda_{ij} λij:反映了交换商品 i 和 j 的位置后,NDCG 值的变化量。如果交换 后导致 NDCG 显著下降,那么 λ i j \lambda_{ij} λij 的值会较大;反之则较小。这确保了模型更关注那些对排序质量影响较大的商品对。
- σ ( Δ s i j ) \sigma(\Delta s_{ij}) σ(Δsij) 相关:
- σ ( Δ s i j ) \sigma(\Delta s_{ij}) σ(Δsij):模型认为商品 i 应该排在商品 j 前面的概率
- σ ( − Δ s i j ) \sigma(-\Delta s_{ij}) σ(−Δsij):模型认为商品 j 应该排在商品 i 前面的概率,即 σ ( Δ s j i ) \sigma(\Delta s_{ji}) σ(Δsji)
- σ ( Δ s i j ) \sigma(\Delta s_{ij}) σ(Δsij) - σ ( − Δ s i j ) \sigma(-\Delta s_{ij}) σ(−Δsij):模型对这对商品相对顺序的置信度差异。如果这个差异较大且正数,说明模型非常确信商品 i 应该排在商品 j 前面;反之则表示模型不太确定这对商品的相对顺序。
5. 评分调整与优化
为了最小化损失函数 L LambdaRank L_{\text{LambdaRank}} LLambdaRank,模型会逐步调整商品的评分,使得高相关性的商品排在前面。具体步骤如下:
5.1 计算梯度
使用梯度下降法,计算评分调整的方向和幅度。对于每个商品 i i i,其评分 s i s_i si 的梯度为:
∂ L LambdaRank ∂ s i = − ∑ j λ i j ⋅ σ ′ ( Δ s i j ) ⋅ sign ( Δ s i j ) \frac{\partial L_{\text{LambdaRank}}}{\partial s_i} = -\sum_j \lambda_{ij} \cdot \sigma'(\Delta s_{ij}) \cdot \text{sign}(\Delta s_{ij}) ∂si∂LLambdaRank=−j∑λij⋅σ′(Δsij)⋅sign(Δsij)
其中, σ ′ ( x ) \sigma'(x) σ′(x) 是 Sigmoid 函数的导数:
σ ′ ( x ) = σ ( x ) ⋅ ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x) \cdot (1 - \sigma(x)) σ′(x)=σ(x)⋅(1−σ(x))
5.2 更新评分
根据梯度更新评分:
s i ← s i − η ⋅ ∂ L LambdaRank ∂ s i s_i \leftarrow s_i - \eta \cdot \frac{\partial L_{\text{LambdaRank}}}{\partial s_i} si←si−η⋅∂si∂LLambdaRank
其中, η \eta η 是学习率,控制每次更新的步长。
假设有两个商品 A A A 和 B B B,当前评分为 s A = 0.8 s_A = 0.8 sA=0.8 和 s B = 0.6 s_B = 0.6 sB=0.6,并且根据 NDCG 计算得到 λ A B = 9.24 \lambda_{AB} = 9.24 λAB=9.24。
-
计算初始损失项:
Δ s A B = s A − s B = 0.8 − 0.6 = 0.2 \Delta s_{AB} = s_A - s_B = 0.8 - 0.6 = 0.2 ΔsAB=sA−sB=0.8−0.6=0.2
σ ( 0.2 ) = 1 1 + e − 0.2 ≈ 0.5498 \sigma(0.2) = \frac{1}{1 + e^{-0.2}} \approx 0.5498 σ(0.2)=1+e−0.21≈0.5498
σ ( − 0.2 ) = 1 1 + e 0.2 ≈ 0.4502 \sigma(-0.2) = \frac{1}{1 + e^{0.2}} \approx 0.4502 σ(−0.2)=1+e0.21≈0.4502
σ ( 0.2 ) − σ ( − 0.2 ) = 0.5498 − 0.4502 = 0.0996 \sigma(0.2) - \sigma(-0.2) = 0.5498 - 0.4502 = 0.0996 σ(0.2)−σ(−0.2)=0.5498−0.4502=0.0996
L A B = − λ A B ⋅ ( σ ( 0.2 ) − σ ( − 0.2 ) ) = − 9.24 ⋅ 0.0996 ≈ − 0.920 L_{AB} = -\lambda_{AB} \cdot (\sigma(0.2) - \sigma(-0.2)) = -9.24 \cdot 0.0996 \approx -0.920 LAB=−λAB⋅(σ(0.2)−σ(−0.2))=−9.24⋅0.0996≈−0.920 -
计算梯度:
假设经过计算后,得到以下梯度值:
- ∂ L LambdaRank ∂ s A ≈ − 0.462 \frac{\partial L_{\text{LambdaRank}}}{\partial s_A} \approx -0.462 ∂sA∂LLambdaRank≈−0.462
- ∂ L LambdaRank ∂ s B ≈ 0.462 \frac{\partial L_{\text{LambdaRank}}}{\partial s_B} \approx 0.462 ∂sB∂LLambdaRank≈0.462
说明
偏导数为负值:表示增加该商品的评分会降低损失函数的值,从而有助于优化排序,反之同理!!!
- 通过梯度下降法,模型会增加高相关性商品的评分并减少低相关性商品的评分,逐步优化整个推荐列表的排序质量。
-
更新评分:
假设学习率为 η = 0.1 \eta = 0.1 η=0.1,则:
-
商品 A A A 的新评分为:
s A ← 0.8 − 0.1 ⋅ ( − 0.462 ) = 0.8 + 0.0462 = 0.8462 s_A \leftarrow 0.8 - 0.1 \cdot (-0.462) = 0.8 + 0.0462 = 0.8462 sA←0.8−0.1⋅(−0.462)=0.8+0.0462=0.8462 -
商品 B B B 的新评分为:
s B ← 0.6 − 0.1 ⋅ 0.462 = 0.6 − 0.0462 = 0.5538 s_B \leftarrow 0.6 - 0.1 \cdot 0.462 = 0.6 - 0.0462 = 0.5538 sB←0.6−0.1⋅0.462=0.6−0.0462=0.5538
-
通过上述过程,可以看到:
- 商品 A A A 的评分增加了:因为它应该排在 B B B 前面,增加 s A s_A sA 可以降低损失函数的值,从而有助于优化排序。
- 商品 B B B 的评分减少了:因为它应该排在 A A A 后面,减少 s B s_B sB 可以降低损失函数的值,从而有助于优化排序。
6. 总结
LambdaRank 通过引入 Lambda 权重 λ i j \lambda_{ij} λij 和精心设计的损失函数,能够高效地捕捉商品之间的相对关系,并直接优化排序评价指标(如 NDCG),从而提高推荐系统的性能。这种设计使得模型的学习目标与最终的应用目标高度一致,能够更有效地捕捉用户的偏好和行为模式,从而提高推荐系统的性能。
关键点回顾
- NDCG:衡量推荐列表中相关商品的位置分布情况。
- Lambda 权重:衡量交换商品对 NDCG 的影响,确保模型更关注重要的商品对。
- 损失函数:通过最小化损失函数,模型能够逐步优化排序,使得高相关性的商品排在前面。
- 评分调整:通过梯度下降法更新评分,逐步优化整个推荐列表的排序质量。