学会排序算法
Learning-to-Rank (LTR) 是一种运用机器学习技术来解决排序问题的领域。它的核心目标是,训练一个模型,让这个模型能自动地对一个项目列表进行优化排序,使得排序结果尽可能地好。
常用的算法有RankNet和LambdaRank等。
RankNet
我们定义一个概率$P _ {ij}$代表i排在j前面的真实概率,我们定义1代表更重要/相关,0.5代表相同重要/相关,0代表更不重要/相关。
同时,我们会对输出的分数$s_i$和$s_j$进行转换,RankNet使用的是
$$
\hat{P} _ {ij} = \frac{1}{1 + e^{-\alpha(s_i - s_j)}}
$$
其中$\alpha$用了控制sigmoid($\sigma$)的形状,注意这里是$\sigma(s_i-s_j)$,而不同于AUC中的$\sigma(s_i)-\sigma(s_j)$。
定义交叉熵损失函数为:
$$ C _ {ij} = -P _ {ij} \log(\hat{P} _ {ij}) - (1 - P _ {ij}) \log(1 - \hat{P} _ {ij}) $$
求偏导有:
$$
\begin{align}
\frac{\partial{C}}{\partial{w_k}}&=\frac{\partial{C}}{\partial{s_i}}\frac{\partial{s_i}}{\partial{w_k}}+\frac{\partial{C}}{\partial{s_j}}\frac{\partial{s_j}}{\partial{w_k}}\\&=\alpha\left(P _ {ij}-\hat P _ {ij}\right)\left(\frac{\partial{s_i}}{\partial{w_k}}-\frac{\partial{s_j}}{\partial{w_k}}\right)
\\&=\lambda _ {ij}\left(\frac{\partial{s_i}}{\partial{w_k}}-\frac{\partial{s_j}}{\partial{w_k}}\right)
\end{align}
$$
$\lambda _ {ij}$也被成为lambda梯度。
LambdaRank
RankNet一个显明的缺点是,不直接与各种排序指标相关。故LambdaRank将其引入到其算法中,修改为
$$
\lambda _ {LambdaRank}=\lambda _ {ij}\cdot|\Delta metric|
$$
Xgboost中有rank:ndcg
、rank:map
、rank:pairwise
,前两种分别对应NDCG和map指标,后一种类似RankNet,即$|\Delta|$=1。
与AUC自定义损失的联系
AUC其实也是一种排序问题,但我们通常使用交叉熵隐含地去优化分类任务以达到更好的排序。
另外,在这里的交叉熵它可以写成softplus的形式,这也是0-1损失的替代损失函数之一,另外还有hinge-loss等等。所以,排序问题和直接优化AUC,采取的思想是类似的。