機器學習中的數學(3)
版權聲明:
本文由LeftNotEasy發佈於http://leftnoteasy.cnblogs.com/, 本文可以被全部的轉載或者部分使用,但請註明出處,如果有問題,請聯繫http://www.360doc.com/mailto:wheeleast@gmail.com
前言:
本來上一章的結尾提到,準備寫寫線性分類的問題,文章都已經寫得差不多了,但是突然聽說最近Team準備做一套分散式的分類器,可能會使用Random Forest來做,下了幾篇論文看了看,簡單的random forest還比較容易弄懂,複雜一點的還會與boosting等演算法結合(參見iccv09),對於boosting也不甚了解,所以臨時抱佛腳的看了看。說起boosting,強哥之前實現過一套Gradient Boosting Decision Tree(GBDT)演算法,正好參考一下。
最近看的一些論文中發現了模型組合的好處,比如GBDT或者rf,都是將簡單的模型組合起來,效果比單個更複雜的模型好。組合的方式很多,隨機化(比如random forest),Boosting(比如GBDT)都是其中典型的方法,今天主要談談Gradient Boosting方法(這個與傳統的Boosting還有一些不同)的一些數學基礎,有了這個數學基礎,上面的應用可以看Freidman的Gradient Boosting Machine。
本文要求讀者學過基本的大學數學,另外對分類、回歸等基本的機器學習概念了解。
本文主要參考資料是prml與Gradient Boosting Machine。
Boosting方法:
Boosting這其實思想相當的簡單,大概是,對一份數據,建立M個模型(比如分類),一般這種模型比較簡單,稱為弱分類器(weak learner)每次分類都將上一次分錯的數據權重提高一點再進行分類,這樣最終得到的分類器在測試數據與訓練數據上都可以得到比較好的成績。
上圖(圖片來自prml p660)就是一個Boosting的過程,綠色的線表示目前取得的模型(模型是由前m次得到的模型合併得到的),虛線表示當前這次模型。每次分類的時候,會更關注分錯的數據,上圖中,紅色和藍色的點就是數據,點越大表示權重越高,看看右下角的圖片,當m=150的時候,獲取的模型已經幾乎能夠將紅色和藍色的點區分開了。
Boosting可以用下面的公式來表示:
訓練集中一共有n個點,我們可以為裡面的每一個點賦上一個權重Wi(0 <= i < n),表示這個點的重要程度,通過依次訓練模型的過程,我們對點的權重進行修正,如果分類正確了,權重降低,如果分類錯了,則權重提高,初始的時候,權重都是一樣的。上圖中綠色的線就是表示依次訓練模型,可以想像得到,程序越往後執行,訓練出的模型就越會在意那些容易分錯(權重高)的點。當全部的程序執行完後,會得到M個模型,分別對應上圖的y1(x)…yM(x),通過加權的方式組合成一個最終的模型YM(x)。
我覺得Boosting更像是一個人學習的過程,開始學一樣東西的時候,會去做一些習題,但是常常連一些簡單的題目都會弄錯,但是越到後面,簡單的題目已經難不倒他了,就會去做更複雜的題目,等到他做了很多的題目後,不管是難題還是簡單的題都可以解決掉了。
Gradient Boosting方法:
其實Boosting更像是一種思想,Gradient Boosting是一種Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型損失函數的梯度下降方向。這句話有一點拗口,損失函數(loss function)描述的是模型的不靠譜程度,損失函數越大,則說明模型越容易出錯(其實這裡有一個方差、偏差均衡的問題,但是這裡就假設損失函數越大,模型越容易出錯)。如果我們的模型能夠讓損失函數持續的下降,則說明我們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度(Gradient)的方向上下降。
下面的內容就是用數學的方式來描述Gradient Boosting,數學上不算太複雜,只要潛下心來看就能看懂:)
可加的參數的梯度表示:
假設我們的模型能夠用下面的函數來表示,P表示參數,可能有多個參數組成,P = {p0,p1,p2….},F(x;P)表示以P為參數的x的函數,也就是我們的預測函數。我們的模型是由多個模型加起來的,β表示每個模型的權重,α表示模型裡面的參數。為了優化F,我們就可以優化{β,α}也就是P。
我們還是用P來表示模型的參數,可以得到,Φ(P)表示P的likelihood函數,也就是模型F(x;P)的loss函數,Φ(P)=…後面的一塊看起來很複雜,只要理解成是一個損失函數就行了,不要被嚇跑了。
既然模型(F(x;P))是可加的,對於參數P,我們也可以得到下面的式子:
這樣優化P的過程,就可以是一個梯度下降的過程了,假設當前已經得到了m-1個模型,想要得到第m個模型的時候,我們首先對前m-1個模型求梯度。得到最快下降的方向,gm就是最快下降的方向。
這裡有一個很重要的假設,對於求出的前m-1個模型,我們認為是已知的了,不要去改變它,而我們的目標是放在之後的模型建立上。就像做事情的時候,之前做錯的事就沒有後悔葯吃了,只有努力在之後的事情上別犯錯:
我們得到的新的模型就是,它就在P似然函數的梯度方向。ρ是在梯度方向上下降的距離。
我們最終可以通過優化下面的式子來得到最優的ρ:
可加的函數的梯度表示:
上面通過參數P的可加性,得到了參數P的似然函數的梯度下降的方法。我們可以將參數P的可加性推廣到函數空間,我們可以得到下面的函數,此處的fi(x)類似於上面的h(x;α),因為作者的文獻中這樣使用,我這裡就用作者的表達方法:
同樣,我們可以得到函數F(x)的梯度下降方向g(x)
最終可以得到第m個模型fm(x)的表達式:
通用的Gradient Descent Boosting的框架:
下面我將推導一下Gradient Descent方法的通用形式,之前討論過的:
對於模型的參數{β,α},我們可以用下面的式子來進行表示,這個式子的意思是,對於N個樣本點(xi,yi)計算其在模型F(x;α,β)下的損失函數,最優的{α,β}就是能夠使得這個損失函數最小的{α,β}。
表示兩個m維的參數:
寫成梯度下降的方式就是下面的形式,也就是我們將要得到的模型fm(x)的參數{αm,βm}能夠使得fm的方向是之前得到的模型Fm-1(x)的損失函數下降最快的方向:
對於每一個數據點xi都可以得到一個gm(xi),最終我們可以得到一個完整梯度下降方向
為了使得fm(x)能夠在gm(x)的方向上,我們可以優化下面的式子得到,可以使用最小二乘法:
得到了α的基礎上,然後可以得到βm。
最終合併到模型中:
演算法的流程圖如下
之後,作者還說了這個演算法在其他的地方的推廣,其中,Multi-class logistic regression and classification就是GBDT的一種實現,可以看看,流程圖跟上面的演算法類似的。這裡不打算繼續寫下去,再寫下去就成論文翻譯了,請參考文章:Greedy function Approximation – A Gradient Boosting Machine,作者Freidman。
總結:
本文主要談了談Boosting與Gradient Boosting的方法,Boosting主要是一種思想,表示「知錯就改」。而Gradient Boosting是在這個思想下的一種函數(也可以說是模型)的優化的方法,首先將函數分解為可加的形式(其實所有的函數都是可加的,只是是否好放在這個框架中,以及最終的效果如何)。然後進行m次迭代,通過使得損失函數在梯度方向上減少,最終得到一個優秀的模型。值得一提的是,每次模型在梯度方向上的減少的部分,可以認為是一個「小」的或者「弱」的模型,最終我們會通過加權(也就是每次在梯度方向上下降的距離)的方式將這些「弱」的模型合併起來,形成一個更好的模型。
有了這個Gradient Descent這個基礎,還可以做很多的事情。也在機器學習的道路上更進一步了:)
推薦閱讀:
※神經網路的理解
※五一重磅-李飛飛團隊主講-CS231-2018(春)基於CNN的視覺識別課程分享
※圖解機器學習:如何粗略理解underfitting, overfitting, 和overfitting的解決方案
※第三章 線性模型