LightGBM

这篇文章是LightGBM工作原理的概念性概述。 假设我们已经熟悉决策树增强算法,以专注于LightGBM方面,这些方面可能与其他增强包有所不同。 如果需要学习决策树可以参考我的决策树文章。

优化速度和内存使用

许多提升工具使用基于预排序的算法(例如xgboost中的默认算法)进行决策树学习。 这是一个简单的解决方案,但不容易优化。

LightGBM使用基于直方图的算法,该算法将连续特征(属性)值存储到离散的bin中。 这样可以加快培训速度并减少内存使用量。 基于直方图的算法的优点包括:

  1. 降低了计算每个分割增益 (gain) 的成本。

    基于预排序的算法具有时间复杂度O(#data)

    计算直方图的时间复杂度为O(#data),但这仅涉及快速求和操作。 一旦构建了直方图,基于直方图的算法将具有时间复杂度O(#bins),并且#bins远小于#data。

  2. 使用直方图减法进一步提高速度

要在二叉树中获取一片叶子的直方图,请使用其父级和neighbour的直方图减法
因此,它只需要为一片叶子(其#data小于其邻居的叶子)构造直方图。 然后,它可以通过以较小的成本(O(#bins))通过直方图减法来获取其邻居的直方图。

  1. 减少内存使用

用离散的bin替换连续的值。 如果#bins较小,则可以使用较小的数据类型,例如 uint8_t,用于存储训练数据
无需存储其他信息即可对特征值进行预排序

  1. 降低并行学习的通信成本

原理:
Leaf-wise (Best-first) Tree Growth
大多数决策树学习算法都是按级别(深度)来生长树,如下图所示:
在这里插入图片描述
LightGBM以叶子的方式(最好的优先)生长树木。 它将选择具有最大增量损失的叶子来生长。 保持#leaf固定,逐叶算法往往比逐级算法具有更低的损耗。

当#data较小时,逐叶可能会导致过度拟合,因此LightGBM包含max_depth参数以限制树的深度。 但是,即使指定了max_depth,树木仍会向叶方向生长。

在这里插入图片描述

分类特征的最佳分割

通常使用一键编码来表示分类特征,但是这种方法对于树学习者而言不是最理想的。 特别是对于高基数的分类特征,基于单热点特征的树倾向于不平衡,并且需要长得很深才能获得良好的精度。

代替单次编码,最佳解决方案是通过将类别的类别划分为2个子集来对类别进行拆分。 如果特征具有k个类别,则存在2 ^(k-1)-1个可能的分区。 但如果是想是对于回归树有一个有效的解决方案。 它需要大约O(k * log(k))来找到最佳分区。

基本思想是在每次分组时根据培训目标对类别进行分类。 更具体地说,LightGBM根据其累积值(sum_gradient / sum_hessian)对直方图(用于分类特征)进行排序,然后在排序的直方图上找到最佳分割。

并行方式的不同

传统算法

特征并行旨在并行化决策树中的“查找最佳拆分”。 传统特征并行的过程是:

垂直分区数据(不同的计算机具有不同的功能集)。
我们在局部特征集上找到局部最佳分割点{特征,阈值}。
相互交流本地最佳成绩并获得最佳成绩。
具有最佳拆分的工作程序执行拆分,然后将数据的拆分结果发送给其他工作程序。
其他工作人员根据接收到的数据拆分数据。

传统功能并行的缺点:

具有计算开销,因为它无法加速“拆分”,其时间复杂度为O(#data)。 因此,当#data很大时,特征并行不能很好地加速。

需要通信拆分结果,花费约O(#data / 8)

LightGBM中的功能平行

由于#data很大时,并行功能无法很好地加速,因此我们做了一些改动:不是垂直划分数据,而是每个工作人员都保存了全部数据。 因此,LightGBM不需要就数据拆分结果进行通信,因为每个工作人员都知道如何拆分数据。 而且#data不会更大,因此在每台计算机上保存完整数据是合理的。

LightGBM中并行功能的过程:

我们在局部特征集上找到局部最佳分割点{特征,阈值}。
相互交流本地最佳成绩并获得最佳成绩。
执行最佳分割。
但是,当#data很大时,此功能并行算法仍会遭受“拆分”的计算开销。 因此,当#data较大时,最好并行使用数据。

数据并行

传统算法

数据并行化旨在并行化整个决策学习。数据并行的过程是:

水平分区数据。
我们使用本地数据来构造本地直方图。
合并所有本地直方图中的全局直方图。
从合并的全局直方图中找到最佳分割,然后执行分割。
传统数据并行的缺点:

通讯成本高。如果使用点对点通信算法,则一台机器的通信成本约为O(#machine * #feature * #bin)。如果使用集体通信算法(例如“ All Reduce”),则通信成本约为O(2 * #feature * #bin)

LightGBM中的数据并行
我们降低了LightGBM中并行数据的通信成本:

代替“从所有本地直方图合并全局直方图”,LightGBM使用“减少散点图”为不同工作人员合并不同(不重叠)特征的直方图。然后我们会在局部合并的直方图中找到局部最佳分割,并同步全局最佳分割。

如前所述,LightGBM使用直方图减法来加快训练速度。基于此,我们只能传达一张叶子的直方图,也可以通过减法获得其邻居的直方图。

考虑到所有因素,LightGBM中的并行数据具有时间复杂度O(0.5 * #feature * #bin)。