Gradient Boosting框架的理解和复习

文本主要是对Gradient Boosting框架的复习,温故而知新,进一步理解Gradient Boosting框架~

文章结构为:

1、从adaboost损失函数理解Gradient Boosting的目的(扩展损失函数)

2、从梯度下降角度理解前向加法模型(为什么拟合的是损失函数的负梯度)

3、同林轩田技法中方法做结合

4、总结不同boosting和GBDT

1、从前向加法模型角度思考

为什么能够自定义函数?
自定义函数后每一个基学习器是怎么学习的?
前向加法算法的过程?

输入:(x,y), T(基学习器的数量), L(损失函数)

1、初始化f0,f0一般为一个常数

2、针对每一次基学习器的学习

  • 2-1、计算需要拟合的负梯度
  • 2-2、根据负梯度,学习基学习器的权重参数(增加缩减)
  • 2-3、通过线性搜索寻找步长
  • 2-4、根据步长和基学习器,更新总函数(求和)

3、输出总求和函数

2、怎么理解前向加法算法模型,为什么要去拟合负梯度

Gradient Boosting里的梯度和梯度下降里的梯度有什么联系?

梯度下降的角度

1、参数空间的优化:梯度下降是每次小步走,每小步都往函数值下降最快的方向走,不断优化权重 ww

wk=w0+α1g1+α2g2...+αkgk w_k = w_0 + \alpha_1*g_1 + \alpha_2*g_2 ... + \alpha_k*g_k

2、从梯度下降得到启发,将梯度下降的优化方法扩展到函数空间的优化,那么目标就是寻找最优的F,使得预测值对应的损失函数最小:

F=argminFL(y,F(x))F(x)=m=0Mfm(x) F = \arg\min\limits_FL(y, F(x)) \\ 其中F(x) = \sum_{m=0}^Mf_m(x)

3、因为最终目标就是找到最优的 F(x)F(x),类似梯度下降算法,构造弱分类器 f1,f2,f3...fm{f_1, f_2, f_3...f_m},每次迭代求梯度:

fk=f0+ρ1g1+ρ2g2+...+ρmgm:gm=L(y,F(x))F(x)F=Fm1 f_k = f_0 + \rho_1*g_1 + \rho_2*g_2 + ... + \rho_m*g_m \\ 其中: g_m = -\frac{\partial L(y, F(x))}{\partial F(x)}|F=F_{m-1}

这里其实用到了 贪心算法 的思想,如果用所有f(x)全加到损失函数中做拟合时,因为一次性找出最优的f(x)和学习率,而且当新分类器被加入到整体模型中时,还需要调整之前的分类器。整个问题是一个NP难问题,所以最终通过贪心法,迭代求局部最优解

所以这里训练是每次只训练一个弱分类器,当新分类器被加入模型的时候,不调整原来得到的分类器。

3、为什么要去拟合负梯度?

这是我初学GBDT一直困惑的一个问题,在此复习时总结下:

3-1、总结1-3所说内容,就是将梯度下降(参数空间优化)引入到函数空间优化(前向加法模型)

wepon大佬的PPT这页很好,具体可以参考:http://wepon.me/files/gbdt.pdf

Gradient Boosting框架的理解和复习

  • 在梯度下降中,我们是寻找的最优w,通过每一次求负 梯度*步长,最终将结果加起来就是最优的w
  • 同理,在前向加法模型中,我们寻找的是最优F(x),通过每一次用基学习器 拟合 负梯度*步长,最终将基学习器的计算结果加起来,就是最优的F(x)
  • 整体思路大致是这样,那么重点就在拟合 这里,为什么这里是拟合,而不是计算 负梯度*步长呢?

3-2、怎么求函数对函数的导数(每一个基学习器,拟合负梯度)

总体来说,是为了提高模型的泛化能力

  • 因为损失函数L直接求F(x)函数的梯度难以求解
  • 所以通过F(x)在训练集取值的梯度来替代
  • 为了能够泛化到其他数据集,需要训练模型,通过F(x)取值的梯度集合取拟合L对F(x)的梯度

