使用機器學習排序算法LambdaMART有一段時間了,但一直沒有真正弄清楚算法中的全部細節。html
學習過程當中細讀了兩篇不錯的博文,推薦給你們:算法
徐博From RankNet to LambdaRank to LambdaMART: An Overviewiphone
但通過一番搜尋以後發現,目前網上並無一篇透徹講解該算法的文章,因此但願這篇文章可以達到此目的。機器學習
本文主要參考微軟研究院2010年發表的文章From RankNet to LambdaRank to LambdaMART: An Overview11,並結合本身的理解,試圖將RankNet、LambdaRank和LambdaMART這三種算法的全部算法細節講解透徹。函數
RankNet、LambdaRank和LambdaMART是三個關係很是緊密的機器學習排序算法。簡而言之,RankNet是最基礎,基於神經網絡的排序算法;而LambdaRank在RankNet的基礎上修改了梯度的計算方式,也即加入了lambda梯度;LambdaMART結合了lambda梯度和MART(另稱爲GBDT,梯度提高樹)。這三種算法在工業界中應用普遍,在BAT等國內大廠和微軟谷歌等世界互聯網巨頭內部都有大量應用,還曾經贏得「Yahoo!Learning To Rank Challenge(Track 1)"的冠軍。本人認爲若是評選當今工業界中三種最重要的機器學習算法,以LambdaMART爲表明的集成學習算法確定佔有一席之地,另外兩個分別是支持向量機和深度學習。學習
2.1 算法基礎定義優化
RankNet解決以下搜索排序問題:給定query集合,每一個query都對應着一個文檔集合,如何對每一個query返回排序後的文檔集合。能夠想象這樣的場景:某位高考生在得知本身的成績後,準備報考志願。據說最近西湖大學辦得不錯,因此就想到網上搜搜關於西湖大學的資料。他打開一個搜索引擎,輸入「西湖大學」四個字,而後點擊「搜索」,頁面從上到下顯示了10條搜索結果,他認爲排在上面的確定比下面的相關,因此就開始從上往下一個個地瀏覽。因此RankNet的目標就是對全部query,都能將其返回的文檔按照相關性進行排序。搜索引擎
RankNet網絡將輸入query的特徵向量x∈Rnx∈Rn映射爲一個實數f(x)∈Rf(x)∈R。RankNet採用pairwise的方法進行模型訓練。具體地,給定特定query下的兩個文檔UiUi和UjUj,其特徵向量分別爲xixi和xjxj,通過RankNet進行前向計算獲得對應的分數爲si=f(xi)si=f(xi)和sj=f(xj)sj=f(xj)。用Ui⊳UjUi⊳Uj表示UiUi比UjUj排序更靠前(如對某個query來講,UiUi被標記爲「good」,UjUj被標記爲「bad」)。繼而能夠用下面的公式來表示UiUi應該比UjUj排序更靠前的機率:atom
這個機率實際上就是深度學習中常用的sigmoid函數,參數σσ決定sigmoid函數的形狀。對於特定的query,定義Sij∈{0,±1}Sij∈{0,±1}爲文檔ii和文檔jj被標記的標籤之間的關聯,即
定義P¯¯¯¯ij=12(1+Sij)P¯ij=12(1+Sij)表示UiUi應該比UjUj排序更靠前的已知機率,則能夠用交叉熵定義優化目標的損失函數:
若是不太熟悉什麼是交叉熵,能夠參考宗成慶老師的《統計天然語言處理》2.2節「信息論基本概念」,裏面將熵、聯合熵、互信息、相對熵、交叉熵和困惑度等概念都講得至關清楚。
結合以上多個公式,能夠改寫損失函數CC爲:
對於Sij=1Sij=1,
然而對於Sij=−1Sij=−1,
能夠看出損失函數CC具備對稱性,也即交換ii和jj的位置,損失函數的值不變。
分析損失函數CC的趨勢發現,若是對文檔UiUi和UjUj的打分能夠正確地擬合標記的標籤,則CC趨向於0,不然CC趨向於線性函數。具體地,假如Sij=1Sij=1,也即UiUi應該比UjUj排序高,若是si>sjsi>sj,則擬合的分數能夠正確排序文檔ii和文檔jj,
若是si<sjsi<sj,則擬合的分數不能正確排序文檔ii和文檔jj,
利用神經網絡對模型進行訓練,目前最有效的方法就是反向傳播算法。反向傳播算法中最核心部分就是損失函數對模型參數的求導,而後可使用下面的公式對模型參數進行迭代更新:
損失函數CC對sisi和sjsj的偏導數爲:
sisi和sjsj對wkwk的偏導數可根據神經網絡求偏導數的方式求得。求得了損失函數CC對神經網絡模型參數wkwk的偏導數以後,就可使用梯度降低算法對其更新。這裏的學習率ηη也是一個正數,由於ηη須要知足下面的不等式:
2.2 RankNet分解形式:加速RankNet訓練過程
2.1節中定義的RankNet,對於每個文檔對(Ui(Ui,Uj)Uj)都將計算損失函數對神經網絡的參數wkwk的偏導數,而後更新模型參數wkwk。這樣作的缺點在於,對模型參數更新慢,耗時長。因此本節講解如何經過分解組合的方式加快這一訓練過程。
對於給定的文檔對UiUi和UjUj,損失函數CC對參數wkwk的偏導數爲:
其中:
定義II爲索引對{i,j}{i,j}的集合,在不損失信息量的狀況下,能夠將集合II中的索引對都轉換成知足Ui⊳UjUi⊳Uj的形式。另外集合II中的索引對還應該知足最多隻出現一次的條件。在此基礎上,累加權重參數wkwk的更新量:
其中:
通俗地說,λiλi就是集合II中全部{i,j}{i,j}的λijλij的和−−集合II中全部{j,i}{j,i}的λijλij的和。若是仍是不太明白,那看下面這個例子就明白了。集合I={{1,2},{2,3},{1,3}}I={{1,2},{2,3},{1,3}},則