论文
Greedy Function Approximation: A Gradient Boosting Machine
函数估计
假设一组数据中输入变量为
x
=
{
x
1
,
⋯
 
,
x
n
}
\boldsymbol x = \left\{ x_1,\cdots,x_n \right\}
x={x1,⋯,xn}, 输出变量为
y
y
y。我们需要找到一个带有参数集合
P
=
{
P
1
,
P
2
,
⋯
 
}
\boldsymbol P = \left\{ P_1,P_2,\cdots \right\}
P={P1,P2,⋯}的函数
F
(
x
;
P
)
F(\boldsymbol x; \boldsymbol P)
F(x;P),将
x
\boldsymbol x
x映射到
y
y
y,并且使得损失函数
L
(
y
,
F
(
x
;
P
)
)
L \left( y,F\left( \boldsymbol x; \boldsymbol P\right)\right)
L(y,F(x;P))最小:
(1)
P
∗
=
arg
min
F
E
y
,
x
L
(
y
,
F
(
x
;
P
)
)
P^* = \mathop{\arg\min}_F E_{y,x}L\left( y,F\left( \boldsymbol x; \boldsymbol P\right)\right) \tag{1}
P∗=argminFEy,xL(y,F(x;P))(1)
其中
(2)
Φ
(
P
)
=
E
y
,
x
L
(
y
,
F
(
x
;
P
)
)
\Phi \left( P\right) = E_{y,x}L(y,F\left( \boldsymbol x;\boldsymbol P\right)) \tag{2}
Φ(P)=Ey,xL(y,F(x;P))(2)
表示期望损失,然后可以得到
(3)
F
∗
(
x
)
=
F
(
x
;
P
∗
)
F^* \left( \boldsymbol x\right) = F \left( \boldsymbol x; \boldsymbol P^*\right) \tag{3}
F∗(x)=F(x;P∗)(3)
而想要计算得到
P
∗
\boldsymbol P^*
P∗,则可以引入最速下降法。
最速下降法 ( Steepest-descent )
最速下降法是数值优化中的常用方法,用来求解目标函数的极小值。给定一个初始参数
P
0
\boldsymbol P_0
P0,则该处的负梯度方向
−
g
m
-g_m
−gm就是函数值下降最快的方向,其等于当前损失函数值对各个参数求偏导,然后取负值:
(4)
−
g
m
=
−
{
g
j
m
}
=
−
{
[
∂
Φ
(
P
)
∂
P
j
]
P
=
P
m
−
1
}
-g_m = -\left\{ g_{jm} \right\} = -\left\{ \left[ \frac{\partial \Phi \left( P \right)}{\partial P_j} \right] _{P = P_{m-1}} \right\} \tag{4}
−gm=−{gjm}=−{[∂Pj∂Φ(P)]P=Pm−1}(4)其中
(5)
P
m
−
1
=
∑
i
=
0
m
−
1
p
i
P_{m-1} = \sum_{i = 0}^{m - 1}p_{i} \tag{5}
Pm−1=i=0∑m−1pi(5)确定最佳移动步长为
(6)
ρ
m
=
arg
min
ρ
Φ
(
P
m
−
1
−
ρ
g
m
)
\rho_m = \mathop{\arg\min}_{\rho}\Phi \left( P_{m-1} - \rho g_{m} \right) \tag{6}
ρm=argminρΦ(Pm−1−ρgm)(6)
那么在负梯度方向上的线性搜索距离
(7)
p
m
=
−
ρ
m
g
m
p_{m} = - \rho_m g_m \tag{7}
pm=−ρmgm(7)
P
∗
\boldsymbol P^*
P∗就是一次次在负梯度方向上移动距离的累加
(8)
P
∗
=
∑
i
=
0
m
p
i
\boldsymbol P^* = \sum_{i = 0}^{m}p_i \tag{8}
P∗=i=0∑mpi(8)
函数空间里的数值优化
以上是在参数空间的数值优化,现在考虑函数空间的数值优化。我们把
F
(
x
)
F(\boldsymbol x)
F(x)在每一个点
x
\boldsymbol x
x的值作为“参数”,使得
(9)
Φ
(
F
)
=
E
y
,
x
L
(
y
,
F
(
x
)
)
\Phi \left( F \right) = E_{y,x}L(y,F\left( \boldsymbol x\right)) \tag{9}
Φ(F)=Ey,xL(y,F(x))(9)因此最优解
(10)
F
∗
(
x
)
=
∑
m
=
0
M
f
m
(
x
)
F^*\left( x \right) = \sum_{m = 0}^M f_m( \boldsymbol x) \tag{10}
F∗(x)=m=0∑Mfm(x)(10)其中
f
0
(
x
)
f_0 \left( \boldsymbol x\right)
f0(x)是初始值,
{
f
m
(
x
)
}
1
m
\left\{ f_m\left( x \right)\right\}_1^m
{fm(x)}1m是每一次迭代的增量,也就是朝最优解的移动距离。
将该思想和最速下降法结合起来,则
(11)
f
m
(
x
)
=
−
ρ
m
g
m
(
x
)
f_m \left( x \right) = -\rho_mg_m \left( x\right) \tag{11}
fm(x)=−ρmgm(x)(11)其中,每一次的移动方向为期望损失对当前
F
(
x
)
F\left( x \right)
F(x)的求导
(12)
−
g
m
(
x
)
=
−
{
[
∂
Φ
(
F
(
x
)
)
∂
F
(
x
)
]
F
(
x
)
=
F
m
−
1
(
x
)
}
-g_m \left( x \right) = -\left\{ \left[ \frac{\partial \Phi \left( F\left(x \right) \right)}{\partial F \left( x \right)} \right] _{F\left( x \right) = F_{m-1}\left( x \right)} \right\} \tag{12}
−gm(x)=−{[∂F(x)∂Φ(F(x))]F(x)=Fm−1(x)}(12)
(13)
F
m
−
1
(
x
)
=
∑
i
=
0
m
−
1
f
i
(
x
)
F_{m - 1}\left( x \right) = \sum_{i = 0}^{m - 1}f_i\left( x \right) \tag{13}
Fm−1(x)=i=0∑m−1fi(x)(13)而线性搜索方向的移动步长表示为
(14)
ρ
m
=
arg
min
ρ
E
y
,
x
L
(
y
,
F
m
−
1
(
x
)
−
ρ
g
m
(
x
)
)
\rho_m = \mathop{\arg\min}_\rho E_{y,\boldsymbol x}L\left( y,F_{m-1}\left( x \right) - \rho g_m\left( x \right)\right) \tag{14}
ρm=argminρEy,xL(y,Fm−1(x)−ρgm(x))(14) 因为是搜索方向是负梯度方向,所以里面是负号。简而言之,这里的思想就是将前一次迭代后损失函数对当前分类器的梯度作为新模型
f
m
(
x
)
f_m\left( x\right)
fm(x)学习的目标,再乘以移动步长
ρ
m
\rho_m
ρm,从而慢慢逼近最优分类器。
Greedy-Wise Approach
因为数据中的样本是有限的,也就是离散的,很难估计出
(
y
,
x
)
(y, \boldsymbol x)
(y,x)的联合分布,因此貌似还是要用到参数优化的方法。但是一次性优化所有基分类器的参数和权重, 达到全局最优是不可能的,所以需要采取一种名为greedy-stagewise
的方法。对于
m
=
1
,
2
,
⋯
 
