最近看了Friedman的關於梯度提升算法的論文,記錄一下。
1 函數估計
在機器學習領域,算法就是利用數據去估計一個函數或就是一個“預測學習”問題。用訓練數據得到一個估計的F*(x),這個函數將x映射到y,然後我們通過最小化一個損失函數,求出我們想要的F(x),即:
F∗=argminFEy,xL(y,F(x))=argminFEx[EyL(y,F(x))|x](1)
而
L(y,f(x)) 包括軍方誤差
(y−F)2 ,binomial log-likelihood(logic regression)等
常見的套路就是限定
F(x) 是某個參數化的函數空間裏的一個函數
F(x;P) ,
P={P1,P2⋯} 是一個有限集合,這裏我們只考慮加法模型
F(x;{βm,am})=∑m=1Mβmh(x;am)(2)
公式(2)其實是很多算法的核心思想,如神經網絡、支持向量機等,這裏只討論
h(x;am) 是一個小的迴歸樹。其中的參數包括分割變量、分割位置以及葉子節點的值。
1.1 數值優化
通常,選擇一個參數化的模型令
P∗=argminPΦ(P)(3)
這裏
Φ(P)=Ex,yL(y,F(x;P)) (4)
最後我們求得的最優函數就是:
F∗(X)=F(x;P∗) ,也就是我們最終想要擬合出來的模型。數值優化的方法是用來求解(3),而最終的參數P對應的結果可以表達成
P∗=∑Mm=0pm 的形式。
1.2 梯度下降
梯度下降是最簡單數值優化的方法之一,而對於(3)式來說,當前的梯度爲
gm=gjm=[∂Φ(P)∂ pj]p=pm−1
其中
Pm−1=∑m−1i=0pi
令
pm=−ρmgm
而
ρm=argminρΦ(Pm−1−ρgm)(5)
用有限的數據來估計模型
按照式(1)則有
{βm,amM1}=argmin∑Ni=1L(yi,β′mh(xi;a′m))(6)在這種情況確實得到的是最優解,但是複雜度太高,很難求解。所以可以選擇“貪心”算法。即對於
m 1,2⋯, M
(βm,am)=argminβ,a∑i=1NL(yi,Fm−1(xi)+β∗h(xi;a))(7)
然後
Fm(x)=Fm−1(x)+βm∗h(xi;am)(8)
在機器學習中,函數
h(x;am) 被稱爲弱學習器或者基於學習器,而這個迭代的過程被稱爲“boosting”。給一定一個
Fm−1(x) ,我們就可以用之前所述的梯度下降法,來求解
β 以及
h(x;a) .。給定特定的loss
L(y,F) 和
h(x;a) ,式(7)的解式很難求的。給定一個
Fm−1(x) ,
βmh(x;am) 可以被看成最佳的貪心算法,對
F∗(x) 的估計。
求出損失函數在每一個訓練數據的梯度,得出一個N維的向量。
−gm(xii)=−{∂L(yi,F(xi))∂F(xi)}F(x)=Fm−1(x)
但是這樣求出來的梯度不能泛化的其他的數據上。一個方法是選擇一個
h(x;am) 使得它求得的
hm={h(xi;am)} 儘可能的與
−gm 平行
am=argmin∑a,β[−gm(xi)−βh(xi;a)]2
求出a參數向量之後,就可以求出另外一個參數
βm=argmin∑i=1Nl(yi,Fm−1(xi)+βh(xi;am))
然後就可以更新
Fm(x)=Fm−1(x)+βmh(x;am)
僞代碼如下: