Skip to content

知识点卡片:泰勒展开

基本信息

属性内容
知识点泰勒展开 (Taylor Expansion)
掌握程度★★★☆☆
学习优先级P1
预估时间4小时
面试频率★★☆☆☆

核心原理

泰勒展开用多项式近似复杂函数:

一阶展开:f(x) ≈ f(a) + f'(a)(x - a)
二阶展开:f(x) ≈ f(a) + f'(a)(x - a) + ½f''(a)(x - a)²
n阶展开:f(x) ≈ Σ_{k=0}^{n} f^{(k)}(a) / k! · (x - a)^k

在深度学习中的应用

1. 梯度下降的泰勒解释

python
"""
为什么梯度下降沿负梯度方向?

一阶泰勒展开:
f(x - α∇f) ≈ f(x) - α‖∇f‖²

当α充分小时,f(x - α∇f) < f(x)
因此函数值下降,这是负梯度方向使函数下降最快的原因。
"""
import numpy as np

def gradient_descent_taylor(f, grad_f, x0, lr=0.1, n_iters=20):
    """梯度下降(基于一阶泰勒近似)"""
    x = x0
    history = [x]

    for _ in range(n_iters):
        # 一阶泰勒:f(x - lr*grad) ≈ f(x) - lr * ‖grad‖²
        grad = grad_f(x)
        x = x - lr * grad
        history.append(x)

    return x, history

2. Adam优化器与二阶信息

python
# Adam结合了一阶矩(动量)和二阶矩(自适应学习率)
# 二阶矩 v_t ≈ E[g²],近似Hessian对角信息的倒数
# 这类似于用二阶泰勒展开的二阶导数信息

class SimplifiedAdam:
    def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, eps=1e-8):
        self.lr = lr
        self.beta1 = beta1
        self.beta2 = beta2
        self.eps = eps
        self.m = None  # 一阶矩
        self.v = None  # 二阶矩
        self.t = 0

    def update(self, param, grad):
        if self.m is None:
            self.m = np.zeros_like(param)
            self.v = np.zeros_like(param)

        self.t += 1
        self.m = self.beta1 * self.m + (1 - self.beta1) * grad
        self.v = self.beta2 * self.v + (1 - self.beta2) * grad ** 2

        # Bias correction
        m_hat = self.m / (1 - self.beta1 ** self.t)
        v_hat = self.v / (1 - self.beta2 ** self.t)

        # 更新:相当于用二阶信息缩放梯度
        param -= self.lr * m_hat / (np.sqrt(v_hat) + self.eps)
        return param

3. 牛顿法(二阶优化)

python
"""
牛顿法基于二阶泰勒展开:
f(x + Δx) ≈ f(x) + f'(x)Δx + ½f''(x)Δx²

最小化:令导数为0
f'(x) + f''(x)Δx = 0
Δx = -f'(x) / f''(x) = -H^{-1}∇f

在深度学习中不常用,因为:
- Hessian矩阵(H)太大(参数量级n²)
- 需要求逆(O(n³))
- 深度学习的loss landscape非凸
"""

def newton_method(f, f_prime, f_double_prime, x0, n_iters=10):
    """一维牛顿法"""
    x = x0
    for _ in range(n_iters):
        x = x - f_prime(x) / f_double_prime(x)
    return x

# 示例:求 f(x) = x⁴ - 3x³ + 2 的最小值
f_prime = lambda x: 4*x**3 - 9*x**2
f_double_prime = lambda x: 12*x**2 - 18*x
x_min = newton_method(None, f_prime, f_double_prime, x0=5.0)
print(f"最小值点: {x_min}")  # 约 2.25

面试高频问题

Q1: 一阶优化 vs 二阶优化的区别?

方面一阶优化(SGD/Adam)二阶优化(牛顿法)
使用信息梯度(一阶导)Hessian(二阶导)
步长固定学习率自动确定
计算量O(n) per stepO(n³) per step
收敛速度线性二次(更快)
DL实用性广泛使用极少使用

为什么DL不用二阶

  1. Hessian太大(参数量平方级)
  2. DL的loss landscape极非凸
  3. 计算Hessian逆不现实

Q2: 泰勒展开在优化器设计中的作用?

  • 一阶泰勒展开解释了梯度下降的合理性
  • 二阶展开指导了牛顿法和拟牛顿法
  • Adam的二阶矩估计可视为对Hessian对角元素的近似
  • 理解泰勒展开有助于理解为什么需要好的学习率

代码练习

python
import numpy as np
import matplotlib.pyplot as plt

# 验证泰勒展开的近似效果
def f(x):
    return np.sin(x)

def taylor_1st(x, a):
    """一阶泰勒展开"""
    return np.sin(a) + np.cos(a) * (x - a)

def taylor_2nd(x, a):
    """二阶泰勒展开"""
    return np.sin(a) + np.cos(a) * (x - a) - 0.5 * np.sin(a) * (x - a)**2

def taylor_3rd(x, a):
    """三阶泰勒展开"""
    return (np.sin(a) + np.cos(a) * (x - a)
            - 0.5 * np.sin(a) * (x - a)**2
            - 1/6 * np.cos(a) * (x - a)**3)

# 验证在 a=0 处的展开
a = 0
x = np.linspace(-2, 2, 100)
print(f"f(0.5) = {f(0.5):.6f}")
print(f"一阶近似: {taylor_1st(0.5, a):.6f}")
print(f"二阶近似: {taylor_2nd(0.5, a):.6f}")
print(f"三阶近似: {taylor_3rd(0.5, a):.6f}")
# 高阶展开越来越精确

关键公式总结

一维泰勒:
f(x) ≈ f(a) + f'(a)(x-a) + f''(a)(x-a)²/2! + ...

多元泰勒:
f(x) ≈ f(a) + ∇f(a)^T (x-a) + ½(x-a)^T H(a) (x-a)

其中 H(a) 是 Hessian 矩阵:H_{ij} = ∂²f/∂x_i∂x_j

相关知识点