文本主要是对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+α1∗g1+α2∗g2...+αk∗gk
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=0∑Mfm(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+ρ1∗g1+ρ2∗g2+...+ρm∗gm其中:gm=−∂F(x)∂L(y,F(x))∣F=Fm−1
这里其实用到了 贪心算法 的思想,如果用所有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=1∑N[−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=1∑NL(yi,Fm−1(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)=Fm−1(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