You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

梯度提升中牛顿-拉夫森更新的工作原理及指数损失下的实现疑问

梯度提升中的牛顿-拉夫森更新详解

我来一步步拆解你的问题,先从牛顿-拉夫森在梯度提升里的核心作用说起,再针对指数损失的情况结合sklearn的实现详细解析。

一、牛顿-拉夫森更新在梯度提升中如何工作?

梯度提升的本质是逐轮训练弱学习器,去拟合前一轮模型留下的「误差信号」。常规的梯度下降只用到损失函数的一阶导数(梯度)来确定更新方向,而牛顿-拉夫森更新则额外引入了二阶导数(海森矩阵,在单变量场景下就是标量),用「负一阶导数的和」除以「二阶导数的和」来确定每轮弱学习器的权重步长。

这么做的好处是,二阶导数反映了损失函数的曲率,能让我们的更新步长更精准,避免步长过大或过小,从而加快收敛速度。简单说,牛顿-拉夫森是用更丰富的损失函数信息来优化每一轮的模型更新。

二、指数损失下的牛顿-拉夫森更新推导与sklearn实现

你提到的指数损失是分类任务里的经典损失(AdaBoost其实就是用指数损失的梯度提升特例),先把完整的损失函数明确下来:
$$L(pred) = \sum_{i=1}^n e^{-y_i \cdot pred_i}$$
这里$y_i \in {-1, 1}$是分类标签,$pred_i$是模型对第i个样本的原始预测值(不是概率哦)。

1. 分子:负一阶导数的总和

先对损失函数求关于$pred_i$的一阶偏导:
$$\frac{\partial L}{\partial pred_i} = -y_i \cdot e^{-y_i \cdot pred_i}$$
取它的负值,就是我们用来拟合的「误差信号」:
$$-\frac{\partial L}{\partial pred_i} = y_i \cdot e^{-y_i \cdot pred_i}$$
sklearn里的分子就是所有样本这个值的总和:$\sum_{i=1}^n y_i \cdot e^{-y_i \cdot pred_i}$。它代表了当前模型的整体误差方向,告诉我们需要往哪里调整预测。

2. 分母:二阶导数的总和

接下来求二阶偏导,用来衡量损失函数的曲率:
$$\frac{\partial^2 L}{\partial pred_i^2} = y_i^2 \cdot e^{-y_i \cdot pred_i}$$
因为$y_i$是±1,所以$y_i2=1$,二阶导数简化为$e{-y_i \cdot pred_i}$。分母就是所有样本二阶导数的总和:$\sum_{i=1}^n e^{-y_i \cdot pred_i}$。

3. 最终更新步长

牛顿-拉夫森的更新步长(也就是当前弱学习器的权重系数)就是分子除以分母:
$$\alpha = \frac{\sum_{i=1}^n y_i \cdot e^{-y_i \cdot pred_i}}{\sum_{i=1}^n e^{-y_i \cdot pred_i}}$$
得到这个$\alpha$后,我们就可以更新模型的总预测:$pred_{new} = pred_{old} + \alpha \cdot h(x)$,其中$h(x)$是当前训练出的弱学习器的输出。

4. sklearn里的对应逻辑

当你在sklearn.GradientBoostingClassifier中设置loss='exponential'时,内部就是按照这个逻辑计算的:

  • 先计算每个样本的负梯度(对应分子的单个项)
  • 计算所有样本的海森值之和(分母)
  • 两者相除得到步长$\alpha$,再把弱学习器的输出乘以$\alpha$加到总预测里

举个直观的例子:如果模型对某个样本预测得很准,$y_i \cdot pred_i$是大正数,那么$e^{-y_i \cdot pred_i}$就很小,这个样本对分子分母的贡献都弱;如果预测错误,$y_i \cdot pred_i$是负数,$e^{-y_i \cdot pred_i}$会很大,这个样本就会主导更新方向,让模型优先纠正这个错误。


内容的提问来源于stack exchange,提问作者gnikol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:34:33