知识点卡片:泰勒展开
基本信息
| 属性 | 内容 |
|---|---|
| 知识点 | 泰勒展开 (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, history2. 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 param3. 牛顿法(二阶优化)
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 step | O(n³) per step |
| 收敛速度 | 线性 | 二次(更快) |
| DL实用性 | 广泛使用 | 极少使用 |
为什么DL不用二阶:
- Hessian太大(参数量平方级)
- DL的loss landscape极非凸
- 计算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