RankNet

RankNet是通过一个神经网络模型来计算样本的得分,输入层和样本特征维数有关,输出层是一个节点,就是分值。以三层的神经网络模型举例,则计算分值函数定义为:

sn=f(xn)=g3(ΣjWij32g2(ΣkWjk21xnk+b2)+b3)s_n = f(x_n) = g^3(\Sigma_j W_{ij}^{32}g^2(\Sigma_k W_{jk}^{21}x_{nk} + b^2) + b^3)

其中权值参数w和偏置参数b的上标表示节点所在的层,下标表示同一层中节点的编号;xnkx_{nk}表示特征向量xnx_n的第k个分量,这是是输入到输入层的。 RankNet是从概率角度解决排序的问题,证明了如果知道一个待排序文档的排列中相邻两个文档之间的排序概率,则通过推导可以算出每两个文档之间的排序概率。因此对于一个待排序文档序列,只需计算相邻文档之间的排序概率,不需要计算所有pair,减少计算量。

损失函数

训练时以预测概率与真实概率的交叉熵作为损失函数

  • 预测概率:

PijP(DiDj)11+eσ(sisj)P_{ij} \equiv P(D_i \triangleright D_j) \equiv \frac {1}{1+e^{-\sigma(s_i-s_j)}}

sis_i :文档DiD_i模型计算出来的得分

  • 真实概率:

Pij=12(1+Sij)\overline P_{ij} = \frac {1}{2}(1+S_{ij})

SijS_{ij} 文档DiD_iDjD_j真实排序。取值{-1,0,1}。1表示DiD_i应该在DjD_j前面,-1表示DiD_i应该在DjD_j后面,0表示谁前谁后无所谓

  • 交叉熵:

C=PijlogPij(1Pij)log(1logPij)=12(1Sij)σ(sisj)+log(1+eσ(sisj))log以e为底数C = - \overline P_{ij} \log P_{ij} - (1 - \overline P_{ij}) \log (1-\log P_{ij}) \\ = \frac {1}{2} (1-S_{ij}) \sigma(s_i-s_j) + \log (1+e^{-\sigma(s_i-s_j)}) \\ \text{log以e为底数}

预测概率函数就是逻辑回归的sigmoid函数,由于σ\sigma 影响的是sigmoid函数的形状,对最终结果影响不大,因此默认使用 σ=1\sigma=1进行简化。

损失函数有以下几个特点:

  • 当两个相关性不同的文档算出来的模型分数相同时,损失函数的值大于0,仍会对这对pair做惩罚,使他们的排序位置区分开

  • 损失函数是一个类线性函数,可以有效减少异常样本数据对模型的影响,因此具有鲁棒性

反向梯度下降

WkWkηCWk=Wkη(CsisiWk+CsjsjWk)W_k \to W_k - \eta \frac {\partial C}{\partial W_k} = W_k - \eta (\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})

参考佳文:

再理解RankNet算法 Learning To Rank之LambdaMART的前世今生

Last updated

Was this helpful?