白云飞
(2022-03-31 16:24):
#paper 31st Conference on Neural Information Processing Systems (NIPS 2017), Long Beach, CA, USA.
论文地址:https://proceedings.neurips.cc/paper/2017/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf
项目文档:https://lightgbm.readthedocs.io/en/latest/Features.html
在LightGBM提出之前,最有名的GBDT工具就是XGBoost了,它是基于预排序方法的决策树算法。这种构建决策树的算法基本思想是:首先,对所有特征都按照特征的数值进行预排序。其次,在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点。最后,在找到一个特征的最好分割点后,将数据分裂成左右子节点。
这样的预排序算法的优点是能精确地找到分割点。但是缺点也很明显:首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如,为了后续快速的计算分割点,保存了排序后的索引),这就需要消耗训练数据两倍的内存。其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。最后,对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。
为了避免上述XGBoost的缺陷,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上进行了如下优化:
基于Histogram的决策树算法。
单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。
带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
直接支持类别特征(Categorical Feature)
支持高效并行
Cache命中率优化
其中两个加速GBDT训练的算法:Gradient-based One Side Sampling (GOSS) 和 Exclusive Feature Bundling (EFB)。在不影响精度的情况下,两个算法分别减少了GBDT训练中所需的数据量和特征量,从而加速了GBDT的训练。
GOSS: 在每一次迭代前,利用了GBDT中的样本梯度和误差的关系,对训练样本进行采样: 对误差大(梯度绝对值大)的数据保留;对误差小的数据采样一个子集,但给这个子集的数据一个权重,让这个子集可以近似到误差小的数据的全集。这么采样出来的数据,既不损失误差大的样本,又在减少训练数据的同时不改变数据的分布,从而实现了在几乎不影响精度的情况下加速了训练。
EFB:在特征维度很大的数据上,特征空间一般是稀疏的。利用这个特征,我们可以无损地降低GBDT算法中需要遍历的特征数量,更确切地说,是降低构造特征直方图(训练GBDT的主要时间消耗)需要遍历的特征数量。在稀疏的特征空间中,很多特征是exclusive的(即在同一个样本里,这一组特征里最多只有一个特征不为0)。每一组exclusive feature都可以无损地合并成一个“大特征”。构造直方图的时候,遍历一个“大特征”可以得到一组exclusive feature的直方图。这样只需要遍历这些“大特征”就可以获取到所有特征的直方图,降低了需要遍历的特征量。这里还需要解决的是Exclusive feature的分组问题,这是一个NP问题,可以转成Graph Coloring (Graph coloring - Wikipedia) 问题,并用贪心的近似方法来求解。
值得一提的是,XGBoost 也实现了 histogram 算法,比原来presorted算法快了不少。但相比LightGBM,还是慢了一些,且内存占用还是比较大。
LightGBM: a highly efficient gradient boosting decision tree
翻译
Abstract:
Gradient Boosting Decision Tree (GBDT) is a popular machine learning algorithm, and has quite a few effective implementations such as XGBoost and pGBRT. Although many engineering optimizations have been adopted in these implementations, the efficiency and scalability are still unsatisfactory when the feature dimension is high and data size is large. A major reason is that for each feature, they need to scan all the data instances to estimate the information gain of all possible split points, which is very time consuming. To tackle this problem, we propose two novel techniques: Gradient-based One-Side Sampling (GOSS) and Exclusive Feature Bundling (EFB). With GOSS, we exclude a significant proportion of data instances with small gradients, and only use the rest to estimate the information gain. We prove that, since the data instances with larger gradients play a more important role in the computation of information gain, GOSS can obtain quite accurate estimation of the information gain with a much smaller data size. With EFB, we bundle mutually exclusive features (i.e., they rarely take nonzero values simultaneously), to reduce the number of features. We prove that finding the optimal bundling of exclusive features is NP-hard, but a greedy algorithm can achieve quite good approximation ratio (and thus can effectively reduce the number of features without hurting the accuracy of split point determination by much). We call our new GBDT implementation with GOSS and EFB LightGBM. Our experiments on multiple public datasets show that, LightGBM speeds up the training process of conventional GBDT by up to over 20 times while achieving almost the same accuracy.
翻译