跳转至

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