XGBoost,一种广泛使用的梯度提升算法,表现出色。然而,在实例数量庞大的数据集上,其树构建过程可能成为计算瓶颈。主要问题在于,每次分裂时,算法都必须扫描每个数据点以评估潜在的增益。微软的 LightGBM (Light Gradient Boosting Machine) 经过专门设计,通过引入更高效的训练方法来应对这一难题。其主要优化之一是一种新颖的采样技术,称为基于梯度的单边采样,简称 GOSS。此方法基于一个简单而有效的观察:并非所有数据实例对训练过程的贡献都相同。GOSS 的基本思路在梯度提升中,每个实例损失函数的梯度代表当前模型对该实例的预测“错”了多少。大梯度表示该实例预测不佳,因此是一个“有价值的”例子,模型可以从中获得很多。反之,小梯度的实例已经被集成模型很好地预测了;模型从中学到的东西较少。传统的随机梯度提升方法均匀地采样数据。GOSS 提出了一种更巧妙的替代方案。它不平等对待所有实例,而是将学习过程集中在那些较难拟合的实例上。核心思想是保留所有具有大梯度的实例,而只对具有小梯度的实例进行随机采样。GOSS 工作原理名称中的“单边”指我们仅从数据的一侧进行降采样,即那些梯度小、信息量低的实例一侧。该过程可以分解为几个步骤:计算梯度: 对于当前的提升迭代,计算所有训练实例的梯度。划分数据: 根据实例梯度的绝对值降序排列实例。选择实例:保留梯度最大的 a * 100% 实例。这些是最有价值的样本。从剩余的 (1 - a) * 100% 实例中,随机采样其中的 b * 100%。这些是信息量较低的样本。放大采样数据: 为在计算信息增益时保持原始数据分布,随机采样的(小梯度)数据的梯度会乘以一个常数因子 (1 - a) / b 进行放大。这种重新加权确保了采样数据对梯度统计量的贡献与其原始大小成比例,从而避免模型偏向大梯度数据。这个过程使 LightGBM 能够使用更小、更集中的数据集来为每棵新树找到最佳分裂点,大幅减少计算时间,同时没有明显降低准确性。digraph G { rankdir=TB; node [shape=box, style="rounded,filled", fontname="sans-serif", fillcolor="#e9ecef"]; edge [fontname="sans-serif"]; subgraph cluster_0 { label = "GOSS 流程"; bgcolor="#f8f9fa"; FullData [label="迭代 t 的完整数据集", fillcolor="#a5d8ff"]; CalcGrad [label="1. 计算所有实例的梯度", fillcolor="#a5d8ff"]; SortData [label="2. 按 |梯度| 排序实例", fillcolor="#a5d8ff"]; subgraph cluster_1 { label="3. 划分与采样"; bgcolor="#dee2e6"; node [fillcolor="#96f2d7"]; LargeGrad [label="前 a% (大梯度)"]; SmallGrad [label="剩余 1-a % (小梯度)"]; KeepAll [label="全部保留"]; Sample [label="随机采样 b%"]; LargeGrad -> KeepAll [dir=none]; SmallGrad -> Sample; } Amplify [label="4. 将采样梯度放大 (1-a)/b 倍", fillcolor="#ffd8a8"]; Combine [label="合并后的有价值子集", fillcolor="#b2f2bb"]; NewTree [label="使用子集训练树 t+1", fillcolor="#74c0fc"]; FullData -> CalcGrad; CalcGrad -> SortData; SortData -> LargeGrad [style=invis]; SortData -> SmallGrad [style=invis]; KeepAll -> Combine; Sample -> Amplify -> Combine; Combine -> NewTree; } }基于梯度的单边采样 (GOSS) 过程图。该算法保留所有具有大梯度的数据点,并对具有小梯度的部分数据点进行采样,然后对其进行重新加权以保持整体数据分布。在 LightGBM 库中,通过将 boosting_type 参数设置为 'goss' 即可启用 GOSS。比例 a 和 b 分别由 top_rate 和 other_rate 超参数控制。这种策略性采样方法是 LightGBM 训练速度通常比其他梯度提升实现快很多的原因之一,使其成为处理大规模数据集的有力选项。