,
M
m = 1, 2, \cdots, M
m=1,2,⋯,M,
(15)
(
β
m
,
a
m
)
=
arg
min
β
,
a
∑
i
=
1
N
L
(
y
i
,
F
m
−
1
(
x
i
)
+
β
h
(
x
i
;
a
)
)
\left( \beta_m, \boldsymbol a_m \right) = \mathop{\arg\min}_{\beta, \boldsymbol a} \sum_{i = 1} ^N L \left( y_i, F_{m-1}\left(x_i \right) + \beta h\left( \boldsymbol x_i; \boldsymbol a\right) \right) \tag{15}
(βm,am)=argminβ,ai=1∑NL(yi,Fm−1(xi)+βh(xi;a))(15)
(16) F m ( x ) = F m − 1 ( x ) + β h ( x ; a m ) F_{m}\left( x\right) = F_{m-1}\left(x \right) + \beta h\left( \boldsymbol x; \boldsymbol a_m\right) \tag{16} Fm(x)=Fm−1(x)+βh(x;am)(16)
简单来说就是,对于当前分类器 F m − 1 ( x ) F_{m-1}\left( x\right) Fm−1(x),想要得到最好的分类器 F ∗ ( x ) F^* \left( x\right) F∗(x),则基于greedy(贪心)策略, β m h ( x ; a m ) \beta_m h\left( \boldsymbol x; \boldsymbol a_m\right) βmh(x;am)在这里代表最优的迭代(包括方向和距离),stagewise意为逐次迭代。因为直接计算(10)比较困难,根据参考资料2,可能是因为涉及到了函数对于函数的求导吧, F m ( x ) F_m \left( x \right) Fm(x)是个涉及之前所有分类器的累加模型,所以求导或许很麻烦,水平有限,不懂。
解决方案是把数据集里的各样本代入
F
(
x
)
F \left( x \right)
F(x)来计算负梯度,这时演变成了函数对向量的求导:
(17)
−
g
m
(
x
i
)
=
−
[
∂
L
(
y
i
,
F
(
x
i
)
)
∂
F
(
x
i
)
]
F
(
x
)
=
F
m
−
1
(
x
)
,
i
=
1
,
2
,
⋯
 
