搜索排序算法


排序模型LTR(L2R,learning to rank)

  • Pointwise:對排序列表中的每一項,直接學習一個值,比如可以是預估點擊率(Predict CTR,pCTR),然后按照預估值從大到小排序即可。常見模型有LR、FFM、GBDT、XGBoost。GBDT是LTR中應用較多的非線性模型。Additive Groves(簡稱AG)是在隨機森林基礎上構建的模型,加入Bagging算法,使得模型的泛化能力更強。AG由很多Grove 組合(bagging)而成,每一個Grove由多棵樹組成,在訓練時每棵樹的擬合目標是真實值與其它樹預測結果之和的殘差。在訓練的過程中達到了指定數目的樹時,重新訓練的樹會替代掉以前的樹。谷歌提出的FTRL方法能夠在線對線性模型進行更新。
  • Pairwise:兩兩學習兩個項的先后關系。常見模型有GBRank、RankNet、LambdaMart、RankSVM。LambdaMart是Lambda和MART(Multiple Additive Regression Tree,GBDT的別名)的結合,是GBDT的一種針對排序問題的改進。在計算梯度時LambdaMart重新計算了Lambda,重新賦予了排序梯度的物理意義,它利用sigmoid來計算各pair的排序概率,使用交叉熵作為損失函數來判斷擬合程度,並將排序離線指標(如MAP、NDCG)考慮到梯度中去。
  • Listwise:將列表的最佳排序當作最終的優化目標,通過預測分布和真實排序分布的差距來優化模型,典型的模型如ListNet。引入規范化帶折扣的累計收益(Normalized Discounted Cumulative Gain,NDCG)作為衡量列表排序質量的指標,以保證排序效果達到列表級別的最優。

Pairwise模型是指所有文檔兩兩組成一個pair,比如(X1,X2),如果X1的分值大於X2則將該pair當作正例+1,否則為負例-1. Pairwise的效果通常好於Pointwise(學術界是如此,工業界也越來越多用Pairwise了)。

下面介紹幾個排序經典模型:

RankSVM

RankSVM是配對法排序學習(Pairwise)的經典模型,通過SVM對query-doc pair進行打分和排序。RankSVM的輸入特征維query-doc pair的特征差值,即 \(X_1-X_2\),標簽為相對順序(+1,-1).

GBRank

GBRank由雅虎的員工提出。基本學習器是梯度提升器(Gradient Boosting Machine,GBM)。對於所有的x>y的N個偏序對的訓練樣本,其損失函數可定義為:

\[L_1=\sum_{i=1}^N \max(0,h(y_i)-h(x_i)) \\ || \\ L_2={1\over 2}\sum_{i=1}^N (\max(0,h(y_i)-h(x_i)))^2 \]

在使用梯度下降求解時,第m次迭代更新h:\(h(y_i^m)=h_{m-1}(y_i)-\rho_m\times{\partial L_2^{m-1}\over \partial y_i}\).只有當偏序預測錯誤時才進行更新,此時有\(h(y_i^m)=h(x_i^{m-1});\ h(x_i^m)=h(y_i^{m-1})\).在偏序學習正確時還需要保證學習的更健壯,因此需要讓差值足夠大,損失函數修改如下:

\[L_3={1\over 2}\sum_{i=1}^N (\max(0,\tau+h(y_i)-h(x_i)))^2 \]

這樣在偏序學錯后,更新:\(h(y_i^m)=h(x_i^{m-1})-\tau;\ h(x_i^m)=h(y_i^{m-1})+\tau\).

GBRank對所有GBM采用了歸一化處理:\(h_m(x)={mh_{m-1}(x)+\eta g_m(x)\over m+1}\),其中\(\eta\)為收縮率。

RankNet

RankNet由微軟的博格斯提出(ICML2005),比GBRank更早的提出觀點:偏序學習可以避免建模過程中將每條樣本映射為確切的排序值,而只需學習排序先后的偏序關系即可。RankNet通過神經網絡來學習先后偏序的概率。設學習的目標概率是\(\bar P_{xy}\),當x排序在y之前(x>y)時,\(\bar P_{xy}=1\),反之為0,不能確定偏序關系時值為0.5. 設輸入x,y對應的輸出值分別為\(f(x),f(y),O_{xy}=f(x)-f(y)\),偏序預測值為\(\text{sigmoid}(O_{xy})={1\over 1+e^{-O_{xy}}}\). 損失函數定義為交叉熵損失(對數幾率損失):

\[\begin{align} L_{xy}&=-\bar P_{xy}\log P_{xy}-(1-\bar P_{xy})\log(1-P_{xy}) \\ &=-\bar P_{xy}[O_{xy}-\log(1+e^{O_{xy}})]+(1-\bar P_{xy})\log(1+O_{xy}) \\ &=-\bar P_{xy}O_{xy}+\log(1+e^{O_{xy}}) \end{align} \]

由於pair的偏序概率具有傳遞性,因此RankNet可以是O(n)的復雜度。由於RankNet以減少錯誤pair為優化目標,因此對NDCG(關心相關文檔所在的位置)等指標衡量的效果不是太好(同樣的RankSVM、GBDT等排序模型亦是如此)。后續的改進模型包括LambdaRank、LambdaMart。

開源代碼實現:Ranklib包含了多種算法實現。

LambdaMART

這是微軟在 Bing 中使用了較長時間的模型,也在L2R這個領域享有盛譽。博格斯的團隊意識到 RankNet 並不能直接優化搜索的評價指標(NDCG 或者 MAP 等)之后提出了 LambdaRank,使用NDCG的變化量對模型參數進行優化。隨后把
LambdaRank 和 GBDT 的思想結合起來,提出了更強的 LambdaMART。
Lambda 是被定義為兩個文檔 NDCG 的變化量(實際上用這個變化量乘以對數幾率損失的梯度)。Lambda梯度更關注位置靠前的優質文檔的排序位置的提升,有效的避免了下調位置靠前優質文檔的位置這種情況的發生。

Learning to rank 評價指標

Precision and Recall(P-R)

P-R的有兩個明顯缺點:

  • 所有文章只被分為相關和不相關兩檔,分類顯然太粗糙。
  • 沒有考慮位置因素。

Discounted Cumulative Gain(DCG)

DCG解決了 P-R 的這兩個問題。對於一個關鍵詞,所有的文檔可以分為多個相關性級別,這里以\(rel_1,rel_2,...\)來表示。文章相關性對整個列表評價指標的貢獻隨着位置的增加而對數衰減,位置越靠后,衰減越嚴重。

NDCG 這個指標的假設是,在一個排序結果里,相關信息要比不相關信息排得更高,而最相關信息需要排在最上面,最不相關信息排在最下面。任何排序結果一旦偏離了這樣的假設,就會受到“扣分”或者說是“懲罰”。NDCG 是針對測試集的一個排序評價指標。

NDCG 是考慮到評分的排序,說到NDCG就需要從CG開始說起。CG(cumulative gain,累計增益)可以用於評價基於打分/評分的個性推薦系統。假設我們推薦k個物品,這個推薦列表的CGk計算公式如下:

\[CG_k=\sum_{i=1}^k \text{rel}_i \]

\(\text{rel}_i\) 表示第k個物品的相關性或者評分。假設我們共推薦k個電影,\(\text{rel}_i\) 可以是用戶對第i部電影的評分。

比如豆瓣給用戶推薦了五部電影: M1,M2,M3,M4,M5

該用戶對這五部電影的評分分別是:5, 3, 2, 1, 2

那么這個推薦列表的CG等於
CG5=5+3+2+1+2=13.
CG沒有考慮推薦的次序,在此基礎之后我們引入對物品順序的考慮,就有了DCG(discounted CG),折扣累積增益。公式如下:

\[DCG_k=\sum_{i=1}^k \frac{2^{\text{rel}_i}-1}{\log_2(i+1)} \]

那么這個推薦列表的DCG等於

\[DCG_5=\frac{2^5-1}{\log_2 2}+\frac{2^3-1}{\log_2 3}+\frac{2^2-1}{\log_2 4}+\frac{2^1-1}{\log_2 5}+\frac{2^2-1}{\log_2 6}=31+4.4+1.5+0.4+1.2=38.5 \]

對於排序引擎而言,不同請求的結果列表長度往往不相同。當比較不同排序引擎的綜合排序性能時,不同長度請求之間的DCG指標的可比性不高。DCG沒有考慮到推薦列表和每個檢索中真正有效結果個數,目前在工業界常用的是Normalized DCG(NDCG),它假定能夠獲取到某個請求的前p個位置的完美排序列表,這個完美列表的分值稱為Ideal DCG(IDCG),NDCG等於DCG與IDCG比值。所以NDCG是一個在0到1之間的值。

完美結果下的DCG,即IDCG的定義如下:

\[\text{IDCG}_p=\sum_{i=1}^{|REL|}{2^{rel_i}-1 \over \log_2(i+1)} \]

|REL|代表按照相關性排序好的最多到位置p的結果列表。

\[NDCG_k=\frac{DCG_k}{IDCG_k} \]

繼續上面的例子,如果相關電影一共有7部:M1,M2,M3,M4,M5,M6,M7
該用戶對這七部電影的評分分別是:5, 3, 2, 1, 2 , 4, 0

把這7部電影按評分排序:5, 4, 3, 2, 2, 1, 0

這個情況下的完美DCG是

\[IDCG_5=\frac{2^5-1}{\log_2 2}+\frac{2^4-1}{\log_2 3}+\frac{2^3-1}{\log_2 4}+\frac{2^2-1}{\log_2 5}+\frac{2^2-1}{\log_2 6}=31+9.5+3.5+1.3+1.2=46.5 \]

所以, \(NDCG_5 = \frac{DCG_5}{IDCG_5}=\frac{38.5}{46.5}=0.827\)
NDCG是0到1的數,越接近1說明推薦越准確。

參考: http://sofasofa.io/forum_main_post.php?postid=1002561

Expected Reciprocal Rank(ERR)

與DCG相比,除了考慮位置衰減和允許多種相關級別(以R1,R2,R3...來表示)以外,ERR更進了一步,還考慮了排在文檔之前所有文檔的相關性。舉個例子來說,文檔A非常相關,排在第5位。如果排在前面的4個文檔相關度都不高,那么文檔A對列表的貢獻就很大。反過來,如果前面4個文檔相關度很大,已經完全解決了用戶的搜索需求,用戶根本就不會點擊第5個位置的文檔,那么文檔A對列表的貢獻就不大。
ERR的定義如下:

\[ERR=\sum_{r=1}^n{1\over r}\prod_{i=1}^{r-1}(1-R_i)R_r \]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM