1. 泰勒展开是什么?(通俗理解)
一句话概括 :泰勒展开是一种用多项式函数 去近似任意复杂函数的方法。
直观类比 :想象你站在一座山的某个位置(点 a a a),你只能感知到脚下的坡度(一阶导数)和地面的弯曲程度(二阶导数)。泰勒展开就是利用这些局部信息,预测如果你往前走一小步( x − a x-a x−a),海拔会变成多少。
-
一阶泰勒展开(线性近似) :只考虑"坡度",认为地面是直线。
f ( x ) ≈ f ( a ) + f ′ ( a ) ( x − a ) f(x) \approx f(a) + f'(a)(x-a) f(x)≈f(a)+f′(a)(x−a)
-
二阶泰勒展开(抛物线近似) :既考虑"坡度",又考虑"弯曲程度"(凹凸性),认为地面是抛物线。
f ( x ) ≈ f ( a ) + f ′ ( a ) ( x − a ) + 1 2 f ′ ′ ( a ) ( x − a ) 2 f(x) \approx f(a) + f'(a)(x-a) + \frac{1}{2}f''(a)(x-a)^2 f(x)≈f(a)+f′(a)(x−a)+21f′′(a)(x−a)2
核心结论:阶数越高,近似越精确,但计算量也越大。
2. 为什么要用二阶泰勒展开?(在机器学习中的意义)
在 GBDT 和 XGBoost 中,我们不是直接去拟合原始数据 y y y,而是去优化一个损失函数 L ( y ^ ) L(\hat{y}) L(y^),其中 y ^ \hat{y} y^ 是模型的预测值。
-
一阶方法(传统 GBDT) :只用梯度 g = L ′ g = L' g=L′。相当于"用直线去逼近损失函数",只知道下降方向,不知道下降速度,容易走弯路。
-
二阶方法(XGBoost) :同时用梯度 g = L ′ g = L' g=L′ 和海森矩阵 h = L ′ ′ h = L'' h=L′′。相当于"用抛物线去逼近损失函数",既知道方向,又知道曲率,能一步跨到抛物线的底部(牛顿法思想),收敛更快、更稳。
3. 完整的数值推导案例(手算对比)
我们选一个复杂但好算的函数 f ( x ) = e x f(x) = e^x f(x)=ex,在 a = 0 a = 0 a=0 处展开(因为 e 0 = 1 e^0 = 1 e0=1,导数全是 1)。
目标 :分别用一阶和二阶泰勒展开近似 f ( 0.2 ) = e 0.2 f(0.2) = e^{0.2} f(0.2)=e0.2 的真实值。
3.1 准备数据
- 展开点: a = 0 a = 0 a=0
- 真实值: e 0.2 ≈ 1.221402758 e^{0.2} \approx 1.221402758 e0.2≈1.221402758
- 函数值: f ( 0 ) = e 0 = 1 f(0) = e^0 = 1 f(0)=e0=1
- 一阶导: f ′ ( x ) = e x ⇒ f ′ ( 0 ) = 1 f'(x) = e^x \Rightarrow f'(0) = 1 f′(x)=ex⇒f′(0)=1
- 二阶导: f ′ ′ ( x ) = e x ⇒ f ′ ′ ( 0 ) = 1 f''(x) = e^x \Rightarrow f''(0) = 1 f′′(x)=ex⇒f′′(0)=1
3.2 一阶泰勒展开(线性近似)
公式:
f ( x ) ≈ f ( a ) + f ′ ( a ) ( x − a ) f(x) \approx f(a) + f'(a)(x-a) f(x)≈f(a)+f′(a)(x−a)
代入 a = 0 , x = 0.2 a=0, x=0.2 a=0,x=0.2:
e 0.2 ≈ 1 + 1 × ( 0.2 ) = 1.2 e^{0.2} \approx 1 + 1 \times (0.2) = 1.2 e0.2≈1+1×(0.2)=1.2
结果 : 1.2 1.2 1.2
误差 : ∣ 1.2214 − 1.2 ∣ = 0.0214 |1.2214 - 1.2| = 0.0214 ∣1.2214−1.2∣=0.0214
3.3 二阶泰勒展开(抛物线近似)
公式:
f ( x ) ≈ f ( a ) + f ′ ( a ) ( x − a ) + 1 2 f ′ ′ ( a ) ( x − a ) 2 f(x) \approx f(a) + f'(a)(x-a) + \frac{1}{2}f''(a)(x-a)^2 f(x)≈f(a)+f′(a)(x−a)+21f′′(a)(x−a)2
代入 a = 0 , x = 0.2 a=0, x=0.2 a=0,x=0.2:
e 0.2 ≈ 1 + 1 × 0.2 + 1 2 × 1 × ( 0.2 ) 2 e^{0.2} \approx 1 + 1 \times 0.2 + \frac{1}{2} \times 1 \times (0.2)^2 e0.2≈1+1×0.2+21×1×(0.2)2
= 1 + 0.2 + 0.5 × 0.04 = 1 + 0.2 + 0.02 = 1.22 = 1 + 0.2 + 0.5 \times 0.04 = 1 + 0.2 + 0.02 = 1.22 =1+0.2+0.5×0.04=1+0.2+0.02=1.22
结果 : 1.22 1.22 1.22
误差 : ∣ 1.2214 − 1.22 ∣ = 0.0014 |1.2214 - 1.22| = 0.0014 ∣1.2214−1.22∣=0.0014
3.4 直观对比表
| 方法 | 近似公式 | 近似值 | 误差 | 精度提升 |
|---|---|---|---|---|
| 真实值 | e 0.2 e^{0.2} e0.2 | 1.2214 | - | - |
| 一阶(切线) | 1 + 0.2 1 + 0.2 1+0.2 | 1.2 | 0.0214 | 基准 |
| 二阶(抛物线) | 1 + 0.2 + 0.02 1 + 0.2 + 0.02 1+0.2+0.02 | 1.22 | 0.0014 | 提升 15 倍 🚀 |
图示理解:
- 一阶近似是用一条直线去"贴"曲线,在远离 a = 0 a=0 a=0 时误差迅速放大(因为曲线是弯的,直线是直的)。
- 二阶近似考虑了曲线的"弯度"(凸性),用抛物线去贴合,在 x = 0.2 x=0.2 x=0.2 处依然非常精准。
4. 在 XGBoost / GBDT 中的实际映射(核心)
在 XGBoost 中,我们不是展开 e x e^x ex,而是展开损失函数 L L L。假设当前预测值为 y ^ ( t − 1 ) \hat{y}^{(t-1)} y^(t−1),我们要加入一棵新树 f t ( x ) f_t(x) ft(x),即新的预测值变成 y ^ ( t − 1 ) + f t ( x ) \hat{y}^{(t-1)} + f_t(x) y^(t−1)+ft(x)。
把 f t ( x ) f_t(x) ft(x) 看作是一个"小增量" Δ \Delta Δ,我们对损失函数做二阶泰勒展开:
L ( y ^ + Δ ) ≈ L ( y ^ ) + L ′ ( y ^ ) ⋅ Δ + 1 2 L ′ ′ ( y ^ ) ⋅ Δ 2 L(\hat{y} + \Delta) \approx L(\hat{y}) + L'(\hat{y}) \cdot \Delta + \frac{1}{2} L''(\hat{y}) \cdot \Delta^2 L(y^+Δ)≈L(y^)+L′(y^)⋅Δ+21L′′(y^)⋅Δ2
4.1 对应到你的 GBDT 推导(平方损失)
在之前的 GBDT 案例中,我们使用了损失函数 L = 1 2 ( y − y ^ ) 2 L = \frac{1}{2}(y - \hat{y})^2 L=21(y−y^)2。
- 一阶导数(梯度): g = ∂ L ∂ y ^ = y ^ − y g = \frac{\partial L}{\partial \hat{y}} = \hat{y} - y g=∂y^∂L=y^−y(之前算出的残差是 y − y ^ y - \hat{y} y−y^,符号相反,本质一样)
- 二阶导数(海森矩阵): h = ∂ 2 L ∂ y ^ 2 = 1 h = \frac{\partial^2 L}{\partial \hat{y}^2} = 1 h=∂y^2∂2L=1
XGBoost 的具体操作:
- 计算每个样本的 g i g_i gi 和 h i h_i hi。
- 构建树时,分裂增益公式为:
G a i n = 1 2 G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ − γ Gain = \frac{1}{2} \left \\frac{G_L\^2}{H_L + \\lambda} + \\frac{G_R\^2}{H_R + \\lambda} - \\frac{(G_L+G_R)\^2}{H_L+H_R+\\lambda} \\right - \gamma Gain=21HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2−γ - 叶子节点权重为:
w j = − G j H j + λ w_j = -\frac{G_j}{H_j + \lambda} wj=−Hj+λGj
这与只用一阶导的 GBDT 有什么区别?
- 传统 GBDT 的叶子权重是残差的平均值(只看 g g g),步长是固定的。
- XGBoost 的叶子权重公式里有 H H H(二阶导),相当于根据该节点的"曲率"自动调节步长 。如果曲率大( H H H 大),说明损失函数很陡,步子就迈小一点;如果曲率小( H H H 小),步子就迈大一点。这就是二阶方法比一阶方法收敛快的原因。
5. 终极总结
| 概念 | 数学表达 | 物理意义 |
|---|---|---|
| 一阶泰勒展开 | f ( x ) ≈ f ( a ) + f ′ ( a ) ( x − a ) f(x) \approx f(a) + f'(a)(x-a) f(x)≈f(a)+f′(a)(x−a) | 用切线近似曲线(只看斜率) |
| 二阶泰勒展开 | f ( x ) ≈ f ( a ) + f ′ ( a ) ( x − a ) + 1 2 f ′ ′ ( a ) ( x − a ) 2 f(x) \approx f(a) + f'(a)(x-a) + \frac{1}{2}f''(a)(x-a)^2 f(x)≈f(a)+f′(a)(x−a)+21f′′(a)(x−a)2 | 用抛物线近似曲线(斜率 + 弯曲度) |
| 在 GBDT 中 | 只算梯度 g g g | 知道该往哪走,但不知走多大步 |
| 在 XGBoost 中 | 算梯度 g g g + 海森矩阵 h h h | 既知道方向,又知道步长,收敛更快 |
一句话记住:
二阶泰勒展开 = 一阶泰勒展开 + "曲线修正项" 。在 XGBoost 中,这个修正项( h h h 二阶导)让模型能够自适应地调整学习步长,从而比传统 GBDT 更快地逼近最优解。