泰勒展开 -- 用多项式逼近任意函数
任何光滑函数,在一点附近都可以用多项式来近似。
一阶泰勒展开是梯度下降的基础,二阶展开引出牛顿法。本章了解即可,无需深究推导细节。
概念解析
一阶泰勒 = 线性逼近(梯度下降的基础)
\[ f(x) \approx f(a) + f'(a)(x - a) \]这就是「在 a 点画一条切线,用切线值近似函数值」。
二阶泰勒 = 考虑曲率
\[ f(x) \approx f(a) + f'(a)(x - a) + \frac{f''(a)}{2}(x - a)^2 \]加入二阶项后能捕捉函数的「弯曲」程度——这就是牛顿法的思想。
重要函数的展开式
| 函数 | x=0 处的展开 |
|---|---|
| \( e^x \) | \( 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots \) |
| \( \sin x \) | \( x - \frac{x^3}{3!} + \frac{x^5}{5!} - \cdots \) |
梯度下降只用一阶信息(方向)。牛顿法用二阶信息(曲率),收敛更快但计算代价高。
生活例子
估算 sin(0.1):sin(0)=0,sin'(0)=cos(0)=1。一阶近似:0 + 1×0.1 = 0.1。
真实值约 0.0998——只用加法和乘法就得到了高精度近似。
Python 动手实践
实例
import numpy as np
x0 = 0.5
true_val = np.sin(x0)
print(f"sin({x0}) 的泰勒近似 vs 真实值 {true_val:.8f}:")
# 手动计算前几项泰勒展开
import math
approx = 0.0
for n in range(6):
if n % 2 == 1: # 偶数项为0
coef = (-1)**((n-1)//2) / math.factorial(n)
approx += coef * x0**n
err = abs(approx - true_val)
print(f" {n}项: {approx:.8f} 误差: {err:.2e}")
x0 = 0.5
true_val = np.sin(x0)
print(f"sin({x0}) 的泰勒近似 vs 真实值 {true_val:.8f}:")
# 手动计算前几项泰勒展开
import math
approx = 0.0
for n in range(6):
if n % 2 == 1: # 偶数项为0
coef = (-1)**((n-1)//2) / math.factorial(n)
approx += coef * x0**n
err = abs(approx - true_val)
print(f" {n}项: {approx:.8f} 误差: {err:.2e}")
输出:
sin(0.5) 的泰勒近似 vs 真实值 0.47942554: 1项: 0.50000000 误差: 2.06e-02 3项: 0.47916667 误差: 2.59e-04 5项: 0.47942708 误差: 1.54e-06
AI 中的应用场景
梯度下降 = 一阶泰勒近似
梯度下降假设损失函数在局部可以用一阶泰勒展开近似(线性近似)。沿负梯度方向走一步,相当于在一阶近似下做最优更新。这就是为什么梯度下降需要小学习率——学习率太大就超出了线性近似成立的区间。
牛顿法 = 二阶泰勒优化
如果加上二阶项(用到 Hessian 矩阵),可以在局部用二次函数精确近似损失,一步跳到二次近似的最优点。理论上收敛更快,但 Hessian 矩阵是参数量的平方大小——百万参数模型需要万亿级的 Hessian,计算和存储都不现实。
XGBoost 的目标函数
XGBoost 每轮迭代用损失函数的二阶泰勒展开来近似目标,同时用到一阶梯度和二阶 Hessian(在 XGBoost 中叫 hess)。相比只用一阶梯度的 GBDT,收敛更快且更稳定。这是二阶信息在工业级 ML 中最成功的应用。
