1. 先定义平方损失函数
对于单个样本 (xi,yi)(x_i, y_i)(xi,yi),平方损失的定义是:
L(yi,f(xi))=(yi−f(xi))2 L(y_i, f(x_i)) = \left(y_i - f(x_i)\right)^2 L(yi,f(xi))=(yi−f(xi))2
其中:
- yiy_iyi 是样本的真实值
- f(xi)f(x_i)f(xi) 是模型对该样本的预测值
- 残差的定义就是 yi−f(xi)y_i - f(x_i)yi−f(xi)
2. 计算损失函数对预测值 f(xi)f(x_i)f(xi) 的偏导数
我们需要计算损失函数 LLL 关于 f(xi)f(x_i)f(xi) 的变化率,也就是偏导数 ∂L∂f(xi)\frac{\partial L}{\partial f(x_i)}∂f(xi)∂L:
∂L∂f(xi)=∂∂f(xi)(yi−f(xi))2 \frac{\partial L}{\partial f(x_i)} = \frac{\partial}{\partial f(x_i)} \left(y_i - f(x_i)\right)^2 ∂f(xi)∂L=∂f(xi)∂(yi−f(xi))2
根据链式法则,令 u=yi−f(xi)u = y_i - f(x_i)u=yi−f(xi),则 L=u2L = u^2L=u2,所以:
∂L∂f(xi)=2u⋅∂u∂f(xi)=2(yi−f(xi))⋅(−1) \frac{\partial L}{\partial f(x_i)} = 2u \cdot \frac{\partial u}{\partial f(x_i)} = 2\left(y_i - f(x_i)\right) \cdot (-1) ∂f(xi)∂L=2u⋅∂f(xi)∂u=2(yi−f(xi))⋅(−1)
化简后得到:
∂L∂f(xi)=−2(yi−f(xi)) \frac{\partial L}{\partial f(x_i)} = -2\left(y_i - f(x_i)\right) ∂f(xi)∂L=−2(yi−f(xi))
3. 计算负梯度
梯度提升树中,我们需要拟合的是负梯度 ,即:
−∂L∂f(xi)=−[−2(yi−f(xi))]=2(yi−f(xi)) -\frac{\partial L}{\partial f(x_i)} = -\left[-2\left(y_i - f(x_i)\right)\right] = 2\left(y_i - f(x_i)\right) −∂f(xi)∂L=−[−2(yi−f(xi))]=2(yi−f(xi))
在梯度下降算法中,常数因子 222 不影响梯度的方向(只影响步长,而步长可以通过学习率调整),因此通常会忽略这个常数,简化为:
−∂L∂f(xi)≈yi−f(xi) -\frac{\partial L}{\partial f(x_i)} \approx y_i - f(x_i) −∂f(xi)∂L≈yi−f(xi)
这正是残差的定义!
总结
平方损失的负梯度等于残差,本质是数学推导的直接结果:
- 平方损失的偏导数包含了残差的相反数
- 取负后就得到了残差(忽略常数因子)
这也是为什么在平方损失场景下,GBDT和传统的残差提升树是等价的------它们都在拟合残差。而当损失函数不是平方损失(如分类任务的对数损失)时,负梯度就不再是残差,这正是GBDT的泛化能力所在。