LambdaRank

LambdaRank就是在RankNet中定义了一个λ\lambda 作为梯度,然后从新反推出新的损失函数。

RankNet的损失函数中设计到两个神经网络的输出si,sjs_i,s_j ,所以梯度如下:

CijWk=CijsisiWk+CijsjsjWk\frac {\partial C_{ij}}{\partial W_k} = \frac {\partial C_{ij}}{\partial s_i} \frac {\partial s_i}{\partial W_k} + \frac {\partial C_{ij}}{\partial s_j} \frac {\partial s_j}{\partial W_k}

一次请求召回的待排序文档集D的损失C=i,jDCijWkC = \sum_{i,j \in D} \frac {\partial C_{ij}}{\partial W_k}

对梯度展开

Cijsi=12(1Sij)σ(sisj)+log(1+eσ(sisj))si=12(1Sij)11+eσ(sisj)=Cijsj\frac {\partial C_{ij}}{\partial s_i} = \frac {\partial \frac {1}{2} (1-S_{ij}) \sigma(s_i-s_j) + \log (1+e^{-\sigma(s_i-s_j)}) }{\partial s_i} = \frac {1}{2} (1-S_{ij}) - \frac {1}{1+e^{-\sigma(s_i-s_j)}} = - \frac {\partial C_{ij}}{\partial s_j}
CijWk=(12(1Sij)11+eσ(sisj))(siWksjWk)=λij(siWksjWk)λij=12(1Sij)11+eσ(sisj)\frac {\partial C_{ij}}{\partial W_k} = (\frac {1}{2} (1-S_{ij}) - \frac {1}{1+e^{-\sigma(s_i-s_j)}})(\frac {\partial s_i}{\partial W_k} - \frac {\partial s_j}{\partial W_k}) = \lambda_{ij} (\frac {\partial s_i}{\partial W_k} - \frac {\partial s_j}{\partial W_k}) \\ \lambda_{ij} = \frac {1}{2} (1-S_{ij}) - \frac {1}{1+e^{-\sigma(s_i-s_j)}}
对于文档pair,由于didj因此:Sij=1所以λij=11+eσ(sisj)\text{对于文档pair,由于} d_i \triangleright d_j \text{因此:} S_{ij} = 1 \text{所以}\\ \lambda_{ij} = - \frac {1}{1+e^{-\sigma(s_i-s_j)}}

因此对每个文档did_i,有λi=j(i,j)Dλijj(j,i)Dλij\lambda_i = \sum_{j(i,j) \in D} \lambda_{ij} - \sum_{j(j,i) \in D} \lambda_{ij},即每一个文档下一次调序的方向和强度取决于所有同一query的其他不同label的文档

此外,还引入评价指标Z(如NDCG、ERR等),把交换两个文档的位置引起的评价指标的变化ΔZi,j\left| \Delta Z_{i,j} \right|作为其中一个因子。

通过梯度反推出LambdaRank的损失函数Cij=log(1+eσ(sisj))ΔZi,jC_{ij} = \log (1+e^{-\sigma(s_i-s_j)}) \left| \Delta Z_{i,j} \right|

LambdaRank相比RankNet的优势在于分解因式后训练速度变快,同时考虑了评价指标,直接对问题求解,效果更明显。

Ranklib开源工具包定义的数据格式如下:

label qid:$id $feaid:$feavalue $feaid:$feavalue … #description

每行代表一个样本,相同查询请求的样本的qid相同,label表示该样本和该查询请求的相关程度,description描述该样本属于哪个待排序文档,用于区分不同的文档。

参考佳文

Learning To Rank之LambdaMART的前世今生

http://datayuan.baijia.baidu.com/article/486753 达观数据帮你揭开搜索引擎排序的神秘面纱

Last updated