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、参数空间的优化:梯度下降是每次小步走,每小步都往函数值下降最快的方向走,不断优化权重 :
2、从梯度下降得到启发,将梯度下降的优化方法扩展到函数空间的优化,那么目标就是寻找最优的F,使得预测值对应的损失函数最小:
3、因为最终目标就是找到最优的 ,类似梯度下降算法,构造弱分类器 ,每次迭代求梯度:
这里其实用到了 贪心算法 的思想,如果用所有f(x)全加到损失函数中做拟合时,因为一次性找出最优的f(x)和学习率,而且当新分类器被加入到整体模型中时,还需要调整之前的分类器。整个问题是一个NP难问题,所以最终通过贪心法,迭代求局部最优解
所以这里训练是每次只训练一个弱分类器,当新分类器被加入模型的时候,不调整原来得到的分类器。
3、为什么要去拟合负梯度?
这是我初学GBDT一直困惑的一个问题,在此复习时总结下:
3-1、总结1-3所说内容,就是将梯度下降(参数空间优化)引入到函数空间优化(前向加法模型)
wepon大佬的PPT这页很好,具体可以参考:http://wepon.me/files/gbdt.pdf
- 在梯度下降中,我们是寻找的最优w,通过每一次求负 ,最终将结果加起来就是最优的w
- 同理,在前向加法模型中,我们寻找的是最优F(x),通过每一次用基学习器 拟合 ,最终将基学习器的计算结果加起来,就是最优的F(x)
- 整体思路大致是这样,那么重点就在拟合 这里,为什么这里是拟合,而不是计算 呢?
3-2、怎么求函数对函数的导数(每一个基学习器,拟合负梯度)
总体来说,是为了提高模型的泛化能力
- 因为损失函数L直接求F(x)函数的梯度难以求解
- 所以通过F(x)在训练集取值的梯度来替代
- 为了能够泛化到其他数据集,需要训练模型,通过F(x)取值的梯度集合取拟合L对F(x)的梯度
上边可能有点绕,直白来说,就是如果直接用训练集的负梯度值,这时候后边就不需要训练了,直接都是负梯度值*步长不断相加。这种情况在训练集表现很好,但是在测试集表现很差
最终,下一轮基学习器拟合的公式为(使用平方误差损失在样本上进行拟合):
这里 我理解是相当于XGB中的Shrinkage,,相当于每个基学习器实际得到的值乘以 才是负梯度值,防止一个基学习器在整体结果中占主导地位,防止过拟合。
3-3、在得到 后,使用线性回归得到在最优函数上的步长
3-4、最后更新模型:
3-5、最终,就形成了第二节中说到的Gradient Boosting方法流程
4、这里再说说一阶泰勒展开和残差
4-1、从林轩田技法中adaboost的损失函数角度理解
这里主要是指林轩田技法中的理解,林轩田技法中这里直接从adaboost到自定义损失函数,有种推导Gradient Boosting从0.8 -> 1的感觉。回顾下来主要是当时对boosting的理解不牢固,没有模型相加做优化的思想。
在第二节的前向加法模型中,基本是从0 -> 1的角度,再一遍理解Gradient Boosting。
4-2、一阶泰勒展开
在初学时的《林轩田机器学习技法》里这块有点蒙,发现关键点是自己当时对泰勒展开公式理解的不够深。
泰勒展开的目的主要是在最小化损失函数时,w是要求解的模型参数,通常用泰勒展开来证明下一步最优w的方向是梯度的负方向:
要使得 ,在一阶泰勒展开中,下降最快的方向是 的方向,也就是负梯度的方向
所以:
- 一阶泰勒展开是相当于损失函数来说的,是最小化损失函数中,求w的优化方向的一种方法
- 针对w,每一步求负梯度是泰勒展开的优化结果。在这里,直接针对h(x)去拟合负梯度,就相当于利用了泰勒展开得知了最好的方向,直接取拟合
在林轩田里有详细的推导,推导如下:
4-3、残差
大部分文章中所说的残差,其实是Gradient Boosting损失函数取平方差损失。
这时候负梯度就是残差,基学习器也是去拟合的残差
但是这只是一种情况,我觉得最关键的还是Gradient Boosting整体框架的原理。
5、根据损失函数不同,几种常见的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