Gradient Boosting是AdaBoosting的general的版本,但是为什么呢?Gradient Boosting的理论有些复杂,但实际上,也不算难理解。
Gradient Boostin和AdaBoosting
这里指出adaboosting可以用整合到梯度下降的理论中,只不过boosting里的梯度下降是对函数梯度下降。
我们来看看Adaboosting的general形式。
在每次循环中,都是计算出一个α和新函数f,来提升原来的表现,其中求出f需要找到数据集一组weight,在新weight上训练得到f
我们会很自然的想要对求loss function对g的梯度,猜想这样是否能找到使得loss变小的方法。形式和求导如下。对函数g的求导,可以将g看出一个无限维度的vector,取一个x,得到一个g,所以将g看成vector,就能理解这个求梯度的方法。
然后,我们会想说,能不能找到一个f,和求出来的梯度的方向相同?
于是,我们根据梯度来找f。让两个向量方向相同,相当于maximizing它们的内积。然后我们发现,这个公式的后边如果同号,则这个公式的值会最大。而后边同号=adaboosting中最小化错误率 = 最大化正确率。你会发现,后边部分其实的最终目标和我们一般损失函数的目标是一样的(虽然后者一般形式为交叉熵)。
更进一步,我们发现,公式前面部分,其实是adaboosting中的数据集的新weight。adaboosting是在找到新weight之后用loss function训练出f,而gradient boosting则是找到这个weight之后,试图取maximizing上面的公式。然后最终发现,目标一模一样。
使用数学方法可以直接求出我们在梯度下降时最佳的learning rate,即alpha,然后我们发现,alpha,f,整个公式的形式,都和adaboosting如出一辙。
gradient boosting就是adaboosting的general形式,前者完全可以改动它自己的loss function,以达到更好的效果。
总结
梳理adaboosting的完整过程。
循环T次,目标找到新的互补f
新数据集权重,当前函数g按样本预测结果更新,出错 * α,正确 / α
用新weighted数据集进行训练,用损失函数+梯度下降,找到新的f,其loss为交叉熵
记录新f和α
更新当前函数g
合并所有f
梳理gradient boosting的算法。
梯度下降n次,找到能使损失最小的新函数f
找f 和梯度方向相同
更新g
为什么两者如出一辙,见下面的详细分析。仔细想来,Adaboosting就是通过不断找新的权重来找到新的数据集来找到新的f,而gradient则直接对当前函数g求导,找到新的g以最小化loss,