Learning To Rank之LambdaMART的前世今生

1.       前言

         我們知道排序在很多應用場景中屬於一個非常核心的模塊,最直接的應用就是搜索引擎。當用戶提交一個query,搜索引擎會召回很多文檔,然後根據文檔與query以及用戶的相關程度對文檔進行排序,這些文檔如何排序直接決定了搜索引擎的用戶體驗。其他重要的應用場景還有在線廣告、協同過濾、多媒體檢索等的排序。

         LambdaMART是Learning To Rank的其中一個算法,適用於許多排序場景。它是微軟Chris Burges大神的成果,最近幾年非常火,屢次現身於各種機器學習大賽中,Yahoo! Learning to Rank Challenge比賽中奪冠隊伍用的就是這個模型[1],據說Bing和Facebook使用的也是這個模型。

         本文先簡單介紹LambdaMART模型的組成部分,然後介紹與該模型相關的其他幾個模型:RankNet、LambdaRank,接着重點介紹LambdaMART的原理,然後介紹LambdaMART的開源實現軟件包Ranklib,最後以搜索下拉提示的個性化推薦場景說明LambdaMART的應用。

2.       符號說明

         在展開介紹之前先說明本文用到的符號所代表的含義:

符號

說明

q

用戶提交的查詢請求

d

需要排序的文檔

D

一次請求召回的待排序文檔集

s

模型計算得到的文檔得分

(i, j)

文檔 組成的有序pair

P

所有的文檔pair集合

排在 之前

文檔pair下標集合,對每個 ,有

排在 之前的預測概率

排在 之前的真實概率,實際如果 排在 之前則爲1,否則爲0

的真實序關係,取值範圍{0, }:0表示 的相關性一樣,誰排在前面沒關係;1表示 更相關,排在 前面;-1則相反,表示 排在 後面

3.       LambdaMART說文解字

         LambdaMART模型從名字上可以拆分成Lambda和MART兩部分,表示底層訓練模型用的是MART(Multiple Additive Regression Tree),如果MART看起來比較陌生,那換成GBDT(GradientBoosting Decision Tree)估計大家都很熟悉了,沒錯,MART就是GBDT。Lambda是MART求解過程使用的梯度,其物理含義是一個待排序的文檔下一次迭代應該排序的方向(向上或者向下)和強度。將MART和Lambda組合起來就是我們要介紹的LambdaMART。

4.       神奇的Lambda

         爲什麼LambdaMART可以很好的應用於排序場景?這主要受益於Lambda梯度的使用,前面介紹了Lambda的意義在於量化了一個待排序的文檔在下一次迭代時應該調整的方向和強度。

         但Lambda最初並不是誕生於LambdaMART,而是在LambdaRank模型中被提出,而LambdaRank模型又是在RankNet模型的基礎上改進而來。如此可見RankNet、LambdaRank、LambdaMART三個的關係很不一般,是一個神祕的基友羣,下面我們逐個分析三個基友之間的關係[2]。

5.       RankNet

         RankNet[3]是一個pairwise模型,它把排序問題轉換成比較一個(i, j) pair的排序概率問題,即比較 排在 前的概率。它首先計算每個文檔的得分,然後根據得分計算文檔pair的排序概率:


         可以看到這其實就是邏輯迴歸的sigmoid函數[4],由於 影響的是sigmoid函數的形狀,對最終結果影響不大,因此默認使用 =1進行簡化。RankNet證明了如果知道一個待排序文檔的排列中相鄰兩個文檔之間的排序概率,則通過推導可以算出每兩個文檔之間的排序概率。因此對於一個待排序文檔序列,只需計算相鄰文檔之間的排序概率,不需要計算所有pair,減少計算量。

         然後用交叉熵[5]作爲損失函數來衡量 的擬合程度:


         該損失函數有以下幾個特點:

         1) 當兩個相關性不同的文檔算出來的模型分數相同時,損失函數的值大於0,仍會對這對pair做懲罰,使他們的排序位置區分開

         2) 損失函數是一個類線性函數,可以有效減少異常樣本數據對模型的影響,因此具有魯棒性

         Ranknet最終目標是訓練出一個算分函數s=f(x:w),使得所有pair的排序概率估計的損失最小:


         RankNet採用神經網絡模型優化損失函數,採用梯度下降法[6]求解:


         排序問題的評價指標一般有NDCG[7]、ERR[8]、MAP[9]、MRR[10]等,這些指標的特點是不平滑、不連續,無法求梯度,因此無法直接用梯度下降法求解。RankNet的創新點在於沒有直接對這些指標進行優化,而是間接把優化目標轉換爲可以求梯度的基於概率的交叉熵損失函數進行求解。因此任何用梯度下降法優化目標函數的模型都可以採用該方法,RankNet採用的是神經網絡模型,其他類似boosting tree等模型也可以使用該方法求解。