上边可能有点绕,直白来说,就是如果直接用训练集的负梯度值,这时候后边就不需要训练了,直接都是负梯度值*步长不断相加。这种情况在训练集表现很好,但是在测试集表现很差

最终,下一轮基学习器拟合的公式为(使用平方误差损失在样本上进行拟合):

αm=argminβ,h(x)i=1N[gm(xi)βh(xi)]2 \alpha_m = \arg\min\limits_{\beta,h(x)}\sum_{i=1}^N[-g_m(x_i) - \beta h(x_i)]^2

这里 β\beta 我理解是相当于XGB中的Shrinkage,β>1\beta > 1,相当于每个基学习器实际得到的值乘以 β\beta 才是负梯度值,防止一个基学习器在整体结果中占主导地位,防止过拟合。

3-3、在得到 h(x)h(x) 后,使用线性回归得到在最优函数上的步长 ρ\rho

ρ=argminρi=1NL(yi,Fm1(xi)+ρh(xi)) \rho = \arg\min\limits_{\rho}\sum_{i=1}^NL(y_i, F_{m-1}(x_i) + \rho h(x_i))

3-4、最后更新模型:

Fm(x)=Fm1(x)+ρmh(x) F_m(x) = F_{m-1}(x) + \rho_mh(x)

3-5、最终,就形成了第二节中说到的Gradient Boosting方法流程

4、这里再说说一阶泰勒展开和残差

4-1、从林轩田技法中adaboost的损失函数角度理解

这里主要是指林轩田技法中的理解,林轩田技法中这里直接从adaboost到自定义损失函数,有种推导Gradient Boosting从0.8 -> 1的感觉。回顾下来主要是当时对boosting的理解不牢固,没有模型相加做优化的思想。

在第二节的前向加法模型中,基本是从0 -> 1的角度,再一遍理解Gradient Boosting。
Gradient Boosting框架的理解和复习

Gradient Boosting框架的理解和复习

4-2、一阶泰勒展开

在初学时的《林轩田机器学习技法》里这块有点蒙,发现关键点是自己当时对泰勒展开公式理解的不够深。

泰勒展开的目的主要是在最小化损失函数时,w是要求解的模型参数,通常用泰勒展开来证明下一步最优w的方向是梯度的负方向:

L(wt+1)=L(wt+Δw)L(wt)+αΔwL(wt) L(w_{t+1}) = L(w_t + \Delta w) \approx L(w_t) + \alpha\Delta w L'(w_t)

要使得 L(wt+1)<L(wt)L(w_{t+1}) < L(w_t),在一阶泰勒展开中,下降最快的方向是 aL(wt)-aL'(w_t) 的方向,也就是负梯度的方向

所以:

  • 一阶泰勒展开是相当于损失函数来说的,是最小化损失函数中,求w的优化方向的一种方法
  • 针对w,每一步求负梯度是泰勒展开的优化结果。在这里,直接针对h(x)去拟合负梯度,就相当于利用了泰勒展开得知了最好的方向,直接取拟合

在林轩田里有详细的推导,推导如下:
Gradient Boosting框架的理解和复习

4-3、残差

大部分文章中所说的残差,其实是Gradient Boosting损失函数取平方差损失。
这时候负梯度就是残差,基学习器也是去拟合的残差

但是这只是一种情况,我觉得最关键的还是Gradient Boosting整体框架的原理。

5、根据损失函数不同,几种常见的Boosting

Gradient Boosting框架的理解和复习

6、GBDT

  • 说完了Gradient Boosting框架,其实GBDT就很好理解了

  • GBDT相当于在Gradient Boosting框架里,每一个基学习器使用CART回归树

思考:

  • 为什么使用回归树呢?
  • 因为Gradient Boosting是一个加法模型,每一个基学习器的计算结果相加,最终得到的计算结果才是真正的预测值。而用分类树的话,每一个基学习器产出的结果是类别,相加起来没有意义

参考资料

https://blog.****.net/dark_scope/article/details/24863289

以下参考资料都把Gradient Boosting框架讲的很好,墙裂建议刷上几遍!
http://xtf615.com/paper/GBM.html
http://wepon.me/files/gbdt.pdf