1. 程式人生 > >機器學習排序演算法:RankNet to LambdaRank to LambdaMART

機器學習排序演算法:RankNet to LambdaRank to LambdaMART

使用機器學習排序演算法LambdaMART有一段時間了,但一直沒有真正弄清楚演算法中的所有細節。

學習過程中細讀了兩篇不錯的博文,推薦給大家:

但經過一番搜尋之後發現,目前網上並沒有一篇透徹講解該演算法的文章,所以希望這篇文章能夠達到此目的。

本文主要參考微軟研究院2010年發表的文章From RankNet to LambdaRank to LambdaMART: An Overview$^1$,並結合自己的理解,試圖將RankNet、LambdaRank和LambdaMART這三種演算法的所有演算法細節講解透徹。

1. 概述

RankNet、LambdaRank和LambdaMART是三個關係非常緊密的機器學習排序演算法。簡而言之,RankNet是最基礎,基於神經網路的排序演算法;而LambdaRank在RankNet的基礎上修改了梯度的計算方式,也即加入了lambda梯度;LambdaMART結合了lambda梯度和MART(另稱為GBDT,梯度提升樹)。這三種演算法在工業界中應用廣泛,在BAT等國內大廠和微軟谷歌等世界網際網路巨頭內部都有大量應用,還曾經贏得“Yahoo!Learning To Rank Challenge(Track 1)"的冠軍。本人認為如果評選當今工業界中三種最重要的機器學習演算法,以LambdaMART為首的整合學習演算法肯定佔有一席之地,另外兩個分別是支援向量機和深度學習。

2. RankNet

2.1 演算法基礎定義

RankNet解決如下搜尋排序問題:給定query集合,每個query都對應著一個文件集合,如何對每個query返回排序後的文件集合。可以想象這樣的場景:某位高考生在得知自己的成績後,準備報考志願。聽說最近西湖大學辦得不錯,所以就想到網上搜搜關於西湖大學的資料。他開啟一個搜尋引擎,輸入“西湖大學”四個字,然後點選“搜尋”,頁面從上到下顯示了10條搜尋結果,他認為排在上面的肯定比下面的相關,所以就開始從上往下一個個地瀏覽。所以RankNet的目標就是對所有query,都能將其返回的文件按照相關性進行排序。

RankNet網路將輸入query的特徵向量$x\in \mathbb{R}^n$對映為一個實數$f(x) \in \mathbb{R}$。RankNet採用pairwise的方法進行模型訓練。具體地,給定特定query下的兩個文件$U_i$和$U_j$,其特徵向量分別為$x_i$和$x_j$,經過RankNet進行前向計算得到對應的分數為$s_i=f(x_i)$和$s_j=f(x_j)$。用$U_i \rhd U_j$表示$U_i$比$U_j$排序更靠前(如對某個query來說,$U_i$被標記為“good”,$U_j$被標記為“bad”)。繼而可以用下面的公式來表示$U_i$應該比$U_j$排序更靠前的概率:$$P_{ij} \equiv P(U_i \rhd U_j) \equiv \frac{1}{1+e^{-\sigma(s_i-s_j)}}$$這個概率實際上就是深度學習中經常使用的sigmoid函式,引數$\sigma$決定sigmoid函式的形狀。對於特定的query,定義$S_{ij} \in \{0,\pm1\}$為文件$i$和文件$j$被標記的標籤之間的關聯,即

