テイラー展開 -- 多項式で任意の関数を近似する
任意の滑らかな関数は、ある一点の近傍で多項式によって近似できる。
一次のテイラー展開は勾配降下法の基礎であり、二次の展開はニュートン法へとつながる。本章は理解できればよく、導出の詳細を深く追究する必要はない。
概念解析
一次テイラー = 線形近似(勾配降下法の基礎)
\[ 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 ハンズオン演習
实例
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 で最も成功した応用である。
其他扩展