6.       LambdaRank


1 pairwise error

         如圖 1所示,每個線條表示文檔,藍色表示相關文檔,灰色表示不相關文檔,RankNet以pairwise error的方式計算cost,左圖的cost爲13,右圖通過把第一個相關文檔下調3個位置,第二個文檔上條5個位置,將cost降爲11,但是像NDCG或者ERR等評價指標只關注top k個結果的排序,在優化過程中下調前面相關文檔的位置不是我們想要得到的結果。圖 1右圖左邊黑色的箭頭表示RankNet下一輪的調序方向和強度,但我們真正需要的是右邊紅色箭頭代表的方向和強度,即更關注靠前位置的相關文檔的排序位置的提升。LambdaRank[11]正是基於這個思想演化而來,其中Lambda指的就是紅色箭頭,代表下一次迭代優化的方向和強度,也就是梯度。

         受LambdaNet的啓發,LambdaRank對 做因式分解,如下:


         其中


         代入上式得


         其中令


         對於 的文檔pair,由於 ,因此 ,所以有


         因此,對每個文檔 ,其Lambda爲 ,即每一個文檔下一次調序的方向和強度取決於所有同一query的其他不同label的文檔。

         同時LambdaRank還在Lambda中引入評價指標Z (如NDCG、ERR等),把交換兩個文檔的位置引起的評價指標的變化 作爲其中一個因子,實驗表明對模型效果有顯著的提升:


         可以看出,LambdaRank不是通過顯示定義損失函數再求梯度的方式對排序問題進行求解,而是分析排序問題需要的梯度的物理意義,直接定義梯度,可以反向推導出LambdaRank的損失函數爲:


         LambdaRank相比RankNet的優勢在於分解因式後訓練速度變快,同時考慮了評價指標,直接對問題求解,效果更明顯。

7.       LambdaMART

         LambdaRank重新定義了梯度,賦予了梯度新的物理意義,因此,所有可以使用梯度下降法求解的模型都可以使用這個梯度,MART就是其中一種,將梯度Lambda和MART結合就是大名鼎鼎的LambdaMART[12]。

         MART[13][14]的原理是直接在函數空間對函數進行求解,模型結果由許多棵樹組成,每棵樹的擬合目標是損失函數的梯度,在LambdaMART中就是Lambda。LambdaMART的具體算法過程如下:


         可以看出LambdaMART的框架其實就是MART,主要的創新在於中間計算的梯度使用的是Lambda,是pairwise的。MART需要設置的參數包括:樹的數量M、葉子節點數L和學習率v,這3個參數可以通過驗證集調節獲取最優參數。

         MART支持“熱啓動”,即可以在已經訓練好的模型基礎上繼續訓練,在剛開始的時候通過初始化加載進來即可。下面簡單介紹LambdaMART每一步的工作:

         1)  每棵樹的訓練會先遍歷所有的訓練數據(label不同的文檔pair),計算每個pair互換位置導致的指標變化 以及Lambda,即 ,然後計算每個文檔的Lambda: ,再計算每個 的導數wi,用於後面的Newton step求解葉子節點的數值。

         2)  創建迴歸樹擬合第一步生成的 ,劃分樹節點的標準是Mean Square Error,生成一顆葉子節點數爲L的迴歸樹。

         3)  對第二步生成的迴歸樹,計算每個葉子節點的數值,採用Newton step求解,即對落入該葉子節點的文檔集,用公式 計算該葉子節點的輸出值。

         4)  更新模型,將當前學習到的迴歸樹加入到已有的模型中,用學習率v(也叫shrinkage係數)做regularization。

         LambdaMART具有很多優勢:

         1)  適用於排序場景:不是傳統的通過分類或者回歸的方法求解排序問題,而是直接求解

         2)  損失函數可導:通過損失函數的轉換,將類似於NDCG這種無法求導的IR評價指標轉換成可以求導的函數,並且富有了梯度的實際物理意義,數學解釋非常漂亮

         3)  增量學習:由於每次訓練可以在已有的模型上繼續訓練,因此適合於增量學習

         4)  組合特徵:因爲採用樹模型,因此可以學到不同特徵組合情況

         5)  特徵選擇:因爲是基於MART模型,因此也具有MART的優勢,可以學到每個特徵的重要性,可以做特徵選擇

         6)  適用於正負樣本比例失衡的數據:因爲模型的訓練對象具有不同label的文檔pair,而不是預測每個文檔的label,因此對正負樣本比例失衡不敏感

