《推荐系统笔记(十一)》Learning to rank(LTR排序问题)的介绍和RankNet算法(内含详细推导)

前言

在美团、大众点评等网站上输入某个关键词时,这些网站该如何对相关的文档进行排序,也就是说,应该将哪个文档排在前面,将哪个文档排在后面。

这就涉及到LRT排序问题。本篇博客将简要介绍LTR问题,并对RankNet进行详细推导。

训练数据

刚接触LTR问题,可以从认识它的训练数据开始。

我们将输入的关键词称为 q u e r y query query(查询词),搜集到的所有文档集合,记为 { d o c 1 , d o c 2 , . . . , d o c N } \{doc_1, doc_2, ..., doc_N\} {doc1,doc2,...,docN},每个文档都和这个 q u e r y query query有关。

训练数据就是由 query,docs和标注 三者组成的。举个例子,

  • query 1,query 2,query 3
  • d o c 11 doc_{11} doc11 d o c 12 doc_{12} doc12 d o c 13 doc_{13} doc13
  • d o c 21 doc_{21} doc21 d o c 22 doc_{22} doc22 d o c 23 doc_{23} doc23
  • d o c 31 doc_{31} doc31 d o c 32 doc_{32} doc32 d o c 33 doc_{33} doc33
  • …,…,…
  • 标注1,标注2,标注3

实际上,训练集有三种形式,也就对应着三种方法。

point-wise

第一种是point-wise,意思是,对query下的每一个doc都进行标注,

  • 可以是二分的,如标注 相关或者不相关
  • 可以是多分类的,如标注 perfect(完美)、excelent(出色)

point-wise的训练集中,每一条数据是这个样子的

  • query1,doc1,标注(相关)
  • query2,doc2,标注(不相关)
  • query3,doc3,标注(相关)

我们可以通过常规的分类模型,如LR、SVM、GBDT等,输入为query和doc,输出为标注。

pair-wise

第二种是pair-wise,意思是,对query下的任意两种doc的相对顺序, < d o c i , d o c j > <doc_i, doc_j> <doci,docj>进行标注,标注标签为{+1, -1, 0}。

  • 当标注为+1时, < d o c i , d o c j > <doc_i, doc_j> <doci,docj>意思是 d o c i doc_i doci d o c j doc_j docj前面,也就是说 d o c i doc_i doci d o c j doc_j docj要和query更相关
  • 当标注为-1时, < d o c i , d o c j > <doc_i, doc_j> <doci,docj>意思是 d o c i doc_i doci d o c j doc_j docj后面,也就是说 d o c j doc_j docj d o c i doc_i doci要和query更相关
  • 当标注为0时, < d o c i , d o c j > <doc_i, doc_j> <doci,docj>意思是 d o c i doc_i doci d o c j doc_j docj与query的相关程度一样

pair-wise的训练集中,每一条数据是这个样子的

  • query, < d o c 1 , d o c 2 > <doc_1, doc_2> <doc1,doc2>,标注(+1)
  • query, < d o c 2 , d o c 1 > <doc_2, doc_1> <doc2,doc1>,标注(-1)
  • query, < d o c 1 , d o c 3 > <doc_1, doc_3> <doc1,doc3>,标注(+1)
  • query, < d o c 3 , d o c 2 > <doc_3, doc_2> <doc3,doc2>,标注(-1)
list-wise

第三种是list-wise,意思是,对query下的整个doc列表进行标注。我们将训练集中的数据记为 ( x , y ) (x, y) (x,y) x x x为特征向量, y y y为标注,则list-wise里面, x = ( q u e r y , d o c 1 , d o c 2 , . . . , d o c N ) x=(query, doc_1, doc_2, ..., doc_N) x=(query,doc1,doc2,...,docN) y y y则为标注。

比如,在美团中输入“烤鱼”,页面会显示出 N N N个烤鱼文档,这些烤鱼文档都是排好序的,因此,数据可以记为 x = ( " 烤 鱼 " , d o c 1 , d o c 2 , . . . , d o c N ) x=("烤鱼", doc_1, doc_2, ..., doc_N) x=("",doc1,doc2,...,docN) y y y为标注(例如 很好 之类的)。

RankNet算法

