本想自己测试一下,不过arxiv上居然已经有大佬做过实验了,so,直接搬运过来好了;
作者在文中主要要探究三个问题:
1.在使用基于gpu进行模型训练,xgb、lgb和cab可以期望相对于cpu得到多少加速度?
2.使用贝叶斯优化并且使用gpu加速训练的情况下,哪一种算法能够更快的收敛
3.承接第二点,哪一种算法能够得到最好的泛化性能
(原文有很多背景介绍的知识,这里就不啰嗦了,感觉关系不大,感兴趣的可以自行阅读)
作者在这里使用了4个数据集合来进行测试,涵盖了二分类和多分类问题,涵盖了不同程度的稀疏特征与稠密特征的情况,
我主要关注加速这一块儿,所以不打算介绍贝叶斯优化的问题了,这种启发式算法的随机性太大了,并不是特别有说服力,而且从后面的结论上看,不同算法之间的差异性太小了,没有什么比较的意义,所以还是谈谈速度这一块儿吧。
作者首先将GPU的加速与每个GBDT算法的CPU的速度进行比较。如上图,显示结果 分别用于XGBOOST、LightGBM和CatBoost。XGboost的平均加速倍数为7.26x,中值为3.32x,其次为CatBoost,平均加速倍数为3.7x和中值为2.17x。lightgbmGBM的平均加速倍数为2.35,中位数为0.75倍。对于LightGBM,作者一开始使用的是Goss单侧梯度回归的树生长模式,估计是微软并没有在goss算法上做太多的gpu优化所以加速并不是很明显。当改为直方图算法之后,LightGBM的平均加速速度为3.57倍,中位数为1.32倍。
最后观察一下泛化性能:
作者通过上述的实验整体上测试下来的结果就是,xgboost的exact模式(注意,上面的xgboost都是使用exact的生长模式)对于内存占用非常大,所以eplison数据集没有算出来。。。内存爆了,lightgbm收敛的速度相对较慢(毕竟直方图切割舍弃了很多精度),但是在某些数据集上的泛化性能要更好。最后得出的结论是,没有什么明确的理论证明谁优谁劣,不同的数据集适应不同的算法实现。
不过就便利性和泛化性能上来说,lightgbm还是首选,在不进行复杂的调参的情况下,lgb的速度和泛化性能都是比较好的。 另外需要注意的是,gpu加速的时候会把数据的精度限制在float32(如果没记错的话),可能会造成一定程度的性能损失,不过可以设置为不进行精度限制但是速度会降低一些。