最近看了Friedman的关于梯度提升算法的论文,记录一下。

1 函数估计
在机器学习领域,算法就是利用数据去估计一个函数或就是一个“预测学习”问题。用训练数据得到一个估计的F*(x),这个函数将x映射到y,然后我们通过最小化一个损失函数,求出我们想要的F(x),即:
F∗=argminFEy,xL(y,F(x))=argminFEx[EyL(y,F(x))|x](1)
而L(y,f(x))包括军方误差(y−F)2,binomial log-likelihood(logic regression)等
常见的套路就是限定F(x)是某个参数化的函数空间里的一个函数F(x;P),P={P1,P2⋯}是一个有限集合,这里我们只考虑加法模型
F(x;{βm,am})=∑m=1Mβmh(x;am)(2)
公式(2)其实是很多算法的核心思想,如神经网络、支持向量机等,这里只讨论h(x;am)是一个小的回归树。其中的参数包括分割变量、分割位置以及叶子节点的值。
1.1 数值优化
通常,选择一个参数化的模型令
P∗=argminPΦ(P)(3)
这里
Φ(P)=Ex,yL(y,F(x;P))(4)
最后我们求得的最优函数就是:F∗(X)=F(x;P∗),也就是我们最终想要拟合出来的模型。数值优化的方法是用来求解(3),而最终的参数P对应的结果可以表达成
P∗=∑Mm=0pm的形式。
1.2 梯度下降
梯度下降是最简单数值优化的方法之一,而对于(3)式来说,当前的梯度为
gm=gjm=[∂Φ(P)∂ pj]p=pm−1
其中
Pm−1=∑m−1i=0pi
令
pm=−ρmgm
而
ρm=argminρΦ(Pm−1−ρgm)(5)
用有限的数据来估计模型
按照式(1)则有
{βm,amM1}=argmin∑Ni=1L(yi,β′mh(xi;a′m))(6)
在这种情况确实得到的是最优解,但是复杂度太高,很难求解。所以可以选择“贪心”算法。即对于m 1,2⋯, M
(βm,am)=argminβ,a∑i=1NL(yi,Fm−1(xi)+β∗h(xi;a))(7)
然后
Fm(x)=Fm−1(x)+βm∗h(xi;am)(8)
在机器学习中,函数h(x;am)被称为弱学习器或者基于学习器,而这个迭代的过程被称为“boosting”。给一定一个Fm−1(x),我们就可以用之前所述的梯度下降法,来求解β以及h(x;a).。给定特定的lossL(y,F)和h(x;a),式(7)的解式很难求的。给定一个Fm−1(x), βmh(x;am)可以被看成最佳的贪心算法,对F∗(x)的估计。
求出损失函数在每一个训练数据的梯度,得出一个N维的向量。
−gm(xii)=−{∂L(yi,F(xi))∂F(xi)}F(x)=Fm−1(x)
但是这样求出来的梯度不能泛化的其他的数据上。一个方法是选择一个h(x;am)使得它求得的hm={h(xi;am)}尽可能的与−gm平行
am=argmin∑a,β[−gm(xi)−βh(xi;a)]2
求出a参数向量之后,就可以求出另外一个参数
βm=argmin∑i=1Nl(yi,Fm−1(xi)+βh(xi;am))
然后就可以更新
Fm(x)=Fm−1(x)+βmh(x;am)
伪代码如下:
