一、Ranknet
在使用搜索引擎的過程中,對於某一Query(或關鍵字),搜索引擎會找出許多與Query相關的URL,然後根據每個URL的特徵向量對該URL與主題的相關性進行打分並決定最終URL的排序,其流程如下:
排序的好壞完全取決於模型的輸出,而模型又由其參數決定,因而問題轉換成了如何利用帶label的訓練數據去獲得最優的模型參數w。Ranknet提供了一種基於Pairwise的訓練方法。
1、Cost function
預測相關性概率
對於任意一個URL對(Ui,Uj),模型輸出的score分別爲si和sj,那麼根據模型的預測,Ui比Uj與Query更相關的概率爲
Pij=P(Ui>Uj)=11+e−σ(si−sj)
,其中
σ
是個參數。
真實相關性概率
定義真實相關性概率爲
Pij⎯⎯⎯⎯⎯⎯=12(1+Sij)
,對於訓練數據中的Ui和Uj,它們都包含有一個與Query相關性的真實label,如果Ui比Uj更相關,那麼Sij=1;如果Ui不如Uj相關,那麼Sij=−1;如果Ui、Uj與Query的相關程度相同,那麼Sij=0。
代價函數定義
C(Pij⎯⎯⎯⎯⎯⎯,Pij)
=−∑Ui>Uj,Ui<Uj,Ui=UjPij⎯⎯⎯⎯⎯⎯logPij
=−Pij⎯⎯⎯⎯⎯⎯logPij−(1−Pij⎯⎯⎯⎯⎯⎯)log(1−Pij)−12log12
=−Pij⎯⎯⎯⎯⎯⎯logPij−(1−Pij⎯⎯⎯⎯⎯⎯)log(1−Pij)
化簡如下:
下圖展示了
Cij
隨
Pij⎯⎯⎯⎯⎯⎯、Pij
的變化情況:
圖中t表示
si−sj
,可以看到當
Sij=1
時,模型預測的
si比sj
越大,其代價越小;
Sij=−1
時,
si
比
sj
越小,代價越小;
Sij=0
時,代價的最小值在
si
與
sj
相等處取得。該代價函數有以下特點:
1)當兩個相關性不同的文檔算出來的模型分數相同時,損失函數的值大於0,仍會對這對pair做懲罰,使他們的排序位置區分開
2)損失函數是一個類線性函數,可以有效減少異常樣本數據對模型的影響,因此具有魯棒性
總代價
C=∑(i,j)∈ICij
,I表示所有URL pair的集合,對於
(i,j)∈I
的pair,i>j,即
Sij=1
。
2、梯度下降更新模型參數W
wk:=wk−αdCdwk
dCdwk=∑(i,j)∈I(dcijdsidsidwk+dcijdsjdsjdwk)
dCijdsi=σ(12(1−sij)−11+eσ(si−sj))=−dCijdsj=λij
dCdwk=∑(i,j)∈I(λijdsidwk−λijdsjdwk)=∑(i,j)∈Iλij(dsidwk−dsjdwk)
令
λi=∑j:(i,j)∈Iλij−∑j:(j,i)∈Iλij
dCdwk=∑iλidsjdwk
綜上
wk:=wk−α∑iλidsjdwk
二、LambdaRank
RankNet以錯誤pair最少爲優化目標,然而NDCG或者ERR等評價指標就只關注top k個結果的排序,所以修改cost function如下。
1、Cost function
Cij=log(1+e−σ(si−sj))|ΔNDCG|
λij=−σ1+eσ(si−sj)|ΔNDCG|
優化方式與RankNet相似。
三、LambdaMART
以上兩個方法都是通過cost function,採用隨機梯度下降更新模型參數,使得計算URL的score值在所有URL排序中,屬於最優位置。但是lambdamart是用梯度
λij=dCijdsi
建立gradient boosting CART迴歸樹,最後得到迴歸樹的加法模型作爲最終模型。下面從簡單的模型講解,一步步推導至lambdaMART。
1、AdaBoost算法
AdaBoost思想就是提高那些被前一輪弱分類器錯誤分類樣本的權值,而降低那些被正確分類樣本的權值;加大分類誤差率小的弱分類器的權值,使其在表決中起較大的作用,減小分類誤差率大的弱分類器的權值,使其在表決中起較小作用。
計算第m次迭代訓練數據更新的權值
Dm+1
- 初始化訓練數據的權值分佈
D1
爲均值:
D1=(w11,...,w1i,...,w1N),w1i=1N,i=1,2,...,N
- 第m次迭代的弱分類器
Gm(x)
在訓練數據集上的分類誤差率:
em=P(Gm(xi)≠yi)=∑Ni=1wmiI(Gm(xi)≠yi)
- 更新訓練數據集的權值分佈
Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)
wm+1,i=wmie−αmyiGm(xi)Zm
,i=1,2,..,N,
αm
爲當前迭代的弱分類器的權重。
Zm
是規範化因子
Zm=∑Ni=1wmie−αmyiGm(xi)
,規範後使得
Dm+1
成爲一個概率分佈。
1)當
Gm(x)=yi
時,
wm+1,i=wmie−αmZm
,正確分類樣本權值縮小
2)當
Gm(x)≠yi
時,
wm+1,i=wmieαmZm
,錯誤分類樣本權值增大
計算第m次迭代的弱分類器
Gm(x)
權值
αm
Gm(x)
的權值:
αm=12log1−emem
,對數爲自然對數。
其中
1−emem=1em−1
1)當
em
大,
1−emem
小,
am
小,分類器權重變低
2)當
em
小,
1−emem
大,
am
大,分類器權重變高。
算法
輸入:訓練數據集
T=(x1,y1),(x2,y2),...,(xN,yN)
,其中
xi∈χ⊆Rn,yi∈y⊆{−1,+1}
; 弱學習算法;
輸出:最終分類器G(x).
1.初始化訓練數據的權值分佈
D1=(w11,...,w1i,...,w1N),w1i=1N,i=1,2,...,N
2.對m=1,2,…,M
(a)使用具有權值分佈
Dm
的訓練數據集學習,得到基本分類器
Gm(x),Gm(x):χ
->{1,-1}
(b)計算
Gm(x)
在訓練數據集上的分類誤差率
em=P(Gm(xi)≠yi)=∑Ni=1wmiI(Gm(xi)≠yi)
(c)計算
Gm(x)
的係數
αm=12log1−emem
,對數爲自然對數
(d)更新訓練數據集的權值分佈
Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)
wm+1,i=wmie−αmyiGm(xi)Zm
,i=1,2,..,N
Zm
是規範化因子
Zm=∑Ni=1wmie−αmyiGm(xi)
,規範後使得
Dm+1
成爲一個概率分佈
3.構建基本分類器的線性組合
f(x)=∑Mm=1αmGm(x)
,得到最終分類器
G(x)=sign(f(x))=sign(∑Mm=1αmGm(x)
)
等價算法-前向分步加法算法
當前向分步算法的損失函數是指數函數時,就是AdaBoost算法。也就是說,前項分步加法算法每次直接通過最小化指數損失函數
L(yi,fm−1(xi)+αG(xi))=exp[−yi∗(fm−1(xi)+αG(xi))]
,得到弱分類器的參數和權值
α
;AdaBoost算法是其具體做法,每次通過帶權的訓練數據學習弱分類器參數,根據分類誤差率計算當前迭代弱分類器的權值
α
以及訓練數據的權值,而訓練數據的權值也是爲了下一次迭代求弱分類器的參數,目標爲了最小化最終分類器的誤分率,否則每次訓練數據權重一樣,每次學出來的分類器都是一樣的,改變訓練數據權重是爲了讓不同分類器側重不同的特徵。
1)加法模型
f(x)=∑Mm=1βmb(x;γm)
,其中
b(x;γm)
爲基函數,
γm
爲基函數的參數,
βm
爲基函數的係數。
在給定訓練數據及損失函數
L(y,f(x))
,通過最小化損失函數
minβ,γ∑Ni=1L(yi,βmb(xi;γm))
學習加法模型f(x)。
2)前向分步算法
輸入:訓練數據集
T=(x1,y1),(x2,y2),...,(xN,yN)
;損失函數
L(y,f(x))
;基函數集
{b(x;γ)}
;
輸出:加法模型f(x)
1. 初始化
f0(x)=0
2. 對m=1,2,…,M
(a)極小化損失函數
(βm,γm)=argminβ,γ∑Ni=1L(yi,fm−1(xi)+βb(xi;γ))
,得到參數
βm,γm
(b)更新
fm(x)=fm−1(x)+βmb(x;γm)
3. 得到加法模型
f(x)=fM(x)=∑Mm=1βmb(x;γm)
3)由指數損失的前向分步算法推導至AadBoost
假設經過m-1輪迭代,前向分步算法已經得到
fm−1(x)
,第m輪迭代目標是得到
αm、Gm(x)
,然後得到
fm(x)=fm−1(x)+αmGm(x)
,使得
fm(x)
在訓練數據集上的指數損失最小,損失函數爲:
L(yi,fm(x))=∑Ni=1exp[−yi(fm−1(xi)+αG(xi))]
。
即
(αm,Gm(x))=argminα,G∑Ni=1exp[−yi(fm−1(xi)+αG(xi))]
化簡,令
w⎯⎯⎯⎯mi=exp[−yifm−1(xi)]
得到
(αm,Gm(x))=argminα,G∑Ni=1w⎯⎯⎯⎯miexp[−yiαG(xi)]
(1)求
Gm(x)
對任意
α⪈0
,
Gm(x)=argminG∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))
,即AdaBoost的基本分類器。
(2)求
α
L=∑Ni=1w⎯⎯⎯⎯miexp[−yiαG(xi)]
=∑yi=Gm(xi)w⎯⎯⎯⎯mie−α+∑yi≠Gm(xi)w⎯⎯⎯⎯mieα
=e−α(∑Ni=1w⎯⎯⎯⎯mi−∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi)))+eα(∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi)))
=(eα−e−α)∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))+e−α∑Ni=1w⎯⎯⎯⎯mi
令
dLdα=0
(eα+e−α)∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))−e−α∑Ni=1w⎯⎯⎯⎯mi=0
(eα+e−α)∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))=e−α∑Ni=1w⎯⎯⎯⎯mi
(eα+e−α)e−α=∑Ni=1w⎯⎯⎯⎯mi∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))
e2α=∑Ni=1w⎯⎯⎯⎯mi∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))−1
α=12log[∑Ni=1w⎯⎯⎯⎯mi∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))−1]
其中
em=∑Ni=1w⎯⎯⎯⎯miI(yi≠G(xi))∑Ni=1w⎯⎯⎯⎯mi
,爲分類誤差率,分錯的樣本加權求和除以總的樣本加權求和。
α=12log(1em−1)=12log(1−emem)
,即AdaBoost算法的分類器權重計算方式。
(3)更新每輪樣本權值
由
fm(x)=fm−1(x)+αmGm(x)
,
w⎯⎯⎯⎯m,i=exp[−yifm−1(xi)]
,可知
w⎯⎯⎯⎯m+1,i=exp[−yifm(xi)]
=exp[−yi(fm−1(xi)+αmGm(xi))]
=w⎯⎯⎯⎯m,iexp[−yiαmGm(xi))]
,即AdaBoost算法訓練數據權值更新的計算方式,但此處權值歸一化放在了
em
計算時。
綜上,指數損失的前向分步算法就是AdaBoost算法。
2、CART迴歸樹
CART是在給定輸入隨機變量X條件下輸出隨機變量Y的條件概率分佈的學習方法,一般爲二叉樹,遞歸的二分每個特徵。
算法
輸入:訓練數據集D;
輸出:迴歸樹f(x)
1. 遍歷所有的j和s,選擇最優切分變量j(特徵)與切分點s(特徵值),即求解
minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]
【
c1
是所有劃分到
R1
區域的樣本的
yi
的均值】
2. 用選定的對(j,s)劃分區域並決定相應的輸出值:
R1(j,s)=x|x(j)≤s,R2(j,s)=x|x(j)⪈s
cm=1Nm∑xi∈Rm(j,s)yi
3. 繼續對兩個子區域調用步驟1、2,直至滿足停止條件
4. 將輸入空間劃分爲M個區域
R1,R2,...,RM
(即M個葉子節點),生成決策樹:
f(x)=∑Mm=1cmI(x∈Rm)
,判斷樣本屬於哪個葉子節點,輸出就賦值該葉子節點的均值。
3、提升樹(AdaBoost+CART)
提升樹模型就是決策樹的加法模型,對於分類問題,損失函數爲指數損失函數,故只需要將AdaBoost算法中的分類器限定爲二類分類樹即可,也就是說分類提升樹就是AdaBoost的一個特例。而對於迴歸提升樹,
fM(x)=∑Mm=1T(x;Θm)
,其中,
T(x;Θm)
表示決策樹,
Θm
爲決策樹的參數;M爲樹的個數。由於是迴歸模型,此處默認所有基函數參數爲1。
若將輸入空間劃分成J個互不相交的區域
R1,R2,...,RJ
(即決策樹的葉子節點),並在每個區域上確定輸出常量
cj
,決策樹可表示爲
T(x;Θm)=∑Jj=1cjI(x∈Rm),Θm={(R1,c1),(R2,c2),...,(RJ,cJ)}
。
採用平方誤差損失函數
L(y,f(x))=(y−f(x))2=[y−fm−1(x)−T(x;Θm)]2
,爲了讓損失函數最小,只需要讓
T(x;Θm)
接近前一次迭代的加法模型輸出與真實輸出的殘差
r=y−fm−1(x)
。
綜上,對迴歸問題的提升樹算法來說,最小化損失函數只需要簡單地擬合當前模型的殘差。
算法
輸入:訓練數據集
T=(x1,y1),(x2,y2),...,(xN,yN)
,其中
xi∈χ⊆Rn,yi∈y⊆R
;
輸出:提升樹
fM(x)
1. 初始化
f0(x)=0
2. 對m=1,2,…,M
(a)計算殘差
rmi=yi−fm−1(xi)
(b)擬合殘差
rmi
學習一個迴歸樹,得到第m棵樹的葉節點區域
Rmj
,j=1,2,…,J
(c)對j=1,2,…,J,計算葉子節點的輸出
cmj=ave(yi|xi∈Rmj)
, 得到
T(x;Θm)=∑Jj=1cmjI(x∈Rmj)
(d)更新
fm(x)=fm−1(x)+T(x;Θm)
3. 得到迴歸問題提升樹
fM(x)=∑Mm=1T(x;Θm)
4、GBDT(Gradient Boosting+CART)
當損失函數是平方損失(迴歸提升樹,採用前向加法算法)和指數損失(二分類提升樹,直接用AdaBoost算法)時,每一步優化是很簡單的。但對一般損失函數而言,並不那麼容易。
GBDT利用最速下降法的近似方法,關鍵在於利用損失函數關於
fm−1(x)
的負梯度(讓損失函數沿着梯度方向的下降)近似迴歸提升樹的殘差,擬合一個迴歸樹。
【主要思想】
求f(x),使得
minf(x)∑xi∈RL(y,f(x))
將f(x)看成一個參數,用梯度下降迭代求解f(x):
f(x):=f(x)−ddf(x)∑xi∈RL(y,f(x))
算法
輸入:訓練數據集
T=(x1,y1),(x2,y2),...,(xN,yN)
,其中
xi∈χ⊆Rn,yi∈y⊆R
; 損失函數
L(y,f(x))
;
輸出:迴歸樹f(x)
1. 初始化
f0(x)=argminc∑Ni=1L(yi,c)
,估計使損失函數極小化的常數值,它是隻有一個根節點的樹,
f0(xi)=c
,爲了方便第一次迭代計算
r1i
2. 對m=1,2,…,M
(a)對i=1,2,…,N,計算
rmi=−[dL(yi,f(xi))df(xi)]f(x)=fm−1(x)
(b)對
rmi
擬合一個迴歸樹,得到第m棵樹的葉節點區域
Rmj
,j=1,2,…,J,估計迴歸樹葉節點區域,以擬合殘差的近似值
(c)對j=1,2,…,J,計算葉子節點的輸出
cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c)
,普通的迴歸樹損失函數爲平方損失,