这里,我们介绍一种pair-wise的算法,RankNet算法。具体内容如下,

  • 我们通过一个打分函数来给query下的所有文档进行打分,打分函数为 s = f ( d o c ; w ) s=f(doc; w) s=f(doc;w) 其中, w w w为我们要优化的参数
  • 对于文档 d o c i doc_i doci d o c j doc_j docj,给它们打分为 s i = f ( d o c i ; w ) s_i=f(doc_i; w) si=f(doci;w) s j = f ( d o c j ; w ) s_j=f(doc_j; w) sj=f(docj;w),这样,我们可以通过比较得分,来获得两个文档之间的相对位置,即
    l a b e l ( < d o c i , d o c j > ) = { + 1 i f s i > s j 0 i f s i = s j − 1 i f s i < s j label(<doc_i, doc_j>)=\left\{ \begin{array}{lll} +1 &if& s_i>s_j\\ 0 &if& s_i=s_j\\ -1 &if& s_i<s_j \end{array}\right. label(<doci,docj>)=+101ifififsi>sjsi=sjsi<sj
  • 对于训练的数据集 ( < d o c i , d o c j > , S i j ) (<doc_i, doc_j>, S_{ij}) (<doci,docj>,Sij) S i j ∈ { + 1 , 0 , − 1 } S_{ij}\in\{+1, 0, -1\} Sij{+1,0,1},我们可以将这个标签一一映射为概率 P ˉ i j \bar P_{ij} Pˉij,即 P ˉ i j = 1 2 ( 1 + S i j ) \bar P_{ij}=\frac{1}{2}(1+S_{ij}) Pˉij=21(1+Sij)
  • 对于数据 < d o c i , d o c j > <doc_i, doc_j> <doci,docj>,我们预测得到的标记为+1的概率 P i j P_{ij} Pij记为 P i j = s i g m o i d ( s i − s j ) = 1 1 + e − ( s i − s j ) P_{ij}=sigmoid(s_i-s_j)=\frac{1}{1+e^{-(s_i-s_j)}} Pij=sigmoid(sisj)=1+e(sisj)1 这样,我们就可以说
    l a b e l ( < d o c i , d o c j > ) = { + 1 i f P i j < 0.5 0 i f P i j = 0.5 − 1 i f P i j > 0.5 label(<doc_i, doc_j>)=\left\{ \begin{array}{lll} +1 &if& P_{ij}<0.5\\ 0 &if& P_{ij}=0.5\\ -1 &if& P_{ij}>0.5 \end{array}\right. label(<doci,docj>)=+101ifififPij<0.5Pij=0.5Pij>0.5
  • 现在,我们有了标注+1的实际概率 P ˉ i j \bar P_{ij} Pˉij和预估概率 P i j P_{ij} Pij,对于给定的单个数据 ( < d o c i , d o c j > , S i j ) (<doc_i, doc_j>, S_{ij}) (<doci,docj>,Sij),我们可以写出损失
    C i j = − P ˉ i j l o g P i j − ( 1 − P ˉ i j ) l o g ( 1 − P i j ) = − [ 1 2 ( 1 + S i j ) l o g 1 1 + e − ( s i − s j ) + 1 2 ( 1 − S i j ) l o g e − ( s i − s j ) 1 + e − ( s i − s j ) ] = − [ 1 2 ( 1 − S i j ) ( − ( s i − s j ) ) + l o g 1 1 + e − ( s i − s j ) ] = 1 2 ( 1 − S i j ) ( s i − s j ) + l o g ( 1 + e − ( s i − s j ) ) \begin{array}{lll} C_{ij}&=&-\bar P_{ij}logP_{ij}-(1-\bar P_{ij})log(1-P_{ij})\\ &=&-\left[\frac{1}{2}(1+S_{ij})log\frac{1}{1+e^{-(s_i-s_j)}} +\frac{1}{2}(1-S_{ij})log\frac{e^{-(s_i-s_j)}}{1+e^{-(s_i-s_j)}}\right]\\ &=&-\left[\frac{1}{2}(1-S_{ij})(-(s_i-s_j))+log\frac{1}{1+e^{-(s_i-s_j)}} \right]\\ &=&\frac{1}{2}(1-S_{ij})(s_i-s_j)+log(1+e^{-(s_i-s_j)}) \end{array} Cij====PˉijlogPij(1Pˉij)log(1Pij)[21(1+Sij)log1+e(sisj)1+21(1Sij)log1+e(sisj)e(sisj)][21(1Sij)((sisj))+log1+e(sisj)1]21(1Sij)(sisj)+log(1+e(sisj))

对损失 C i j C_{ij} Cij关于参数 w k w_k wk求导,有
∂ C i j ∂ w k = ∂ C i j ∂ s i ∂ s i ∂ w k + ∂ C i j ∂ s j ∂ s j ∂ w k \begin{array}{lll} \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} \end{array} wkCij=siCijwksi+sjCijwksj
这里, ∂ s i ∂ w k = ∂ f ( d o c i ; w ) ∂ w k \frac{\partial s_{i}}{\partial w_k}=\frac{\partial f(doc_i; w)}{\partial w_k} wksi=wkf(doci;w) ∂ C i j ∂ s i = 1 2 ( 1 − S i j ) − e − ( s i − s j ) 1 + e − ( s i − s j ) \frac{\partial C_{ij}}{\partial s_i}=\frac{1}{2}(1-S_{ij})-\frac{e^{-(s_i-s_j)}}{1+e^{-(s_i-s_j)}} siCij=21(1Sij)1+e(sisj)e(sisj) ∂ C i j ∂ s j = − 1 2 ( 1 − S i j ) + e − ( s i − s j ) 1 + e − ( s i − s j ) \frac{\partial C_{ij}}{\partial s_j}=-\frac{1}{2}(1-S_{ij})+\frac{e^{-(s_i-s_j)}}{1+e^{-(s_i-s_j)}} sjCij=21(1Sij)+1+e(sisj)e(sisj)

  • 不难发现, ∂ C i j ∂ s i = − ∂ C i j ∂ s j \frac{\partial C_{ij}}{\partial s_i}=-\frac{\partial C_{ij}}{\partial s_j} siCij=sjCij。令 λ i j = ∂ C i j ∂ s i \lambda_{ij}=\frac{\partial C_{ij}}{\partial s_i} λij=siCij,则
    ∂ C i j ∂ w k = λ i j ( ∂ s i ∂ w k − ∂ s j ∂ w k ) \begin{array}{lll} \frac{\partial C_{ij}}{\partial w_k}&=&\lambda_{ij}(\frac{\partial s_{i}}{\partial w_k}-\frac{\partial s_{j}}{\partial w_k}) \end{array} wkCij=λij(wksiwksj) 考虑总体损失,我们有
    ∂ ∑ i , j C i j ∂ w k = ∑ i , j λ i j ( ∂ s i ∂ w k − ∂ s j ∂ w k ) = ∑ i , j λ i j ∂ s i ∂ w k − ∑ i , j λ i j ∂ s j ∂ w k = ∑ i , j λ i j ∂ s i ∂ w k − ∑ j , i λ j i ∂ s i ∂ w k = ∑ i , j λ i j ∂ s i ∂ w k − ∑ i , j λ j i ∂ s i ∂ w k = ∑ i ( ∑ j λ i j − ∑ j λ j i ) ∂ s i ∂ w k = ∑ i λ i ∂ s i ∂ w k \begin{array}{lll} \frac{\partial \sum_{i,j}C_{ij}}{\partial w_k}&=&\sum_{i,j}\lambda_{ij}(\frac{\partial s_{i}}{\partial w_k}-\frac{\partial s_{j}}{\partial w_k})\\ &=&\sum_{i,j}\lambda_{ij}\frac{\partial s_{i}}{\partial w_k}-\sum_{i,j}\lambda_{ij}\frac{\partial s_{j}}{\partial w_k}\\ &=&\sum_{i,j}\lambda_{ij}\frac{\partial s_{i}}{\partial w_k}-\sum_{j,i}\lambda_{ji}\frac{\partial s_{i}}{\partial w_k}\\ &=&\sum_{i,j}\lambda_{ij}\frac{\partial s_{i}}{\partial w_k}-\sum_{i,j}\lambda_{ji}\frac{\partial s_{i}}{\partial w_k}\\ &=&\sum_{i}(\sum_j\lambda_{ij}-\sum_{j}\lambda_{ji})\frac{\partial s_{i}}{\partial w_k}\\ &=&\sum_i\lambda_i\frac{\partial s_{i}}{\partial w_k} \end{array} wki,jCij======i,jλij(wksiwksj)i,jλijwksii,jλijwksji,jλijwksij,iλjiwksii,jλijwksii,jλjiwksii(jλijjλji)wksiiλiwksi

这样,我们就可以写出参数 w w w的更新策略
w k ← w k − α ∂ ∑ i , j C i j ∂ w k w_k\leftarrow w_k-\alpha\frac{\partial \sum_{i,j}C_{ij}}{\partial w_k} wkwkαwki,jCij

通过指定打分函数 s = f ( d o c ; w ) s=f(doc; w) s=f(doc;w)的形式,我们能通过迭代,求出最优的参数 w w w

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值