专栏名称: Coggle数据科学
Coggle全称Communication For Kaggle,专注数据科学领域竞赛相关资讯分享。
目录
相关文章推荐
51好读  ›  专栏  ›  Coggle数据科学

Kaggle知识点:量化训练GBDT

Coggle数据科学  · 公众号  ·  · 2024-07-05 10:16

正文

近年来,梯度提升决策树(GBDT)在各种机器学习应用中取得了显著成功。传统上,GBDT的训练算法使用高精度浮点数来计算梯度和统计信息。

本论文探讨了一个之前文献中基本被忽视的重要问题——训练GBDT需要多少位来表示梯度?为了解决这个问题,作者提出在GBDT的训练算法中对所有高精度梯度进行量化。

作者提出了一种简单但有效的方法来量化梯度。他们的理论分析和实证研究表明,在不损害性能的情况下,所需的梯度精度可以很低,例如2或3位。使用低精度梯度,大多数算术运算可以被8位、16位或32位的整数运算替代。

unsetunset背景介绍unsetunset

GBDT是一种强大的机器学习算法,尽管近年来深度学习取得了很大成功,GBDT仍然在许多现实任务中(如在线广告、搜索排名、金融预测等)表现出色。工具如XGBoost、LightGBM和CatBoost的设计进一步增强了GBDT的性能,使其在各种数据科学竞赛和工业应用中表现突出。

尽管GBDT取得了成功,但其算法在充分利用现代计算资源方面仍有改进空间:

  • 高精度计算问题:GBDT的训练需要进行高精度浮点数的算术运算,限制了低精度计算资源的使用,而低精度训练已成为显著加速神经网络训练的标准技术。
  • 分布式训练的通信成本:对于大数据集,GBDT需要分布式训练,但高精度统计信息的传递导致通信成本高,尤其是在特征数量庞大的情况下,这严重影响了GBDT在分布式系统中的扩展性。

unsetunsetGBDT算法原理unsetunset

GBDT的训练过程

GBDT是一种集成学习算法,通过迭代地训练决策树作为基础组件。在每次迭代中,对每个训练样本计算损失函数相对于当前预测值的梯度(一阶导数)和海森矩阵(二阶导数)。然后训练一棵决策树以拟合梯度的负值。

梯度和海森矩阵计算

设第 (k+1) 次迭代中,样本 (i) 的当前预测值为 (\hat{y}_i^k)。

梯度 (g_i) 和海森矩阵 (h_i) 计算如下:


损失函数的近似

对于叶子节点 (s),令 (I_s) 表示叶子节点中的数据索引集合。

分别是梯度和海森矩阵的和。

在第 (k+1) 次迭代中,固定树结构,训练损失可以用二阶泰勒多项式近似:


其中 是常数, 是叶子节点 的预测值。

通过最小化近似损失,可以得到叶子节点 (s) 的最优值和数据 (I_s) 的最小损失:

树结构的优化

寻找最优树结构非常困难,因此通过贪心方法迭代地将叶子节点分裂为两个子叶节点,从单一根叶节点开始。

当在树 中将叶子节点 分裂为两个子节点 时,可以计算近似损失的减少量:

为了找到叶子节点 的最佳分裂条件,需要枚举所有特征的所有分裂候选,并选择损失减少量最大的那个。

直方图加速算法

为了加速最佳分裂寻找过程,最先进的GBDT工具采用基于直方图的算法。基本思想是将特征值划分到不同的箱中,每个箱对应特征值的一个范围。

然后构建直方图,每个箱记录该箱中数据的梯度和海森矩阵的累加值。只有这些箱的边界会被考虑作为分裂阈值的候选。

  • 输入:梯度 、海森矩阵 ,箱数据 ,叶子节点数据索引
  • 输出:直方图 hist
  • 对于每个样本 和每个特征 ,找到样本 在特征 上所属的箱,将梯度和海森矩阵值累加到相应的直方图箱中。

unsetunset量化训练GBDTunsetunset

量化训练框架

我们将梯度 () 和 Hessian 矩阵 () 量化为低位宽整数 ()。将所有训练样本的 范围划分为等长区间。

使用 位 () 整数梯度时,使用 个区间。每个区间的端点对应一个整数值,总共 个整数值。由于 可以取正负值,区间一半分配给负值,另一半分配给正值。对于 通常为非负值,其区间如下:

低位宽梯度和 Hessian 计算如下:

整数运算

在算法1中用 替换 。 原始梯度的加法操作替换为整数加法。直方图箱中的统计量 变为整数,累积梯度只需要整数加法。

大多数操作用低位宽整数完成。只有在计算原始梯度、Hessian 和分裂增益时需要浮点操作:

四舍五入策略

直接四舍五入到最接近的整数通常会导致严重的准确性下降,尤其是在梯度位数较少的情况下。因此采用随机四舍五入策略:

四舍五入策略的正式定义如下:

unsetunset量化训练GBDT的评估unsetunset

表1列出了实验中使用的数据集。对于Criteo数据集,我们通过目标编码和计数编码对类别特征进行编码。我们使用开源GBDT工具XGBoost、LightGBM和CatBoost作为基准。

量化训练的准确性

我们评估了量化训练的准确性。对于每个数据集和每个算法,我们报告测试集中最佳迭代的结果。我们使用2-bit、3-bit、4-bit和5-bit的整数梯度,并将结果与32-bit单精度浮点梯度进行比较。表2列出了在所有提升迭代中测试集上达到的最佳指标。我们用SR表示随机四舍五入,用RN表示最接近四舍五入,并使用下标表示是否应用叶子值重拟合。

单机加速

我们通过比较流行开源GBDT工具的CPU和CUDA实现,评估了量化训练(SRrefit)在单机上的加速效果。我们的CPU量化训练基于LightGBM。我们将我们的CPU实现与XGBoost、CatBoost和32-bit梯度的LightGBM进行比较。

分布式训练的加速

我们在Epsilon数据集的扩展版本上评估了量化在分布式GBDT训练中的效果。该扩展版本包含原始Epsilon数据集训练集的20个副本(记为Epsilon-8M)和Criteo。

unsetunsetLightGBM对应参数unsetunset

https://lightgbm.readthedocs.io/en/latest/Parameters.html

  • use_quantized_grad 🔗︎, default = false, type = bool

    • 是否在训练时使用梯度量化。
    • 启用此选项将把梯度和hessians离散化(量化)到 num_grad_quant_bins 的箱中。
    • 使用量化训练时,训练过程中的大多数算术运算将是整数运算。
    • 梯度量化可以加速训练,在大多数情况下精度损失很小。
  • num_grad_quant_bins 🔗︎, default = 4, type = int

    • 用于量化梯度和hessians的箱数。
    • 箱数越多,量化训练将越接近全精度训练。
  • quant_train_renew_leaf 🔗︎, default = false, type = bool

    • 在量化训练时是否使用原始梯度更新叶子值。
    • 对于排名目标,更新叶子值对良好的量化训练精度非常有帮助。
  • stochastic_rounding 🔗︎, default = true, type = bool

    • 在梯度量化中是否使用随机四舍五入。

添加👇微信拉你进竞赛群