從損失函數談一談adaboost和GBDT和xgboost的區別

       adaboost和GBDT和xgboost在損失函數的最優化方法是有很多不同的,三者的不同之處其實就在於最優化方法的不同(這樣說不知道是否妥當,至少站在這個角度的我認爲是正確的,多年後可能發現這個觀點不太妥當)。adaboost在李航博士的《統計學習基礎》裏面用加法模型和向前算法解釋了權值更新策略。在解釋的過程中,樣本權值更新和弱分類器權值的求取是直接通過偏導數等於零來計算的,如果記不清楚的可以回去仔細看一下。不管是做迴歸還是做分類,adaboost的目標都是找到一個值(通過使得偏導數等零的方法)直接使得損失函數降低到最小。

       而GBDT使用的是梯度下降法使得損失函數有所降低。首先說一下爲什麼會提出這種方法,然後說一下爲什麼GBDT是使用梯度下降法將損失函數有所降低。這種方法的出現肯定是因爲對於某些損失函數,偏導數等於零是可解的,而對於一般的損失函數偏導數等於零是無法求解的,不然梯度下降法也不會存在了。而至於爲什麼GBDT使用的是梯度下降法將損失函數降低的。首先將損失函數在ft-1(x)處做一階泰勒展開(這裏的ft-1(x)就是前t-1個弱分類器的整合),展開之後是一個常數C 和 梯度g和新的弱分類器f的乘積(就是L = C + gf),這時候如果要讓損失函數L變得更小,就要讓梯度g和弱分類器f的乘積變得更小,所以就是用負梯度來擬合新的弱分類器。如果把弱分類器當做步長,那麼損失函數就代表沿着梯度走了一步。如果新的弱分類器跟負梯度完美擬合,那麼損失函數就變成了L = C + g(-f)= C-gg,所以這時候損失函數是下降了的。如果是這樣的話,只要保證新的弱分類器f的向量方向和梯度g相反,而向量模長儘可能大不就行了嗎?答案當然是不行的,因爲我們做的是損失函數在ft-1(x)的泰勒展開啊,如果步長太長的話沿着梯度相反的方向走一步,誤差就大了。所以步長也要小一點。在這不知道爲什麼定義步長f的模和梯度的模相等,可能Freidman有所考慮的吧,如果後續讓我來改進,我就從該地方入手,選擇多長的步長也就是-a*g來擬合新的弱分類器f,其中a>0。

       xgboost損失函數同樣是在ft-1(x)處做泰勒展開,不同的是做的二階泰勒展開,而且還附帶了對樹葉子節點約束、權值模長(其實可以考慮爲步長)約束的正則項。當然在GBDT裏面一樣可以做這些正則項約束,這裏面並不是xgboost特有的,但是不同的地方就是xgboost損失函數在ft-1(x)處做二階泰勒展開。對就是從二階泰勒展開入手去最優化損失函數的。

      這些是上述三個方法的不同吧。首先這篇文章中公式很少,對於查閱了比較多文獻,對這些東西有初步瞭解的人,看了纔會有效果。如果不太熟悉這些,下面的這段話對你沒有什麼啓發,可能只是天書。

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章