前言
在美团、大众点评等网站上输入某个关键词时,这些网站该如何对相关的文档进行排序,也就是说,应该将哪个文档排在前面,将哪个文档排在后面。
这就涉及到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>)=⎩⎨⎧+10−1ifififsi>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(si−sj)=1+e−(si−sj)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>)=⎩⎨⎧+10−1ifififPij<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−(1−Pˉij)log(1−Pij)−[21(1+Sij)log1+e−(si−sj)1+21(1−Sij)log1+e−(si−sj)e−(si−sj)]−[21(1−Sij)(−(si−sj))+log1+e−(si−sj)1]21(1−Sij)(si−sj)+log(1+e−(si−sj))
对损失
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}
∂wk∂Cij=∂si∂Cij∂wk∂si+∂sj∂Cij∂wk∂sj
这里,
∂
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}
∂wk∂si=∂wk∂f(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)}}
∂si∂Cij=21(1−Sij)−1+e−(si−sj)e−(si−sj)且
∂
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)}}
∂sj∂Cij=−21(1−Sij)+1+e−(si−sj)e−(si−sj)
- 不难发现,
∂
C
i
j
∂
s
i
=
−
∂
C
i
j
∂
s
j
\frac{\partial C_{ij}}{\partial s_i}=-\frac{\partial C_{ij}}{\partial s_j}
∂si∂Cij=−∂sj∂Cij。令
λ
i
j
=
∂
C
i
j
∂
s
i
\lambda_{ij}=\frac{\partial C_{ij}}{\partial s_i}
λij=∂si∂Cij,则
∂ 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} ∂wk∂Cij=λij(∂wk∂si−∂wk∂sj) 考虑总体损失,我们有
∂ ∑ 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} ∂wk∂∑i,jCij======∑i,jλij(∂wk∂si−∂wk∂sj)∑i,jλij∂wk∂si−∑i,jλij∂wk∂sj∑i,jλij∂wk∂si−∑j,iλji∂wk∂si∑i,jλij∂wk∂si−∑i,jλji∂wk∂si∑i(∑jλij−∑jλji)∂wk∂si∑iλi∂wk∂si
这样,我们就可以写出参数
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}
wk←wk−α∂wk∂∑i,jCij
通过指定打分函数 s = f ( d o c ; w ) s=f(doc; w) s=f(doc;w)的形式,我们能通过迭代,求出最优的参数 w w w。