,
N
-g_m\left( x_i\right) = -\left[ \frac{\partial L\left( y_i, F\left(x_i\right)\right)}{ \partial F(x_i)} \right] _{F\left( x\right) = F_{m - 1}\left( x\right)} ,i = 1,2,\cdots,N \tag{17}
−gm(xi)=−[∂F(xi)∂L(yi,F(xi))]F(x)=Fm−1(x),i=1,2,⋯,N(17) 但是这个负梯度不可以泛化到除样本点外空间中的其他点,所以需要用
h
(
x
;
a
m
)
h\left( \boldsymbol x; \boldsymbol a_m \right)
h(x;am)来拟合负梯度。怎么拟合呢?当
h
(
x
;
a
m
)
h\left( \boldsymbol x; \boldsymbol a_m\right)
h(x;am)和负梯度方向完全平行时,就是最合适的。要求出参数
a
m
\boldsymbol a_m
am, 用公式来表示就是
(18)
a
m
=
arg
min
a
,
β
∑
i
=
1
N
[
−
g
m
(
x
i
)
−
β
h
(
x
i
;
a
)
]
\boldsymbol a_m = \mathop{\arg\min}_{\boldsymbol a,\beta} \sum_{i = 1}^N \left[ -g_m\left(x_i\right) - \beta h\left( \boldsymbol x_i; \boldsymbol a\right) \right] \tag{18}
am=argmina,βi=1∑N[−gm(xi)−βh(xi;a)](18)到此,整个Gradient Boost算法如图所示
步骤简述:
- 初始化一个学习器 F 0 ( x ) F_0 \left( x \right) F0(x);
- 基于之前的学习器 F m − 1 ( x ) F_{m - 1} \left( \boldsymbol x\right) Fm−1(x),计算负梯度
- 利用数据集中的样本点,使用一个基学习器 h ( x i ; a ) h \left( \boldsymbol x_i; \boldsymbol a \right) h(xi;a)来拟合梯度,得到最佳参数 a m \boldsymbol a_m am
- 寻找在 h ( x i ; a ) h \left( \boldsymbol x_i; \boldsymbol a \right) h(xi;a)方向上的最佳移动步长 ρ m \rho_m ρm
- 将之前的学习器 F m − 1 ( x ) F_{m - 1} \left( \boldsymbol x\right) Fm−1(x)和当前新的学习器 ρ m h ( x ; a m ) \rho_m h \left( \boldsymbol x; \boldsymbol a_m \right) ρmh(x;am)累加,得到更强的学习器
- 重复 2 - 5 步
Regression Tree
以j
个节点的回归树作为基分类器,公式为:
(19)
h
(
x
;
{
b
j
,
R
j
}
1
j
)
=
∑
j
=
1
j
b
j
I
(
x
∈
R
j
)
h \left( \boldsymbol x; \left\{ b_j, R_j\right\}_1^j \right ) = \sum_{j = 1}^j b_j I \left( x \in R_j \right) \tag{19}
h(x;{bj,Rj}1j)=j=1∑jbjI(x∈Rj)(19) 可以看出来,回归树本身就是一个累加的模型。其中,
{
R
j
}
1
j
\left\{ R_j \right\}_1 ^j
{Rj}1j代表一个个互不相交的区域,也就是回归树里的一个个叶节点,
b
j
b_j
bj表示每个区域的输出。把回归树模型带入到前面的Gradient Boost算法第六行
(20)
F
m
(
x
)
=
F
m
−
1
(
x
)
+
ρ
m
∑
j
=
1
J
b
j
m
I
(
x
∈
R
j
m
)
F_m \left( \boldsymbol x \right) = F_{m-1} \left( \boldsymbol x \right) + \rho_m \sum_{j = 1}^J b_{jm}I\left( x \in R_{jm}\right) \tag{20}
Fm(x)=Fm−1(x)+ρmj=1∑JbjmI(x∈Rjm)(20)
Regularization
为了避免过拟合,可以控制回归树的数量M,这可以通过交叉验证来实现。但研究发现,通过shrinkage
来正则化效果更佳。原本,当前迭代生成的分类器
(21)
F
m
(
x
)
=
F
m
−
1
(
x
)
+
ρ
m
h
(
x
;
a
m
)
F_m \left( \boldsymbol x\right) = F_{m - 1} \left( \boldsymbol x \right) + \rho_m h \left( \boldsymbol x; \boldsymbol a_m \right) \tag{21}
Fm(x)=Fm−1(x)+ρmh(x;am)(21)现在新增一个缩小系数,即学习率
v
v
v:
(22)
F
m
(
x
)
=
F
m
−
1
(
x
)
+
v
∗
ρ
m
h
(
x
;
a
m
)
,
0
<
v
<
1
F_m \left( \boldsymbol x\right) = F_{m - 1} \left( \boldsymbol x \right) + v * \rho_m h \left( \boldsymbol x; \boldsymbol a_m \right), 0< v < 1 \tag{22}
Fm(x)=Fm−1(x)+v∗ρmh(x;am),0<v<1(22)实际上这和梯度下降的思想比较像,每一次迭代只基于当前的残差回归树
ρ
m
h
(
x
;
a
m
)
\rho_m h \left( \boldsymbol x; \boldsymbol a_m \right)
ρmh(x;am)前进一小部分。另外,
v
和
M
v 和 M
v和M这两者是此消彼长的关系,它们互相影响。事实证明,较小的
v
v
v可以提升性能。
参考资料
水平有限,如有错误,欢迎指正!!!