跳转至

10_随机微分方程基础

第九批 · 专题 9.1:随机微分方程基础 (Stochastic Calculus Fundamentals)

定位:本章填补路线图中 纯数学基础/100_测度论与Lebesgue积分、纯数学基础/120_常微分方程与 深度学习数学/40_Diffusion_Models数学之间的**关键断层**——随机微积分。深度学习数学/40_Diffusion_Models数学 开篇明确警告"路线图中没有任何专题系统覆盖 Ito 积分、布朗运动、Girsanov 定理",本章正是这一缺口的系统补全。

核心承诺:读完本章,你将能够:(1) 严格定义布朗运动并理解其路径的"野性";(2) 构造 Ito 积分并证明 Ito 等距;(3) 推导并应用 Ito 公式(随机链式法则);(4) 写出和求解 VP-SDE/OU 过程等扩散模型核心方程;(5) 从 Ito 公式推导 Fokker-Planck 方程。

与机器人的关系:◉ 过程噪声建模——EKF/UKF/粒子滤波中的 \(\mathrm{d}X_t = f(X_t)\mathrm{d}t + G\,\mathrm{d}W_t\) 就是 SDE;◉ Diffusion Policy——前向扩散 \(\mathrm{d}X_t = -\frac{1}{2}\beta(t)X_t\,\mathrm{d}t + \sqrt{\beta(t)}\,\mathrm{d}W_t\) 是 VP-SDE;◉ MPPI 控制——采样轨迹就是 SDE 的 Monte Carlo 模拟。


§9.1.0 前置自测检查点

[!NOTE] 在开始之前,请确认你能回答以下问题。 如果某项卡住超过 5 分钟,先回对应章节补课。

# 自测问题 来源 通过标准
1 什么是 \(\sigma\)-代数?概率空间 \((\Omega, \mathcal{F}, \mathbb{P})\) 三个组件各是什么? 纯数学基础/100_测度论与Lebesgue积分 §B2.2 能举出掷骰子的具体例子
2 什么是 Lebesgue 积分?它与 Riemann 积分的本质区别是什么? 纯数学基础/100_测度论与Lebesgue积分 §B2.1 能说出"按值域分层"vs"按定义域切条"
3 什么是 \(L^2\) 空间?它为什么是完备的(Riesz-Fischer)? 纯数学基础/100_测度论与Lebesgue积分 §B2.10 能解释 Cauchy 列在 \(L^2\) 中必收敛
4 Picard-Lindelof 定理说了什么?Lipschitz 条件的几何含义? 纯数学基础/120_常微分方程 §B4.2 能复述证明中压缩映射的关键步骤
5 ODE \(\dot{x} = Ax\) 的解是什么?矩阵指数 \(e^{tA}\) 怎么定义? 纯数学基础/120_常微分方程 §B4.5 能写出 \(x(t) = e^{tA}x_0\)
6 什么是条件期望 \(\mathbb{E}[X \mid \mathcal{G}]\)?它是一个数还是一个随机变量? 纯数学基础/100_测度论与Lebesgue积分 §B2.14 知道它是 \(\mathcal{G}\)-可测的随机变量

最小前置路径:纯数学基础/100_测度论与Lebesgue积分(测度论,特别是 \(L^2\) 完备性)+ 纯数学基础/120_常微分方程(ODE,特别是 Picard-Lindelof 与 Gronwall)。

预计阅读时间

阅读方式 时间 适合谁
精读(含全部推导手算与练习) 18-25 小时 首次系统学习随机微积分、需要自行推导 Ito 公式与 Fokker-Planck 的读者
速读(跳过存在唯一性证明细节,聚焦 Ito 公式应用与 SDE 求解) 8-12 小时 有测度论基础、主要目标是读懂 Diffusion Policy / MPPI 数学的工程师
速查(只看定理框、Ito 乘法表、VP-SDE/OU 求解公式与陷阱表) 40-60 分钟 已学过随机微积分、遇到具体公式推导时回来查阅

§9.1.1 本章目标与知识地图

本章覆盖的核心定理

# 定理/概念 难度 本章角色 下游应用
1 布朗运动的定义与性质 ⭐⭐ 全部 SDE 的驱动噪声 EKF/UKF, MPPI, Diffusion
2 二次变差 \([W]_t = t\) ⭐⭐ Ito 公式的根源 理解 \((\mathrm{d}W)^2 = \mathrm{d}t\)
3 Ito 积分的构造 ⭐⭐ SDE 的严格定义 所有 SDE 理论
4 Ito 等距定理 ⭐⭐ Ito 积分良定性的核心 方差计算
5 Ito 公式(随机链式法则) 本章核心中的核心 推导一切
6 Ito 乘法表 Ito 公式的计算工具 快速推导
7 Ito vs Stratonovich ⭐⭐ 选择积分约定 物理建模
8 SDE 存在唯一性 ⭐⭐⭐ 理论完整性 保证解良定
9 Fokker-Planck 方程 ⭐⭐ 从轨迹到密度 Score SDE, Anderson 反向 SDE

学习路径图

纯数学基础/100_测度论与Lebesgue积分 ──┐
               ├──→ 布朗运动 ──→ Ito 积分 ──→ Ito 公式 ──→ SDE 求解
纯数学基础/120_常微分方程 ─────┘         │                        │           │
                          │                        ▼           ▼
                    二次变差              Fokker-Planck    深度学习数学/40_Diffusion_Models数学 Diffusion
                  (dW)²=dt                                Score SDE

§9.1.2 布朗运动 / Wiener 过程 ⭐⭐

9.1.2.1 动机:机器人动力学中的过程噪声怎么建模?

问题场景:你在做 EKF 滤波,状态方程写作

\[ x_{k+1} = f(x_k, u_k) + w_k, \quad w_k \sim \mathcal{N}(0, Q) \]

这里 \(w_k\) 是离散时间的高斯白噪声。但真实物理系统是连续时间的——传感器噪声、电机扰动、风力干扰都是**连续**的随机过程。问题来了:

连续时间的"白噪声"怎么严格定义?

直觉上,白噪声 \(\xi(t)\) 应该满足 \(\mathbb{E}[\xi(t)] = 0\)\(\mathbb{E}[\xi(t)\xi(s)] = \delta(t-s)\)(Dirac delta)。但这意味着 \(\mathrm{Var}[\xi(t)] = \delta(0) = \infty\)!——白噪声作为普通函数在数学上不存在

解决方案:不直接定义 \(\xi(t)\),而是定义它的**积分** \(W_t = \int_0^t \xi(s)\,\mathrm{d}s\)。这个积分——布朗运动/Wiener 过程——是严格定义的。白噪声可以"非正式地"写成 \(\xi(t) = \frac{\mathrm{d}W_t}{\mathrm{d}t}\),但这个导数在经典意义下不存在(我们马上会看到为什么)。

历史插曲:Robert Brown (1827) 在显微镜下观察花粉粒子的随机运动;Einstein (1905) 给出了物理解释(分子碰撞);Wiener (1923) 给出了严格的数学构造。有趣的是,Bachelier (1900) 在博士论文中比 Einstein 更早将布朗运动用于金融建模——但在数学上不够严格。

9.1.2.2 从离散到连续:随机游走的极限

离散随机游走:在每个时间步 \(\Delta t\),粒子向左或向右跳 \(\Delta x\),各以概率 \(1/2\)

\[ S_n = \sum_{i=1}^n X_i, \quad X_i = \begin{cases} +\Delta x & \text{概率 } 1/2 \\ -\Delta x & \text{概率 } 1/2 \end{cases} \]

关键缩放:取 \(\Delta x = \sqrt{\Delta t}\),令 \(\Delta t \to 0\)。由中心极限定理,

\[ S_{\lfloor t/\Delta t \rfloor} = \sum_{i=1}^{\lfloor t/\Delta t \rfloor} X_i \xrightarrow{d} \mathcal{N}(0, t) \]

这个极限过程就是布朗运动。注意关键的 \(\sqrt{\Delta t}\) 缩放——不是 \(\Delta t\)。这个"根号"会贯穿整个随机微积分,是它与确定性微积分的根本区别。

[!TIP] 类比:如果你熟悉 C++ 中的离散仿真,想象 for (int i=0; i<N; i++) x += sqrt(dt) * randn();。当 N 趋于无穷、dt 趋于零时,轨迹的极限就是布朗运动。

9.1.2.3 严格定义

定义(布朗运动 / Wiener 过程):设 \((\Omega, \mathcal{F}, \mathbb{P})\) 是概率空间。随机过程 \(\{W_t\}_{t \geq 0}\) 称为(标准)布朗运动,如果满足以下四个性质:

# 性质 数学表述 直觉
W1 初始值为零 \(W_0 = 0\) a.s. 从原点出发
W2 独立增量 \(W_t - W_s\)\(\mathcal{F}_s = \sigma(W_r : r \leq s)\) 独立 "未来跳跃不记得过去"
W3 高斯增量 \(W_t - W_s \sim \mathcal{N}(0, t-s)\)\(\forall\, 0 \leq s < t\) 增量方差 = 时间间隔
W4 连续路径 \(t \mapsto W_t(\omega)\) 连续,\(\mathbb{P}\)-a.s. 轨迹不跳跃(但极度扭曲)

存在性:布朗运动的存在性并非显然。Wiener (1923) 的构造使用了 Fourier 级数;现代证明(Kolmogorov 延拓定理 + Kolmogorov 连续性定理)可在 纯数学基础/100_测度论与Lebesgue积分的测度论框架下完成。我们在此接受其存在性作为公理。

