论文

   Greedy Function Approximation: A Gradient Boosting Machine

函数估计

  假设一组数据中输入变量为x={x1, ,xn}\boldsymbol x = \left\{ x_1,\cdots,x_n \right\}, 输出变量为yy。我们需要找到一个带有参数集合P={P1,P2, }\boldsymbol P = \left\{ P_1,P_2,\cdots \right\}的函数F(x;P)F(\boldsymbol x; \boldsymbol P),将x\boldsymbol x映射到 yy,并且使得损失函数L(y,F(x;P))L \left( y,F\left( \boldsymbol x; \boldsymbol P\right)\right)最小:
(1)P=argminFEy,xL(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}
其中
(2)Φ(P)=Ey,xL(y,F(x;P)) \Phi \left( P\right) = E_{y,x}L(y,F\left( \boldsymbol x;\boldsymbol P\right)) \tag{2}
表示期望损失,然后可以得到
(3)F(x)=F(x;P) F^* \left( \boldsymbol x\right) = F \left( \boldsymbol x; \boldsymbol P^*\right) \tag{3}
而想要计算得到P\boldsymbol P^*,则可以引入最速下降法。

最速下降法 ( Steepest-descent )

  最速下降法是数值优化中的常用方法,用来求解目标函数的极小值。给定一个初始参数P0\boldsymbol P_0,则该处的负梯度方向gm-g_m就是函数值下降最快的方向,其等于当前损失函数值对各个参数求偏导,然后取负值:
(4)gm={gjm}={[Φ(P)Pj]P=Pm1} -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} 其中
(5)Pm1=i=0m1pi P_{m-1} = \sum_{i = 0}^{m - 1}p_{i} \tag{5} 确定最佳移动步长为
(6)ρm=argminρΦ(Pm1ρgm) \rho_m = \mathop{\arg\min}_{\rho}\Phi \left( P_{m-1} - \rho g_{m} \right) \tag{6}
那么在负梯度方向上的线性搜索距离
(7)pm=ρmgm p_{m} = - \rho_m g_m \tag{7}
P\boldsymbol P^*就是一次次在负梯度方向上移动距离的累加
(8)P=i=0mpi \boldsymbol P^* = \sum_{i = 0}^{m}p_i \tag{8}

函数空间里的数值优化

  以上是在参数空间的数值优化,现在考虑函数空间的数值优化。我们把F(x)F(\boldsymbol x)在每一个点x\boldsymbol x的值作为“参数”,使得
(9)Φ(F)=Ey,xL(y,F(x)) \Phi \left( F \right) = E_{y,x}L(y,F\left( \boldsymbol x\right)) \tag{9} 因此最优解
(10)F(x)=m=0Mfm(x) F^*\left( x \right) = \sum_{m = 0}^M f_m( \boldsymbol x) \tag{10} 其中f0(x)f_0 \left( \boldsymbol x\right)是初始值,{fm(x)}1m\left\{ f_m\left( x \right)\right\}_1^m是每一次迭代的增量,也就是朝最优解的移动距离。