8.       Ranklib開源工具包

         Ranklib[15]是一個開源的Learning ToRank工具包,裏面實現了很多Learning To Rank算法模型,其中包括LambdaMART,其源碼的算法實現流程大致如下:


         該工具包定義的數據格式如下:

label           qid:$id      $feaid:$feavalue      $feaid:$feavalue      …      #description

         每行代表一個樣本,相同查詢請求的樣本的qid相同,label表示該樣本和該查詢請求的相關程度,description描述該樣本屬於哪個待排序文檔,用於區分不同的文檔。

         該工具包是用Java實現的,在空間使用上感覺有些低效,但整體設計還是挺好的,Ranker的接口設計的很好,值得學習借鑑。

         另外還有很多其他的LambdaMART的開源實現,有興趣的可以參考[16][17][18]

9.      LambdaMART應用

         最後我們以一個實際場景來介紹LambdaMART的應用。現在很多搜索引擎都有一個下拉提示的功能,學術上叫QAC(Query Auto-Completion,query自動補全),主要作用是在用戶在搜索引擎輸入框輸入query的過程中輸出一系列跟用戶輸入query前綴相匹配的query,供用戶選擇,減少用戶的輸入,讓用戶更加便捷的搜索。

         Milad Shokouhi[19]發現有一些query的熱度有明顯的用戶羣傾向,例如,當不同用戶輸入i時,年輕的女性用戶傾向於搜instagram,而男性用戶則傾向於搜imdb,所以可以對query的下拉提示做個性化排序。

         Milad Shokouhi使用LambdaMART模型作爲個性化排序模型,使用了用戶的長期歷史、短期歷史、性別、年齡、所處地域、提示query的原始排序位置等特徵,最終效果提升了9%,效果非常明顯。

         Milad Shokouhi的工作說明LambdaMART可以應用於個性化排序,且效果非常不錯。

10.   總結

         本文在一些相關書籍、paper和開源代碼的基礎上,簡單梳理了LambdaMART的來龍去脈,簡單總結:Lambda在RankNet出爐,在LambdaRank昇華,在LambdaMART發揚光大,青出於藍而勝於藍,模型的數學推導和實際效果都非常漂亮,只要涉及到排序的場景都可以適用,是排序場景的“萬金油”。

參考文獻:

[1]      Learning to Rank Using an Ensemble ofLambda-Gradient Models

[2]      From RankNet to LambdaRank to LambdaMART: AnOverview

[3]      Learning to Rank using Gradient Descent

[4]      Wikipedia-Sigmoid Function

[5]      Wikipedia-Cross Entropy

[6]      Wikipedia-Gradient Descent

[7]      Wikipedia-NDCG

[8]      Expected Reciprocal Rank for Graded Relevance

[9]      Wikipedia-MAP

[10]  Wikipedia-MRR

[11]  Learning to Rank with Nonsmooth CostFunctions

[12]  Adapting boosting for information retrievalmeasures

[13]  Greedy function approximation: A gradientboosting machine

[14]  The Elements of Statistical Learning

[15]  RankLib

[16]  jforests

[17]  xgboost

[18]  gbm

[19]  Learning to Personalize QueryAuto-Completion

轉載請註明出處,本文轉自http://blog.csdn.net/huagong_adu/article/details/40710305

本博客搬遷至:http://ralphadu.com/ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章