05 - 随机微分方程基础¶
学习时间: 6小时 重要性: ⭐⭐⭐⭐⭐ 理解连续时间扩散模型的数学基础
🎯 学习目标¶
完成本章后,你将能够: - 理解布朗运动和维纳过程的数学定义 - 掌握Itô积分和Itô公式的核心思想 - 理解随机微分方程(SDE)的解的存在唯一性 - 掌握Fokker-Planck方程的推导和应用 - 理解逆向SDE和概率流ODE
1. 布朗运动与维纳过程¶
1.1 直观理解¶
布朗运动描述的是悬浮在流体中的微粒由于分子碰撞而产生的无规则运动。在数学上,我们用维纳过程(Wiener Process)来建模。
关键特性: - 连续但处处不可微 - 独立增量 - 高斯分布
1.2 数学定义¶
定义(维纳过程):随机过程 \(\{W_t, t \geq 0\}\) 称为维纳过程,如果满足:
- 初始条件:\(W_0 = 0\)
- 独立增量:对于 \(0 \leq s < t\),\(W_t - W_s\) 独立于 \(\{W_u, 0 \leq u \leq s\}\)
- 高斯增量:\(W_t - W_s \sim \mathcal{N}(0, t-s)\)
- 连续性:样本路径 \(t \mapsto W_t\) 几乎 surely 连续
1.3 维纳过程的性质¶
性质1:均值和方差 $\(\mathbb{E}[W_t] = 0, \quad \text{Var}(W_t) = t\)$
性质2:协方差 $\(\text{Cov}(W_s, W_t) = \min(s, t)\)$
性质3:自相似性 对于任意 \(c > 0\),\(\{W_{ct}, t \geq 0\}\) 与 \(\{\sqrt{c}W_t, t \geq 0\}\) 同分布
性质4:二次变差 $\(\langle W \rangle_t = t\)$ 这意味着维纳过程的"速度"是无限的(因为二次变差不为零)。
1.4 代码模拟¶
import numpy as np
import matplotlib.pyplot as plt
def simulate_wiener_process(T=1.0, N=1000, num_paths=5):
"""
模拟维纳过程
参数:
T: 终止时间
N: 时间步数
num_paths: 模拟路径数
返回:
t: 时间点
W: 维纳过程路径
"""
dt = T / N
t = np.linspace(0, T, N+1)
# 生成增量
dW = np.random.normal(0, np.sqrt(dt), (num_paths, N))
# 累积求和
W = np.zeros((num_paths, N+1))
W[:, 1:] = np.cumsum(dW, axis=1)
return t, W
# 模拟
np.random.seed(42)
t, W = simulate_wiener_process(T=1.0, N=1000, num_paths=5)
# 可视化
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
for i in range(5):
plt.plot(t, W[i], alpha=0.7, label=f'Path {i+1}')
plt.xlabel('Time')
plt.ylabel('$W_t$')
plt.title('Wiener Process Sample Paths')
plt.legend()
plt.grid(True, alpha=0.3)
# 验证性质
plt.subplot(1, 2, 2)
# 计算多个路径的统计量
num_samples = 1000
_, W_many = simulate_wiener_process(T=1.0, N=100, num_paths=num_samples)
# 计算均值和方差
mean = np.mean(W_many, axis=0)
variance = np.var(W_many, axis=0)
plt.plot(t[::10], mean[::10], 'b-', label='Empirical Mean', linewidth=2)
plt.plot(t[::10], variance[::10], 'r-', label='Empirical Variance', linewidth=2)
plt.plot(t, np.zeros_like(t), 'b--', label='Theoretical Mean (0)', alpha=0.5)
plt.plot(t, t, 'r--', label='Theoretical Variance (t)', alpha=0.5)
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Statistical Properties')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('wiener_process.png', dpi=150)
plt.show()
print("维纳过程性质验证:")
print(f"终点均值: {np.mean(W[:, -1]):.4f} (理论: 0)")
print(f"终点方差: {np.var(W[:, -1]):.4f} (理论: 1.0)")
2. Itô积分¶
2.1 为什么需要Itô积分¶
普通黎曼积分要求被积函数光滑,但维纳过程处处不可微,因此需要新的积分理论。
Itô积分的核心思想: - 用简单过程的积分逼近 - 在左端点取值(非预期性) - 均方收敛
2.2 Itô积分的定义¶
定义(Itô积分):对于适应过程 \(f(t, \omega)\),Itô积分定义为:
其中极限是均方极限(L²收敛)。
2.3 Itô积分的性质¶
性质1:线性性 $\(\int_0^T (af + bg) dW_t = a\int_0^T f dW_t + b\int_0^T g dW_t\)$
性质2:鞅性质 如果 \(f\) 满足适当条件,则 \(M_t = \int_0^t f(s) dW_s\) 是鞅。
性质3:Itô等距 $\(\mathbb{E}\left[\left(\int_0^T f(t) dW_t\right)^2\right] = \mathbb{E}\left[\int_0^T f(t)^2 dt\right]\)$
性质4:期望为零 $\(\mathbb{E}\left[\int_0^T f(t) dW_t\right] = 0\)$
2.4 代码实现¶
class ItoIntegrator:
"""
Itô积分计算
"""
def __init__(self, seed=None):
if seed is not None:
np.random.seed(seed)
def integrate(self, f, T=1.0, N=10000, num_samples=1000):
"""
计算Itô积分 ∫₀ᵀ f(t) dW_t
参数:
f: 被积函数 f(t)
T: 积分上限
N: 时间步数
num_samples: 蒙特卡洛样本数
返回:
integral: 积分值的蒙特卡洛估计
variance: 估计的方差
"""
dt = T / N
t = np.linspace(0, T, N+1)
integrals = []
for _ in range(num_samples):
# 生成维纳过程
dW = np.random.normal(0, np.sqrt(dt), N)
# 计算Itô积分(左端点法则)
f_values = f(t[:-1]) # 左端点
integral = np.sum(f_values * dW)
integrals.append(integral)
return np.mean(integrals), np.var(integrals)
def verify_ito_isometry(self, f, T=1.0, N=10000, num_samples=5000):
"""
验证Itô等距
"""
dt = T / N
t = np.linspace(0, T, N+1)
# 计算左边: E[(∫fdW)²]
integrals = []
for _ in range(num_samples):
dW = np.random.normal(0, np.sqrt(dt), N)
f_values = f(t[:-1])
integral = np.sum(f_values * dW)
integrals.append(integral**2)
lhs = np.mean(integrals)
# 计算右边: E[∫f²dt]
f_squared = f(t[:-1])**2
rhs = np.sum(f_squared) * dt
return lhs, rhs
# 测试Itô积分
integrator = ItoIntegrator(seed=42)
# 测试函数: f(t) = 1
f1 = lambda t: np.ones_like(t) # lambda匿名函数
mean1, var1 = integrator.integrate(f1, T=1.0, N=1000, num_samples=10000)
print(f"\nItô积分 ∫₀¹ 1 dW_t:")
print(f"均值: {mean1:.4f} (理论: 0)")
print(f"方差: {var1:.4f} (理论: 1.0)")
# 测试函数: f(t) = t
f2 = lambda t: t
mean2, var2 = integrator.integrate(f2, T=1.0, N=1000, num_samples=10000)
print(f"\nItô积分 ∫₀¹ t dW_t:")
print(f"均值: {mean2:.4f} (理论: 0)")
print(f"方差: {var2:.4f} (理论: 1/3 ≈ 0.333)")
# 验证Itô等距
lhs, rhs = integrator.verify_ito_isometry(f2, T=1.0, N=1000, num_samples=5000)
print(f"\nItô等距验证:")
print(f"左边 E[(∫fdW)²]: {lhs:.4f}")
print(f"右边 E[∫f²dt]: {rhs:.4f}")
print(f"相对误差: {abs(lhs - rhs) / rhs * 100:.2f}%")
3. Itô公式¶
3.1 核心思想¶
Itô公式是随机微积分的基本定理,对应于普通微积分中的链式法则。
关键区别:由于维纳过程的二次变差不为零,需要额外考虑二阶项。
3.2 Itô公式(一维)¶
定理(Itô公式):设 \(X_t\) 满足SDE: $\(dX_t = \mu(t, X_t) dt + \sigma(t, X_t) dW_t\)$
对于二次连续可微函数 \(f(t, x)\),有:
其中 \((dX_t)^2 = \sigma^2(t, X_t) dt\)(Itô乘法表)。
展开形式: $\(df = \left(\frac{\partial f}{\partial t} + \mu \frac{\partial f}{\partial x} + \frac{1}{2}\sigma^2 \frac{\partial^2 f}{\partial x^2}\right) dt + \sigma \frac{\partial f}{\partial x} dW_t\)$
3.3 Itô乘法表¶
| \(dt\) | \(dW_t\) | |
|---|---|---|
| \(dt\) | 0 | 0 |
| \(dW_t\) | 0 | \(dt\) |
记忆口诀:\(dW_t \cdot dW_t = dt\),其他交叉项为0。
3.4 应用示例¶
例1:几何布朗运动
设 \(S_t\) 满足: $\(dS_t = \mu S_t dt + \sigma S_t dW_t\)$
令 \(Y_t = \log S_t\),应用Itô公式:
因此: $\(S_t = S_0 \exp\left(\left(\mu - \frac{\sigma^2}{2}\right)t + \sigma W_t\right)\)$
例2:Ornstein-Uhlenbeck过程
令 \(Y_t = e^{\theta t} X_t\),应用Itô公式:
积分得: $\(X_t = e^{-\theta t} X_0 + \sigma \int_0^t e^{-\theta(t-s)} dW_s\)$
3.5 代码验证¶
def verify_ito_formula():
"""
验证Itô公式: 对于f(X_t) = X_t², 其中dX_t = dW_t
Itô公式给出: df = 2X_t dX_t + dt = 2W_t dW_t + dt
因此: W_t² = t + 2∫₀ᵗ W_s dW_s
"""
T = 1.0
N = 10000
dt = T / N
num_samples = 1000
results = []
for _ in range(num_samples):
# 生成维纳过程
dW = np.random.normal(0, np.sqrt(dt), N)
W = np.zeros(N+1)
W[1:] = np.cumsum(dW)
# 计算Itô积分 ∫W_s dW_s
ito_integral = np.sum(W[:-1] * dW)
# 验证: W_t² = t + 2∫W_s dW_s
lhs = W[-1]**2 # [-1]负索引取最后元素
rhs = T + 2 * ito_integral
results.append(abs(lhs - rhs))
mean_error = np.mean(results)
print(f"Itô公式验证 (W_t² = t + 2∫W_s dW_s):")
print(f"平均误差: {mean_error:.6f}")
print(f"验证通过!" if mean_error < 0.1 else "误差较大")
verify_ito_formula()
4. 随机微分方程(SDE)¶
4.1 SDE的一般形式¶
定义(SDE):随机微分方程的一般形式为:
其中: - \(b(t, x)\):漂移系数(drift) - \(\sigma(t, x)\):扩散系数(diffusion) - \(W_t\):维纳过程
积分形式: $\(X_t = X_0 + \int_0^t b(s, X_s) ds + \int_0^t \sigma(s, X_s) dW_s\)$
4.2 解的存在唯一性¶
定理(存在唯一性):如果 \(b\) 和 \(\sigma\) 满足Lipschitz条件和线性增长条件:
-
Lipschitz条件: $\(|b(t, x) - b(t, y)| + |\sigma(t, x) - \sigma(t, y)| \leq L|x - y|\)$
-
线性增长条件: $\(|b(t, x)|^2 + |\sigma(t, x)|^2 \leq K(1 + |x|^2)\)$
则SDE存在唯一强解。
4.3 扩散模型中的SDE¶
VP-SDE(Variance Preserving): $\(dx = -\frac{1}{2}\beta(t) x dt + \sqrt{\beta(t)} dw\)$
VE-SDE(Variance Exploding): $\(dx = \sqrt{\frac{d[\sigma^2(t)]}{dt}} dw\)$
子VP-SDE: $\(dx = -\frac{1}{2}\beta(t) x dt + \sqrt{\beta(t)(1 - e^{-2\int_0^t \beta(s)ds})} dw\)$
4.4 代码模拟SDE¶
class SDESimulator:
"""
SDE模拟器
"""
def __init__(self, seed=None):
if seed is not None:
np.random.seed(seed)
def euler_maruyama(self, b, sigma, x0, T, N, num_paths=1):
"""
Euler-Maruyama方法求解SDE
参数:
b: 漂移函数 b(t, x)
sigma: 扩散函数 sigma(t, x)
x0: 初始条件
T: 终止时间
N: 时间步数
num_paths: 模拟路径数
返回:
t: 时间点
X: 解路径
"""
dt = T / N
t = np.linspace(0, T, N+1)
X = np.zeros((num_paths, N+1))
X[:, 0] = x0
for i in range(N):
dW = np.random.normal(0, np.sqrt(dt), num_paths)
X[:, i+1] = X[:, i] + b(t[i], X[:, i]) * dt + sigma(t[i], X[:, i]) * dW
return t, X
def milstein(self, b, sigma, sigma_derivative, x0, T, N, num_paths=1):
"""
Milstein方法(更高精度)
"""
dt = T / N
t = np.linspace(0, T, N+1)
X = np.zeros((num_paths, N+1))
X[:, 0] = x0
for i in range(N):
dW = np.random.normal(0, np.sqrt(dt), num_paths)
sigma_val = sigma(t[i], X[:, i])
X[:, i+1] = (X[:, i] + b(t[i], X[:, i]) * dt +
sigma_val * dW +
0.5 * sigma_val * sigma_derivative(t[i], X[:, i]) * (dW**2 - dt))
return t, X
# 测试:几何布朗运动
simulator = SDESimulator(seed=42)
# 参数
mu, sigma = 0.1, 0.3
x0, T, N = 1.0, 1.0, 1000
# 漂移和扩散函数
b = lambda t, x: mu * x
sigma_func = lambda t, x: sigma * x
sigma_derivative = lambda t, x: sigma
# Euler-Maruyama
t, X_em = simulator.euler_maruyama(b, sigma_func, x0, T, N, num_paths=100)
# Milstein
t, X_mil = simulator.milstein(b, sigma_func, sigma_derivative, x0, T, N, num_paths=100)
# 解析解
W_T = np.random.normal(0, np.sqrt(T), 100)
X_exact = x0 * np.exp((mu - 0.5 * sigma**2) * T + sigma * W_T)
print(f"\n几何布朗运动模拟:")
print(f"Euler-Maruyama终点均值: {np.mean(X_em[:, -1]):.4f}")
print(f"Milstein终点均值: {np.mean(X_mil[:, -1]):.4f}")
print(f"解析解终点均值: {np.mean(X_exact):.4f}")
print(f"理论值: {x0 * np.exp(mu * T):.4f}")
5. Fokker-Planck方程¶
5.1 直观理解¶
Fokker-Planck方程(也称为Kolmogorov前向方程)描述了SDE解的概率密度函数 \(p(x, t)\) 的演化。
5.2 数学推导¶
对于SDE: $\(dX_t = b(X_t) dt + \sigma(X_t) dW_t\)$
概率密度 \(p(x, t)\) 满足:
多维形式: $\(\frac{\partial p}{\partial t} = -\nabla \cdot (bp) + \frac{1}{2}\nabla^2 : (\sigma\sigma^T p)\)$
5.3 稳态分布¶
当 \(t \to \infty\) 时,如果存在稳态分布 \(p_\infty(x)\),则:
详细平衡条件: $\(b(x)p_\infty(x) = \frac{1}{2}\frac{\partial}{\partial x}[\sigma^2(x)p_\infty(x)]\)$
5.4 与扩散模型的联系¶
前向SDE的Fokker-Planck方程描述了数据分布如何逐渐变成噪声分布。
反向SDE的Fokker-Planck方程描述了如何从噪声分布恢复数据分布。
6. 逆向SDE¶
6.1 时间反转¶
给定前向SDE: $\(dX_t = b(t, X_t) dt + \sigma(t) dW_t\)$
我们希望找到逆向SDE,使得当从 \(t=T\) 反向演化到 \(t=0\) 时,分布从 \(p_T\) 变回 \(p_0\)。
6.2 逆向SDE的推导¶
定理(逆向SDE):逆向SDE为:
其中: - \(\nabla_x \log p_t(x)\) 是得分函数(score function) - \(\bar{W}_t\) 是反向时间的维纳过程 - \(dt\) 现在表示反向时间的增量
6.3 关键洞察¶
得分函数 \(\nabla_x \log p_t(x)\) 告诉我们在每个点 \(x\) 应该向哪个方向移动才能增加概率密度。
在扩散模型中,我们用神经网络 \(s_\theta(x, t)\) 来近似得分函数。
6.4 概率流ODE¶
定理(概率流ODE):存在一个确定性的ODE,其边缘分布与SDE相同:
意义: - 可以用确定性ODE代替随机SDE - 采样更快(DDIM的基础) - 可以计算精确似然
7. 本章总结¶
核心概念¶
- 维纳过程
- 连续时间随机过程
- 独立高斯增量
-
二次变差为 \(t\)
-
Itô积分
- 对随机过程的积分
- 鞅性质
-
Itô等距
-
Itô公式
- 随机链式法则
- 包含二阶项
-
核心工具
-
SDE
- 漂移 + 扩散
- 存在唯一性条件
-
数值解法
-
Fokker-Planck方程
- 描述概率密度演化
- 与SDE等价
-
稳态分布
-
逆向SDE
- 时间反转
- 得分函数
- 概率流ODE
关键公式¶
| 概念 | 公式 |
|---|---|
| Itô公式 | \(df = (\partial_t f + b\partial_x f + \frac{1}{2}\sigma^2 \partial_{xx} f)dt + \sigma \partial_x f dW\) |
| Fokker-Planck | \(\partial_t p = -\nabla \cdot (bp) + \frac{1}{2}\nabla^2 : (\sigma\sigma^T p)\) |
| 逆向SDE | \(dx = (b - \sigma^2 \nabla \log p)dt + \sigma d\bar{W}\) |
| 概率流ODE | \(\frac{dx}{dt} = b - \frac{1}{2}\sigma^2 \nabla \log p\) |
📝 自测问题¶
基础问题¶
- 维纳过程
- 维纳过程的四个定义条件是什么?
- 为什么维纳过程处处不可微?
-
二次变差为什么重要?
-
Itô积分
- Itô积分与普通黎曼积分的区别是什么?
- Itô等距的意义是什么?
-
为什么Itô积分是鞅?
-
Itô公式
- Itô公式与普通链式法则的区别?
- 二阶项的物理意义?
-
如何应用Itô公式求解SDE?
-
SDE
- 存在唯一性定理的条件?
- Euler-Maruyama方法的精度?
-
漂移和扩散的物理意义?
-
Fokker-Planck方程
- FP方程与SDE的关系?
- 稳态分布的条件?
-
详细平衡的意义?
-
逆向SDE
- 为什么需要得分函数?
- 概率流ODE的优势?
- 与扩散模型的联系?
编程练习¶
- 实现各种SDE的数值解法
- 验证Fokker-Planck方程
- 模拟逆向SDE
- 比较不同数值方法的精度
思考题¶
- 连续时间扩散模型相比离散时间的优势?
- 如何选择SDE的漂移和扩散系数?
- 得分函数估计的误差如何影响采样?
🔗 下一步¶
理解了随机微分方程后,我们将学习连续时间扩散模型,将SDE理论应用于扩散模型。
→ 下一步:07-连续时间扩散模型.md