从损失函数看-xgboost、GBDT、adaboost

 adaboost和GBDT和xgboost在损失函数的最优化方法是有很多不同的,三者的不同之处其实就在于最优化方法的不同(这样说不知道是否妥当,至少站在这个角度的我认为是正确的,多年后可能发现这个观点不太妥当)。adaboost在李航博士的《统计学习基础》里面用加法模型和向前算法解释了权值更新策略。在解释的过程中,样本权值更新和弱分类器权值的求取是直接通过偏导数等于零来计算的,如果记不清楚的可以回去仔细看一下。不管是做回归还是做分类,adaboost的目标都是找到一个值(通过使得偏导数等零的方法)直接使得损失函数降低到最小。  而GBDT使用的是梯度下降法使得损失函数有所降低。首先说一下为什么会提出这种方法,然后说一下为什么GBDT是使用梯度下降法将损失函数有所降低。这种方法的出现肯定是因为对于某些损失函数,偏导数等于零是可解的,而对于一般的损失函数偏导数等于零是无法求解的,不然梯度下降法也不会存在了。而至于为什么GBDT使用的是梯度下降法将损失函数降低的。首先将损失函数在ft-1(x)处做一阶泰勒展开(这里的ft-1(x)就是前t-1个弱分类器的整合),展开之后是一个常数C 和 梯度g和新的弱分类器f的乘积(就是L = C + gf),这时候如果要让损失函数L变得更小,就要让梯度g和弱分类器f的乘积变得更小,所以就是用负梯度来拟合新的弱分类器。  如果把弱分类器当做步长,那么损失函数就代表沿着梯度走了一步。如果新的弱分类器跟负梯度完美拟合,那么损失函数就变成了L = C + g(-f)= C-gg,所以这时候损失函数是下降了的。如果是这样的话,只要保证新的弱分类器f的向量方向和梯度g相反,而向量模长尽可能大不就行了吗?答案当然是不行的,因为我们做的是损失函数在ft-1(x)的泰勒展开啊,如果步长太长的话沿着梯度相反的方向走一步,误差就大了。所以步长也要小一点。在这不知道为什么定义步长f的模和梯度的模相等,可能Freidman有所考虑的吧,如果后续让我来改进,我就从该地方入手,选择多长的步长也就是-a*g来拟合新的弱分类器f,其中a>0。  xgboost损失函数同样是在ft-1(x)处做泰勒展开,不同的是做的二阶泰勒展开,而且还附带了对树叶子节点约束、权值模长(其实可以考虑为步长)约束的正则项。当然在GBDT里面一样可以做这些正则项约束,这里面并不是xgboost特有的,但是不同的地方就是xgboost损失函数在ft-1(x)处做二阶泰勒展开。对就是从二阶泰勒展开入手去最优化损失函数的。

Donate comment here