将该思想和最速下降法结合起来,则
(11)fm(x)=ρmgm(x) f_m \left( x \right) = -\rho_mg_m \left( x\right) \tag{11} 其中,每一次的移动方向为期望损失对当前F(x)F\left( x \right)的求导
(12)gm(x)={[Φ(F(x))F(x)]F(x)=Fm1(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}

(13)Fm1(x)=i=0m1fi(x) F_{m - 1}\left( x \right) = \sum_{i = 0}^{m - 1}f_i\left( x \right) \tag{13} 而线性搜索方向的移动步长表示为
(14)ρm=argminρEy,xL(y,Fm1(x)ρgm(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}   因为是搜索方向是负梯度方向,所以里面是负号。简而言之,这里的思想就是将前一次迭代后损失函数对当前分类器的梯度作为新模型fm(x)f_m\left( x\right)学习的目标,再乘以移动步长ρm\rho_m,从而慢慢逼近最优分类器。

Greedy-Wise Approach

  因为数据中的样本是有限的,也就是离散的,很难估计出(y,x)(y, \boldsymbol x)的联合分布,因此貌似还是要用到参数优化的方法。但是一次性优化所有基分类器的参数和权重, 达到全局最优是不可能的,所以需要采取一种名为greedy-stagewise的方法。对于 m=1,2, ,Mm = 1, 2, \cdots, M,
(15)(βm,am)=argminβ,ai=1NL(yi,Fm1(xi)+βh(xi;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}

(16)Fm(x)=Fm1(x)+βh(x;am) F_{m}\left( x\right) = F_{m-1}\left(x \right) + \beta h\left( \boldsymbol x; \boldsymbol a_m\right) \tag{16}

  简单来说就是,对于当前分类器Fm1(x)F_{m-1}\left( x\right),想要得到最好的分类器F(x)F^* \left( x\right),则基于greedy(贪心)策略,βmh(x;am)\beta_m h\left( \boldsymbol x; \boldsymbol a_m\right)在这里代表最优的迭代(包括方向和距离),stagewise意为逐次迭代。因为直接计算(10)比较困难,根据参考资料2,可能是因为涉及到了函数对于函数的求导吧,Fm(x)F_m \left( x \right)是个涉及之前所有分类器的累加模型,所以求导或许很麻烦,水平有限,不懂。

  解决方案是把数据集里的各样本代入F(x)F \left( x \right)来计算负梯度,这时演变成了函数对向量的求导:
(17)gm(xi)=[L(yi,F(xi))F(xi)]F(x)=Fm1(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}   但是这个负梯度不可以泛化到除样本点外空间中的其他点,所以需要用h(x;am)h\left( \boldsymbol x; \boldsymbol a_m \right)来拟合负梯度。怎么拟合呢?当h(x;am)h\left( \boldsymbol x; \boldsymbol a_m\right)和负梯度方向完全平行时,就是最合适的。要求出参数am\boldsymbol a_m, 用公式来表示就是
(18)am=argmina,βi=1N[gm(xi)βh(xi;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} 到此,整个Gradient Boost算法如图所示
GBDT 原理详述

步骤简述

  1. 初始化一个学习器F0(x)F_0 \left( x \right);
  2. 基于之前的学习器Fm1(x)F_{m - 1} \left( \boldsymbol x\right),计算负梯度
  3. 利用数据集中的样本点,使用一个基学习器h(xi;a)h \left( \boldsymbol x_i; \boldsymbol a \right)来拟合梯度,得到最佳参数am\boldsymbol a_m
  4. 寻找在h(xi;a)h \left( \boldsymbol x_i; \boldsymbol a \right)方向上的最佳移动步长ρm\rho_m
  5. 将之前的学习器Fm1(x)F_{m - 1} \left( \boldsymbol x\right)和当前新的学习器ρmh(x;am)\rho_m h \left( \boldsymbol x; \boldsymbol a_m \right)累加,得到更强的学习器
  6. 重复 2 - 5 步

Regression Tree

  以j个节点的回归树作为基分类器,公式为:
(19)h(x;{bj,Rj}1j)=j=1jbjI(xRj) 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}   可以看出来,回归树本身就是一个累加的模型。其中,{Rj}1j\left\{ R_j \right\}_1 ^j代表一个个互不相交的区域,也就是回归树里的一个个叶节点,bjb_j表示每个区域的输出。把回归树模型带入到前面的Gradient Boost算法第六行
(20)Fm(x)=Fm1(x)+ρmj=1JbjmI(xRjm) 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}

Regularization

  为了避免过拟合,可以控制回归树的数量M,这可以通过交叉验证来实现。但研究发现,通过shrinkage来正则化效果更佳。原本,当前迭代生成的分类器
(21)Fm(x)=Fm1(x)+ρmh(x;am) 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} 现在新增一个缩小系数,即学习率vv
(22)Fm(x)=Fm1(x)+vρmh(x;am),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} 实际上这和梯度下降的思想比较像,每一次迭代只基于当前的残差回归树 ρmh(x;am)\rho_m h \left( \boldsymbol x; \boldsymbol a_m \right)前进一小部分。另外,vMv 和 M这两者是此消彼长的关系,它们互相影响。事实证明,较小的vv可以提升性能。

参考资料

水平有限,如有错误,欢迎指正!!!

相关文章: