1. 程式人生 > >Learning To Rank之LambdaMART的前世今生

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發揚光大,青出於藍而勝於藍,模型的數學推導和實際效果都非常漂亮,只要涉及到排序的場景都可以適用,是排序場景的“萬金油”。

參考文獻:

[18]  gbm