在合集的上一篇文章介绍了XGBoost的目标函数(1)式:
本文推导(1)式的二阶泰勒展开过程。
1.目标函数为什么要进行二阶泰勒展开
要计算sin23应该怎么做?
当然是首先将其展开为麦克老林级数:
此时,将23代入,就方便多了。尤其对编程而言,这几乎是唯一合适的算法。
为什么是二阶泰勒展开而不是三阶?
因为二阶已经够用了,三阶反而增加了计算量。一阶导数向模型指示梯度(方向)信息,明确模型的下一步调整方向;二阶导数向模型指示变化速率信息,让模型的调整既不能龟速也不能超速。
综上所述,XGBoost对其目标函数进行二阶泰勒展开,能简化代码编写,提高计算效率,也方便自定义目标函数,只要其二阶可导即可。
2.向前分步算法
XGBoost在训练时,首先初始化第0颗树,然后优化第1颗树,第2颗树,…,直至优化完第k颗树,过程如下:
…
利用(2)式改写(1)式为:
对第t颗树,第t-1颗树的正则化项已经求得,因此在(3)式中:
为常数项。
3.二阶泰勒展开
回归问题和分类问题需要定义不同的损失函数,有时也需要自定义其它损失函数。为使损失函数的形式更具一般性,对(3)式进行二阶泰勒展开,此时,无论损失函数采用什么形式,只需其二阶可导即可。
泰勒展开公式:
在(3)式中,
同时令:
则:第t颗树(3)式的二阶泰勒展开式为:
因为常数项与目标函数的最小值无关,对第t棵树,
可视为常数项,因此可舍去,则(3)式进一步简化为:
至此,泰勒展开已经完成,下一篇将对(4)式求最小值。