RankNet -> LambdaRank -> LambdaMART
Ranking 问题的常见的评价指标如NDCG、MAP等,都是不平滑、不连续、无法求梯度,因此不能直接用梯度下降法求解。
RankNet、LambdaRank 和 LambdaMART 是由微软提出的LTR的三个算法。它们将排序问题转化为 pairwise 的分类或者回归问题,使用梯度下降进行求解。
RankNet
RankNet最初是用神经网络开发的,但底层模型可以不局限于神经网络。**RankNet的损失函数旨在最小化排序中的逆序数量。**这里的逆序代表一对结果之间不正确的顺序,比如我们在排序列表中将较低评级的结果排在较高评级结果之上。RankNet使用随机梯度下降算法优化损失函数。
RankNet 的创新之处在于,它将不适宜用梯度下降求解的Ranking问题,转化为对概率的交叉熵损失函数的优化问题,从而适用梯度下降方法。RankNet 的梯度下降表现在结果的整体变化中是逆序对的下降。
RankNet 的目标是得到一个打分函数:
s
=
f
(
x
;
w
)
s=f(x;w)
s=f(x;w)根据这个算法函数,我们可以计算文档
x
i
x_i
xi和文档
x
j
x_j
xj的得分
s
i
s_i
si和
s
j
s_j
sj
s
i
=
f
(
x
i
;
w
)
,
s
j
=
f
(
x
j
;
w
)
s_i=f(x_i;w), s_j=f(x_j;w)
si=f(xi;w),sj=f(xj;w)
然后根据得分计算二者的偏序概率
P
i
j
=
P
(
x
i
⊳
x
j
)
=
exp
(
σ
⋅
(
s
i
−
s
j
)
)
1
+
exp
(
σ
⋅
(
s
i
−
s
j
)
)
=
1
1
+
exp
(
−
σ
⋅
(
s
i
−
s
j
)
)
P_{ij} = P(x_i \rhd x_j) = \frac{\exp\bigl(\sigma\cdot(s_i - s_j)\bigr)}{1 + \exp\bigl(\sigma\cdot(s_i - s_j)\bigr)} = \frac{1}{1 + \exp\bigl(-\sigma\cdot(s_i - s_j)\bigr)}
Pij=P(xi⊳xj)=1+exp(σ⋅(si−sj))exp(σ⋅(si−sj))=1+exp(−σ⋅(si−sj))1
再定义交叉熵为损失函数
L
i
j
=
−
P
ˉ
i
j
log
P
i
j
−
(
1
−
P
ˉ
i
j
)
log
(
1
−
P
i
j
)
=
1
2
(
1
−
S
i
j
)
σ
⋅
(
s
i
−
s
j
)
+
log
{
1
+
exp
(
−
σ
⋅
(
s
i
−
s
j
)
)
}
L_{ij} = -\bar{P}_{ij}\log P_{ij} - (1 - \bar{P}_{ij})\log (1 - P_{ij}) = \frac12 (1 - S_{ij})\sigma\cdot(s_i - s_j) + \log\Bigl\{1 + \exp\bigl(-\sigma\cdot(s_i - s_j)\bigr)\Bigr\}
Lij=−PˉijlogPij−(1−Pˉij)log(1−Pij)=21(1−Sij)σ⋅(si−sj)+log{1+exp(−σ⋅(si−sj))}
进行梯度下降
w
k
→
w
k
−
η
∂
L
∂
w
k
w_k \to w_k - \eta\frac{\partial L}{\partial w_k}
wk→wk−η∂wk∂L
LambdaRank
RankNet 告诉我们如何绕开 NDCG 等无法求导的评价指标得到一个可用的梯度。
后来发现在训练 RankNet 的过程中,其实是不需要损失函数的,只需要损失函数的梯度,可以通过交换每对文档后 NDCG 的变化来衡量梯度。LambdaRank 的核心思想是不通过显示定义损失函数的方式来求梯度,而是分析排序问题需要的梯度的意义,直接定义梯度。实验显示它在速度和准确度上都比原始 RankNet 要好。
如上图所示,每条线表示一个文档,蓝色表示相关文档,灰色表示不相关文档。RankNet以pairwise error的方式计算cost,左图的cost为13,右图通过把第一个相关文档下调3个位置,第二个文档上调5个位置,将cost降为11,但是像NDCG等指标只关注Top k个结果的排序,在优化的过程中下调前面相关文档的位置并不是我们想要的结果。右图左边黑色的箭头表示RankNet下一轮的调序方向和强度,但我们真正需要的是右边红色箭头代表的方向和强度,即更关注靠前位置的相关文档的排序位置的提升。LambdaRank正是基于这个思想演化而来,其中Lambda指的就是红色箭头,代表下一次迭代优化的方向和强度,也就是梯度
λ
\lambda
λ。
LambdaMART
LambdaMART 组合了 LambdaRank 和 MART(Multiple Additive Regression Trees)。LambdaMART 使用 LambdaRank 里的损失函数和梯度提升决策树来求解 Rank 任务。 实验显示 LambdaMART 比 LambdaRank 和原始 RankNet 都要好。