最近看了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)
这里
最后我们求得的最优函数就是: F∗(X)=F(x;P∗) ,也就是我们最终想要拟合出来的模型。数值优化的方法是用来求解(3),而最终的参数P对应的结果可以表达成
P∗=∑Mm=0pm 的形式。
1.2 梯度下降
梯度下降是最简单数值优化的方法之一,而对于(3)式来说,当前的梯度为
其中
令
而
ρm=argminρΦ(Pm−1−ρgm)(5)
用有限的数据来估计模型
按照式(1)则有
(βm,am)=argminβ,a∑i=1NL(yi,Fm−1(xi)+β∗h(xi;a))(7)
然后
在机器学习中,函数 h(x;am) 被称为弱学习器或者基于学习器,而这个迭代的过程被称为“boosting”。给一定一个 Fm−1(x) ,我们就可以用之前所述的梯度下降法,来求解 β 以及 h(x;a) .。给定特定的loss L(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))
然后就可以更新
伪代码如下: