Gradient Boosting框架的理解和复习

本文详细介绍了Gradient Boosting框架,从自定义损失函数的角度出发,阐述了前向加法模型的工作原理,探讨了为什么需要拟合负梯度。通过对一阶泰勒展开和残差的分析,解释了如何优化模型以提高泛化能力。此外,还讨论了根据不同损失函数的Boosting方法和GBDT中回归树的选择原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文本主要是对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、参数空间的优化:梯度下降是每次小步走,每小步都往函数值下降最快的方向走,不断优化权重 w w w

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

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

F = arg ⁡ min ⁡ F L ( y , F ( x ) ) 其 中 F ( x ) = ∑ m = 0 M f m ( x ) F = \arg\min\limits_FL(y, F(x)) \\ 其中F(x) = \sum_{m=0}^Mf_m(x) F=argFminL(y,F(x))F(x)=m=0Mfm(x)

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

f k = f 0 + ρ 1 ∗ g 1 + ρ 2 ∗ g 2 + . . . + ρ m ∗ g m 其 中 : g m = − ∂ L ( y , F ( x ) ) ∂ F ( x ) ∣ F = F m − 1 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} fk=f0+ρ1g1+ρ2g2+...+ρmgm:gm=F(x)L(y,F(x))F=Fm1

这里其实用到了 贪心算法 的思想,如果用所有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)的梯度

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

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

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

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

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

ρ = arg ⁡ min ⁡ ρ ∑ i = 1 N L ( y i , F m − 1 ( x i ) + ρ h ( x i ) ) \rho = \arg\min\limits_{\rho}\sum_{i=1}^NL(y_i, F_{m-1}(x_i) + \rho h(x_i)) ρ=argρmini=1NL(yi,Fm1(xi)+ρh(xi))

3-4、最后更新模型:

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

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

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

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

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

在第二节的前向加法模型中,基本是从0 -> 1的角度,再一遍理解Gradient Boosting。
在这里插入图片描述

在这里插入图片描述

4-2、一阶泰勒展开

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

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

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

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

所以:

  • 一阶泰勒展开是相当于损失函数来说的,是最小化损失函数中,求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.youkuaiyun.com/dark_scope/article/details/24863289

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值