泰勒展开(Taylor Expansion)

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 的具体操作

  1. 计算每个样本的 g i g_i gi 和 h i h_i hi。
  2. 构建树时,分裂增益公式为:
    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−γ
  3. 叶子节点权重为:
    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 更快地逼近最优解。

相关推荐
zander2582 小时前
34. 在排序数组中查找元素的第一个和最后一个位置:用两个边界定位区间
数据结构·算法·leetcode
郑州光合科技余经理7 小时前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php
To_OC9 小时前
LC 35 搜索插入位置:二分查找谁都会,边界条件谁写谁懵
javascript·算法·leetcode
码哥DFS10 小时前
二叉树的直径
开发语言·javascript·算法
营养充电站13 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑13 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
Ivanqhz16 小时前
php8 use-def链
算法·php
evans在进步16 小时前
LeetCode 189 轮转数组:三次反转原地解决,图解 Java 实现
java·算法·leetcode