排序一直是信息檢索的核心問題之一, Learning to Rank(簡稱LTR)用機器學習的思想來解決排序問題(關於Learning to Rank的簡介請見我的博文Learning to Rank簡介)。LTR有三種主要的方法:PointWise,PairWise,ListWise. RankNet是一種Pairwise方法, 由微軟研究院的Chris Burges等人在2005年ICML上的一篇論文Learning to Rank Using Gradient Descent中提出,並被應用在微軟的搜索引擎Bing當中。
1. 損失函數
損失函數一直是各種Learning to Rank算法的核心, RankNet亦然.
RankNet是一種Pairwise方法, 定義了文檔對<A, B>的概率(假設文檔A, B的特征分別為xi,xj):
其中oij=oi-oj, oi=f(xi), RankNet使用神經網絡來訓練模型, 所以f(xi)是神經網絡的輸出。
如果文檔A比文檔B和查詢q更加相關, 則目標概率:=1, 如果文檔B比文檔A更相關, 目標函數
=0, 如果A和B同樣相關, 則
=0.5.
有了模型輸出的概率Pij和目標概率, 我們使用交叉熵來作為訓練的損失函數:
在三種不同的目標概率下, 損失函數和oij之間的關系如下圖所示:
可以看到, 在=1時, oij越大損失函數越小,
=0時,
越小損失函數越小,
=0.5時,
=0.5時損失函數最小。
本身也有一些非常好的特性, 給定
和
, 得到:
令=
=P, 得到P和
的關系如下圖所示:
可以看到, 當P>0.5時, 亦即i>j, j>k時, 有>0.5, 亦即i>k, 這說明概率P具有一致性(consistency).
2. RankNet算法
RankNet使用神經網絡來訓練模型, 使用梯度下降來優化損失函數。特別的, Chris Burges等人在論文中證明, 對於m個文檔{d1,d2,...,dm}, 需要且只需要知道相鄰文檔之間的概率Pij,就可以算出任意兩個文檔之間的后驗概率. 可以實現對m個文檔做任意排列, 然后以排列后的相鄰文檔之間的概率Pij作為訓練數據, 然后訓練模型, 時間復雜度為O(N), 優於Ranking SVM的O(N2)。
在使用神經網絡進行訓練時, 將排好序的文檔逐個的放入神經網絡進行訓練, 然后通過前后兩個文檔之間的oij=oi-oj來訓練模型, 每一次迭代, 前向傳播m次, 后向反饋m-1次。
RankLib中有RankNet等Learning to Rank算法的開源Java實現。
參考文獻:
[1]. Chris Burges, et al. Learning to Rank using Gradient Descent, ICML, 2005.
[2]. Tie-yan Liu. Learning to Rank for Information Retrieval.
[3]. Learning to Rank簡介
[4]. RankLib