从四个性质可以立刻推导的基本结论

  • 期望\(\mathbb{E}[W_t] = 0\)(由 W1 和 W3:\(\mathbb{E}[W_t] = \mathbb{E}[W_t - W_0] = 0\)
  • 方差\(\mathrm{Var}[W_t] = t\)(由 W3)
  • 协方差\(\mathrm{Cov}(W_s, W_t) = \min(s,t)\)

协方差的推导(⭐ 必须掌握):设 \(s \leq t\)

\[ \mathrm{Cov}(W_s, W_t) = \mathbb{E}[W_s W_t] = \mathbb{E}[W_s(W_t - W_s + W_s)] $$ $$ = \mathbb{E}[W_s(W_t - W_s)] + \mathbb{E}[W_s^2] \]

由 W2,\(W_s\)\(\mathcal{F}_s\)-可测的,\((W_t - W_s)\)\(\mathcal{F}_s\) 独立,因此

\[ \mathbb{E}[W_s(W_t - W_s)] = \mathbb{E}[W_s] \cdot \mathbb{E}[W_t - W_s] = 0 \cdot 0 = 0 \]

\(\mathrm{Cov}(W_s, W_t) = \mathbb{E}[W_s^2] = \mathrm{Var}[W_s] = s = \min(s,t)\)\(\square\)

9.1.2.4 二次变差 \([W]_t = t\):随机微积分的根基

这是随机微积分与普通微积分的根本分歧点。在普通微积分中,光滑函数 \(f\) 的二次变差为零——这是 Taylor 展开只需一阶项的原因。布朗运动的二次变差非零,迫使我们保留二阶项,从而产生 Ito 公式中的"额外项"。

定义(二次变差):设 \(\Pi_n = \{0 = t_0^n < t_1^n < \cdots < t_{k_n}^n = t\}\)\([0,t]\) 的一列分割,网格 \(|\Pi_n| = \max_i(t_{i+1}^n - t_i^n) \to 0\)。过程 \(X\) 的二次变差定义为

\[ [X]_t := \lim_{|\Pi_n| \to 0} \sum_{i=0}^{k_n - 1} (X_{t_{i+1}^n} - X_{t_i^n})^2 \]

其中极限在概率或 \(L^2\) 意义下取。

定理(布朗运动的二次变差)\([W]_t = t\)

完整证明(⭐⭐ 必须完全掌握):

取等距分割 \(t_i = it/n\)\(\Delta t_i = t/n\)\(\Delta W_i = W_{t_{i+1}} - W_{t_i}\)

定义 \(Q_n = \sum_{i=0}^{n-1} (\Delta W_i)^2\)。我们要证 \(Q_n \xrightarrow{L^2} t\),即

\[ \mathbb{E}[(Q_n - t)^2] \to 0 \quad \text{as } n \to \infty \]

步骤 1:计算 \(\mathbb{E}[Q_n]\)

\[ \mathbb{E}[Q_n] = \sum_{i=0}^{n-1} \mathbb{E}[(\Delta W_i)^2] = \sum_{i=0}^{n-1} \frac{t}{n} = t \]

因为 \(\Delta W_i \sim \mathcal{N}(0, t/n)\),所以 \(\mathbb{E}[(\Delta W_i)^2] = \mathrm{Var}[\Delta W_i] = t/n\)

步骤 2:计算 \(\mathrm{Var}[Q_n]\)

由于各 \(\Delta W_i\) 独立(W2),

\[ \mathrm{Var}[Q_n] = \sum_{i=0}^{n-1} \mathrm{Var}[(\Delta W_i)^2] \]

对于 \(Z \sim \mathcal{N}(0, \sigma^2)\)\(\mathbb{E}[Z^4] = 3\sigma^4\)(高斯四阶矩),因此

\[ \mathrm{Var}[(\Delta W_i)^2] = \mathbb{E}[(\Delta W_i)^4] - (\mathbb{E}[(\Delta W_i)^2])^2 = 3\left(\frac{t}{n}\right)^2 - \left(\frac{t}{n}\right)^2 = 2\left(\frac{t}{n}\right)^2 \]

\[ \mathrm{Var}[Q_n] = \sum_{i=0}^{n-1} 2\left(\frac{t}{n}\right)^2 = \frac{2t^2}{n} \to 0 \quad \text{as } n \to \infty \]

步骤 3:结论

\[ \mathbb{E}[(Q_n - t)^2] = \mathrm{Var}[Q_n] + (\mathbb{E}[Q_n] - t)^2 = \frac{2t^2}{n} + 0 \to 0 \]

因此 \(Q_n \xrightarrow{L^2} t\),即 \([W]_t = t\)\(\square\)

这个结果的深刻含义

普通微积分 随机微积分
光滑函数 \(f\) 的二次变差 \(= 0\) 布朗运动 \(W\) 的二次变差 \(= t\)
Taylor 展开:\(\mathrm{d}f = f'\mathrm{d}t\),高阶项可忽略 Taylor 展开:\((\mathrm{d}W)^2 = \mathrm{d}t\) 不可忽略
链式法则:\(\frac{d}{dt}g(f(t)) = g'(f(t))f'(t)\) Ito 公式:多一个 \(\frac{1}{2}g''\)
\((\mathrm{d}t)^2 = 0\) \((\mathrm{d}W)^2 = \mathrm{d}t\)非零!

9.1.2.5 样本路径处处不可微

定理:布朗运动的样本路径 \(t \mapsto W_t(\omega)\) 几乎处处**处处不可微**。

直觉解释(不做完整证明,但给出核心论据):

如果 \(W_t\) 在某点 \(t_0\) 可微,那么局部上 \(W_{t_0 + h} - W_{t_0} \approx ch\),因此

\[ (W_{t_0+h} - W_{t_0})^2 \approx c^2 h^2 \]

在长度为 \(\Delta t\) 的区间上对二次变差的贡献为 \(O((\Delta t)^2)\)。将 \([0,t]\) 分成 \(n\) 段,总贡献为 \(n \cdot O((t/n)^2) = O(t^2/n) \to 0\)

但我们刚刚证明了 \([W]_t = t \neq 0\)!这意味着**路径不可能在任何点可微**——更准确地说,可微点的集合是零测集。

另一个直觉角度(与 ODE 的对比):在 ODE \(\dot{x} = f(x)\) 中,轨迹 \(x(t)\) 至少是 \(C^1\) 的(Picard-Lindelof 保证)。你可以画出速度 \(\dot{x}(t)\) 的图像。但布朗运动没有"速度"这个概念——它在每个瞬间都在以无穷大的"速度"抖动。这就是为什么我们不能把 SDE 简单当作"带噪 ODE"——噪声的性质从根本上改变了数学结构。

自相似性:布朗运动具有标度不变性——\(\{c^{-1/2}W_{ct}\}_{t \geq 0}\) 也是标准布朗运动(验证四个性质即可)。这意味着放大任何一段路径,统计性质和原来一样。Hausdorff 维数为 \(3/2\)(介于曲线的 1 和平面的 2 之间)。

[!WARNING] 陷阱 1:把 \(\mathrm{d}W\) 当作 \(\mathrm{d}t\) 一样处理

初学者常犯的错误:看到 SDE \(\mathrm{d}X = \mu\,\mathrm{d}t + \sigma\,\mathrm{d}W\) 就把它当作 ODE 的"带噪声版本",用普通微积分法则处理。这是错误的!

  • \((\mathrm{d}t)^2 = 0\),但 \((\mathrm{d}W)^2 = \mathrm{d}t\)
  • 普通链式法则失效:\(\mathrm{d}(W_t^2) \neq 2W_t\,\mathrm{d}W_t\)(还差一个 \(\mathrm{d}t\)
  • 正确结果:\(\mathrm{d}(W_t^2) = 2W_t\,\mathrm{d}W_t + \mathrm{d}t\)(Ito 公式)

记住:每次对含 \(W_t\) 的函数求微分,都要用 Ito 公式,不能用普通链式法则。

9.1.2.6 练习

练习 9.1.1(⭐):证明 \(\mathbb{E}[W_t^3] = 0\)\(\mathbb{E}[W_t^4] = 3t^2\)。(提示:\(W_t \sim \mathcal{N}(0,t)\),利用高斯矩。)

练习 9.1.2(⭐⭐):设 \(W_t^{(1)}, W_t^{(2)}\) 是两个独立布朗运动。定义 \(X_t = W_t^{(1)} + W_t^{(2)}\)。求 \(X_t\) 的分布,并说明 \(X_t / \sqrt{2}\) 是否是布朗运动(验证四个性质)。

练习 9.1.3(⭐⭐):证明 \([W]_t = t\) 的证明中,将等距分割替换为任意分割 \(\Pi_n\)\(|\Pi_n| \to 0\)),结论仍成立。(提示:\(\mathrm{Var}[Q_n] \leq 2|\Pi_n| \cdot t\)。)


§9.1.3 Ito 积分 ⭐⭐

9.1.3.1 动机:为什么不能用 Riemann-Stieltjes 积分?

回忆 Riemann-Stieltjes 积分 \(\int_0^t f(s)\,\mathrm{d}g(s)\) 要求积分器 \(g\) 是**有界变差**的(bounded variation, BV)。有界变差的意思是

\[ \mathrm{TV}(g; [0,t]) := \sup_{\Pi} \sum_i |g(t_{i+1}) - g(t_i)| < \infty \]

布朗运动不是有界变差的。直觉上,\(\sum |W_{t_{i+1}} - W_{t_i}|\) 远大于 \(\sum (W_{t_{i+1}} - W_{t_i})^2 = [W]_t = t\)(因为 Jensen 不等式:\(|a| \geq a^2\)\(|a| \leq 1\),而细分后增量确实很小,但它们的个数太多以至于绝对值之和趋于无穷)。可以证明

\[ \mathrm{TV}(W; [0,t]) = +\infty \quad \text{a.s.} \]

因此,\(\int_0^t f(s)\,\mathrm{d}W_s\) 不能用 Riemann-Stieltjes 积分定义。我们需要一种全新的积分理论。

还有一个更深的问题:即使我们强行用 Riemann 和来定义 \(\int f\,\mathrm{d}W\),结果会**依赖于取样点的选择**(左端点、右端点还是中点给出不同答案)。在普通 Riemann 积分中,取样点不影响极限——但对布朗运动,由于二次变差非零,不同取样点差了一个 \(O(\mathrm{d}t)\) 的项。这就是 Ito vs Stratonovich 分歧的根源。

与 ODE 的对比

ODE \(\dot{x} = f(x)\) SDE \(\mathrm{d}X = f(X)\mathrm{d}t + g(X)\mathrm{d}W\)
积分形式 \(x(t) = x_0 + \int_0^t f(x(s))\,\mathrm{d}s\) \(X_t = X_0 + \int_0^t f(X_s)\,\mathrm{d}s + \int_0^t g(X_s)\,\mathrm{d}W_s\)
第一个积分 普通 Lebesgue 积分 普通 Lebesgue 积分(没问题)
第二个积分 不存在 Ito 积分(需要新定义!)

9.1.3.2 Ito 积分的四阶段构造

Ito 的天才在于:用 \(L^2\) 空间的完备性(纯数学基础/100_测度论与Lebesgue积分的 Riesz-Fischer 定理!)来定义积分。构造分四个阶段,从简单到一般:

阶段 1:简单过程上的定义

定义:称 \(H_t\) 为**简单过程**(simple / elementary process),如果存在分割 \(0 = t_0 < t_1 < \cdots < t_n = T\) 和有界 \(\mathcal{F}_{t_i}\)-可测随机变量 \(\eta_i\),使得

\[ H_t = \sum_{i=0}^{n-1} \eta_i \cdot \mathbf{1}_{(t_i, t_{i+1}]}(t) \]

对简单过程,Ito 积分自然定义为

\[ I(H) := \int_0^T H_t\,\mathrm{d}W_t := \sum_{i=0}^{n-1} \eta_i (W_{t_{i+1}} - W_{t_i}) \]

[!WARNING] 陷阱 2:忘记适应性要求(左端点取值)

注意 \(\eta_i\)\(\mathcal{F}_{t_i}\)-可测的,即**被积函数在每个区间上取的是左端点的值**。这不是任意选择——它保证了 Ito 积分是**鞅**(martingale),即"公平赌博"。

如果取右端点或中点,得到的是不同的积分(Stratonovich 积分取中点,见 §9.1.5)。两者给出不同的结果!

物理类比:你根据**已知信息**(\(\mathcal{F}_{t_i}\) = 到时刻 \(t_i\) 的全部历史)决定在 \((t_i, t_{i+1}]\) 上的"赌注" \(\eta_i\)。你不能偷看未来。这正是金融中"无套利"原则的数学化身。

阶段 2:Ito 等距定理(核心!)

定理(Ito 等距):对简单过程 \(H\)

\[ \mathbb{E}\left[\left(\int_0^T H_t\,\mathrm{d}W_t\right)^2\right] = \mathbb{E}\left[\int_0^T H_t^2\,\mathrm{d}t\right] \]

Ito 积分的 \(L^2\) 范数等于被积函数的 \(L^2\) 范数

完整证明

\[ \mathbb{E}[I(H)^2] = \mathbb{E}\left[\left(\sum_{i=0}^{n-1} \eta_i \Delta W_i\right)^2\right] \]

展开平方:

\[ = \sum_{i=0}^{n-1} \sum_{j=0}^{n-1} \mathbb{E}[\eta_i \eta_j \Delta W_i \Delta W_j] \]

\(i \neq j\) 时交叉项为零。不失一般性设 \(i < j\),则 \(\eta_i \eta_j \Delta W_i\)\(\mathcal{F}_{t_j}\)-可测的(因为 \(\eta_i, \eta_j\) 分别是 \(\mathcal{F}_{t_i}, \mathcal{F}_{t_j}\)-可测,\(\Delta W_i = W_{t_{i+1}} - W_{t_i}\) 也是 \(\mathcal{F}_{t_{i+1}} \subset \mathcal{F}_{t_j}\)-可测的),而 \(\Delta W_j = W_{t_{j+1}} - W_{t_j}\) 独立于 \(\mathcal{F}_{t_j}\)(W2)。因此

\[ \mathbb{E}[\eta_i \eta_j \Delta W_i \Delta W_j] = \mathbb{E}[\eta_i \eta_j \Delta W_i] \cdot \mathbb{E}[\Delta W_j] = \mathbb{E}[\eta_i \eta_j \Delta W_i] \cdot 0 = 0 \]

\(i = j\)\(\eta_i\)\(\mathcal{F}_{t_i}\)-可测的,\(\Delta W_i\) 独立于 \(\mathcal{F}_{t_i}\),因此

\[ \mathbb{E}[\eta_i^2 (\Delta W_i)^2] = \mathbb{E}[\eta_i^2] \cdot \mathbb{E}[(\Delta W_i)^2] = \mathbb{E}[\eta_i^2] \cdot (t_{i+1} - t_i) \]

综合得

\[ \mathbb{E}[I(H)^2] = \sum_{i=0}^{n-1} \mathbb{E}[\eta_i^2] \cdot (t_{i+1} - t_i) = \mathbb{E}\left[\int_0^T H_t^2\,\mathrm{d}t\right] \quad \square \]

Ito 等距的意义:它说明 \(H \mapsto I(H)\)\(L^2(\Omega \times [0,T])\)\(L^2(\Omega)\) 的**等距嵌入**(isometry)。等距映射保持距离,因此也保持 Cauchy 列——这是下一步扩张的关键。

[!TIP] 给 C++ 工程师的类比:等距嵌入就像一个保持"距离"(范数)不变的映射。想象你有一个函数 transform(H) -> I,它满足 norm(transform(H)) == norm(H)。那么如果输入序列 \(H_n\) 收敛,输出序列 \(I(H_n)\) 也自动收敛,而且收敛到的就是 transform(极限) 的自然定义。

阶段 3:\(L^2\) 扩张

\(H \in L^2(\Omega \times [0,T])\) 是一般的**适应过程**(即 \(H_t\)\(\mathcal{F}_t\)-可测的,\(\mathbb{E}[\int_0^T H_t^2\,\mathrm{d}t] < \infty\))。可以证明存在简单过程的序列 \(H^{(n)}\) 使得

\[ \mathbb{E}\left[\int_0^T |H_t^{(n)} - H_t|^2\,\mathrm{d}t\right] \to 0 \]

由 Ito 等距,\(\{I(H^{(n)})\}\)\(L^2(\Omega)\) 中是 Cauchy 列:

\[ \mathbb{E}[|I(H^{(n)}) - I(H^{(m)})|^2] = \mathbb{E}\left[\int_0^T |H_t^{(n)} - H_t^{(m)}|^2\,\mathrm{d}t\right] \to 0 \]

\(L^2(\Omega)\) 的**完备性**(Riesz-Fischer 定理,来自纯数学基础/100_测度论与Lebesgue积分!),极限存在:

\[ \int_0^T H_t\,\mathrm{d}W_t := \lim_{n \to \infty} I(H^{(n)}) \quad \text{($L^2$ 极限)} \]

而且 Ito 等距对极限仍成立(等距映射的唯一连续延拓)。

[!IMPORTANT] 回看 纯数学基础/100_测度论与Lebesgue积分的回报:测度论中 \(L^2\) 的完备性在这里发挥了关键作用。如果我们停留在 Riemann 积分的框架中,\(L^2\) 不完备,Ito 积分的构造就无法完成。这就是为什么纯数学基础/100_测度论与Lebesgue积分是本章的硬依赖。

阶段 4:局部化(localization)

对于不满足 \(\mathbb{E}[\int_0^T H_t^2\,\mathrm{d}t] < \infty\) 但满足 \(\int_0^T H_t^2\,\mathrm{d}t < \infty\) a.s. 的过程,用**停时**(stopping time)截断:

\[ \tau_n = \inf\left\{t \geq 0 : \int_0^t H_s^2\,\mathrm{d}s \geq n\right\} \]

\(H^{(n)}_t = H_t \cdot \mathbf{1}_{t \leq \tau_n}\) 满足 \(L^2\) 条件,且 \(\tau_n \uparrow \infty\) a.s.。最终

\[ \int_0^t H_s\,\mathrm{d}W_s = \lim_{n \to \infty} \int_0^t H_s^{(n)}\,\mathrm{d}W_s \]

这完成了 Ito 积分在最大自然类上的定义。

9.1.3.3 Ito 积分的关键性质

性质 数学表述 意义
线性 \(I(\alpha H + \beta K) = \alpha I(H) + \beta I(K)\) 积分是线性算子
零均值 \(\mathbb{E}[\int_0^T H_t\,\mathrm{d}W_t] = 0\) Ito 积分是鞅
Ito 等距 \(\mathbb{E}[I(H)^2] = \mathbb{E}[\int_0^T H_t^2\,\mathrm{d}t]\) \(L^2\) 范数守恒
鞅性 \(M_t = \int_0^t H_s\,\mathrm{d}W_s\) 是鞅 "公平赌博"
连续路径 \(t \mapsto \int_0^t H_s\,\mathrm{d}W_s\) 连续 a.s. 积分路径不跳

零均值性质的直觉:Ito 积分 \(\int_0^t H_s\,\mathrm{d}W_s\) 的期望为零,因为布朗运动的增量 \(\mathrm{d}W_s\) 有零均值,而被积函数 \(H_s\) 在每个瞬间是"已知的"(适应性),不能"预见"未来的 \(\mathrm{d}W_s\)。这使得 Ito 积分成为鞅——在概率论中,鞅是"公平赌博"的数学模型。你根据当前信息下注,赌局的期望收益为零。

9.1.3.4 练习

练习 9.1.4(⭐):直接用 Riemann 和计算 \(\int_0^t W_s\,\mathrm{d}W_s\)

提示:\(\sum_{i} W_{t_i}(W_{t_{i+1}} - W_{t_i}) = \frac{1}{2}\sum_i [(W_{t_{i+1}})^2 - (W_{t_i})^2] - \frac{1}{2}\sum_i (W_{t_{i+1}} - W_{t_i})^2\)

第一个和是伸缩和 \(= \frac{1}{2}(W_t^2 - W_0^2)\)。第二个和趋于 \([W]_t = t\)

答案:\(\int_0^t W_s\,\mathrm{d}W_s = \frac{1}{2}W_t^2 - \frac{1}{2}t\)。注意与普通积分 \(\int x\,\mathrm{d}x = \frac{1}{2}x^2\) 的区别——多了 \(-\frac{1}{2}t\)

练习 9.1.5(⭐⭐):用 Ito 等距计算 \(\mathrm{Var}[\int_0^t s\,\mathrm{d}W_s]\)

解:\(H_s = s\) 是确定性函数,所以 \(\mathbb{E}[\int_0^t H_s^2\,\mathrm{d}s] = \int_0^t s^2\,\mathrm{d}s = t^3/3\)

练习 9.1.6(⭐⭐⭐):证明 \(M_t = W_t^2 - t\) 是鞅。(提示:用 Ito 公式得到 \(M_t = 2\int_0^t W_s\,\mathrm{d}W_s\),这是 Ito 积分,因此是鞅。)


§9.1.4 Ito 公式(随机链式法则)⭐

9.1.4.1 动机:\(f(W_t)\) 的微分怎么算?

问题:给定 \(f \in C^2(\mathbb{R})\) 和布朗运动 \(W_t\)\(f(W_t)\) 的微分是什么?

如果直接用普通链式法则\(\mathrm{d}f(W_t) = f'(W_t)\,\mathrm{d}W_t\)

但这是错的! 验证:取 \(f(x) = x^2\),普通链式法则给 \(\mathrm{d}(W_t^2) = 2W_t\,\mathrm{d}W_t\),即

\[ W_t^2 = 2\int_0^t W_s\,\mathrm{d}W_s \]

取期望:\(\mathbb{E}[W_t^2] = 2\mathbb{E}[\int_0^t W_s\,\mathrm{d}W_s] = 2 \cdot 0 = 0\)

\(\mathbb{E}[W_t^2] = t \neq 0\)矛盾——普通链式法则在这里给出了错误答案。

根源\((\mathrm{d}W)^2 = \mathrm{d}t \neq 0\),Taylor 展开中的二阶项不能忽略。

9.1.4.2 一维 Ito 公式的推导

Ito 乘法表:在进行形式计算时,使用以下规则:

\(\times\) \(\mathrm{d}t\) \(\mathrm{d}W\)
\(\mathrm{d}t\) \(0\) \(0\)
\(\mathrm{d}W\) \(0\) \(\mathrm{d}t\)

规则来源: - \((\mathrm{d}t)^2 = 0\):确定性量的平方是高阶无穷小 - \(\mathrm{d}t \cdot \mathrm{d}W = 0\):可以证明 \(\sum \Delta t_i \cdot \Delta W_i \to 0\)(因为 \(\mathbb{E}[\cdot] = 0\) 且方差趋于零) - \((\mathrm{d}W)^2 = \mathrm{d}t\):这就是二次变差 \([W]_t = t\)

定理(一维 Ito 公式):设 \(f \in C^2(\mathbb{R})\),则

\[ \boxed{\mathrm{d}f(W_t) = f'(W_t)\,\mathrm{d}W_t + \frac{1}{2}f''(W_t)\,\mathrm{d}t} \]

或积分形式:

\[ f(W_t) = f(W_0) + \int_0^t f'(W_s)\,\mathrm{d}W_s + \frac{1}{2}\int_0^t f''(W_s)\,\mathrm{d}s \]

推导(通过 Taylor 展开 + Ito 乘法表):

\(f(W_t)\)\([0,t]\) 上做分割 \(0 = t_0 < t_1 < \cdots < t_n = t\)

\[ f(W_t) - f(W_0) = \sum_{i=0}^{n-1} [f(W_{t_{i+1}}) - f(W_{t_i})] \]

对每一项做 Taylor 展开到二阶:

\[ f(W_{t_{i+1}}) - f(W_{t_i}) = f'(W_{t_i})\underbrace{(W_{t_{i+1}} - W_{t_i})}_{\Delta W_i} + \frac{1}{2}f''(W_{t_i})\underbrace{(W_{t_{i+1}} - W_{t_i})^2}_{(\Delta W_i)^2} + R_i \]

其中 \(R_i\) 是高阶余项(含 \((\Delta W_i)^3\) 及以上)。

\[ f(W_t) - f(W_0) = \underbrace{\sum_i f'(W_{t_i})\Delta W_i}_{\text{(A)}} + \frac{1}{2}\underbrace{\sum_i f''(W_{t_i})(\Delta W_i)^2}_{\text{(B)}} + \underbrace{\sum_i R_i}_{\text{(C)}} \]

\(|\Pi| \to 0\)

  • (A) \(\to \int_0^t f'(W_s)\,\mathrm{d}W_s\)(这是 Ito 积分的定义——注意取**左端点**!)
  • (B):将 \((\Delta W_i)^2\) 分解为 \([(\Delta W_i)^2 - \Delta t_i] + \Delta t_i\)。第一部分的和趋于零(因为 \((\Delta W_i)^2 - \Delta t_i\) 是零均值的,它们的和的方差趋于零——本质上是二次变差证明的推广)。第二部分 \(\sum_i f''(W_{t_i})\Delta t_i \to \int_0^t f''(W_s)\,\mathrm{d}s\)(普通 Riemann 积分)。合起来 \(\text{(B)} \to \int_0^t f''(W_s)\,\mathrm{d}s\)
  • (C)\(\sum_i R_i \to 0\)(利用 \(f \in C^2\),余项涉及 \((\Delta W_i)^3\) 等,其量级为 \(o(\Delta t_i)\),加起来趋于零)。

合并得 Ito 公式。 \(\square\)

更一般的形式:设 \(X_t\) 是 Ito 过程:

\[ \mathrm{d}X_t = \mu_t\,\mathrm{d}t + \sigma_t\,\mathrm{d}W_t \]

则对 \(f \in C^2(\mathbb{R})\)

\[ \boxed{\mathrm{d}f(X_t) = f'(X_t)\,\mathrm{d}X_t + \frac{1}{2}f''(X_t)\,(\mathrm{d}X_t)^2} \]

其中 \((\mathrm{d}X_t)^2\) 用 Ito 乘法表展开:

\[ (\mathrm{d}X_t)^2 = (\mu_t\,\mathrm{d}t + \sigma_t\,\mathrm{d}W_t)^2 = \mu_t^2(\mathrm{d}t)^2 + 2\mu_t\sigma_t\,\mathrm{d}t\,\mathrm{d}W + \sigma_t^2(\mathrm{d}W_t)^2 = \sigma_t^2\,\mathrm{d}t \]

因此

\[ \boxed{\mathrm{d}f(X_t) = \left[\mu_t f'(X_t) + \frac{1}{2}\sigma_t^2 f''(X_t)\right]\mathrm{d}t + \sigma_t f'(X_t)\,\mathrm{d}W_t} \]

对比普通链式法则

普通微积分 Ito 微积分
\(\mathrm{d}f(x(t)) = f'(x)\dot{x}\,\mathrm{d}t\) \(\mathrm{d}f(X_t) = f'(X_t)\,\mathrm{d}X_t + \frac{1}{2}f''(X_t)\sigma_t^2\,\mathrm{d}t\)
只有一阶项 多出 \(\frac{1}{2}f''\sigma^2\,\mathrm{d}t\)
\((\mathrm{d}x)^2 = 0\) 可忽略 \((\mathrm{d}X)^2 = \sigma^2\,\mathrm{d}t\) 不可忽略

含时间的 Ito 公式:若 \(f = f(t, x) \in C^{1,2}\)(对 \(t\) 一阶、对 \(x\) 二阶连续可微),则

\[ \mathrm{d}f(t, X_t) = \left[\frac{\partial f}{\partial t} + \mu_t\frac{\partial f}{\partial x} + \frac{1}{2}\sigma_t^2\frac{\partial^2 f}{\partial x^2}\right]\mathrm{d}t + \sigma_t\frac{\partial f}{\partial x}\,\mathrm{d}W_t \]

这是解 SDE 的主力工具——通过选择合适的 \(f(t,x)\),把复杂 SDE 变换成简单的形式。

9.1.4.3 多维 Ito 公式

\(X_t \in \mathbb{R}^n\) 是多维 Ito 过程:

\[ \mathrm{d}X_t^i = \mu_t^i\,\mathrm{d}t + \sum_{j=1}^m \sigma_t^{ij}\,\mathrm{d}W_t^j, \quad i = 1, \ldots, n \]

其中 \(W_t = (W_t^1, \ldots, W_t^m)\)\(m\) 维布朗运动(各分量独立)。

\(f \in C^2(\mathbb{R}^n)\)

\[ \boxed{\mathrm{d}f(X_t) = \sum_i \frac{\partial f}{\partial x_i}\mathrm{d}X_t^i + \frac{1}{2}\sum_{i,k} \frac{\partial^2 f}{\partial x_i \partial x_k}\mathrm{d}[X^i, X^k]_t} \]

其中**互变差**(cross variation)由多维 Ito 乘法表决定:

\(\times\) \(\mathrm{d}W^j\) \(\mathrm{d}W^l\)
\(\mathrm{d}W^j\) \(\delta_{jl}\,\mathrm{d}t\) --

因此

\[ \mathrm{d}[X^i, X^k]_t = \sum_{j=1}^m \sigma_t^{ij}\sigma_t^{kj}\,\mathrm{d}t = (\sigma\sigma^\top)_{ik}\,\mathrm{d}t \]

写成紧凑形式:

\[ \mathrm{d}f = (\nabla f)^\top \mathrm{d}X + \frac{1}{2}\mathrm{tr}\!\left(\sigma\sigma^\top \cdot \nabla^2 f\right)\mathrm{d}t \]

其中 \(\nabla^2 f\) 是 Hessian 矩阵。这个形式在推导 Fokker-Planck 方程(§9.1.7)时直接用到。

9.1.4.4 应用实例

应用 1:几何布朗运动 (GBM)

SDE:\(\mathrm{d}S_t = \mu S_t\,\mathrm{d}t + \sigma S_t\,\mathrm{d}W_t\)(股票价格模型 / Black-Scholes)

求解:令 \(f(x) = \ln x\)\(f'(x) = 1/x\)\(f''(x) = -1/x^2\)。由 Ito 公式

\[ \mathrm{d}\ln S_t = \frac{1}{S_t}\mathrm{d}S_t + \frac{1}{2}\left(-\frac{1}{S_t^2}\right)(\sigma S_t)^2\,\mathrm{d}t \]

代入 \(\mathrm{d}S_t = \mu S_t\,\mathrm{d}t + \sigma S_t\,\mathrm{d}W_t\)

\[ \mathrm{d}\ln S_t = \frac{\mu S_t\,\mathrm{d}t + \sigma S_t\,\mathrm{d}W_t}{S_t} - \frac{\sigma^2 S_t^2}{2S_t^2}\,\mathrm{d}t = \left(\mu - \frac{\sigma^2}{2}\right)\mathrm{d}t + \sigma\,\mathrm{d}W_t \]

这是一个具有常系数的 SDE,直接积分:

\[ \ln S_t - \ln S_0 = \left(\mu - \frac{\sigma^2}{2}\right)t + \sigma W_t \]
\[ \boxed{S_t = S_0 \exp\!\left[\left(\mu - \frac{\sigma^2}{2}\right)t + \sigma W_t\right]} \]

[!WARNING] 陷阱 3:漏掉 Ito 修正项

初学者常以为 \(\mathrm{d}S/S = \mu\,\mathrm{d}t + \sigma\,\mathrm{d}W\) 意味着 \(S_t = S_0 e^{\mu t + \sigma W_t}\)错误!正确答案中指数里是 \((\mu - \sigma^2/2)t\),多了一个 \(-\sigma^2/2\) 的**Ito 修正**。

如果 \(\sigma = 0\)(无噪声),恢复普通指数增长 \(S_t = S_0 e^{\mu t}\),修正项消失。修正项完全是噪声导致的后果——直觉上,随机波动会"消耗"一部分增长率。

验证\(\mathbb{E}[S_t] = S_0 e^{(\mu - \sigma^2/2)t} \cdot \mathbb{E}[e^{\sigma W_t}] = S_0 e^{(\mu - \sigma^2/2)t} \cdot e^{\sigma^2 t/2} = S_0 e^{\mu t}\)。期望增长率确实是 \(\mu\),但每条**单独路径**的增长率是 \(\mu - \sigma^2/2 < \mu\)

应用 2:Ornstein-Uhlenbeck (OU) 过程

SDE:\(\mathrm{d}X_t = -\theta X_t\,\mathrm{d}t + \sigma\,\mathrm{d}W_t\)\(\theta > 0\)

这是机器人学中**极其重要**的过程——它是**均值回复**(mean-reverting)的:当 \(X_t\) 偏离零时,漂移项 \(-\theta X_t\) 把它拉回来。物理上,它模拟了一个受弹簧力和随机扰动的粒子(Langevin 方程)。

求解(积分因子法——完全类比 ODE!):

回忆一阶线性 ODE \(\dot{x} = -\theta x + g(t)\) 的解法:乘以积分因子 \(e^{\theta t}\),得 \(\frac{d}{dt}(e^{\theta t}x) = e^{\theta t}g(t)\)

对 SDE 做类似的事。令 \(Y_t = e^{\theta t} X_t\),对 \(f(t,x) = e^{\theta t}x\) 用含时间的 Ito 公式:

\[ \mathrm{d}Y_t = \frac{\partial f}{\partial t}\mathrm{d}t + \frac{\partial f}{\partial x}\mathrm{d}X_t + \frac{1}{2}\frac{\partial^2 f}{\partial x^2}\underbrace{(\sigma)^2\mathrm{d}t}_{(\mathrm{d}X)^2} \]

其中 \(\frac{\partial f}{\partial t} = \theta e^{\theta t}x\)\(\frac{\partial f}{\partial x} = e^{\theta t}\)\(\frac{\partial^2 f}{\partial x^2} = 0\)

\[ \mathrm{d}Y_t = \theta e^{\theta t} X_t\,\mathrm{d}t + e^{\theta t}\,\mathrm{d}X_t + 0 $$ $$ = \theta e^{\theta t} X_t\,\mathrm{d}t + e^{\theta t}(-\theta X_t\,\mathrm{d}t + \sigma\,\mathrm{d}W_t) $$ $$ = \theta e^{\theta t} X_t\,\mathrm{d}t - \theta e^{\theta t} X_t\,\mathrm{d}t + \sigma e^{\theta t}\,\mathrm{d}W_t = \sigma e^{\theta t}\,\mathrm{d}W_t \]

漂移项完美对消!积分:

\[ Y_t - Y_0 = \sigma \int_0^t e^{\theta s}\,\mathrm{d}W_s \]
\[ e^{\theta t}X_t - X_0 = \sigma \int_0^t e^{\theta s}\,\mathrm{d}W_s \]
\[ \boxed{X_t = e^{-\theta t}X_0 + \sigma \int_0^t e^{-\theta(t-s)}\,\mathrm{d}W_s} \]

由 Ito 积分的性质(线性组合的高斯性),\(X_t\) 是高斯随机变量。其均值和方差为:

\[ \mathbb{E}[X_t] = e^{-\theta t}X_0 \quad \text{(指数衰减到零)} \]
\[ \mathrm{Var}[X_t] = \sigma^2 \int_0^t e^{-2\theta(t-s)}\,\mathrm{d}s = \frac{\sigma^2}{2\theta}(1 - e^{-2\theta t}) \quad \text{(Ito 等距!)} \]

\(t \to \infty\) 时:\(\mathbb{E}[X_t] \to 0\)\(\mathrm{Var}[X_t] \to \sigma^2/(2\theta)\)——系统达到**稳态分布** \(\mathcal{N}(0, \sigma^2/(2\theta))\)

应用 3:VP-SDE(Diffusion 模型的前向过程,直接连接 深度学习数学/40_Diffusion_Models数学)

\[ \mathrm{d}X_t = -\frac{1}{2}\beta(t)X_t\,\mathrm{d}t + \sqrt{\beta(t)}\,\mathrm{d}W_t \]

这本质就是**时变系数的 OU 过程**!\(\theta(t) = \frac{1}{2}\beta(t)\)\(\sigma(t) = \sqrt{\beta(t)}\)

用与 OU 过程相同的积分因子法。定义

\[ \alpha(t) = \exp\!\left(-\frac{1}{2}\int_0^t \beta(s)\,\mathrm{d}s\right) \]

类比 OU 过程中的 \(e^{-\theta t}\),可得

\[ X_t = \alpha(t)X_0 + \int_0^t \alpha(t)/\alpha(s) \cdot \sqrt{\beta(s)}\,\mathrm{d}W_s \]

因此 \(X_t \mid X_0\) 是高斯的:

\[ \boxed{X_t \mid X_0 \sim \mathcal{N}\!\left(\alpha(t)X_0,\; (1 - \alpha(t)^2)I\right)} \]

\(t\) 足够大(\(\int_0^t \beta(s)\,\mathrm{d}s \to \infty\))时,\(\alpha(t) \to 0\),故 \(X_t \to \mathcal{N}(0, I)\)

这就是 Diffusion Policy / Score SDE 中**"数据被噪声逐渐淹没"**的严格数学表述。深度学习数学/40_Diffusion_Models数学 §8.4.1 中的转移核公式,正是从本章的 Ito 公式推导得到的。

9.1.4.5 代码:模拟 OU 过程并验证解析解

import numpy as np
import matplotlib.pyplot as plt

def simulate_ou_process(x0, theta, sigma, T, dt, n_paths=1000):
    """
    用 Euler-Maruyama 方法模拟 OU 过程
    dX_t = -theta * X_t * dt + sigma * dW_t

    参数:
        x0: 初始值
        theta: 均值回复速率 (> 0)
        sigma: 扩散系数
        T: 终止时间
        dt: 时间步长
        n_paths: 模拟路径数
    """
    n_steps = int(T / dt)
    t = np.linspace(0, T, n_steps + 1)
    X = np.zeros((n_paths, n_steps + 1))
    X[:, 0] = x0

    # Euler-Maruyama 迭代: X_{k+1} = X_k + b(X_k)*dt + sigma*sqrt(dt)*Z_k
    for i in range(n_steps):
        dW = np.sqrt(dt) * np.random.randn(n_paths)  # 布朗运动增量
        X[:, i+1] = X[:, i] - theta * X[:, i] * dt + sigma * dW

    return t, X

# 参数设置
x0 = 2.0       # 初始值(偏离均值)
theta = 1.0     # 均值回复速率
sigma = 0.5     # 扩散系数
T = 5.0         # 模拟时间
dt = 0.01       # 时间步长
n_paths = 5000  # 模拟路径数

t, X = simulate_ou_process(x0, theta, sigma, T, dt, n_paths)

# 解析解的均值和标准差
mean_analytical = x0 * np.exp(-theta * t)
std_analytical = np.sqrt(sigma**2 / (2*theta) * (1 - np.exp(-2*theta*t)))

# 绘图对比
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左图:样本路径
ax = axes[0]
for i in range(min(20, n_paths)):
    ax.plot(t, X[i], alpha=0.3, linewidth=0.5)
ax.plot(t, mean_analytical, 'r-', linewidth=2, label=r'$\mathbb{E}[X_t]$ (解析)')
ax.fill_between(t, mean_analytical - 2*std_analytical,
                mean_analytical + 2*std_analytical,
                alpha=0.2, color='red', label=r'$\pm 2\sigma$ (解析)')
ax.set_xlabel('时间 t')
ax.set_ylabel(r'$X_t$')
ax.set_title('OU 过程样本路径')
ax.legend()

# 右图:均值与方差对比
ax = axes[1]
mean_sim = np.mean(X, axis=0)
var_sim = np.var(X, axis=0)
var_analytical = std_analytical**2

ax.plot(t, mean_sim, 'b-', label='均值 (Monte Carlo)', linewidth=1.5)
ax.plot(t, mean_analytical, 'r--', label='均值 (解析)', linewidth=1.5)
ax.plot(t, var_sim, 'g-', label='方差 (Monte Carlo)', linewidth=1.5)
ax.plot(t, var_analytical, 'm--', label='方差 (解析)', linewidth=1.5)
ax.axhline(y=sigma**2/(2*theta), color='gray', linestyle=':',
           label=f'稳态方差 = {sigma**2/(2*theta):.3f}')
ax.set_xlabel('时间 t')
ax.set_title('OU 过程:解析解 vs Monte Carlo')
ax.legend()

plt.tight_layout()
plt.savefig('ou_process_verification.png', dpi=150)
plt.show()

print(f"t=T 时: 模拟均值={mean_sim[-1]:.4f}, 解析均值={mean_analytical[-1]:.4f}")
print(f"t=T 时: 模拟方差={var_sim[-1]:.4f}, 解析方差={var_analytical[-1]:.4f}")
print(f"稳态方差 (理论): sigma^2/(2*theta) = {sigma**2/(2*theta):.4f}")

9.1.4.6 练习

练习 9.1.7(⭐):用 Ito 公式验证 \(\mathrm{d}(W_t^2) = 2W_t\,\mathrm{d}W_t + \mathrm{d}t\)。取 \(f(x) = x^2\),写出 \(f'\), \(f''\),代入公式,并取积分形式确认 \(\int_0^t W_s\,\mathrm{d}W_s = \frac{1}{2}(W_t^2 - t)\)

练习 9.1.8(⭐⭐):用 Ito 公式求 \(\mathrm{d}(e^{W_t})\)

解:\(f(x) = e^x\)\(f'(x) = f''(x) = e^x\)。代入 Ito 公式:\(\mathrm{d}(e^{W_t}) = e^{W_t}\,\mathrm{d}W_t + \frac{1}{2}e^{W_t}\,\mathrm{d}t\)

注意 \(e^{W_t}\) 不是鞅(因为有 \(\frac{1}{2}e^{W_t}\,\mathrm{d}t\) 项)。但 \(e^{W_t - t/2}\) 是鞅——这个修正再次体现了 Ito 微积分与普通微积分的区别。

练习 9.1.9(⭐⭐):对 \(f(t,x) = e^{-rt}x\)(其中 \(r\) 为常数),设 \(\mathrm{d}X_t = rX_t\,\mathrm{d}t + \sigma X_t\,\mathrm{d}W_t\),用含时间的 Ito 公式证明 \(Y_t = e^{-rt}X_t\) 是鞅。(提示:验证 \(\mathrm{d}Y_t\)\(\mathrm{d}t\) 系数为零。)

练习 9.1.10(⭐⭐⭐):对 VP-SDE \(\mathrm{d}X_t = -\frac{1}{2}\beta(t)X_t\,\mathrm{d}t + \sqrt{\beta(t)}\,\mathrm{d}W_t\),定义 \(\alpha(t) = \exp(-\frac{1}{2}\int_0^t \beta(s)\,\mathrm{d}s)\)。令 \(Y_t = X_t / \alpha(t)\),用含时间的 Ito 公式推导 \(\mathrm{d}Y_t\),并由此得到 \(X_t \mid X_0\) 的闭式分布。


§9.1.5 Ito vs Stratonovich ⭐⭐

9.1.5.1 问题:取样点的选择竟然影响结果?

回忆 Ito 积分的定义中,被积函数取**左端点**的值:

\[ \int_0^T H_t\,\mathrm{d}W_t = \lim_{|\Pi| \to 0} \sum_{i} H_{t_i} \Delta W_i \quad \text{(Ito:左端点 $t_i$)} \]

如果改取**中点** \((t_i + t_{i+1})/2\)

\[ \int_0^T H_t \circ \mathrm{d}W_t := \lim_{|\Pi| \to 0} \sum_{i} H_{(t_i + t_{i+1})/2} \Delta W_i \quad \text{(Stratonovich:中点)} \]

两者给出**不同的结果**!经典例子:

积分 Ito Stratonovich
\(\int_0^t W_s\,\mathrm{d}W_s\) \(\frac{1}{2}W_t^2 - \frac{1}{2}t\) \(\frac{1}{2}W_t^2\)
差异 多了 \(-\frac{1}{2}t\) 与普通微积分一致

Stratonovich 积分给出了看起来更"自然"的 \(\frac{1}{2}x^2\)——和普通微积分一样!那为什么不直接用 Stratonovich?

9.1.5.2 两种积分的比较

Ito 积分 Stratonovich 积分
取样点 左端点 \(t_i\) 中点 \((t_i + t_{i+1})/2\)
链式法则 需要修正项 \(\frac{1}{2}f''\sigma^2\,\mathrm{d}t\) 普通链式法则成立
鞅性 \(\int H\,\mathrm{d}W\) 是鞅 \(\int H \circ \mathrm{d}W\) **不是**鞅
适应性 被积函数必须适应(因果性) 需要"偷看一点未来"
数学优势 鞅理论、Ito 等距、概率计算方便 微分几何中坐标变换不变性
物理约定 金融数学(Black-Scholes) 物理学(Langevin 方程)
数值离散 Euler-Maruyama(简单、自然) 需要隐式或预测-校正格式

各有优势: - Ito 的鞅性使概率计算(条件期望、滤波、最优停止)极为方便 - Stratonovich 的链式法则不变性使物理建模和微分几何(特别是流形上的 SDE)更自然

9.1.5.3 转换公式

定理(Ito-Stratonovich 转换):设 Ito SDE 为

\[ \mathrm{d}X_t = \mu(X_t)\,\mathrm{d}t + \sigma(X_t)\,\mathrm{d}W_t \]

等价的 Stratonovich SDE 为

\[ \mathrm{d}X_t = \underbrace{\left[\mu(X_t) - \frac{1}{2}\sigma(X_t)\sigma'(X_t)\right]}_{\tilde{\mu}(X_t)}\mathrm{d}t + \sigma(X_t) \circ \mathrm{d}W_t \]

反方向:Stratonovich \(\to\) Ito 只需将修正项的符号反转(加而非减)。

推导直觉:Stratonovich 取中点 \(H_{(t_i+t_{i+1})/2} \approx H_{t_i} + \frac{1}{2}H'_{t_i}\Delta W_i\)(Taylor 展开到一阶),代入求和

\[ \sum H_{(t_i+t_{i+1})/2}\Delta W_i \approx \sum H_{t_i}\Delta W_i + \frac{1}{2}\sum H'_{t_i}(\Delta W_i)^2 \]

第一项是 Ito 积分,第二项 \(\to \frac{1}{2}\int H'_s\,\mathrm{d}s\)(二次变差!)。当 \(H_s = \sigma(X_s)\) 时,$H' = \sigma'(X_s)\cdot \mathrm{d}X_s/... $——精确分析给出修正项 \(\frac{1}{2}\sigma\sigma'\)

转换项 \(\frac{1}{2}\sigma\sigma'\) 称为 noise-induced drift(噪声诱导漂移)。它的物理意义:当扩散系数 \(\sigma(x)\) 依赖于状态时,粒子从 \(\sigma\) 大的区域被"推向" \(\sigma\) 小的区域(或反之),产生一个有效的漂移。

9.1.5.4 何时用哪个?实用指南

场景 推荐约定 理由
概率计算、滤波、贝叶斯推断 Ito 鞅性、条件期望、滤波方程
物理建模(Langevin 方程、热力学) Stratonovich 坐标变换不变、与物理直觉一致
Diffusion Models (Score SDE) Ito Anderson 反向 SDE 在 Ito 意义下
流形上的 SDE(如 SO(3) 上的噪声) Stratonovich 坐标无关性,微分几何与李群/30_李群基础与SO3_SE3
EKF/UKF 连续-离散滤波 Ito Kushner-Stratonovich/Duncan-Mortensen-Zakai 方程
不确定时 写 Ito 然后需要时用转换公式得 Stratonovich

[!TIP] 机器人学中的经验法则:大多数机器人文献使用 Ito 约定。如果你看到 SDE 没有明确标注约定,默认假设是 Ito。物理学文献(如从热力学或统计力学推导的随机模型)通常用 Stratonovich。

9.1.5.5 练习

练习 9.1.11(⭐⭐):Ito SDE \(\mathrm{d}X = X\,\mathrm{d}W\)\(\mu = 0, \sigma(x) = x\))对应什么 Stratonovich SDE?

解:\(\sigma(x) = x\)\(\sigma'(x) = 1\),修正项 \(= \frac{1}{2}x \cdot 1 = \frac{1}{2}x\)

Stratonovich SDE:\(\mathrm{d}X = (0 - \frac{1}{2}X)\mathrm{d}t + X \circ \mathrm{d}W = -\frac{1}{2}X\,\mathrm{d}t + X \circ \mathrm{d}W\)

验证:Ito 版解为 \(X_t = X_0 e^{-t/2 + W_t}\)(GBM with \(\mu = 0\))。Stratonovich 版的普通链式法则给 \(\mathrm{d}\ln X = (-\frac{1}{2})\mathrm{d}t + \circ\mathrm{d}W\),积分得 \(\ln X_t = \ln X_0 - t/2 + W_t\),一致!

练习 9.1.12(⭐⭐⭐):当 \(\sigma\) 为常数(不依赖 \(x\))时,证明 Ito 和 Stratonovich SDE 完全相同(修正项为零)。说明这在机器人学中为什么重要。(答案:大多数机器人 SDE 模型中 \(\sigma\) 是常数或不依赖状态的矩阵,此时两种约定等价,不需要担心选择问题。)


§9.1.6 SDE 的存在唯一性 ⭐⭐⭐

9.1.6.1 动机与 纯数学基础/120_常微分方程的完美对照

在 纯数学基础/120_常微分方程中,我们学过 ODE \(\dot{x} = f(x)\) 的 Picard-Lindelof 定理:Lipschitz 条件保证解的存在唯一性。SDE 的情况完全平行:

\[ \mathrm{d}X_t = b(t, X_t)\,\mathrm{d}t + \sigma(t, X_t)\,\mathrm{d}W_t, \quad X_0 = x_0 \]
ODE (纯数学基础/120_常微分方程 §B4.2) SDE (本节)
方程 \(\dot{x} = f(t,x)\) \(\mathrm{d}X = b(t,X)\mathrm{d}t + \sigma(t,X)\mathrm{d}W\)
条件 1 \(f\)\(x\) Lipschitz \(b, \sigma\)\(x\) Lipschitz
条件 2 \(f\) 在紧集上有界(自动满足) 线性增长条件(额外需要!)
证明方法 Picard 迭代 \(\to\) 压缩映射 Picard 迭代 \(\to\) \(L^2\) 估计 + Gronwall
解的性质 \(x \in C^1\),确定性函数 \(X\) 是连续适应过程(随机的)
不动点空间 \((C([0,T], \mathbb{R}^n), \|\cdot\|_\infty)\) \(L^2(\Omega; C([0,T], \mathbb{R}^n))\)

定理(SDE 存在唯一性,随机 Picard-Lindelof):设 \(b: [0,T] \times \mathbb{R}^n \to \mathbb{R}^n\)\(\sigma: [0,T] \times \mathbb{R}^n \to \mathbb{R}^{n \times m}\) 满足:

(L) 全局 Lipschitz 条件:存在 \(K > 0\) 使得对所有 \(t \in [0,T]\)\(x, y \in \mathbb{R}^n\)

\[ |b(t,x) - b(t,y)| + |\sigma(t,x) - \sigma(t,y)| \leq K|x - y| \]

(G) 线性增长条件:存在 \(C > 0\) 使得

\[ |b(t,x)|^2 + |\sigma(t,x)|^2 \leq C^2(1 + |x|^2) \]

则 SDE 有**唯一的强解** \(X_t\),满足 \(\mathbb{E}[\sup_{0 \leq t \leq T} |X_t|^2] < \infty\)

9.1.6.2 为什么 SDE 需要线性增长条件而 ODE 不需要?

在 ODE 的 Picard-Lindelof 中,我们在**紧集** \(\bar{B}(x_0, b) \times [t_0 - \delta, t_0 + \delta]\) 上工作。紧集上的连续函数自动有界。然后解被限制在这个紧集中(至少在短时间内)。

但 SDE 的解是**随机**的——布朗运动可以在任意有限时间内走得任意远(虽然概率很小)。我们不能事先把解限制在一个紧集中。线性增长条件的作用是:控制漂移和扩散的增长速度,使得解不会在有限时间内以正概率爆炸到无穷

反例\(\mathrm{d}X_t = X_t^2\,\mathrm{d}t\)(纯漂移,无噪声)。\(\sigma = 0\) 满足 Lipschitz,但 \(b(x) = x^2\) 不满足线性增长。解 \(X_t = X_0/(1-X_0 t)\)\(t^* = 1/X_0\) 爆炸。加上噪声后情况更为复杂——线性增长条件排除了这类"有限时间爆炸"。

ODE vs SDE 条件对比表

条件 ODE 中是否需要 SDE 中是否需要 原因
Lipschitz 唯一性(两者一样)
有界性 / 线性增长 紧集上自动满足 必须显式假设 SDE 解可随机走出任何紧集
连续性 是(Peano 定理只需连续) 包含在 Lipschitz 中 --

9.1.6.3 证明骨架(Picard 迭代的 SDE 版本)

步骤 1:定义 Picard 迭代(与纯数学基础/120_常微分方程完全平行!)

\[ X_t^{(0)} = x_0 $$ $$ X_t^{(n+1)} = x_0 + \int_0^t b(s, X_s^{(n)})\,\mathrm{d}s + \int_0^t \sigma(s, X_s^{(n)})\,\mathrm{d}W_s \]

对比 ODE:\(x^{(n+1)}(t) = x_0 + \int_0^t f(s, x^{(n)}(s))\,\mathrm{d}s\)——唯一的区别是多了一个 Ito 积分项。

步骤 2:\(L^2\) 误差估计

\(e_n(t) = \mathbb{E}\left[\sup_{0 \leq s \leq t} |X_s^{(n+1)} - X_s^{(n)}|^2\right]\)

\[ X_t^{(n+1)} - X_t^{(n)} = \int_0^t [b(s, X_s^{(n)}) - b(s, X_s^{(n-1)})]\,\mathrm{d}s + \int_0^t [\sigma(s, X_s^{(n)}) - \sigma(s, X_s^{(n-1)})]\,\mathrm{d}W_s \]

利用 \((a+b)^2 \leq 2a^2 + 2b^2\)、Cauchy-Schwarz 不等式和 Doob 鞅不等式

\[ \mathbb{E}\!\left[\sup_{s \leq t}\left|\int_0^s \phi_r\,\mathrm{d}W_r\right|^2\right] \leq 4\,\mathbb{E}\!\left[\int_0^t |\phi_r|^2\,\mathrm{d}r\right] \]

(鞅不等式是 Ito 积分理论的产物,类似于 ODE 中的三角不等式)加上 Lipschitz 条件,可得

\[ e_n(t) \leq C_T \int_0^t e_{n-1}(s)\,\mathrm{d}s \]

其中 \(C_T\) 是只依赖于 \(K\)(Lipschitz 常数)和 \(T\) 的常数。

步骤 3:Gronwall 迭代(与 纯数学基础/120_常微分方程中的方法完全一样!)

反复代入:

\[ e_n(t) \leq C_T \int_0^t e_{n-1}(s)\,\mathrm{d}s \leq C_T^2 \int_0^t \int_0^s e_{n-2}(r)\,\mathrm{d}r\,\mathrm{d}s \leq \cdots \leq \frac{(C_T t)^n}{n!} \cdot e_0(T) \]

因为 \(\sum_{n=0}^\infty \frac{(C_T T)^n}{n!} = e^{C_T T} < \infty\),所以 \(\sum_n \sqrt{e_n(T)} < \infty\)

由 Chebyshev 不等式和 Borel-Cantelli 引理,\(X^{(n)}\)\(C([0,T], \mathbb{R}^n)\) 中一致收敛(a.s.),极限 \(X\) 就是 SDE 的解。

步骤 4:唯一性

\(X, \tilde{X}\) 是两个解,令 \(e(t) = \mathbb{E}[\sup_{s \leq t}|X_s - \tilde{X}_s|^2]\)。同样的 Lipschitz 估计给出 \(e(t) \leq C_T \int_0^t e(s)\,\mathrm{d}s\)。由 Gronwall 不等式(纯数学基础/120_常微分方程 §B4.6 的核心工具!),\(e(t) = 0\)\(\square\)

[!TIP] 给 C++ 工程师的类比:Picard 迭代就像你写了一个 for 循环不断改进近似解。ODE 版本的"收敛"用上确界范数(worst-case pointwise error),SDE 版本用 \(L^2\) 范数(average-case squared error, over all random outcomes)。Gronwall 不等式在两者中扮演完全相同的角色——控制误差的指数增长,保证迭代收敛。

9.1.6.4 常见 SDE 是否满足条件?

SDE Lipschitz? 线性增长? 结论
\(\mathrm{d}X = -\theta X\,\mathrm{d}t + \sigma\,\mathrm{d}W\)(OU) 是 (\(K = \theta\)) 唯一强解存在
\(\mathrm{d}X = \mu X\,\mathrm{d}t + \sigma X\,\mathrm{d}W\)(GBM) 是 ($K = \mu +
\(\mathrm{d}X = -\frac{1}{2}\beta(t)X\,\mathrm{d}t + \sqrt{\beta(t)}\,\mathrm{d}W\)(VP-SDE) 唯一强解存在
\(\mathrm{d}X = X^2\,\mathrm{d}t + \mathrm{d}W\) 不是(全局) 不是 可能爆炸
$\mathrm{d}X = X ^{1/2}\,\mathrm{d}W$(Tanaka) 不是

9.1.6.5 练习

练习 9.1.13(⭐⭐):验证 OU 过程 \(\mathrm{d}X = -\theta X\,\mathrm{d}t + \sigma\,\mathrm{d}W\)\(\theta > 0, \sigma > 0\) 常数)满足 Lipschitz 和线性增长条件。写出 Lipschitz 常数 \(K\) 和线性增长常数 \(C\)

练习 9.1.14(⭐⭐⭐):为什么 \(b(x) = |x|^{1/2}\) 不满足 Lipschitz?在 \(x = 0\) 附近画出 \(|b(x) - b(0)|/|x|\) 的行为(它趋于无穷)。这类似于 ODE 中的 \(\dot{x} = x^{2/3}\) 反例(纯数学基础/120_常微分方程 §B4.3)。


§9.1.7 Fokker-Planck 方程 ⭐⭐

9.1.7.1 动机:从单条轨迹到概率密度的演化

到目前为止,我们一直在研究**单条轨迹** \(X_t(\omega)\)。但在很多应用中,我们关心的是**所有轨迹的统计分布**——即 \(X_t\) 的概率密度 \(p(x,t)\) 如何随时间演化。

机器人学场景

  • 粒子滤波:我用 1000 个粒子模拟了 SDE,我想知道粒子云的密度 \(p(x,t)\) 满足什么 PDE——这有助于分析滤波器的收敛性
  • Diffusion Models:VP-SDE 的前向过程把数据分布 \(p_{\text{data}}\) 变成 \(\mathcal{N}(0,I)\)。密度变化的方程是什么?反向过程的方程呢?
  • MPPI 控制:轨迹分布的密度变化规律可以帮助设计更好的重要性采样分布

核心问题:给定 SDE

\[ \mathrm{d}X_t = b(X_t, t)\,\mathrm{d}t + \sigma(X_t, t)\,\mathrm{d}W_t \]

如果 \(X_t\) 在时刻 \(t\) 的概率密度为 \(p(x,t)\),那么 \(p\) 满足什么偏微分方程?

[!TIP] 与 ODE 的类比:对确定性 ODE \(\dot{x} = f(x)\),如果初始条件有分布 \(p_0(x)\),密度的演化由 Liouville 方程 \(\partial_t p + \nabla \cdot (fp) = 0\) 描述(纯输运,无扩散)。Fokker-Planck 方程是 Liouville 方程的**随机推广**——多了一个扩散项。

9.1.7.2 从 Ito 公式推导 Fokker-Planck

推导(一维情况,\(X_t \in \mathbb{R}\)):

\(\varphi \in C_c^\infty(\mathbb{R})\)(光滑紧支集测试函数)。对 \(\varphi(X_t)\) 用 Ito 公式:

\[ \mathrm{d}\varphi(X_t) = \varphi'(X_t)\,\mathrm{d}X_t + \frac{1}{2}\varphi''(X_t)\sigma^2(X_t,t)\,\mathrm{d}t \]

展开 \(\mathrm{d}X_t = b\,\mathrm{d}t + \sigma\,\mathrm{d}W_t\)

\[ \mathrm{d}\varphi(X_t) = \left[b(X_t,t)\varphi'(X_t) + \frac{1}{2}\sigma^2(X_t,t)\varphi''(X_t)\right]\mathrm{d}t + \varphi'(X_t)\sigma(X_t,t)\,\mathrm{d}W_t \]

\(0\) 积分到 \(t\) 并取期望(Ito 积分项期望为零——鞅性!):

\[ \mathbb{E}[\varphi(X_t)] - \mathbb{E}[\varphi(X_0)] = \int_0^t \mathbb{E}\left[b(X_s)\varphi'(X_s) + \frac{1}{2}\sigma^2(X_s)\varphi''(X_s)\right]\mathrm{d}s \]

\(t\) 求导:

\[ \frac{\mathrm{d}}{\mathrm{d}t}\mathbb{E}[\varphi(X_t)] = \mathbb{E}\left[b(X_t,t)\varphi'(X_t) + \frac{1}{2}\sigma^2(X_t,t)\varphi''(X_t)\right] \]

用密度改写期望:

左边\(\frac{\mathrm{d}}{\mathrm{d}t}\int \varphi(x) p(x,t)\,\mathrm{d}x = \int \varphi(x) \partial_t p(x,t)\,\mathrm{d}x\)

右边\(\int \left[b(x,t)\varphi'(x) + \frac{1}{2}\sigma^2(x,t)\varphi''(x)\right] p(x,t)\,\mathrm{d}x\)

对右边做**分部积分**(边界项消失,因为 \(\varphi\) 紧支集或 \(p\) 在无穷远处充分衰减):

\[ \int b\varphi' p\,\mathrm{d}x = -\int \varphi \cdot \partial_x(bp)\,\mathrm{d}x \]
\[ \int \frac{1}{2}\sigma^2 \varphi'' p\,\mathrm{d}x = \int \varphi \cdot \frac{1}{2}\partial_x^2(\sigma^2 p)\,\mathrm{d}x \]

(每次分部积分翻转一个导数的方向,两次分部积分翻转两个。)

代入:

\[ \int \varphi(x) \partial_t p(x,t)\,\mathrm{d}x = \int \varphi(x)\left[-\partial_x(b\,p) + \frac{1}{2}\partial_x^2(\sigma^2 p)\right]\mathrm{d}x \]

\(\varphi\) 的任意性(\(C_c^\infty\) 函数的基本引理,纯数学基础/100_测度论与Lebesgue积分的遗产),

\[ \boxed{\partial_t p(x,t) = -\partial_x[b(x,t)\,p(x,t)] + \frac{1}{2}\partial_x^2[\sigma^2(x,t)\,p(x,t)]} \]

这就是 Fokker-Planck 方程(也称 Kolmogorov 前向方程)。

多维推广:设 \(D(x,t) = \frac{1}{2}\sigma(x,t)\sigma(x,t)^\top \in \mathbb{R}^{n \times n}\)(扩散矩阵),

\[ \boxed{\partial_t p = -\sum_i \partial_i(b_i\,p) + \sum_{i,j} \partial_i \partial_j(D_{ij}\,p)} \]

紧凑向量形式:\(\partial_t p = -\nabla \cdot (b\,p) + \nabla \cdot \nabla \cdot (D\,p)\)

物理解读

表达式 物理含义 ODE 对应
\(\partial_t p\) 密度变化率 概率守恒(总概率始终为 1)
\(-\nabla \cdot (bp)\) 漂移项 概率被确定性流 \(b\) 输运 Liouville 方程(仅此项)
\(\nabla \cdot (D \nabla p)\) 扩散项 概率因随机噪声而弥散 ODE 中不存在!

整个方程保持概率守恒:\(\frac{d}{dt}\int p(x,t)\,\mathrm{d}x = 0\)(因为边界项为零)。

9.1.7.3 经典验证:布朗运动和 OU 过程

例 1:标准布朗运动 \(\mathrm{d}X_t = \mathrm{d}W_t\)

\(b = 0\)\(\sigma = 1\)。Fokker-Planck 方程变为**热方程**:

\[ \partial_t p = \frac{1}{2}\partial_x^2 p \]

初始条件 \(p(x, 0) = \delta(x)\)(从原点出发)。解:

\[ p(x,t) = \frac{1}{\sqrt{2\pi t}}\exp\!\left(-\frac{x^2}{2t}\right) \]

这就是 \(W_t \sim \mathcal{N}(0,t)\) 的密度。验证:\(\partial_t p = \frac{1}{2}\partial_x^2 p\) 是标准 PDE 练习。

例 2:OU 过程 \(\mathrm{d}X_t = -\theta X_t\,\mathrm{d}t + \sigma\,\mathrm{d}W_t\)

\(b(x) = -\theta x\),$\sigma = $ 常数。Fokker-Planck 方程:

\[ \partial_t p = \theta\,\partial_x(x\,p) + \frac{\sigma^2}{2}\partial_x^2 p = \theta\,p + \theta x\,\partial_x p + \frac{\sigma^2}{2}\partial_x^2 p \]

稳态解:令 \(\partial_t p = 0\),得 \(0 = \theta\,\partial_x(xp_\infty) + \frac{\sigma^2}{2}\partial_{x}^2 p_\infty\)

\(p_\infty(x) = A\exp(-\alpha x^2)\)(高斯形式)。代入可解出 \(\alpha = \theta/\sigma^2\),故

\[ p_\infty(x) = \frac{1}{\sqrt{2\pi \cdot \sigma^2/(2\theta)}} \exp\!\left(-\frac{x^2}{2 \cdot \sigma^2/(2\theta)}\right) = \mathcal{N}\!\left(0, \frac{\sigma^2}{2\theta}\right) \]

与我们在 §9.1.4.4 中用 Ito 公式得到的 \(\mathrm{Var}[X_\infty] = \sigma^2/(2\theta)\) 完全一致!

9.1.7.4 与扩散模型 (深度学习数学/40_Diffusion_Models数学) 的核心联系

VP-SDE 的 Fokker-Planck

\(\mathrm{d}X_t = -\frac{1}{2}\beta(t)X_t\,\mathrm{d}t + \sqrt{\beta(t)}\,\mathrm{d}W_t\)

\[ b(x,t) = -\tfrac{1}{2}\beta(t)x, \quad \sigma^2 = \beta(t) \]

Fokker-Planck 方程:

\[ \partial_t p = \frac{1}{2}\beta(t)\,\partial_x(x\,p) + \frac{1}{2}\beta(t)\,\partial_x^2 p = \frac{1}{2}\beta(t)\left[\partial_x(x\,p) + \partial_x^2 p\right] \]

\(t \to \infty\)\(p(\cdot, t) \to \mathcal{N}(0, I)\)——前向过程把任何数据分布变成标准高斯。

Anderson 反向 SDE (1982)——Diffusion Models 的数学根基:

知道了前向 SDE 和对应的 Fokker-Planck 方程后,Anderson 证明了一个惊人的结果:存在一个**反向时间**的 SDE,使得反向过程具有相同的有限维边际分布:

\[ \boxed{\mathrm{d}X_t = \left[b(X_t, t) - \sigma^2(X_t, t)\,\nabla_x \log p(X_t, t)\right]\mathrm{d}t + \sigma(X_t, t)\,\mathrm{d}\bar{W}_t} \]

其中 \(\bar{W}_t\) 是反向时间的布朗运动,\(\nabla_x \log p(x,t)\) 就是 score 函数

这个结果将 SDE 理论与深度生成模型完美连接

步骤 数学 Diffusion Models 实现
1. 前向 SDE \(p_{\text{data}} \xrightarrow{t \to T} \mathcal{N}(0,I)\) 加噪声(已知,无需学习)
2. 反向 SDE 需要 \(\nabla_x \log p(x,t)\) Score Matching:训练 \(s_\theta \approx \nabla \log p\)
3. 采样 Euler-Maruyama 模拟反向 SDE \(\mathcal{N}(0,I)\) 出发,逐步去噪
4. Fokker-Planck 保证密度演化正确 理论收敛保证

[!IMPORTANT] 全貌连接

  • 本章 §9.1.2:布朗运动 \(\to\) 噪声模型
  • 本章 §9.1.3:Ito 积分 \(\to\) SDE 的严格定义
  • 本章 §9.1.4:Ito 公式 \(\to\) 求解 VP-SDE,得到闭式转移核
  • 本章 §9.1.7:Fokker-Planck \(\to\) 密度演化方程
  • 深度学习数学/40_Diffusion_Models数学 §8.4.1:VP-SDE 的转移核(本章推导的)
  • 深度学习数学/40_Diffusion_Models数学 §8.4.2:Anderson 反向 SDE(需要 Fokker-Planck + score)
  • 深度学习数学/40_Diffusion_Models数学 §8.4.4:Score Matching(学习 \(\nabla \log p\)

本章提供了理解 深度学习数学/40_Diffusion_Models数学 中**全部** SDE 相关内容的前置知识。

9.1.7.5 练习

练习 9.1.15(⭐⭐):写出标准布朗运动 \(\mathrm{d}X_t = \mathrm{d}W_t\) 的 Fokker-Planck 方程,并直接验证 \(p(x,t) = \frac{1}{\sqrt{2\pi t}}e^{-x^2/(2t)}\) 是其解(计算 \(\partial_t p\)\(\frac{1}{2}\partial_x^2 p\),确认相等)。

练习 9.1.16(⭐⭐⭐):写出 OU 过程 \(\mathrm{d}X_t = -\theta X_t\,\mathrm{d}t + \sigma\,\mathrm{d}W_t\) 的 Fokker-Planck 方程。令 \(\partial_t p = 0\) 求稳态解 \(p_\infty(x)\)。验证 \(p_\infty = \mathcal{N}(0, \sigma^2/(2\theta))\)

练习 9.1.17(⭐⭐⭐⭐ 研究级):对 VP-SDE,写出 Anderson 反向 SDE。说明为什么 score function \(s(x,t) = \nabla_x \log p(x,t)\) 是唯一需要"学习"的量——\(b\)\(\sigma\) 都是已知的。然后解释 深度学习数学/40_Diffusion_Models数学 中 Score Matching 损失函数 \(\mathbb{E}[\|s_\theta(X_t, t) - \nabla_{X_t}\log p(X_t \mid X_0)\|^2]\) 为什么可以用闭式计算(因为 \(p(X_t \mid X_0)\) 是高斯的,你在 §9.1.4.4 已经推导了它的闭式)。


§9.1.8 数值方法:Euler-Maruyama 与 Milstein ⭐⭐

到目前为止,我们能解的 SDE 都是"运气好"的——OU、GBM、VP-SDE 这些线性或可对数变换的方程恰好有闭式解。但机器人学中绝大多数 SDE 没有解析解:非线性漂移(如倒立摆的 \(\sin\theta\) 项)、状态依赖的扩散系数、高维耦合系统……这时唯一的出路是**数值模拟**。本节回答:怎样把连续时间的 SDE 离散成计算机能跑的迭代?精度有多高?为什么不能照搬 ODE 的数值方法?

9.1.8.1 动机:为什么 ODE 的数值方法不能直接搬过来?

回顾 纯数学基础/120_常微分方程 中求解 ODE \(\dot{x} = f(x)\) 的**前向 Euler 法**:

\[ x_{k+1} = x_k + f(x_k)\,\Delta t \]

它的局部截断误差是 \(O(\Delta t^2)\),全局误差 \(O(\Delta t)\)(一阶精度)。一个自然的想法是:对 SDE \(\mathrm{d}X = b(X)\mathrm{d}t + \sigma(X)\mathrm{d}W\),直接把 \(\mathrm{d}W\) 换成离散增量 \(\Delta W_k\)

\[ X_{k+1} = X_k + b(X_k)\,\Delta t + \sigma(X_k)\,\Delta W_k \]

这就是 Euler-Maruyama 方法(Maruyama 1955 把 Euler 法推广到随机情形)。看起来平淡无奇——但**两个关键陷阱**潜伏其中:

陷阱一:\(\Delta W_k\) 怎么取? 不能取 \(\Delta W_k = 0\)(那就退化成无噪声 ODE),也不能取一个固定常数。正确做法源自布朗运动的定义 W3:增量 \(\Delta W_k = W_{t_{k+1}} - W_{t_k} \sim \mathcal{N}(0, \Delta t)\)。因此

\[ \Delta W_k = \sqrt{\Delta t}\, Z_k, \quad Z_k \overset{\text{iid}}{\sim} \mathcal{N}(0, 1) \]

注意这个 \(\sqrt{\Delta t}\)——又是它!这是 §9.1.2.2 中"\(\Delta x = \sqrt{\Delta t}\) 缩放"在数值算法里的直接体现。如果错写成 \(\Delta t \cdot Z_k\)(量纲都不对),噪声会随 \(\Delta t \to 0\) 过快消失,模拟出的根本不是同一个过程。

[!WARNING] 陷阱 1(数值):把布朗增量写成 \(\Delta t \cdot Z\) 而非 \(\sqrt{\Delta t}\cdot Z\)

错误现象:你把步长从 \(0.01\) 减半到 \(0.005\),发现模拟轨迹的"抖动幅度"莫名其妙地缩小了一半——但理论上布朗运动的统计性质与离散步长无关。

根本原因:误用了 \(\Delta W_k = \Delta t\, Z_k\)。此时 \(\mathrm{Var}[\Delta W_k] = \Delta t^2\),而正确的应是 \(\mathrm{Var}[\Delta W_k] = \Delta t\)。前者让噪声以 \(O(\Delta t)\) 的速度消失,后者以 \(O(\sqrt{\Delta t})\)

正确做法:永远写 dW = np.sqrt(dt) * np.random.randn(...)。一个快速自检:模拟 \(\mathrm{d}X = \mathrm{d}W\)(纯布朗运动),检查 \(\mathrm{Var}[X_T] \approx T\) 与步长无关。

陷阱二:左端点 \(X_k\) 不是随意的。 我们在 §9.1.3.2 强调过 Ito 积分取**左端点**——数值格式必须忠实于这一点:\(b(X_k)\)\(\sigma(X_k)\) 都用区间**起点**的值,而不是终点 \(X_{k+1}\)(那会变成隐式格式,且若对扩散项也取终点,离散的就不再是 Ito SDE 而漂移向 Stratonovich)。这正是为什么 Euler-Maruyama 天然对应 Ito 约定(回看 §9.1.5.2 表格最后一行)。

9.1.8.2 收敛阶:强收敛 vs 弱收敛

这是 SDE 数值分析**最反直觉**的地方,也是与 ODE 的根本分歧。ODE 数值方法只有一种"精度"概念;SDE 却有**两种本质不同**的收敛概念,因为我们既可能关心"单条轨迹逼近得多准",也可能只关心"统计量(均值、方差、期望收益)逼近得多准"。

定义(强收敛):数值解 \(X_N^{\Delta t}\)(在终点 \(T\),步长 \(\Delta t\))以阶 \(\gamma\) 强收敛,如果

\[ \mathbb{E}\big[\,|X_N^{\Delta t} - X_T|\,\big] \leq C\,(\Delta t)^{\gamma} \]

其中 \(X_T\) 是**同一布朗路径下**的精确解。强收敛要求逐路径逼近——数值轨迹和真实轨迹"形影不离"。

定义(弱收敛):以阶 \(\beta\) 弱收敛,如果对所有充分光滑的检验函数 \(g\)

\[ \big|\,\mathbb{E}[g(X_N^{\Delta t})] - \mathbb{E}[g(X_T)]\,\big| \leq C\,(\Delta t)^{\beta} \]

弱收敛只要求**分布层面**逼近——数值解的均值、方差、各阶矩逼近真实分布,但单条轨迹可以差很远。

本质洞察:强收敛和弱收敛的区别,本质是"逐点逼近"与"分布逼近"的区别。这不是数学家的吹毛求疵——它直接决定你该选哪种方法。如果你在做**滤波或最优控制**(关心这一条真实轨迹),需要强收敛;如果你在做 Monte Carlo 估计期望(如 MPPI 算成本期望、Diffusion 采样统计),只需要弱收敛,可以用更省的格式。

Euler-Maruyama 的收敛阶(在标准 Lipschitz + 线性增长条件下,即 §9.1.6 的条件):

\[ \boxed{\text{强收敛阶 } \gamma = \tfrac{1}{2}, \qquad \text{弱收敛阶 } \beta = 1} \]

为什么强阶只有 \(1/2\) 而非 ODE Euler 的 \(1\) 根源还是 \((\mathrm{d}W)^2 = \mathrm{d}t\)。在一步的 Taylor/Ito 展开中,被丢弃的最低阶项含有 \(\int_{t_k}^{t_{k+1}}\!\!\int_{t_k}^{s} \mathrm{d}W_r\,\mathrm{d}W_s\) 这样的**二重 Ito 积分**,其量级是 \(O((\Delta W)^2) = O(\Delta t)\)——比 ODE 情形(被丢弃项 \(O(\Delta t^2)\))大了一整个 \(\sqrt{\Delta t}\) 量级。把单步误差 \(O(\Delta t)\) 累积 \(N = T/\Delta t\) 步、并考虑随机误差的 \(L^2\) 累加(独立误差按平方和累加,开根号引入额外 \(\sqrt{\cdot}\)),最终全局强误差落在 \(O(\sqrt{\Delta t})\)

[!TIP] 阶段小结:到这里我们知道了两件事——(1) Euler-Maruyama 就是"前向 Euler + \(\sqrt{\Delta t}Z\) 噪声";(2) 它逐路径只有 \(1/2\) 阶精度(要精度翻倍得把步长缩到 \(1/4\),代价高)。接下来要问:能不能像 ODE 里用 Runge-Kutta 那样,造一个更高阶的格式?答案是 Milstein 方法。

9.1.8.3 Milstein 方法:用 Ito 公式补回二阶项

核心思想:Euler-Maruyama 丢掉了那个 \(O(\Delta t)\) 的二重 Ito 积分项。Milstein(1974)的想法是——把它算出来补回去。对扩散系数 \(\sigma(X)\) 用 Ito 公式展开(注意这里又一次用到 §9.1.4 的 Ito 公式,它真的是"推导一切"的工具),可以证明那个二重积分等于

\[ \int_{t_k}^{t_{k+1}}\!\!\!\int_{t_k}^{s} \sigma(X_r)\sigma'(X_r)\,\mathrm{d}W_r\,\mathrm{d}W_s \;\approx\; \frac{1}{2}\sigma(X_k)\sigma'(X_k)\big[(\Delta W_k)^2 - \Delta t\big] \]

注意右边那个 \((\Delta W_k)^2 - \Delta t\)——它正是二次变差证明(§9.1.2.4 步骤 2)里反复出现的"零均值修正项"。补上后得到**一维 Milstein 格式**:

\[ \boxed{X_{k+1} = X_k + b(X_k)\Delta t + \sigma(X_k)\Delta W_k + \frac{1}{2}\sigma(X_k)\sigma'(X_k)\big[(\Delta W_k)^2 - \Delta t\big]} \]

收敛阶:Milstein 方法的**强收敛阶提升到 \(\gamma = 1\)**(弱阶仍为 \(1\))。也就是说,逐路径精度从 \(\sqrt{\Delta t}\) 提升到 \(\Delta t\)——这是质的飞跃。

对比表

方法 多出的项 强收敛阶 \(\gamma\) 弱收敛阶 \(\beta\) 需要 \(\sigma'\)
Euler-Maruyama —— \(1/2\) \(1\)
Milstein \(\frac{1}{2}\sigma\sigma'[(\Delta W)^2 - \Delta t]\) \(1\) \(1\)

[!IMPORTANT] 加性噪声时二者完全相同。当扩散系数 \(\sigma\) 是常数(不依赖状态),\(\sigma' = 0\),Milstein 修正项消失,Milstein 退化为 Euler-Maruyama。这与 §9.1.5.4 中"\(\sigma\) 为常数时 Ito = Stratonovich"是同一件事的两个侧面——常数扩散是最温顺的情形。机器人学里很多过程噪声模型(EKF 的 \(G\,\mathrm{d}W\)\(G\) 为常矩阵)正属此类,所以**这些场景下 Euler-Maruyama 已经是一阶强收敛的,无需 Milstein**。这解释了为什么 Euler-Maruyama 在工程中如此流行——它在最常见的加性噪声场景下并不"低人一等"。

Milstein 的代价:需要扩散系数的导数 \(\sigma'(x)\)。在高维(\(X \in \mathbb{R}^n\),多布朗源)情形,修正项涉及**所有布朗分量两两的二重积分**,其中"非对角"的二重积分(不同布朗运动 \(W^i, W^j\) 之间,称为 Lévy 面积)无法用 \(\Delta W\) 简单表示,必须额外采样——这使多维 Milstein 实现复杂且昂贵。这是它不如 Euler-Maruyama 普及的现实原因。

反事实:如果扩散系数 \(\sigma'\) 不存在(不可微,如 §9.1.6.4 的 Tanaka 方程 \(\sigma(x) = |x|^{1/2}\)),Milstein 方法直接失效,只能退回 Euler-Maruyama 或用导数自由的变体(用差商近似 \(\sigma'\))。

9.1.8.4 数值稳定性:步长不是越小越好,但太大会爆炸

问题:和刚性 ODE 一样,显式 Euler-Maruyama 对**强回复**的 SDE(如大 \(\theta\) 的 OU 过程)有稳定性上限。考虑 \(\mathrm{d}X = -\theta X\,\mathrm{d}t + \sigma\,\mathrm{d}W\),离散为

\[ X_{k+1} = (1 - \theta\Delta t)X_k + \sigma\sqrt{\Delta t}\,Z_k \]

漂移部分的放大因子是 \(|1 - \theta\Delta t|\)。要数值稳定(均方有界),需要 \(|1 - \theta\Delta t| < 1\),即

\[ \Delta t < \frac{2}{\theta} \]

如果 \(\theta = 100\)(强阻尼),步长必须小于 \(0.02\),否则解会发散震荡——和确定性刚性 ODE 的稳定性约束完全一致。

解决方案——半隐式(漂移隐式)格式:把漂移项取在终点(隐式),扩散项仍取起点(保持 Ito):

\[ X_{k+1} = X_k - \theta X_{k+1}\Delta t + \sigma\sqrt{\Delta t}\,Z_k \;\Longrightarrow\; X_{k+1} = \frac{X_k + \sigma\sqrt{\Delta t}\,Z_k}{1 + \theta\Delta t} \]

此时放大因子 \(1/(1+\theta\Delta t) < 1\) 对**任意** \(\Delta t > 0\) 都成立——无条件稳定。这与 ODE 中"后向 Euler 治刚性"完全平行。

[!WARNING] 陷阱 2(数值):对扩散项也取隐式

错误现象:你想让格式更稳定,于是把 \(\sigma\,\mathrm{d}W\) 项的 \(\sigma\) 也取在 \(X_{k+1}\) 上。结果模拟出的稳态方差系统性偏离理论值。

根本原因:对扩散项取终点(或中点)相当于把 Ito 积分悄悄变成了 Stratonovich 积分(§9.1.5)。两者差一个 \(\frac{1}{2}\sigma\sigma'\) 的 noise-induced drift——你以为在解 Ito SDE,实际解的是另一个方程。

正确做法:漂移项可以隐式(治刚性无害,因为漂移是 \(\mathrm{d}t\) 项),但**扩散项必须显式取左端点**,才能忠实于 Ito 约定。

9.1.8.5 代码:验证 Euler-Maruyama 与 Milstein 的收敛阶

import numpy as np

def convergence_order_test(n_paths=20000):
    """
    验证 Euler-Maruyama (强阶 1/2) vs Milstein (强阶 1) 的强收敛阶。

    测试方程: 几何布朗运动 dX = mu*X dt + sigma*X dW
    选它的原因: 有闭式解 X_t = X_0*exp((mu-sigma^2/2)t + sigma*W_t),
    可以在【同一布朗路径】下比较数值解与精确解 —— 这正是"强收敛"的定义。
    """
    mu, sigma, X0, T = 1.0, 0.5, 1.0, 1.0
    dt_list = [2**-k for k in range(3, 9)]   # 步长从 1/8 到 1/256

    print(f"{'dt':>10} {'EM 强误差':>14} {'Milstein 强误差':>16}")
    print("-" * 44)
    em_errs, mil_errs = [], []
    for dt in dt_list:
        N = int(T / dt)
        rng = np.random.default_rng(0)         # 固定种子 -> 同一族布朗路径
        # 用最细网格生成布朗增量,保证两种方法看到"同一条路径"
        dW = np.sqrt(dt) * rng.standard_normal((n_paths, N))
        W_T = dW.sum(axis=1)                    # 终点布朗值

        # 精确解(同一路径)
        X_exact = X0 * np.exp((mu - 0.5*sigma**2)*T + sigma*W_T)

        # Euler-Maruyama:   X += mu*X*dt + sigma*X*dW
        X_em = np.full(n_paths, X0)
        for k in range(N):
            X_em = X_em + mu*X_em*dt + sigma*X_em*dW[:, k]

        # Milstein:  额外 + 0.5*sigma*X*sigma*[(dW)^2 - dt]
        #            因为 g(x)=sigma*x => g'(x)=sigma => g*g' = sigma^2 * x
        X_mil = np.full(n_paths, X0)
        for k in range(N):
            X_mil = (X_mil + mu*X_mil*dt + sigma*X_mil*dW[:, k]
                     + 0.5*sigma**2*X_mil*(dW[:, k]**2 - dt))

        em_err  = np.mean(np.abs(X_em  - X_exact))
        mil_err = np.mean(np.abs(X_mil - X_exact))
        em_errs.append(em_err); mil_errs.append(mil_err)
        print(f"{dt:>10.5f} {em_err:>14.6f} {mil_err:>16.6f}")

    # 用对数-对数斜率估计收敛阶: error ~ C * dt^gamma => log(err) = gamma*log(dt)+c
    em_order  = np.polyfit(np.log(dt_list), np.log(em_errs),  1)[0]
    mil_order = np.polyfit(np.log(dt_list), np.log(mil_errs), 1)[0]
    print(f"\n拟合强收敛阶: Euler-Maruyama ~ {em_order:.3f} (理论 0.5)")
    print(f"             Milstein      ~ {mil_order:.3f} (理论 1.0)")

if __name__ == '__main__':
    convergence_order_test()

结果解读:对数-对数图上,Euler-Maruyama 的误差直线斜率约 \(0.5\),Milstein 约 \(1.0\)——直接验证了理论收敛阶。注意两点工程经验:(1) 同一布朗路径下比较才是"强收敛",若用不同随机种子比较只能看到"弱收敛",斜率会失真;(2) Milstein 的误差曲线明显低于 Euler-Maruyama,但每步多了一次乘法和一次平方——是否值得,取决于你要的精度和这是不是加性噪声。

9.1.8.6 练习

练习 9.1.18(⭐):对纯布朗运动 \(\mathrm{d}X = \mathrm{d}W\)\(b=0, \sigma=1\)),写出 Euler-Maruyama 和 Milstein 格式,说明二者为何完全相同。(提示:\(\sigma\) 是常数。)

练习 9.1.19(⭐⭐):对 \(\mathrm{d}X = -\theta X\,\mathrm{d}t + \sigma\,\mathrm{d}W\),推导显式 Euler-Maruyama 的均方稳定条件 \(\Delta t < 2/\theta\)。(提示:写出 \(\mathbb{E}[X_{k+1}^2]\) 关于 \(\mathbb{E}[X_k^2]\) 的递推,要求放大因子 \((1-\theta\Delta t)^2 < 1\)。)

练习 9.1.20(⭐⭐⭐ 跨节综合):用 §9.1.4.4 的 GBM 闭式解 \(S_t = S_0 e^{(\mu-\sigma^2/2)t+\sigma W_t}\) 作为"真值",手工推导 Milstein 修正项 \(\frac{1}{2}\sigma S\cdot\sigma\cdot[(\Delta W)^2-\Delta t]\)\(\sigma\sigma'\) 为何等于 \(\sigma^2 S\)(这里 \(g(S)=\sigma S\))。再解释:为什么对 GBM 这个修正能显著降低强误差,但对加性噪声 OU 过程却毫无作用?


§9.1.9 反向时间 SDE 与概率流 ODE ⭐⭐⭐

§9.1.7.4 我们已经瞥见了 Anderson 反向 SDE——它是 Diffusion 模型的数学心脏。但那里只给了公式没给来历。本节补上这条关键链路:给定一个把数据"打碎成噪声"的前向 SDE,如何严格地构造一个把噪声"还原成数据"的反向过程? 这是连接本章全部理论与现代生成模型(深度学习数学/40_Diffusion_Models数学)、乃至 Diffusion Policy 机器人决策的桥梁。

9.1.9.1 动机:时间能不能倒流?

问题场景:VP-SDE 前向过程 \(\mathrm{d}X_t = -\frac{1}{2}\beta(t)X_t\,\mathrm{d}t + \sqrt{\beta(t)}\,\mathrm{d}W_t\) 把任意数据分布 \(p_0 = p_{\text{data}}\)\(t\to T\) 时刻碾成 \(\mathcal{N}(0,I)\)。生成模型想做的是反过来:从 \(\mathcal{N}(0,I)\) 采一个噪声,沿时间倒退回到 \(p_{\text{data}}\),得到一张新图 / 一条新机器人轨迹。

反面——朴素地"反向跑"为什么不行? 一个天真的想法:把前向 SDE 的时间反一下、\(\mathrm{d}t\)\(-\mathrm{d}t\)。但这立刻撞上 §9.1.2.5 的铁律——布朗运动处处不可微、无方向性\(\mathrm{d}W_t\) 没有"反向"的概念(它的增量独立于过去,倒过来看就独立于未来,但绝不是简单变号)。更根本地,前向扩散是**不可逆的信息销毁**:两个不同的数据点经过加噪可能变成几乎一样的噪声,光看噪声无法知道它原来是谁。要"还原",必须额外注入信息——这个信息就是 score 函数 \(\nabla_x\log p_t(x)\),它告诉你"在当前噪声水平下,数据更可能在哪个方向"。

历史:Anderson(1982)在一篇纯随机分析的论文里证明了反向时间扩散的存在性,当时与机器学习毫无关系。三十多年后,Song et al.(ICLR 2021)发现整个 score-based 生成模型恰好就是 Anderson 定理的应用,一举统一了 score matching 与 DDPM——这是"老数学突然成为新 AI 引擎"的经典案例。

9.1.9.2 Anderson 反向时间 SDE

定理(Anderson 1982):设前向 Ito SDE 为

\[ \mathrm{d}X_t = b(X_t, t)\,\mathrm{d}t + \sigma(t)\,\mathrm{d}W_t, \quad t \in [0, T] \]

其时刻 \(t\) 的边际密度为 \(p_t(x)\)。则存在一个**反向时间** SDE,使得反向过程 \(\bar{X}_t\)(从 \(t=T\)\(t=0\) 演化)与前向过程具有**完全相同的边际分布** \(p_t\)

\[ \boxed{\mathrm{d}\bar{X}_t = \Big[\,b(\bar{X}_t, t) - \sigma^2(t)\,\nabla_x \log p_t(\bar{X}_t)\,\Big]\mathrm{d}t + \sigma(t)\,\mathrm{d}\bar{W}_t} \]

其中 \(\bar{W}_t\) 是反向时间的布朗运动,\(\mathrm{d}t\) 在这里取负方向(从 \(T\)\(0\))。

逐项拆解(理论-工程桥接):

含义 在 Diffusion 中由谁提供
\(b(\bar{X}_t,t)\) 原前向漂移(已知解析式) 直接照搬,无需学习
\(-\sigma^2\nabla_x\log p_t\) 额外的"去噪"漂移,指向高密度区 \(\nabla\log p_t\) 即 score,由神经网络 \(s_\theta\) 学习
\(\sigma\,\mathrm{d}\bar{W}_t\) 反向扩散(继续注入随机性,保证多样性) 采样时现场生成

本质洞察:反向 SDE 比前向 SDE 多出的唯一新东西是 score 项 \(-\sigma^2\nabla_x\log p_t\)。它扮演"指南针"——前向扩散让粒子盲目随机游走、远离数据流形;score 项在每一步把粒子往"数据更可能在的地方"推一把。整个 Diffusion 模型的训练,本质上**只是在学这一个指南针**(score matching),其余的 \(b\)\(\sigma\) 都是设计时就定死的已知量。这把"生成一张图"这件玄乎的事,还原成了"估计一个梯度场"的回归问题。

9.1.9.3 概率流 ODE:去掉随机性的"孪生"轨迹

Anderson 反向 SDE 仍含随机项 \(\mathrm{d}\bar{W}_t\),每次采样轨迹都不同。Song et al.(2021)进一步证明了一个惊人结果:存在一个完全确定性的 ODE,与前向/反向 SDE 共享完全相同的边际密度 \(p_t\)

\[ \boxed{\frac{\mathrm{d}X_t}{\mathrm{d}t} = b(X_t, t) - \frac{1}{2}\sigma^2(t)\,\nabla_x \log p_t(X_t)} \]

这称为**概率流常微分方程**(probability-flow ODE)。它与反向 SDE 的唯一差别是 score 项的系数从 \(\sigma^2\) 变成 \(\frac{1}{2}\sigma^2\),并且**没有 \(\mathrm{d}W\) 项**。

为什么系数恰好减半? 这不是凑出来的,而是 Fokker-Planck 方程(§9.1.7)的直接推论。回顾前向 SDE 的 Fokker-Planck:

\[ \partial_t p_t = -\nabla\cdot(b\,p_t) + \frac{1}{2}\nabla\cdot\big(\sigma^2\nabla p_t\big) \]

关键技巧——把扩散项改写成一个"伪输运"形式。利用恒等式 \(\nabla p_t = p_t\,\nabla\log p_t\)(对数导数),

\[ \frac{1}{2}\nabla\cdot(\sigma^2\nabla p_t) = \frac{1}{2}\nabla\cdot\big(\sigma^2 p_t\,\nabla\log p_t\big) = \nabla\cdot\Big(\underbrace{\tfrac{1}{2}\sigma^2\nabla\log p_t}_{\text{当作漂移}}\,p_t\Big) \]

代回 Fokker-Planck:

\[ \partial_t p_t = -\nabla\cdot\Big(\big[\,b - \tfrac{1}{2}\sigma^2\nabla\log p_t\,\big]\,p_t\Big) \]

这是一个**纯输运方程**(Liouville 方程,§9.1.7.1 提到的 ODE 密度演化方程!)——没有扩散项了。而 Liouville 方程 \(\partial_t p = -\nabla\cdot(v\,p)\) 恰好描述确定性 ODE \(\dot{X} = v(X,t)\) 的密度演化,其速度场就是 \(v = b - \frac{1}{2}\sigma^2\nabla\log p_t\)。这就证明了概率流 ODE 与 SDE 共享边际密度,且解释了系数 \(\frac{1}{2}\) 的来历。\(\square\)

本质洞察:同一族边际分布 \(p_t\) 可以由**无穷多条不同的动力学**实现——随机的反向 SDE 是一条,确定性的概率流 ODE 是另一条,二者只是 score 项系数不同。这揭示了一个深刻事实:"分布如何演化"(Fokker-Planck)与"个体如何运动"(SDE/ODE 轨迹)是两个层次,前者不唯一地决定后者。Diffusion 采样既可以"掷骰子"(SDE,多样性好),也可以"走直线"(ODE,快且可复现、可算精确似然)。

三种视角对照(系统性分类):

视角 方程 随机性 机器人 / 生成中的用途
前向 SDE \(\mathrm{d}X = b\,\mathrm{d}t + \sigma\,\mathrm{d}W\) 训练时加噪(已知,免学习)
反向 SDE (Anderson) \(\mathrm{d}\bar X = (b-\sigma^2\nabla\log p)\mathrm{d}t + \sigma\,\mathrm{d}\bar W\) 采样,多样性高(DDPM 采样器)
概率流 ODE (Song) \(\dot X = b - \frac{1}{2}\sigma^2\nabla\log p\) 快速采样、精确似然、DDIM、可复现

[!IMPORTANT] 直达机器人:在 Diffusion Policy(机器人模仿学习的主流范式)中,"数据"不是图片而是**动作序列轨迹**。前向 SDE 把专家演示轨迹打成噪声训练 score 网络;部署时用反向 SDE 或概率流 ODE 从噪声生成一段可执行的机器人动作。实时控制偏爱**概率流 ODE**——确定性、步数少(可用高阶 ODE 求解器,回看 §9.1.8 的数值方法在这里直接复用)、延迟低且每次给出可复现的动作,这对安全攸关的机器人至关重要。

9.1.9.4 练习

练习 9.1.21(⭐⭐):对标准布朗运动 \(\mathrm{d}X = \mathrm{d}W\)\(b=0,\sigma=1\)),其密度 \(p_t = \mathcal{N}(0,t)\)。计算 score \(\nabla_x\log p_t(x)\),写出对应的概率流 ODE,并说明它是一个简单的线性 ODE。

练习 9.1.22(⭐⭐⭐):用 §9.1.7 的对数导数技巧 \(\nabla p = p\nabla\log p\),从 OU 过程的 Fokker-Planck 方程出发,推导其概率流 ODE。验证当 \(p_t\) 取稳态 \(\mathcal{N}(0,\sigma^2/2\theta)\) 时,ODE 速度场为零(稳态不动)。

练习 9.1.23(⭐⭐⭐⭐ 研究级 / 跨章综合):综合 §9.1.4(VP-SDE 闭式转移核)、§9.1.7(Fokker-Planck)、本节(反向 SDE)三处知识,论证:为什么 Diffusion 训练时不需要知道 \(\nabla\log p_t(x)\)(边际 score,难算),只需知道 \(\nabla\log p_t(x\mid x_0)\)(条件 score,因为 \(p_t(\cdot\mid x_0)\) 是你在 §9.1.4.4 求过的高斯,闭式可算)?提示:用 \(\nabla\log p_t(x) = \mathbb{E}_{x_0\sim p(x_0\mid x_t)}[\nabla\log p_t(x\mid x_0)]\) 与去噪 score matching 的等价性。


§9.1.10 与机器人估计与控制的深度关联 ⭐⭐⭐

本章开篇承诺过:SDE 不是抽象数学,而是机器人过程噪声、滤波、采样控制的统一语言。前面各节已零散地连接了 EKF、Diffusion、MPPI;本节把这些线索收拢,**系统性地**展示随机微积分如何贯穿机器人的"估计—控制—学习"三大支柱。这也是本章"理论-工程桥接"(R6-D)的总成。

9.1.10.1 连续时间滤波:从 SDE 到 Kalman-Bucy 滤波

动机:你在 纯数学基础 / 机器人状态估计 章节学过离散卡尔曼滤波——"预测-更新"两步循环。但传感器(IMU、编码器)和动力学本质是连续时间的,离散滤波是对连续问题的采样近似。连续时间的最优滤波长什么样? 答案是 Kalman-Bucy 滤波(Kalman & Bucy 1961),它把整个滤波器写成一个 SDE + 一个矩阵 ODE。

问题设置:线性系统的状态和观测都由 SDE 驱动:

\[ \mathrm{d}X_t = F X_t\,\mathrm{d}t + G\,\mathrm{d}W_t \quad(\text{状态}), \qquad \mathrm{d}Y_t = H X_t\,\mathrm{d}t + \,\mathrm{d}V_t \quad(\text{观测}) \]

其中 \(W_t, V_t\) 是独立布朗运动(过程噪声谱密度 \(Q\)、观测噪声谱密度 \(R\))。这里观测写成 \(\mathrm{d}Y_t = HX_t\,\mathrm{d}t + \mathrm{d}V_t\)——它的"导数"\(\dot Y = HX + \dot V\) 就是"信号 + 白噪声",正是 §9.1.2.1 中"白噪声只能在积分意义下定义"的又一次体现。

Kalman-Bucy 滤波方程:最优估计 \(\hat{X}_t = \mathbb{E}[X_t\mid \mathcal{F}_t^Y]\)(给定到 \(t\) 为止的观测历史)满足

\[ \boxed{\mathrm{d}\hat{X}_t = F\hat{X}_t\,\mathrm{d}t + K_t\big(\mathrm{d}Y_t - H\hat{X}_t\,\mathrm{d}t\big), \qquad K_t = P_t H^\top R^{-1}} \]

其中误差协方差 \(P_t = \mathbb{E}[(X_t-\hat X_t)(X_t-\hat X_t)^\top]\) 满足**矩阵 Riccati 微分方程**:

\[ \boxed{\dot{P}_t = F P_t + P_t F^\top - P_t H^\top R^{-1} H P_t + G Q G^\top} \]

逐项的物理意义(理论-工程桥接):

含义 直觉
\(F\hat X_t\,\mathrm{d}t\) 模型预测漂移 "按动力学外推"
\(\mathrm{d}Y_t - H\hat X_t\,\mathrm{d}t\) 新息(innovation) "实测与预测之差"——新信息
\(K_t = P_tH^\top R^{-1}\) 卡尔曼增益 信预测还是信观测的权衡
\(FP+PF^\top\) 协方差被动力学传播 不确定性随时间漂移
\(-PH^\top R^{-1}HP\) 观测带来的**信息增益** 测量降低不确定性(二次项!)
\(GQG^\top\) 过程噪声注入 不确定性的源头

与离散 EKF 的对照(多视角理解):

离散 Kalman 连续 Kalman-Bucy
结构 预测 + 更新两步交替 单个 SDE,无显式两步
增益 \(K_k = P_k^- H^\top(HP_k^-H^\top+R)^{-1}\) \(K_t = P_tH^\top R^{-1}\)(无 \(H P H^\top\) 项)
协方差 离散 Riccati 递推 连续 Riccati ODE
数值求解 直接递推 \(P\) 用 ODE 积分(纯数学基础/120_常微分方程!)

本质洞察:连续与离散 Riccati 方程"几乎等价,差在一个时间反演"——这呼应了滤波与 LQR 最优控制的**对偶性**(Kalman 1960 的另一重大发现)。滤波的 Riccati 向前积分(不确定性随时间累积又被观测压缩),LQR 的 Riccati 向后积分(代价从终端向初始回溯)。同一个矩阵方程,正着读是估计,反着读是控制。

[!TIP] 机器人实践:实际机器人代码里几乎都用**离散** EKF/UKF(因为传感器是采样的、计算机是离散的)。但理解 Kalman-Bucy 的价值在于:(1) 它揭示了增益、Riccati 方程的连续时间本质,让你明白离散公式是怎么来的;(2) 高频传感器(如 1kHz IMU)下,连续-离散滤波(连续预测 + 离散更新)比纯离散更准;(3) 它是更高级的连续滤波(如针对非线性的 Kushner-Stratonovich 方程、Zakai 方程,已在 §9.1.5.4 表格中出现)的基础。

9.1.10.2 采样型控制:MPPI 与路径积分

动机:机器人最优控制要解 Hamilton-Jacobi-Bellman(HJB)方程——一个非线性 PDE,高维下"维数灾难"无法网格求解。能不能像 Diffusion 用采样代替求解那样,用 Monte Carlo 采样轨迹来近似最优控制? 这就是路径积分控制 / MPPI(Model Predictive Path Integral,Williams et al. 2017)的核心思想,如今是机器人(自动驾驶、四足、机械臂)实时控制的主力之一。

与本章的连接点:MPPI 把系统动力学建模为受控 SDE

\[ \mathrm{d}X_t = \big(f(X_t) + G u_t\big)\mathrm{d}t + G\,\sqrt{\nu}\,\mathrm{d}W_t \]

控制 \(u_t\) 进入漂移项,噪声进入扩散项。算法做的事:从当前状态采样**大量**带噪控制轨迹(每条就是一次 Euler-Maruyama 模拟,§9.1.8 的方法在此直接复用),算每条轨迹的累积成本 \(S(\tau)\),然后用成本加权平均得到最优控制更新:

\[ u_t^* = \frac{\sum_{k} \exp\!\big(-\frac{1}{\lambda}S(\tau_k)\big)\,\delta u_t^k}{\sum_{k}\exp\!\big(-\frac{1}{\lambda}S(\tau_k)\big)} \]

即"成本越低的采样轨迹,权重越大"——一个 softmax 形式的加权。

为什么采样能解 HJB? 这背后是**路径积分理论**与 Feynman-Kac 公式(本章后续规划的"随机分析·Feynman-Kac"章):通过对值函数做对数变换 \(V = -\lambda\log\psi\),非线性 HJB PDE 被**线性化**为一个线性 PDE,而线性 PDE 的解可由 Feynman-Kac 公式表示成"受控 SDE 轨迹上某泛函的期望"——期望可以用 Monte Carlo 采样估计。这正是 §9.1.8.2 中"弱收敛足矣"的典型应用:我们只关心成本的**期望**,不关心单条轨迹精度,所以 Euler-Maruyama 的弱一阶收敛绰绰有余。

本质洞察:MPPI 和 Diffusion 采样在数学上是**同一枚硬币的两面**——都是"用 SDE 的 Monte Carlo 模拟,把一个本来要解 PDE(HJB / Fokker-Planck)的难题,转化为采样求期望的易题"。Diffusion 采样反向 SDE 生成数据,MPPI 采样受控 SDE 生成控制。理解了本章的 Ito 积分 + Euler-Maruyama + Fokker-Planck,你就同时握住了这两个现代机器人算法的钥匙。

MPPI 的边界(语言精确性,标注类比失效处):路径积分控制并非万能——它**只对 HJB 可被对数变换线性化的一类问题严格最优**,要求控制代价与噪声协方差满足特定匹配条件(\(G\) 同时出现在控制和噪声通道)。Williams 等用信息论的 KL 散度/自由能对偶给出了更宽松的启发式推导,使 MPPI 可用于更一般的成本,但此时它是"合理的近似"而非"严格最优"。不要把"MPPI = 最优控制"这个类比无限延伸。

9.1.10.3 三大支柱的统一图景

把本章对机器人的贡献收拢成一张表(系统性分类):

机器人支柱 用到的 SDE 工具 本章对应节 代表算法
建模 布朗运动作过程噪声、\((\mathrm{d}W)^2=\mathrm{d}t\) §9.1.2 连续时间动力学 + 噪声
估计 Ito 积分、鞅、Kalman-Bucy、Riccati §9.1.3, §9.1.10.1 EKF/UKF、连续-离散滤波
控制 受控 SDE、Euler-Maruyama 采样、HJB/Feynman-Kac §9.1.8, §9.1.10.2 MPPI、路径积分控制
学习/决策 反向 SDE、概率流 ODE、Fokker-Planck、score §9.1.7, §9.1.9 Diffusion Policy、Score SDE

[!IMPORTANT] 一句话总览:随机微积分是机器人"在不确定性下感知与行动"的统一数学语言。布朗运动**是噪声的原子;**Ito 积分/公式**是操作它的语法;**Fokker-Planck 在分布层面描述演化;而 Kalman-Bucy(估计)、MPPI(控制)、Diffusion(学习) 是这门语言写出的三篇代表作。本章学完,这三者对你不再是孤立的"技巧",而是同一理论的不同投影。

9.1.10.4 练习

练习 9.1.24(⭐⭐⭐):写出标量 Kalman-Bucy 滤波(\(F=-a, H=1, G=1\),常数 \(Q,R\))的 Riccati ODE,求其稳态解 \(P_\infty\)(令 \(\dot P=0\) 解二次方程),并解释稳态增益 \(K_\infty = P_\infty/R\) 的物理意义。

练习 9.1.25(⭐⭐⭐⭐ 跨章综合):对比 MPPI 的成本加权 \(\propto e^{-S(\tau)/\lambda}\) 与 Diffusion 反向 SDE 的 score 项 \(\nabla\log p_t\)。论证两者都可写成"对一族 SDE 轨迹的期望/加权",并说明它们各自把哪个 PDE(HJB vs Fokker-Planck)转化成了采样问题。


§9.1.11 本章小结

知识点总结表

概念 难度 核心公式 与 ODE 的对比 下游应用
布朗运动 \(W_t\) ⭐⭐ \(W_t \sim \mathcal{N}(0,t)\),独立增量 -- 一切随机微积分的基础
二次变差 ⭐⭐ \([W]_t = t\)\((\mathrm{d}W)^2 = \mathrm{d}t\) ODE: \((\mathrm{d}t)^2 = 0\) Ito 公式的来源
Ito 积分 ⭐⭐ \(I(H) = \int H\,\mathrm{d}W\)\(\mathbb{E}[I^2] = \mathbb{E}[\int H^2\,\mathrm{d}t]\) Riemann-Stieltjes 积分 SDE 的定义
Ito 公式 \(\mathrm{d}f = f'\mathrm{d}X + \frac{1}{2}f''\sigma^2\mathrm{d}t\) 普通链式法则(无二阶项) 求解 SDE、推导 FP
Ito 乘法表 \(\mathrm{d}W \cdot \mathrm{d}W = \mathrm{d}t\), 其余 \(= 0\) \(\mathrm{d}t \cdot \mathrm{d}t = 0\) 快速计算
Ito vs Stratonovich ⭐⭐ 修正项 \(\frac{1}{2}\sigma\sigma'\) -- 选择建模约定
SDE 存在唯一性 ⭐⭐⭐ Lipschitz + 线性增长 Picard-Lindelof 保证模型良定义
Fokker-Planck ⭐⭐ \(\partial_t p = -\nabla\cdot(bp) + \frac{1}{2}\nabla^2(\sigma^2 p)\) Liouville 方程(仅输运项) Score SDE, Anderson

核心思想流

布朗运动 W_t
  |
  |--- 路径连续但处处不可微
  |     \--- 二次变差 [W]_t = t != 0
  |           \--- (dW)^2 = dt:Taylor 展开需保留二阶项
  |
  |--- 无界变差 ---> Riemann-Stieltjes 积分不适用
  |     \--- Ito 积分(左端点 + L^2 扩张)
  |           \--- Ito 等距:||I(H)||^2 = ||H||^2
  |
  \--- Ito 公式 = 普通链式法则 + 修正项 (1/2)f''*sigma^2*dt
        |--- 求解 SDE(GBM, OU, VP-SDE)
        \--- Fokker-Planck 方程(轨迹 --> 密度)
              \--- Anderson 反向 SDE ---> Diffusion Models (深度学习数学/40_Diffusion_Models数学)

常见陷阱汇总

# 陷阱 正确做法
1 \(\mathrm{d}W\)\(\mathrm{d}t\),用普通链式法则 必须用 Ito 公式,保留 \(\frac{1}{2}f''\sigma^2\mathrm{d}t\)
2 忘记 Ito 积分的适应性要求 被积函数必须取**左端点**值(\(\mathcal{F}_{t_i}\)-可测)
3 GBM 中漏掉 Ito 修正 \(-\sigma^2/2\) \(S_t = S_0 e^{(\mu - \sigma^2/2)t + \sigma W_t}\),不是 \(e^{\mu t + \sigma W_t}\)
4 混淆 Ito 和 Stratonovich 明确声明使用哪种约定,需要时用转换公式
5 以为布朗运动可微 路径处处不可微,\(\mathrm{d}W/\mathrm{d}t\) 不存在
6 SDE 存在性只需 Lipschitz 还需**线性增长条件**(ODE 不需要是因为紧集自动有界)
7 数值布朗增量写成 \(\Delta t\,Z\) 必须 \(\sqrt{\Delta t}\,Z\),否则方差量纲错(\(\Delta t^2\) vs \(\Delta t\)
8 误以为 Milstein 总比 Euler-Maruyama 强 加性噪声(\(\sigma\) 常数)时 \(\sigma'=0\),二者完全相同
9 数值格式对扩散项取隐式/中点 悄悄变成 Stratonovich,引入 \(\frac12\sigma\sigma'\) 偏差;扩散项须显式左端点
10 把反向时间 SDE 当作"前向 \(\mathrm{d}t\) 变号" 必须额外加 score 项 \(-\sigma^2\nabla\log p_t\),否则无法还原数据
11 把 Diffusion 训练当作"学整个生成过程" 只学一个 score 场 \(\nabla\log p_t\)\(b,\sigma\) 都是设计时已知量

本章常见误解汇总

# 常见误解 正确理解
1 "SDE 就是带噪声的 ODE,用 ODE 直觉即可" 噪声的二次变差非零(\((\mathrm{d}W)^2=\mathrm{d}t\))从根本上改变了微积分规则——链式法则要加二阶项,路径不可微,无"速度"概念
2 "Ito 积分和 Riemann 积分一样,取样点无所谓" 取样点本质重要:左端点给 Ito(鞅),中点给 Stratonovich(普通链式法则),二者差一个 \(O(\mathrm{d}t)\)
3 "\(\mathbb{E}[\int H\,\mathrm{d}W]=0\) 是因为 \(\mathrm{d}W\) 均值为零,跟 \(H\) 无关" 关键是 \(H\) 的**适应性**(不能预见未来 \(\mathrm{d}W\))。若 \(H\) 可偷看未来,期望未必为零——这正是鞅性的来源
4 "Stratonovich 更自然(链式法则不变),所以更好" 各有所长:Ito 的鞅性便于概率/滤波计算,Stratonovich 的坐标不变性便于物理建模与流形 SDE。机器人文献默认 Ito
5 "数值步长越小,模拟一定越准" 强阻尼 SDE 有稳定性上限 \(\Delta t<2/\theta\),太大发散;显式格式还受刚性约束。精度与稳定性是两回事
6 "Fokker-Planck 是另一套理论,与 Ito 公式无关" Fokker-Planck 正是对测试函数用 Ito 公式取期望、再分部积分推出来的——它是 Ito 公式的直接推论
7 "反向 SDE 和概率流 ODE 是两种不同的模型" 二者共享**完全相同的边际分布** \(p_t\),只是 score 项系数 \(\sigma^2\) vs \(\frac12\sigma^2\)、有无 \(\mathrm{d}W\) 的区别——同一分布演化的两种实现
8 "MPPI、Kalman 滤波、Diffusion 是三个无关的算法" 都是随机微积分的应用:估计(Kalman-Bucy/Ito 积分)、控制(MPPI/受控 SDE 采样)、学习(Diffusion/反向 SDE),共享同一套语言

§9.1.12 累积项目:随机动力学模拟器

项目定位:本章实现核心组件,后续章节将扩展(添加 Milstein 方法、多维 SDE、Fokker-Planck 数值解等)。

本章实现目标: 1. 布朗运动模拟器(含二次变差数值验证) 2. Euler-Maruyama SDE 求解器 3. OU 过程和 GBM 的模拟与解析解对比

"""
stochastic_dynamics.py — 随机动力学模拟器 (随机分析/10_随机微分方程基础 累积项目)

本模块实现:
  1. 布朗运动 (Wiener 过程) 模拟
  2. Euler-Maruyama SDE 求解器
  3. 二次变差的数值验证
  4. OU 过程模拟与解析解对比

后续章节将扩展:Milstein 方法、多维 SDE、Fokker-Planck 数值解。
"""

import numpy as np
from typing import Callable, Optional, Tuple


# ============================================================
# 1. 布朗运动模拟器
# ============================================================

def brownian_motion(T: float, n_steps: int, n_paths: int = 1,
                    seed: Optional[int] = None) -> Tuple[np.ndarray, np.ndarray]:
    """
    模拟标准一维布朗运动。

    原理: W_0 = 0, W_{t_{k+1}} = W_{t_k} + sqrt(dt) * Z_k, Z_k ~ N(0,1)

    参数:
        T: 终止时间
        n_steps: 时间步数
        n_paths: 模拟路径数
        seed: 随机种子 (可选)

    返回:
        t: 时间网格, shape (n_steps+1,)
        W: 布朗运动路径, shape (n_paths, n_steps+1)
    """
    if seed is not None:
        np.random.seed(seed)

    dt = T / n_steps
    t = np.linspace(0, T, n_steps + 1)

    # dW_i ~ N(0, dt)
    dW = np.sqrt(dt) * np.random.randn(n_paths, n_steps)

    # W_0 = 0, W_{k+1} = W_k + dW_k (cumulative sum)
    W = np.zeros((n_paths, n_steps + 1))
    W[:, 1:] = np.cumsum(dW, axis=1)

    return t, W


def verify_quadratic_variation(T: float, n_steps: int,
                                n_paths: int = 10000) -> dict:
    """
    数值验证 [W]_T = T。

    计算 Q_n = sum_i (W_{t_{i+1}} - W_{t_i})^2 并与 T 比较。
    理论: E[Q_n] = T, Var[Q_n] = 2*T^2/n

    返回:
        字典包含 mean_qv, std_qv, theoretical (= T), relative_error
    """
    t, W = brownian_motion(T, n_steps, n_paths)
    dW = np.diff(W, axis=1)  # (n_paths, n_steps)

    # 二次变差 = sum of squared increments
    qv = np.sum(dW**2, axis=1)  # (n_paths,)

    return {
        'mean_qv': np.mean(qv),
        'std_qv': np.std(qv),
        'theoretical': T,
        'relative_error': abs(np.mean(qv) - T) / T,
        'theory_std': np.sqrt(2 * T**2 / n_steps)
    }


# ============================================================
# 2. Euler-Maruyama SDE 求解器
# ============================================================

def euler_maruyama(
    drift: Callable[[float, np.ndarray], np.ndarray],
    diffusion: Callable[[float, np.ndarray], np.ndarray],
    x0: np.ndarray,
    T: float,
    n_steps: int,
    n_paths: int = 1,
    seed: Optional[int] = None
) -> Tuple[np.ndarray, np.ndarray]:
    """
    Euler-Maruyama 方法求解标量/向量 SDE:
        dX_t = drift(t, X_t) dt + diffusion(t, X_t) dW_t

    这是 SDE 的最基本数值方法,类比 ODE 的前向 Euler 法:
        X_{k+1} = X_k + b(t_k, X_k) * dt + sigma(t_k, X_k) * sqrt(dt) * Z_k

    收敛阶: 强 O(sqrt(dt)), 弱 O(dt)

    参数:
        drift: b(t, x) 漂移函数, 输入 (t: float, x: (n_paths, d)) -> (n_paths, d)
        diffusion: sigma(t, x) 扩散函数, 同上
        x0: 初始值, shape (d,)
        T: 终止时间
        n_steps: 时间步数
        n_paths: 模拟路径数
        seed: 随机种子

    返回:
        t: 时间网格, shape (n_steps+1,)
        X: 解的路径, shape (n_paths, n_steps+1, d)
    """
    if seed is not None:
        np.random.seed(seed)

    d = len(x0)
    dt = T / n_steps
    sqrt_dt = np.sqrt(dt)
    t = np.linspace(0, T, n_steps + 1)

    X = np.zeros((n_paths, n_steps + 1, d))
    X[:, 0, :] = x0

    for i in range(n_steps):
        Z = np.random.randn(n_paths, d)          # 标准正态
        b = drift(t[i], X[:, i, :])               # (n_paths, d)
        sigma = diffusion(t[i], X[:, i, :])        # (n_paths, d)
        X[:, i+1, :] = X[:, i, :] + b * dt + sigma * sqrt_dt * Z

    return t, X


# ============================================================
# 3. 示例: OU 过程
# ============================================================

def ou_process_demo():
    """
    OU 过程: dX = -theta * X * dt + sigma * dW

    解析解:
        X_t = x0 * exp(-theta*t) + sigma * int_0^t exp(-theta*(t-s)) dW_s
        E[X_t] = x0 * exp(-theta*t)
        Var[X_t] = sigma^2 / (2*theta) * (1 - exp(-2*theta*t))
        稳态分布: N(0, sigma^2 / (2*theta))
    """
    theta = 1.0
    sigma = 0.5
    x0 = np.array([2.0])
    T = 5.0
    n_steps = 5000
    n_paths = 10000

    drift = lambda t, x: -theta * x
    diffusion = lambda t, x: sigma * np.ones_like(x)

    t, X = euler_maruyama(drift, diffusion, x0, T, n_steps, n_paths, seed=42)
    X = X[:, :, 0]  # (n_paths, n_steps+1)

    # 解析解
    mean_exact = x0[0] * np.exp(-theta * t)
    var_exact = sigma**2 / (2 * theta) * (1 - np.exp(-2 * theta * t))

    # 数值统计
    mean_num = np.mean(X, axis=0)
    var_num = np.var(X, axis=0)

    print("=== OU 过程验证 ===")
    print(f"t={T:.1f}: 均值  解析={mean_exact[-1]:.6f}, 数值={mean_num[-1]:.6f}")
    print(f"t={T:.1f}: 方差  解析={var_exact[-1]:.6f}, 数值={var_num[-1]:.6f}")
    print(f"稳态方差 (理论): sigma^2/(2*theta) = {sigma**2/(2*theta):.6f}")


# ============================================================
# 4. 示例: 几何布朗运动 (GBM)
# ============================================================

def gbm_demo():
    """
    GBM: dS = mu * S * dt + sigma_gbm * S * dW

    解析解 (由 Ito 公式推导):
        S_t = S_0 * exp((mu - sigma^2/2) * t + sigma * W_t)

    注意 Ito 修正项 -sigma^2/2 !

    统计量:
        E[S_t] = S_0 * exp(mu * t)
        Var[S_t] = S_0^2 * exp(2*mu*t) * (exp(sigma^2*t) - 1)
    """
    mu = 0.1
    sigma_gbm = 0.3
    s0 = np.array([1.0])
    T = 2.0
    n_steps = 2000
    n_paths = 10000

    drift = lambda t, x: mu * x
    diffusion = lambda t, x: sigma_gbm * x

    t, S = euler_maruyama(drift, diffusion, s0, T, n_steps, n_paths, seed=123)
    S = S[:, :, 0]

    # E[S_t] = S_0 * exp(mu * t)
    # 注意: 不是 exp((mu - sigma^2/2)*t), 因为 E[exp(sigma*W_t)] = exp(sigma^2*t/2)
    mean_exact = s0[0] * np.exp(mu * t)
    mean_num = np.mean(S, axis=0)

    print("\n=== GBM 验证 ===")
    print(f"t={T:.1f}: E[S_T]  解析={mean_exact[-1]:.6f}, 数值={mean_num[-1]:.6f}")
    print(f"注意: 每条路径增长率是 mu - sigma^2/2 = {mu - sigma_gbm**2/2:.4f}")
    print(f"  但 E[S_t] 增长率是 mu = {mu:.4f}")
    print(f"  差异源自 Jensen 不等式: E[exp(X)] >= exp(E[X])")


# ============================================================
# 5. 二次变差验证
# ============================================================

def quadratic_variation_demo():
    """验证 [W]_T = T, 展示 Var[Q_n] = 2T^2/n 的收敛"""
    T = 1.0
    print("=== 二次变差 [W]_T = T 验证 ===")
    print(f"{'n_steps':>10} {'E[QV]':>12} {'Std[QV]':>12} "
          f"{'理论Std':>12} {'相对误差':>12}")
    print("-" * 62)

    for n_steps in [10, 100, 1000, 10000]:
        result = verify_quadratic_variation(T, n_steps, n_paths=5000)
        print(f"{n_steps:>10} {result['mean_qv']:>12.6f} "
              f"{result['std_qv']:>12.6f} {result['theory_std']:>12.6f} "
              f"{result['relative_error']:>12.2e}")

    print(f"\n理论值: [W]_{T} = {T}")
    print("Std[QV] ~ sqrt(2*T^2/n), 体现了 Var[Q_n] = 2T^2/n 的理论结果")


# ============================================================
# 运行全部演示
# ============================================================

if __name__ == '__main__':
    quadratic_variation_demo()
    ou_process_demo()
    gbm_demo()

运行结果解读

  1. 二次变差验证:随着 n_steps 增大,\(Q_n = \sum (\Delta W_i)^2\) 的均值趋近 \(T\),标准差以 \(O(1/\sqrt{n})\) 衰减——正如我们证明的 \(\mathrm{Var}[Q_n] = 2T^2/n\)

  2. OU 过程:数值解的均值和方差与解析解吻合(相对误差应小于 1%),验证了 Euler-Maruyama 方法和 Ito 公式推导的正确性。均值指数衰减到零,方差趋近稳态值 \(\sigma^2/(2\theta)\)

  3. GBM:注意 \(\mathbb{E}[S_t] = S_0 e^{\mu t}\)(不含 Ito 修正),但**每条路径**的"典型"增长率是 \(\mu - \sigma^2/2 < \mu\)。两者的差异源于 Jensen 不等式 \(\mathbb{E}[e^X] \geq e^{\mathbb{E}[X]}\)——这个反直觉的结果正是 Ito 修正的直接体现。

后续章节将扩展:本章实现了布朗运动、二次变差验证、Euler-Maruyama 求解器与 OU/GBM 验证。基于 §9.1.8 的新内容,下一步可加入 Milstein 求解器(一维已在 §9.1.8.5 给出收敛阶验证代码,可整合进模拟器类)、半隐式稳定格式(§9.1.8.4,治刚性 SDE)、以及 Fokker-Planck 有限差分数值解(§9.1.7,从轨迹密度直接求 PDE)。再往后是多维 SDE、概率流 ODE 采样器(§9.1.9),逐步逼近一个可服务于 Diffusion Policy 与 MPPI 的完整随机动力学工具箱。


§9.1.13 符号表

本章新引入的数学符号汇总(按首次出现顺序):

符号 含义 首次出现
\(W_t\) 标准布朗运动 / Wiener 过程 §9.1.2.3
\(\mathcal{F}_t\) 到时刻 \(t\) 的自然滤波(信息流 \(\sigma(W_r:r\le t)\) §9.1.2.3
\([X]_t\) 过程 \(X\) 的二次变差 §9.1.2.4
\([X^i,X^k]_t\) 互变差(cross variation) §9.1.4.3
\(\int_0^t H_s\,\mathrm{d}W_s\) Ito 积分(左端点) §9.1.3.2
\(\circ\,\mathrm{d}W\) Stratonovich 微分(中点) §9.1.5.1
\(I(H)\) 简单过程 \(H\) 的 Ito 积分算子 §9.1.3.2
\(\tau_n\) 停时(stopping time) §9.1.3.2
\(\mathrm{d}f\) Ito 微分(含修正项) §9.1.4.2
\(\nabla^2 f\) Hessian 矩阵 §9.1.4.3
\(\theta\) OU 过程均值回复速率 §9.1.4.4
\(\alpha(t)\) VP-SDE 信号衰减因子 \(\exp(-\frac12\int_0^t\beta)\) §9.1.4.4
\(b,\sigma\) SDE 漂移与扩散系数 §9.1.6.1
\(K\)(Lipschitz) 全局 Lipschitz 常数 §9.1.6.1
\(p(x,t)\) 时刻 \(t\) 的概率密度 §9.1.7.1
\(D=\frac12\sigma\sigma^\top\) 扩散矩阵 §9.1.7.2
\(\nabla_x\log p_t\) score 函数 §9.1.7.4
\(\gamma,\beta\)(收敛) 强收敛阶 / 弱收敛阶 §9.1.8.2
\(\Delta W_k\) 离散布朗增量 \(\sqrt{\Delta t}Z_k\) §9.1.8.1
\(\bar W_t,\bar X_t\) 反向时间布朗运动 / 反向过程 §9.1.9.2
\(\hat X_t\) Kalman-Bucy 最优估计 §9.1.10.1
\(P_t\) 滤波误差协方差 §9.1.10.1
\(K_t\)(增益) 卡尔曼增益 \(P_tH^\top R^{-1}\) §9.1.10.1
\(S(\tau)\) MPPI 轨迹累积成本 §9.1.10.2

§9.1.14 定理速查表

定理 / 公式 一句话说明 对应节
布朗运动四性质 (W1–W4) \(W_0=0\)、独立增量、\(\mathcal{N}(0,t-s)\) 增量、连续路径 §9.1.2.3
二次变差 \([W]_t=t\) 随机微积分的根基,导致 \((\mathrm{d}W)^2=\mathrm{d}t\) §9.1.2.4
Ito 等距 \(\mathbb{E}[(\int H\mathrm{d}W)^2]=\mathbb{E}[\int H^2\mathrm{d}t]\),是 \(L^2\) 等距嵌入 §9.1.3.2
Ito 公式 \(\mathrm{d}f=f'\mathrm{d}X+\frac12 f''\sigma^2\mathrm{d}t\),随机链式法则 §9.1.4.2
Ito 乘法表 \(\mathrm{d}W\cdot\mathrm{d}W=\mathrm{d}t\),其余为零 §9.1.4.2
Ito-Stratonovich 转换 修正项 \(\frac12\sigma\sigma'\)(noise-induced drift) §9.1.5.3
SDE 存在唯一性 Lipschitz + 线性增长 \(\Rightarrow\) 唯一强解 §9.1.6.1
Fokker-Planck \(\partial_t p=-\nabla\!\cdot\!(bp)+\nabla\!\cdot\!(D\nabla p)\),密度演化 §9.1.7.2
Euler-Maruyama 收敛阶 \(1/2\)、弱 \(1\);加性噪声下与 Milstein 同 §9.1.8.2
Milstein 格式 \(\frac12\sigma\sigma'[(\Delta W)^2-\Delta t]\),强阶升到 \(1\) §9.1.8.3
Anderson 反向 SDE \(\mathrm{d}\bar X=(b-\sigma^2\nabla\log p)\mathrm{d}t+\sigma\mathrm{d}\bar W\) §9.1.9.2
概率流 ODE \(\dot X=b-\frac12\sigma^2\nabla\log p\),与 SDE 同边际 §9.1.9.3
Kalman-Bucy + Riccati \(\dot P=FP+PF^\top-PH^\top R^{-1}HP+GQG^\top\) §9.1.10.1

§9.1.15 本章与后续章节的关系

后续章节 与本章的关系 本章哪个知识点为其铺垫
深度学习数学/40_Diffusion_Models数学 直接前置——填补其开篇声明的 Ito 断层 §9.1.4(VP-SDE 转移核)、§9.1.7(Fokker-Planck)、§9.1.9(反向 SDE / 概率流 ODE)
随机分析·Girsanov 定理(规划中) Anderson 反向 SDE 严格证明的核心工具 §9.1.3(Ito 积分、鞅)、§9.1.5(测度与漂移变换的雏形)
随机分析·Feynman-Kac(规划中) 连接 SDE 与线性 PDE,是 MPPI 线性化 HJB 的依据 §9.1.4(Ito 公式)、§9.1.7(FP)、§9.1.10.2(路径积分)
随机分析·数值方法进阶(规划中) 高阶格式、弱逼近、跳过程 §9.1.8(Euler-Maruyama / Milstein 基础)
机器人状态估计(EKF/UKF) 连续时间最优滤波的理论根基 §9.1.10.1(Kalman-Bucy、Riccati)
机器人采样型控制 受控 SDE 的 Monte Carlo 采样 §9.1.8(Euler-Maruyama)、§9.1.10.2(MPPI)

🔧 故障排查手册

下表针对学习与实现随机微积分时最常见的"卡壳/出错"场景,按"症状、可能原因、排查步骤、相关章节"的顺序给出结构化诊断。

# 症状 可能原因 排查步骤 相关节
1 \(f(W_t)\) 求微分,取期望后与已知矩矛盾(如算出 \(\mathbb{E}[W_t^2]=0\) 用了普通链式法则,漏掉 Ito 修正项 \(\frac12 f''\sigma^2\mathrm{d}t\) (a) 检查是否对含 \(W_t\) 的函数用了 \(\mathrm{d}f=f'\mathrm{d}W\);(b) 补上二阶项重算;(c) 用 \(\mathbb{E}[W_t^2]=t\) 反向校验 §9.1.4.1–2
2 Ito 积分算出的均值不为零 被积函数不满足适应性(偷看了未来),或取了右端点/中点 (a) 确认 \(H_{t_i}\)\(\mathcal{F}_{t_i}\)-可测(只依赖 \(\le t_i\) 的信息);(b) 确认取左端点;(c) 若有意取中点,那是 Stratonovich,期望本就非零 §9.1.3.2, §9.1.5
3 GBM 模拟的样本中位数远低于 \(S_0e^{\mu t}\),怀疑代码错了 没错——这是 Ito 修正 \(-\sigma^2/2\) 的真实效应(均值 \(\neq\) 中位数) (a) 确认 \(\mathbb{E}[S_t]=S_0e^{\mu t}\)(均值对);(b) 确认单路径增长率 \(\mu-\sigma^2/2\)(中位数对);(c) 二者差异由 Jensen 不等式解释 §9.1.4.4
4 数值模拟的轨迹抖动幅度随步长改变而系统性变化 布朗增量错写成 \(\Delta t\,Z\) 而非 \(\sqrt{\Delta t}\,Z\) (a) 检查 dW = sqrt(dt)*randn;(b) 模拟纯布朗运动验证 \(\mathrm{Var}[W_T]\approx T\) 与步长无关 §9.1.8.1
5 强阻尼 SDE(大 \(\theta\))数值解发散震荡 显式 Euler-Maruyama 超过稳定步长 \(\Delta t<2/\theta\) (a) 减小步长至 \(<2/\theta\);(b) 或改用漂移半隐式格式(无条件稳定);(c) 注意扩散项仍须显式 §9.1.8.4
6 Milstein 方法与 Euler-Maruyama 结果完全一样,怀疑没实现对 当前 SDE 是加性噪声(\(\sigma\) 常数),\(\sigma'=0\) 修正项本就为零 (a) 检查 \(\sigma\) 是否依赖状态;(b) 换乘性噪声 SDE(如 GBM)才能看出差异;(c) 此现象本身证明实现正确 §9.1.8.3
7 Diffusion 反向采样还原不出数据,只得到模糊噪声 反向 SDE 漏了 score 项,或 score 网络没学好 (a) 确认反向漂移含 \(-\sigma^2\nabla\log p_t\);(b) 检查 score matching 损失是否收敛;(c) 先用闭式条件 score(高斯)做 sanity check §9.1.9.2–3
8 SDE 模型解在有限时间"爆炸"到无穷 漂移/扩散不满足线性增长条件(如 \(b=x^2\) (a) 检查 $ b

研究实践建议

给初学者

  1. 先建立"\((\mathrm{d}W)^2=\mathrm{d}t\)"的肌肉记忆——这是全章的根。每次对含 \(W\) 的量求微分,机械地问自己"有没有二阶项"。把练习 9.1.7(\(\mathrm{d}(W_t^2)\))和 9.1.4(\(\int W\mathrm{d}W\))手推到不看答案能复现为止。
  2. 代码先行验证直觉:随机微积分反直觉之处多,写几十行 Euler-Maruyama 模拟,把"二次变差收敛到 \(T\)""GBM 中位数低于均值""OU 稳态方差"亲手跑出来,比读十遍证明更牢。
  3. 从 OU 过程吃透一切:OU 几乎涉及本章每个概念(Ito 公式求解、Fokker-Planck 稳态、Kalman-Bucy、VP-SDE 特例)。把 OU 当作"随机微积分的 Hello World"反复咀嚼。
  4. 不要纠结 Ito vs Stratonovich:机器人语境下默认 Ito;加性噪声时二者相同(最常见情形)。先用 Ito 把事情做对,理解了再回头看转换公式。

给有经验者 / 研究者

  1. 抓"SDE 与 PDE"对偶:本章最深的主线是轨迹(SDE)与分布(Fokker-Planck/PDE)的对偶。Diffusion(反向 SDE 对应概率流 ODE)、MPPI(受控 SDE 对应 HJB)、滤波(Kalman-Bucy 对应 Riccati)都是这条对偶的不同投影。带着"我现在站在轨迹侧还是分布侧"的意识读后续文献。
  2. 数值收敛阶决定算法选型:做滤波/控制(关心单轨迹)盯强收敛,做 Monte Carlo 期望(MPPI/Diffusion 采样)只需弱收敛——这直接决定能否用更省的格式换吞吐。
  3. score 是唯一要学的量:研究 Diffusion 时,时刻清醒 \(b,\sigma\) 是设计的、只有 \(\nabla\log p_t\) 要学。许多"新方法"本质是换了 score 的参数化或 SDE 的设计(如 VE/VP/sub-VP),底层都是 Anderson 定理。
  4. 下一步深入路径:Girsanov(测度变换,严格证反向 SDE),再到 Feynman-Kac(SDE 解线性 PDE,MPPI 的理论根),最后到跳扩散 / Lévy 过程(处理碰撞、接触等非连续动力学)。

推荐阅读与后续路径

资源 覆盖内容 适合阶段
Evans, An Introduction to Stochastic Differential Equations 直觉驱动,最适合工程背景读者 入门首选
Oksendal, SDE: An Introduction with Applications, Ch.3-5 Ito 积分、Ito 公式、SDE 存在唯一性 本章学完后深入
Shreve, Stochastic Calculus for Finance II, Ch.3-4 偏应用的 Ito 积分讲解 辅助理解
Karatzas & Shreve, Brownian Motion and Stochastic Calculus 完整严格理论 ⭐⭐⭐⭐ 研究级参考
Pavliotis, Stochastic Processes and Applications Fokker-Planck、遍历性、多尺度方法 进阶(连接 PDE 与 SDE)

后续章节预告

  • 随机分析·Girsanov定理(规划中)(规划中):Girsanov 定理与测度变换(理解 Anderson 反向 SDE 证明的核心工具)
  • 随机分析·Feynman-Kac公式(规划中)(规划中):鞅表示定理与 Feynman-Kac 公式(连接 PDE 与 SDE)
  • 随机分析·数值方法进阶(规划中)(规划中):数值方法进阶(Milstein 方法、高阶格式、弱逼近)

本章完成后,你已经具备了阅读 深度学习数学/40_Diffusion_Models数学(Diffusion Models 数学)中所有 SDE 相关内容的能力。深度学习数学/40_Diffusion_Models数学 开篇第 60-68 行的"Ito 前置断层警告"对你不再适用。