跳转至

05 - 随机微分方程基础

学习时间: 6小时 重要性: ⭐⭐⭐⭐⭐ 理解连续时间扩散模型的数学基础


🎯 学习目标

完成本章后,你将能够: - 理解布朗运动和维纳过程的数学定义 - 掌握Itô积分和Itô公式的核心思想 - 理解随机微分方程(SDE)的解的存在唯一性 - 掌握Fokker-Planck方程的推导和应用 - 理解逆向SDE和概率流ODE


1. 布朗运动与维纳过程

1.1 直观理解

布朗运动描述的是悬浮在流体中的微粒由于分子碰撞而产生的无规则运动。在数学上,我们用维纳过程(Wiener Process)来建模。

关键特性: - 连续但处处不可微 - 独立增量 - 高斯分布

1.2 数学定义

定义(维纳过程):随机过程 \(\{W_t, t \geq 0\}\) 称为维纳过程,如果满足:

  1. 初始条件\(W_0 = 0\)
  2. 独立增量:对于 \(0 \leq s < t\)\(W_t - W_s\) 独立于 \(\{W_u, 0 \leq u \leq s\}\)
  3. 高斯增量\(W_t - W_s \sim \mathcal{N}(0, t-s)\)
  4. 连续性:样本路径 \(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 代码模拟

Python
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ô积分定义为:

\[\int_0^T f(t, \omega) dW_t = \lim_{n \to \infty} \sum_{i=0}^{n-1} f(t_i, \omega) (W_{t_{i+1}} - W_{t_i})\]

其中极限是均方极限(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 代码实现

Python
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)\),有:

\[df(t, X_t) = \frac{\partial f}{\partial t} dt + \frac{\partial f}{\partial x} dX_t + \frac{1}{2} \frac{\partial^2 f}{\partial x^2} (dX_t)^2\]

其中 \((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ô公式:

\[dY_t = \frac{1}{S_t} dS_t - \frac{1}{2S_t^2} (dS_t)^2 = \left(\mu - \frac{\sigma^2}{2}\right) dt + \sigma dW_t\]

因此: $\(S_t = S_0 \exp\left(\left(\mu - \frac{\sigma^2}{2}\right)t + \sigma W_t\right)\)$

例2:Ornstein-Uhlenbeck过程

\[dX_t = -\theta X_t dt + \sigma dW_t\]

\(Y_t = e^{\theta t} X_t\),应用Itô公式:

\[dY_t = \theta e^{\theta t} X_t dt + e^{\theta t} dX_t = \sigma e^{\theta t} dW_t\]

积分得: $\(X_t = e^{-\theta t} X_0 + \sigma \int_0^t e^{-\theta(t-s)} dW_s\)$

3.5 代码验证

Python
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):随机微分方程的一般形式为:

\[dX_t = b(t, X_t) dt + \sigma(t, X_t) dW_t, \quad X_0 = x_0\]

其中: - \(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条件线性增长条件

  1. Lipschitz条件: $\(|b(t, x) - b(t, y)| + |\sigma(t, x) - \sigma(t, y)| \leq L|x - y|\)$

  2. 线性增长条件: $\(|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

Python
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} = -\frac{\partial}{\partial x}[b(x)p] + \frac{1}{2}\frac{\partial^2}{\partial x^2}[\sigma^2(x)p]\]

多维形式: $\(\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)\),则:

\[-\frac{\partial}{\partial x}[b(x)p_\infty] + \frac{1}{2}\frac{\partial^2}{\partial x^2}[\sigma^2(x)p_\infty] = 0\]

详细平衡条件: $\(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为:

\[dX_t = [b(t, X_t) - \sigma^2(t) \nabla_x \log p_t(x)] dt + \sigma(t) d\bar{W}_t\]

其中: - \(\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相同:

\[\frac{dx}{dt} = b(t, x) - \frac{1}{2}\sigma^2(t) \nabla_x \log p_t(x)\]

意义: - 可以用确定性ODE代替随机SDE - 采样更快(DDIM的基础) - 可以计算精确似然


7. 本章总结

核心概念

  1. 维纳过程
  2. 连续时间随机过程
  3. 独立高斯增量
  4. 二次变差为 \(t\)

  5. Itô积分

  6. 对随机过程的积分
  7. 鞅性质
  8. Itô等距

  9. Itô公式

  10. 随机链式法则
  11. 包含二阶项
  12. 核心工具

  13. SDE

  14. 漂移 + 扩散
  15. 存在唯一性条件
  16. 数值解法

  17. Fokker-Planck方程

  18. 描述概率密度演化
  19. 与SDE等价
  20. 稳态分布

  21. 逆向SDE

  22. 时间反转
  23. 得分函数
  24. 概率流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\)

📝 自测问题

基础问题

  1. 维纳过程
  2. 维纳过程的四个定义条件是什么?
  3. 为什么维纳过程处处不可微?
  4. 二次变差为什么重要?

  5. Itô积分

  6. Itô积分与普通黎曼积分的区别是什么?
  7. Itô等距的意义是什么?
  8. 为什么Itô积分是鞅?

  9. Itô公式

  10. Itô公式与普通链式法则的区别?
  11. 二阶项的物理意义?
  12. 如何应用Itô公式求解SDE?

  13. SDE

  14. 存在唯一性定理的条件?
  15. Euler-Maruyama方法的精度?
  16. 漂移和扩散的物理意义?

  17. Fokker-Planck方程

  18. FP方程与SDE的关系?
  19. 稳态分布的条件?
  20. 详细平衡的意义?

  21. 逆向SDE

  22. 为什么需要得分函数?
  23. 概率流ODE的优势?
  24. 与扩散模型的联系?

编程练习

  1. 实现各种SDE的数值解法
  2. 验证Fokker-Planck方程
  3. 模拟逆向SDE
  4. 比较不同数值方法的精度

思考题

  1. 连续时间扩散模型相比离散时间的优势?
  2. 如何选择SDE的漂移和扩散系数?
  3. 得分函数估计的误差如何影响采样?

🔗 下一步

理解了随机微分方程后,我们将学习连续时间扩散模型,将SDE理论应用于扩散模型。

→ 下一步:07-连续时间扩散模型.md