GBDT
GBDT是Gradient Boosting Decision Tree的简称,其形式是决策树的加法模型。
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
f_M(x) = \sum_{m=1}^MT(x;\Theta_m)
fM(x)=m=1∑MT(x;Θm)
其中
T
(
x
;
Θ
)
T(x;\Theta)
T(x;Θ)代表树模型,普遍使用的是CART树。
GBDT Regression
求解这个加法模型的方法即是上一节所提到的前向分步算法,于是我们自然要明确每一轮的损失函数的形式。GBDT并不指定损失函数的具体形式,对一般的损失函数
L
(
y
,
f
(
x
i
)
)
L(y,f(x_i))
L(y,f(xi)),在前向分步算法中第
m
m
m步的优化中,我们要建立回归树去拟合损失函数关于
f
(
x
)
f(x)
f(x)的负梯度
r
m
i
=
−
[
∂
L
(
y
i
;
f
(
x
)
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
i
)
i
=
1
,
2
,
…
,
N
r_{mi} = -\Bigg[\frac{\partial{L(y_i;f(x))}}{\partial f(x)}\Bigg]_{f(x) = f_{m-1}(x_i)} \quad i = 1,2,\ldots,N
rmi=−[∂f(x)∂L(yi;f(x))]f(x)=fm−1(xi)i=1,2,…,N
这是梯度提升名称的由来,也是本篇的重点,下面着重解析此处拟合负梯度的动机。
前向分步算法第
m
m
m步的本质优化目标可以写为
min
f
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
)
)
\min_{f}\sum_{i=1}^NL(y_i,f(x_i))
fmini=1∑NL(yi,f(xi))
将
f
(
x
)
f(x)
f(x)拆分为
f
m
−
1
(
x
)
+
T
(
x
,
Θ
m
)
f_{m-1}(x)+T(x,\Theta_m)
fm−1(x)+T(x,Θm),优化目标变为
min
Θ
m
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
,
Θ
m
)
)
\min_{\Theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i,\Theta_m))
Θmmini=1∑NL(yi,fm−1(xi)+T(xi,Θm))
由于
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))在此处没有明确形式,我们无法像AdaBoost那样直接将
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x)与
T
(
x
,
Θ
m
)
T(x,\Theta_m)
T(x,Θm)分成独立的两部分,为达成这个目的,考虑
L
(
y
i
,
f
m
−
1
(
x
)
+
T
(
x
,
Θ
m
)
)
L(y_i,f_{m-1}(x)+T(x,\Theta_m))
L(yi,fm−1(x)+T(x,Θm))的麦克劳林(Maclaurin)公式
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
,
Θ
m
)
)
≈
L
(
y
i
,
f
m
−
1
(
x
i
)
)
+
g
i
T
(
x
i
,
Θ
m
)
+
1
2
h
i
[
T
(
x
i
,
Θ
m
)
]
2
L(y_i,f_{m-1}(x_i)+T(x_i,\Theta_m)) \approx L(y_i,f_{m-1}(x_i))+g_iT(x_i,\Theta_m)+\frac{1}{2}h_i[T(x_i,\Theta_m)]^2
L(yi,fm−1(xi)+T(xi,Θm))≈L(yi,fm−1(xi))+giT(xi,Θm)+21hi[T(xi,Θm)]2
其中
g
i
=
[
∂
L
(
y
i
,
f
(
x
)
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
i
)
,
g_i = \bigg[\frac{\partial{L(y_i,f(x))}}{\partial{f(x)}}\bigg]_{f(x) = f_{m-1}(x_i)},\quad
gi=[∂f(x)∂L(yi,f(x))]f(x)=fm−1(xi),
h
i
=
[
∂
2
L
(
y
i
,
f
(
x
)
)
∂
(
f
(
x
)
)
2
]
f
(
x
)
=
f
m
−
1
(
x
i
)
h_i = \bigg[\frac{\partial^2{L(y_i,f(x))}}{\partial{(f(x))^2}}\bigg]_{f(x) = f_{m-1}(x_i)}
hi=[∂(f(x))2∂2L(yi,f(x))]f(x)=fm−1(xi)
这时候,由于前向分步算法第
m
m
m步中,
f
m
−
1
(
x
i
)
f_{m-1}(x_i)
fm−1(xi)是常值,于是优化问题可以做如下转化
a
r
g
min
Θ
m
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
,
Θ
m
)
)
≈
a
r
g
min
Θ
m
∑
i
=
1
N
g
i
T
(
x
i
,
Θ
m
)
+
1
2
h
i
[
T
(
x
i
,
Θ
m
)
]
2
arg\min_{\Theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i,\Theta_m))\approx arg\min_{\Theta_m}\sum_{i=1}^Ng_iT(x_i,\Theta_m)+\frac{1}{2}h_i[T(x_i,\Theta_m)]^2
argΘmmini=1∑NL(yi,fm−1(xi)+T(xi,Θm))≈argΘmmini=1∑NgiT(xi,Θm)+21hi[T(xi,Θm)]2
记
L
(
T
(
x
i
,
Θ
)
)
=
g
i
T
(
x
i
,
Θ
)
+
1
2
h
i
[
T
(
x
i
,
Θ
)
]
2
\mathcal{L}(T(x_i,\Theta)) = g_iT(x_i,\Theta)+\frac{1}{2}h_i[T(x_i,\Theta)]^2
L(T(xi,Θ))=giT(xi,Θ)+21hi[T(xi,Θ)]2,对
T
(
x
i
,
Θ
)
T(x_i,\Theta)
T(xi,Θ)求偏导并使其为
0
0
0,则有
∂
L
(
T
(
x
i
,
Θ
)
)
∂
T
(
x
i
,
Θ
)
=
g
i
+
h
i
T
(
x
i
,
Θ
)
=
0
\frac{\partial{\mathcal{L}(T(x_i,\Theta))}}{\partial{T(x_i,\Theta)}} = g_i + h_iT(x_i,\Theta) = 0
∂T(xi,Θ)∂L(T(xi,Θ))=gi+hiT(xi,Θ)=0
得
T
(
x
i
,
Θ
)
=
−
g
i
h
i
T(x_i,\Theta) = -\frac{g_i}{h_i}
T(xi,Θ)=−higi
而我们一般假定
L
(
y
i
,
f
(
x
i
)
)
L(y_i,f(x_i))
L(yi,f(xi))是一个凸函数,此时
h
i
>
0
h_i>0
hi>0,通常将
h
i
h_i
hi设置成
1
1
1去扮演梯度下降中学习率的角色,于是我们知道了前向分步算法中第
m
m
m步的近似最优解就是能更好的拟合
−
g
i
-g_i
−gi的那一棵CART回归树,这即是GBDT拟合负梯度的动机。
还可以从另外一个角度去理解,即使
L
(
y
i
,
f
(
x
i
)
)
L(y_i,f(x_i))
L(yi,f(xi))不是一个凸函数,我们将
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
,
Θ
m
)
)
L(y_i,f_{m-1}(x_i)+T(x_i,\Theta_m))
L(yi,fm−1(xi)+T(xi,Θm))仅仅展开到一阶,如下式
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
,
Θ
m
)
)
≈
L
(
y
i
,
f
m
−
1
(
x
i
)
)
+
g
i
T
(
x
i
,
Θ
m
)
L(y_i,f_{m-1}(x_i)+T(x_i,\Theta_m)) \approx L(y_i,f_{m-1}(x_i))+g_iT(x_i,\Theta_m)
L(yi,fm−1(xi)+T(xi,Θm))≈L(yi,fm−1(xi))+giT(xi,Θm)
移项后,变为
g
i
T
(
x
i
,
Θ
m
)
≈
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
,
Θ
m
)
)
−
L
(
y
i
,
f
m
−
1
(
x
i
)
)
g_iT(x_i,\Theta_m) \approx L(y_i,f_{m-1}(x_i)+T(x_i,\Theta_m)) - L(y_i,f_{m-1}(x_i))
giT(xi,Θm)≈L(yi,fm−1(xi)+T(xi,Θm))−L(yi,fm−1(xi))
我们想要通过每一步优化使训练误差减小,即是想达到
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
,
Θ
m
)
)
−
L
(
y
i
,
f
m
−
1
(
x
i
)
)
⩽
0
L(y_i,f_{m-1}(x_i)+T(x_i,\Theta_m)) - L(y_i,f_{m-1}(x_i))\leqslant 0
L(yi,fm−1(xi)+T(xi,Θm))−L(yi,fm−1(xi))⩽0的目的。此时取
T
(
x
i
,
Θ
m
)
=
−
g
i
T(x_i,\Theta_m) = -g_i
T(xi,Θm)=−gi即可满足要求。从这个角度也可以看出GBDT拟合负梯度的动机。
攻克了这项难关之后,下面的伪代码无非只是每一步用树模型拟合负梯度的前向分步算法
其中关于优化
c
m
j
c_{mj}
cmj的一步,CART树通常的做法是将落在
R
m
j
R_{mj}
Rmj的所有训练样本的label求平均,作为
c
m
j
c_{mj}
cmj的值。
GBDT Regression的特例——Boosting Tree
将提升树(Boosting Tree)写在这里,以解决抽象形式的损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))所带来的理解困难的问题。
Boosting Tree是特殊的GBDT,其指定了损失函数的具体形式
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L(y,f(x)) = (y-f(x))^2
L(y,f(x))=(y−f(x))2
该损失函数是一个凸函数,按照梯度提升树的求法,每一步所训练的树所要拟合的目标为
T
(
x
i
,
Θ
)
=
−
g
i
h
i
T(x_i,\Theta) = -\frac{g_i}{h_i}
T(xi,Θ)=−higi
其中
g
i
=
[
∂
L
(
y
i
,
f
(
x
)
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
i
)
=
−
2
(
y
i
−
f
m
−
1
(
x
i
)
)
,
g_i = \bigg[\frac{\partial{L(y_i,f(x))}}{\partial{f(x)}}\bigg]_{f(x) = f_{m-1}(x_i)} = -2(y_i-f_{m-1}(x_i)),\quad
gi=[∂f(x)∂L(yi,f(x))]f(x)=fm−1(xi)=−2(yi−fm−1(xi)),
h
i
=
[
∂
2
L
(
y
i
,
f
(
x
)
)
∂
(
f
(
x
)
)
2
]
f
(
x
)
=
f
m
−
1
(
x
i
)
=
2
h_i = \bigg[\frac{\partial^2{L(y_i,f(x))}}{\partial{(f(x))^2}}\bigg]_{f(x) = f_{m-1}(x_i)} = 2
hi=[∂(f(x))2∂2L(yi,f(x))]f(x)=fm−1(xi)=2
代入后,有
−
g
i
h
i
=
y
i
−
f
m
−
1
(
x
i
)
-\frac{g_i}{h_i} = y_i-f_{m-1}(x_i)
−higi=yi−fm−1(xi)
于是提升树是GBDT的特例,每一步优化的负梯度为当前模型拟合数据的残差(residual)。
GBDT Classification
而当我们想要用GBDT解决分类问题时(以二分类问题为例,多分类问题仅仅是将sigmoid函数更换为softmax函数),与Logistic Regression类似,用GBDT去拟合对数几率
l
o
g
p
1
−
p
log\frac{p}{1-p}
log1−pp.即
l
o
g
p
1
−
p
=
f
(
x
)
=
∑
m
=
1
M
f
m
(
x
)
log\frac{p}{1-p} = f(x) = \sum_{m=1}^M{f_m(x)}
log1−pp=f(x)=m=1∑Mfm(x)
得分类模型
P
(
y
=
1
∣
x
)
=
1
1
+
e
−
f
(
x
)
=
1
1
+
e
−
∑
m
=
1
M
f
m
(
x
)
P(y=1|x) = \frac{1}{1+e^{-f(x)}} = \frac{1}{1+e^{-\sum_{m=1}^M{f_m(x)}}}
P(y=1∣x)=1+e−f(x)1=1+e−∑m=1Mfm(x)1
损失函数即与Logistic Regression相同,使用交叉熵(cross entropy)衡量分布的相似程度
L
(
x
i
,
y
i
∣
f
(
x
)
)
=
−
y
i
l
o
g
1
1
+
e
−
f
(
x
i
)
−
(
1
−
y
i
)
l
o
g
(
1
−
1
1
+
e
−
f
(
x
i
)
)
=
y
i
l
o
g
(
1
+
e
−
f
(
x
i
)
)
+
(
1
−
y
i
)
l
o
g
(
1
+
e
−
f
(
x
i
)
e
−
f
(
x
i
)
)
=
y
i
l
o
g
(
1
+
e
−
f
(
x
i
)
)
+
(
1
−
y
i
)
[
l
o
g
(
1
+
e
−
f
(
x
i
)
)
+
f
(
x
i
)
]
\begin{aligned} L(x_i,y_i|f(x)) &= -y_ilog\frac{1}{1+e^{-f(x_i)}}-(1-y_i)log(1-\frac{1}{1+e^{-f(x_i)}}) \\ & = y_ilog(1+e^{-f(x_i)})+(1-y_i)log(\frac{1+e^{-f(x_i)}}{e^{-f(x_i)}}) \\ & = y_ilog(1+e^{-f(x_i)})+(1-y_i)[log(1+e^{-f(x_i)})+f(x_i)] \end{aligned}
L(xi,yi∣f(x))=−yilog1+e−f(xi)1−(1−yi)log(1−1+e−f(xi)1)=yilog(1+e−f(xi))+(1−yi)log(e−f(xi)1+e−f(xi))=yilog(1+e−f(xi))+(1−yi)[log(1+e−f(xi))+f(xi)]
损失函数在当前模型的负梯度为
−
[
∂
L
(
y
i
∣
f
(
x
)
)
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
i
)
=
y
i
−
1
1
+
e
−
f
m
−
1
(
x
i
)
=
y
i
−
y
^
m
−
1
,
i
-\bigg[\frac{\partial L(y_i|f(x))}{f(x)}\bigg]_{f(x) = f_{m-1}(x_i)} = y_i - \frac{1}{1+e^{-f_{m-1}(x_i)}} = y_i - \hat{y}_{m-1,i}
−[f(x)∂L(yi∣f(x))]f(x)=fm−1(xi)=yi−1+e−fm−1(xi)1=yi−y^m−1,i
于是分类任务的GBDT每一轮的训练任务与提升树相同,都是拟合当前模型的残差。