LightGBM 如何计算叶子值与分裂增益
手写 GBDT 用残差均值作为叶子值。现在把问题推广为:损失不一定是平方误差时,一片叶子应该修正多少?
本页固定 LightGBM 4.6.0 的普通常数叶、平滑目标语境。先推导无权重、仅 L2 正则的情形,再补 L1;不把这个公式强行套到所有非光滑目标、线性叶或约束变体。
1. 梯度和 Hessian 属于谁
第
它们描述“这个样本的预测值再移动一点,损失怎样变”。这里的 Hessian 是每个标量预测的二阶导数;不是对离散阈值求导,也不是一个神经网络参数矩阵。
延续本章四个样本和
| 样本 | y | F₀ | g=F₀−y | h |
|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 1 |
| 2 | 1 | 2 | 1 | 1 |
| 3 | 3 | 2 | -1 | 1 |
| 4 | 3 | 2 | -1 | 1 |
这是本版 RegressionL2loss 的无权重梯度规则。有样本权重时,梯度与 Hessian 都乘相应权重。
2. 用局部二阶式描述一片叶子
一片叶子
舍去不随
当
这两式分别回答“叶子输出什么”和“这片叶子能让局部目标下降多少”。平方损失的二阶展开是精确的;一般损失这里只是局部近似。
3. 回到数值,连接之前的残差树
在阈值 2.5 处,左边
若
若
本例再取
4. 一刀值不值得切
父叶变为两个子叶,局部正则化目标的下降量为:
这里没有另外加入每片叶子的固定复杂度罚项。父叶
源码的 gain 尺度需要单独核对。 LightGBM 4.6.0 常规未约束分支用
当 split_gain 是 4,而最初 CART 的 SSE 下降也是 4。它们在这个特例中有明确的换算关系,不能推广为所有目标都等于 SSE 下降。
5. L1 和二分类怎样连接
加入
它会让一部分小梯度和对应的输出直接归零。带输出限制、路径平滑、单调约束时,还需要相应分支的计算,不能只背这一式。
二分类交叉熵中,
6. 自己验证一次
核心脚本已有 g,h,再分别求左右 G,H;如果左右
第三方实验打印 dump_model() 的第一棵树,并检查 split_gain=4。还单独验证
小结、自测与下一步
- 为什么本例的 h 都是 1?
- λ 从 0 增到 1,左叶输出如何改变?
- 为什么公式算 2、模型打印 4,可以同时正确?
参考答案
- 对半平方误差关于 F 求二阶导数为 1;它不是所有目标的固定值。
- 从 -1 缩小为 -2/3;乘学习率是后续步骤。
- 在本例无正则情形,公式使用半平方损失下降;源码增益省略公共 1/2。应先统一目标和尺度再比较。
下一步:LightGBM 如何用直方图生长一棵树。