$$ S_{ij}=\left\{\begin{aligned}1&&     文件i比文件j更相關\\0&&    文件i和文件j相關性一致\\-1&&   文件j比文件i更相關\end{aligned}\right.$$

定義$\overline{P}_{ij}=\frac{1}{2}(1+S_{ij})$表示$U_i$應該比$U_j$排序更靠前的已知概率,則可以用交叉熵定義優化目標的損失函式:$$C=-\overline{P}_{ij}log{P_{ij}}-(1-\overline{P}_{ij})log(1-P_{ij})$$

如果不太熟悉什麼是交叉熵,可以參考宗成慶老師的《統計自然語言處理》2.2節“資訊理論基本概念”,裡面將熵、聯合熵、互資訊、相對熵、交叉熵和困惑度等概念都講得相當清楚。

結合以上多個公式,可以改寫損失函式$C$為:$$C=\frac{1}{2}(1-S_{ij})\sigma(s_i-s_j)+log(1+e^{-\sigma(s_i-s_j)})$$

對於$S_{ij}=1$,$$C=log\left(1+e^{-\sigma(s_i-s_j)}\right)$$

然而對於$S_{ij}=-1$,$$C=log\left(1+e^{-\sigma(s_j-s_i)}\right)$$

可以看出損失函式$C$具有對稱性,也即交換$i$和$j$的位置,損失函式的值不變。

分析損失函式$C$的趨勢發現,如果對文件$U_i$和$U_j$的打分可以正確地擬合標記的標籤,則$C$趨向於0,否則$C$趨向於線性函式。具體地,假如$S_{ij}=1$,也即$U_i$應該比$U_j$排序高,如果$s_i>s_j$,則擬合的分數可以正確排序文件$i$和文件$j$,$$\lim \limits_{s_i-s_j\rightarrow\infty}C=\lim \limits_{s_i-s_j\rightarrow\infty}log\left(1+e^{-\sigma(s_i-s_j)}\right)=log1=0$$

如果$s_i<s_j$,則擬合的分數不能正確排序文件$i$和文件$j$,$$\lim \limits_{s_i-s_j\rightarrow\infty}C=\lim \limits_{s_i-s_j\rightarrow\infty}log\left(1+e^{-\sigma(s_i-s_j)}\right)=log\left(e^{-\sigma(s_i-s_j)}\right)=-\sigma(s_i-s_j)$$

利用神經網路對模型進行訓練,目前最有效的方法就是反向傳播演算法。反向傳播演算法中最核心部分就是損失函式對模型引數的求導,然後可以使用下面的公式對模型引數進行迭代更新:

$$w_k\rightarrow{w_k}-\eta\frac{\partial{C}}{\partial{w_k}}={w_k}-\eta\left(\frac{\partial{C}}{\partial{s_i}}\frac{\partial{s_i}}{\partial{w_k}}+\frac{\partial{C}}{\partial{s_j}}\frac{\partial{s_j}}{\partial{w_k}}\right)$$

損失函式$C$對$s_i$和$s_j$的偏導數為:$$\frac{\partial{C}}{\partial{s_i}}=\sigma\left(\frac{1}{2}(1-S_{ij})-\frac{1}{1+e^{\sigma(s_i-s_j)}}\right)=-\frac{\partial{C}}{\partial{s_j}}$$

$s_i$和$s_j$對$w_k$的偏導數可根據神經網路求偏導數的方式求得。求得了損失函式$C$對神經網路模型引數$w_k$的偏導數之後,就可以使用梯度下降演算法對其更新。這裡的學習率$\eta$也是一個正數,因為$\eta$需要滿足下面的不等式:$$\delta C=\sum_{k}\frac{\partial{C}}{\partial{w_k}}\delta w_k=\sum_{k}\frac{\partial{C}}{\partial{w_k}}\left(-\eta\frac{\partial{C}}{\partial{w_k}}\right)=-\eta\sum_{k}\left(\frac{\partial{C}}{\partial{w_k}}\right)^2<0$$

2.2 RankNet分解形式:加速RankNet訓練過程

2.1節中定義的RankNet,對於每一個文件對$(U_i$,$U_j)$都將計算損失函式對神經網路的引數$w_k$的偏導數,然後更新模型引數$w_k$。這樣做的缺點在於,對模型引數更新慢,耗時長。所以本節講解如何通過分解組合的方式加快這一訓練過程。

對於給定的文件對$U_i$和$U_j$,損失函式$C$對引數$w_k$的偏導數為:$$\frac{\partial{C}}{\partial{w_k}}=\frac{\partial{C}}{\partial{s_i}}\frac{\partial{s_i}}{\partial{w_k}}+\frac{\partial{C}}{\partial{s_j}}\frac{\partial{s_j}}{\partial{w_k}}=\sigma\left(\frac{1}{2}(1-S_{ij})-\frac{1}{1+e^{\sigma(s_i-s_j)}}\right)\left(\frac{\partial{s_i}}{\partial{w_k}}-\frac{\partial{s_j}}{\partial{w_k}}\right)=\lambda_{ij}\left(\frac{\partial{s_i}}{\partial{w_k}}-\frac{\partial{s_j}}{\partial{w_k}}\right)$$

其中:$$\lambda_{ij}=\frac{\partial{C(s_i-s_j)}}{\partial{s_i}}=\sigma\left(\frac{1}{2}(1-S_{ij})-\frac{1}{1+e^{\sigma(s_i-s_j)}}\right)$$

定義$I$為索引對$\{i,j\}$的集合,在不損失資訊量的情況下,可以將集合$I$中的索引對都轉換成滿足$U_i \rhd U_j$的形式。另外集合$I$中的索引對還應該滿足最多隻出現一次的條件。在此基礎上,累加權重引數$w_k$的更新量:$$\delta w_k=-\eta\sum_{(i,j) \in I}\left(\lambda_{ij}\frac{\partial{s_i}}{\partial{w_k}}-\lambda_{ij}\frac{\partial{s_j}}{\partial{w_k}}\right)=-\eta\sum_{i}\lambda_i\frac{\partial{s_j}}{\partial{w_k}}$$

其中:$$\lambda_i=\sum_{j:\{i,j\} \in I}\lambda_{ij}-\sum_{j:\{j,i\} \in I}\lambda_{ij}$$

通俗地說,$\lambda_i$就是集合$I$中所有$\{i,j\}$的$\lambda_{ij}$的和$-$集合$I$中所有$\{j,i\}$的$\lambda_{ij}$的和。如果還是不太明白,那看下面這個例子就明白了。集合$I=\{\{1,2\},\{2,3\},\{1,3\}\}$,則

$$\delta w_k=-\eta\sum_{\{i,j\}\in I}\left(\lambda_{ij}\frac{\partial{s_i}}{\partial{w_k}}-\lambda_{ij}\frac{\partial{s_j}}{\partial{w_k}}\right)=-\eta\left(\lambda_{12}\frac{\partial{s_1}}{\partial{w_k}}-\lambda_{12}\frac{\partial{s_2}}{\partial{w_k}}+\lambda_{13}\frac{\partial{s_1}}{\partial{w_k}}-\lambda_{13}\frac{\partial{s_3}}{\partial{w_k}}+\lambda_{23}\frac{\partial{s_2}}{\partial{w_k}}-\lambda_{23}\frac{\partial{s_3}}{\partial{w_k}}\right)=-\eta\left((\lambda_{12}+\lambda_{13})\frac{\partial{s_1}}{\partial{w_k}}+(\lambda_{23}-\lambda_{12})\frac{\partial{s_2}}{\partial{w_k}}+(-\lambda_{23}-\lambda_{13})\frac{\partial{s_3}}{\partial{w_k}}\right)$$

於是可以得到$\lambda_1=\lambda_{12}+\lambda_{13}$,$\lambda_2=\lambda_{23}-\lambda_{12}$,$\lambda_3=-\lambda_{23}-\lambda_{13}$

$\lambda_i$可以看成是作用在排序文件上的力,其正負代表了方向,長度代表了力的大小。最初的實現是對每個文件對,都計算一遍梯度並且更新神經網路的引數值,而這裡則是將同一個query下的所有文件對進行疊加,然後更新一次網路的權重引數。這種分解組合形式實際上就是一種小批量學習方法,不僅可以加快迭代速度,還可以為後面使用非連續的梯度模型打下基礎。

2.3 模型訓練過程示例

假設某個搜尋系統中,文件用2維的特徵向量表示。給定一個query下的三個文件向量分別為$x_1=(5,4.5)^T$,$x_2=(4,3.7)^T$和$x_3=(2,1.8)^T$,標記情況為$U_1 \rhd U_2 \rhd U_3$。為了簡化訓練過程,這裡採用單層的神經網路模型,即輸入層大小2,輸出層大小為1,輸出值為$f(x)=w_0+w_1x^{(1)}+w_2x^{(2)}$。

初始化$\mathbf{w}=[0, -1, 1]$,控制sigmoid函式形狀的$\sigma=0.1$,神經網路學習率$\eta=0.1$。

根據以上初始值可以計算出$s_1=-0.5$,$s_2=-0.3$和$s_3=-0.2$,可見此時三個文件輸出的分數並不滿足標記$U_1 \rhd U_2 \rhd U_3$。

計算$\lambda_1=\lambda_{12}+\lambda_{13}=-0.1012$,$\lambda_2=\lambda_{23}-\lambda_{12}=0.0002$,$\lambda_3=-\lambda_{23}-\lambda_{13}=-0.1010$。

$\delta w_0=-\eta\left(\lambda_1\frac{\partial{s_1}}{\partial{w_0}}+\lambda_2\frac{\partial{s_2}}{\partial{w_0}}+\lambda_3\frac{\partial{s_3}}{\partial{w_0}}\right)=0$

$\delta w_1=-\eta\left(\lambda_1\frac{\partial{s_1}}{\partial{w_1}}+\lambda_2\frac{\partial{s_2}}{\partial{w_1}}+\lambda_3\frac{\partial{s_3}}{\partial{w_1}}\right)=3.032$

$\delta w_2=-\eta\left(\lambda_1\frac{\partial{s_1}}{\partial{w_2}}+\lambda_2\frac{\partial{s_2}}{\partial{w_2}}+\lambda_3\frac{\partial{s_3}}{\partial{w_2}}\right)=2.7286$

更新網路權重:

$w_0=w0+\delta w_0=0+0=0$

$w_1=w1+\delta w_1=-1+3.032=2.032$

$w_2=w2+\delta w_2=1+2.7286=3.7286$

使用更新後的權重重新計算三個文件的分數,分別為$s_1=26.9387$,$s_2=21.92382$,$s_3=10.77548$。可見,經過一輪訓練,單層神經網路的輸出分數已經可以很好地擬合標記的標籤。

3. 資訊檢索評分

資訊檢索研究者經常使用的排序質量評分指標有以下四種:

MRR(Mean Reciprocal Rank),平均倒數排名

MAP(Mean Average Precision),平均正確率均值

NDCG(Normalized Discounted Cumulative Gain),歸一化折損累積增益

ERR(Expected Reciprocal Rank),預期倒數排名

其中,MRR和MAP只能對二級的相關性(排序等級:相關和不相關)進行評分,而NDCG和ERR則可以對多級的相關性(排序等級>2)進行評分。NDCG和ERR的另一個優點是更關注排名靠前的文件,在計算分數時會給予排名靠前的文件更高的權重。但是這兩種評分方式的缺點是函式不連續,不能進行求導,所以也就不能簡單地將這兩種評分方式加入到模型的損失函式中去。

3.1 MRR

對於一個查詢$i$來說,$rank_i$表示第一個相關結果的排序位置,所以:$$MRR(Q)=\frac{1}{|Q|}\sum_{i=1}^{|Q|}\frac{1}{rank_i}$$

$|Q|$表示查詢的數量,$MRR$表示搜尋系統在查詢集$Q$下的平均倒數排名值。$MRR$只能度量檢索結果只有一個並且相關性等級只有相關和不相關兩種的情況。

舉個簡單例子:

查詢語句 查詢結果 正確結果 排序位置 排序倒數
機器學習 快速排序,深度學習,平行計算 深度學習 2 1/2
蘋果手機 小米手機,華為手機,iphone 7 iphone 7 3 1/3
小米移動電源 小米移動電源,華為充電器,蘋果充電插頭 小米移動電源 1 1/1

所以$MRR(Q)=\frac{1/2+1/3+1}{3}=\frac{11}{18}$

 3.2 MAP

假定資訊需求$q_j \in Q$對應的所有相關文件集合為${d_{1},...,d_{mj}}$,$R_{jk}$是返回結果中直到遇到$d_k$後其所在位置前(含$d_k$)的所有文件的集合,則定義$MAP(Q)^2$如下:

$$MAP(Q)=\frac{1}{|Q|}\sum_{j=1}^{|Q|}\frac{1}{m_j}\sum_{k=1}^{m_j}Precision(R_{jk})$$

實際上有兩種計算$MAP$的方法或者說有兩種$MAP(Q)$的定義方法。第一種方法是在每篇相關文件所在位置上求正確率然後平均(參考上面的公式)。另一種是在每個召回率水平上計算此時的插值正確率,然後求11點平均正確率,最後在不同查詢之間計算平均。前者也稱為非插值$MAP(Q)$。一般提$MAP(Q)$都指前者,所有這裡也只討論前者。

如果對定義的公式不太理解,可以結合下面的例子進行理解。

查詢1:機器學習 查詢2:蘋果手機
排序位置 是否相關 排序位置 是否相關
1 1
2 2
3 3
4 4
5 5
6 6
7 7

針對上面檢索的結果,可計算出

$AP(1)=\left(1*1+1*1+2/3*0+2/4*0+3/5*1+3/6*0+3/7*0\right)/3=\frac{13}{15}$

$AP(2)=\left(0*0+1/2*1+2/3*1+2/4*0+2/5*0+3/6*1+4/7*1\right)/4=\frac{47}{84}$

$MAP(Q)=\frac{AP(1)+AP(2)}{2}=\frac{13/15+47/84}{2}=\frac{599}{420}$

3.3 NDCG

NDCG是基於前$k$個檢索結果進行計算的。設$R(j,m)$是評價人員給出的文件$d$對查詢$j$的相關性得分,那麼有:

$$NDCG(Q,k)=\frac{1}{|Q|}\sum_{j=1}^{|Q|}Z_{j,k}\sum_{m=1}^{k}\frac{2^{R(j,m)}-1}{log(1+m)}$$

其中$$DCG_k=\sum_{m=1}^{k}\frac{2^{R(j,m)}-1}{log(1+m)}$$

$Z_{j,k}$為第$j$個查詢的DCG歸一化因子,用於保證對於查詢$j$最完美系統的$DCG_k$得分是1。$Z_{j,k}$也可以用$\frac{1}{IDCG_k}$表示。$m$是返回文件的位置。如果某查詢返回的文件數$k'<k$,那麼上述公式只需要計算到$k'$為止。

修改上面簡單的例子進行輔助理解:

查詢1:機器學習 查詢2:蘋果手機
排序位置 相關程度 排序位置 相關程度
1 3 1 2
2 2 2 2
3 3 3 3
4 0 4 1
5 1 5 2
6 2 6 3
7 2 7 1

對於查詢1:機器學習:

$$DCG_7=\sum_{m=1}^{7}\frac{2^{R(j,m)}-1}{log(1+m)}=21.421516$$

查詢1返回結果的最佳相關程度排序為:3,3,2,2,2,1,0,所以,$IDCG_7=22.686817$,$NDCG_7=\frac{DCG_7}{IDCG_7}=0.944227$

對於查詢2:蘋果手機:

$$DCG_7=\sum_{m=1}^{7}\frac{2^{R(j,m)}-1}{log(1+m)}=18.482089$$

查詢2返回結果的最佳相關程度排序為:3,3,2,2,2,1,1,所以,$IDCG_7=23.167716$,$NDCG_7=\frac{DCG_7}{IDCG_7}=0.797752$

最後可得:$NDCG(Q,7)=(0.944227+0.797752)/2=0.870990$

3.4 ERR

$ERR^3$旨在改善NDCG計算當前結果時未考慮排在前面結果的影響的缺點,提出了一種基於級聯模型的評價指標。首先定義:

$$R(g)=\frac{2^g-1}{2^{g_{max}}}, g \in \{0,1,...,g_{max}\}$$

$g$代表文件的得分級別,$g_{max}$代表最大的分數級別。

於是定義:

$$ERR=\sum_{r=1}^{n}\frac{1}{r}\prod_{i=1}^{r-1}(1-R_i)R_r$$

展開公式如下:

$$ERR=R_1+\frac{1}{2}(1-R_1)R_2+\frac{1}{3}(1-R_1)(1-R_2)R_3+...+\frac{1}{n}(1-R_1)(1-R_2)...(1-R_{n-1})R_n$$ 

舉例來說($g_{max}=3$):

查詢:機器學習
排序位置 相關程度
1 3
2 2
3 3
4 1

$R_1=0.875,R2=0.375,R_3=0.875,R_4=0.125$

$ERR=0.875+\frac{1}{2}*0.125*0.375+\frac{1}{3}*0.125*0.625*0.875+\frac{1}{4}*0.125*0.625*0.125*0.125=0.913391$

4. LambdaRank

4.1 為什麼需要LambdaRank

先看一張論文原文中的圖,如下所示。這是一組用二元等級相關性進行排序的連結地址,其中淺灰色代表連結與query不相關,深藍色代表連結與query相關。 對於左邊來說,總的pairwise誤差為13,而右邊總的pairwise誤差為11。但是大多數情況下我們更期望能得到左邊的結果。這說明最基本的pairwise誤差計算方式並不能很好地模擬使用者對搜尋引擎的期望。右邊黑色箭頭代表RankNet計算出的梯度大小,紅色箭頭是期望的梯度大小。NDCG和ERR在計算誤差時,排名越靠前權重越大,可以很好地解決RankNet計算誤差時的缺點。但是NDCG和ERR均是不可導的函式,如何加入到RankNet的梯度計算中去?

圖1

4.2  LambdaRank定義

RankNet中的$\lambda_{ij}$可以看成是$U_i$和$U_j$中間的作用力,如果$U_i \rhd U_j$,則$U_j$會給予$U_i$向上的大小為$|\lambda_{ij}$的推動力,而對應地$U_i$會給予$U_j$向下的大小為$|\lambda_{ij}$的推動力。如何將NDCG等類似更關注排名靠前的搜尋結果的評價指標加入到排序結果之間的推動力中去呢?實驗表明,直接用$|\Delta_{NDCG}|$乘以原來的$\lambda_{ij}$就可以得到很好的效果,也即:

$$\lambda_{ij}=\frac{\partial{C(s_i-s_j)}}{\partial{s_i}}=\frac{-\sigma}{1+e^{\sigma(s_i-s_j)}}|\Delta_{NDCG}|$$

其中$|\Delta_{NDCG}|$是交換排序結果$U_i$和$U_j$得到的NDCG差值。NDCG傾向於將排名高並且相關性高的文件更快地向上推動,而排名地而且相關性較低的文件較慢地向上推動。

另外還可以將$|\Delta_{NDCG}|$替換成其他的評價指標。

5. LambdaMART

5.1 MART

LambdaMART是MART和LambdaRank的結合,所以要學習LambdaMART首先得了解什麼是MART。MART是Multiple Additive Regession Tree的簡稱,很多時候又稱為GBDT(Gradient Boosting Decision Tree)。MART是一種整合學習演算法,不同於經典的整合學習演算法Adaboost利用前一輪學習器的誤差來更新下一輪學習的樣本權重,MART每次都擬合上一輪分類器產生的殘差。舉個例子便於理解,比如一個人的年齡是50歲,第一棵樹擬合的結果是35歲,第一輪的殘差為15歲;然後第二棵數擬合的結果是10歲,兩棵樹相加總的擬合結果是45歲,第二輪的殘差為5歲;第三棵數擬合的結果為2歲,三棵樹相加擬合的結果是47歲,第三輪的殘差是3歲......只要如此不斷地進行下去,擬合結果就可以達到50歲,擬合殘差的過程就是訓練資料的過程。

對於一個給定的資料集$\{x_i,y_i\}, i=1,2,...,m$,其中特徵向量$x_i \in \mathbb{R}^n$,標籤$y_i \in \mathbb{R}$,可以用$x_{ij}, j=1,2,...,d來代表x_i的第j個特徵值$。對於一個典型的迴歸決策樹問題,需要遍歷所有特徵$j$的全部閾值$t$,找到最優的$j$和$t$使下面的等式最小化:

$$S_j=\sum_{i \in L}(y_i-\mu_L)^2+\sum_{i \in R}(y_i-\mu_R)^2$$

其中$x_{ij} \leq t$的所有樣本落入左子樹$L$中,其中$x_{ij} > t$的所有樣本落入右子樹$R$中,$\mu_L(\mu_R)$表示左子樹(右子樹)所有樣例標籤值的均值。如果這就是一棵最簡單的擁有一個根節點、兩個葉子節點的二叉迴歸樹,那麼只需要根據最優閾值切分為左右子樹,並且分別計算左右子樹的值$\gamma_l,l=1,2$即可。如果將劃分子樹的過程繼續進行$L-1$次即可得到一棵包含$L$個葉子節點的迴歸樹。

上面公式使用最小二乘法計算擬合誤差,所以通過上面方法得到的模型又稱為最小二乘迴歸樹。其實不管誤差的計算方式如何,我們都可以擬合出相應的迴歸樹,唯一的區別是梯度的計算不同而已。

MART使用線性組合的方式將擬合的樹結合起來,作為最後的輸出:

$$F_n(x)=\sum_{i=1}^{N}\alpha_if_i(x)$$

$f_i(x)$是單棵迴歸樹函式,$\alpha_i$是第$i$棵迴歸樹的權重。

在這裡我們需要弄清楚為什麼擬合殘差就能不斷減少擬合誤差。假設擬合誤差$C$是擬合函式$F_n$的函式$C(F_n)$。那麼:

$$\delta C \approx \frac{\partial{C(F_n)}}{\partial{F_n}}\delta F_n$$

如果取$\delta F_n=-\eta \frac{\partial{C}}{\partial{F_n}}$,就可以得到$\delta C<0$。其中$\eta$是學習率,為正實數。所以只要函式$F_n$擬合誤差函式的負梯度就可以不斷降低擬合誤差的值。

設標籤向量$y=[y_1,y_2,...,y_m]^T$,如果用最小二乘的方式表示擬合誤差,則:$$C=\frac{1}{2}(F_n-y)^2$$

那麼$\delta F_n=-\eta \frac{\partial{C}}{\partial{F_n}}=-\eta (F_n-y)$。這其實就是上面提到的殘差,所以擬合殘差可以不斷減少擬合誤差。

5.2 邏輯迴歸+MART進行二分類

瞭解了MART之後,下面舉一個MART實際應用的例子:使用MART和邏輯迴歸進行二分類。用於分類的樣本$x_i \in \mathbb{R}^n$,標籤$y_i \in \{\pm1\}$,擬合函式$F(x)$。為了簡化表示,我們表示條件概率如下:

$$P_+ \equiv P(y=1|x)$$

$$P_- \equiv P(y=-1|x)$$

用交叉熵表示損失函式:$$L(y,F)=-ylog(P_+)-(1-y)log(P_-)$$

邏輯迴歸使用對數機率(屬於正例概率/屬於負例概率)進行建模,

$$F_n(x)=\frac{1}{2}log(\frac{P_+}{P_-})$$

$$P_+=\frac{1}{1+e^{-2\sigma F_n(x)}}$$

$$P_-=1-P_+=\frac{1}{1+e^{2\sigma F_n(x)}}$$

將$P_+$和$P_-$帶入$L(y,F)$中,得到:

$$L(y,F_n)=log(1+e^{-2y\sigma F_n})$$

$R_{jm}$表示落入第$m$棵樹的第$j$個葉子節點中的樣例集合,可以通過下式對該葉子節點的值進行優化:

$$\gamma_{jm}=arg\min_{\gamma}\sum_{x_i \in R_{jm}}\log\left(1+e^{-2\sigma y_i\left(F_{m-1}\,\,\left({x_i}\right)+\gamma\right)\,}\right)$$

上式可以使用Newton-Raphson方法按照下面的公式進行迭代求解:

$$\gamma_{n+1}=\gamma_{n}-\frac{g'(\gamma_n)}{g''(\gamma_n)}$$

5.3 LambdaMART基本定義

LambdaMART基於MART,優化$\lambda$梯度。根據上面的定義,對於任意$U_i$和$U_j$,有:

$$\lambda_{ij}=\frac{\partial{C(s_i-s_j)}}{\partial{s_i}}=\frac{-\sigma |\Delta_{Z_{ij}}|}{1+e^{\sigma(s_i-s_j)}}$$

$|\Delta_{Z_{ij}}|$表示交換$U_i$和$U_j$的位置產生的評價指標差值,$Z$可以是$NDCG$或者$ERR$等。對於特定$U_i$,累加其他所有排序項的影響,得到:

$$\lambda_i=\sum_{j:\{i,j\} \in I}\lambda_{ij}-\sum_{j:\{j,i\} \in I}\lambda_{ij}$$

 為了簡化表示:

$$\sum_{\{i,j\}\rightleftharpoons I}=\sum_{j:\{i,j\} \in I}\lambda_{ij}-\sum_{j:\{j,i\} \in I}\lambda_{ij}$$

於是我們可以更新損失函式:

$$\frac{\partial{C}}{\partial{s_i}} = \sum_{j:\{i,j\} \in I} \frac{-\sigma |\Delta_{Z_{ij}}|}{1+e^{\sigma(s_i-s_j)}} = \sum_{j:\{i,j\} \in I} -\sigma |\Delta_{Z_{ij}}| \rho_{ij}$$

其中,我們定義:

$$\rho_{ij}=\frac{1}{1+e^{\sigma(s_i-s_j)}}=\frac{-\lambda_{ij}}{\sigma |\Delta_{Z_{ij}}|}$$

然後可以得到:

$$\frac{\partial{^2C}}{\partial{s_i^2}}=\sum_{\{i,j\}\rightleftharpoons I}\sigma^2|\Delta_{Z_{ij}}|\rho{ij}(1-\rho_{ij})$$

所以我們可以用下面的公式計算第$k$棵樹的第$k$個葉子節點上的值:

$$\gamma_{km}=\frac{\sum_{x_i \in R_{km}}\frac{\partial{C}}{\partial{s_i}}}{\sum_{x_i \in R_{km}}\frac{\partial{^2C}}{\partial{s_i^2}}}=\frac{-\sum_{x_i \in R_{km}}\sum_{\{i,j\}\rightleftharpoons I}|\Delta_{Z_{ij}}|\rho_{ij}}{\sum_{x_i \in R_{km}}\sum_{\{i,j\}\rightleftharpoons I}|\Delta_{Z_{ij}}|\rho_{ij}(1-\rho_{ij})}$$

所以總結LambdaMART演算法如下:

6. 參考文獻

1. Christopher J.C. Burges. From RankNet to LambdaRank to LambdaMART: An Overview. Microsoft Research Technical Report MSR-TR-010-82.

2. Chrisopher D.Manning, Prabhakar Raghavan, Hinrich Schutze著, 王斌譯. Introduction to Information Retrieval, 8.4 有序檢索結果的評價方法, 2017年10月北京第11次印刷.

3. Olivier Chapelle, Ya Zhang, Pierre Grinspan. Expected Recipocal Rank for Graded Relevance. CIKM 2009.