# 变系数一阶线性 ODE
这节的目的
**你一直在用的扩散加噪均值 $\sqrt{\bar\alpha}(t)\,x_0$,其实是解一条 ODE 得来的。**扩散里噪声速率 $\beta(t)$ 随时间变,所以管均值的那条 ODE 是「变系数」的(系数随时间变)。常数速率的情形已经会了:$\dfrac{\mathrm{d}m}{\mathrm{d}t}=a\,m$,解是 $m(t)=m(0)e^{at}$。这节把它推广到速率随时间变,解出来正好就是 $\sqrt{\bar\alpha}(t)\,x_0$。学完你会清楚这个 $\sqrt{\bar\alpha}$ 从哪来,也能读懂论文里 $\int_0^t\dots\,\mathrm{d}s$ 那种连续写法。
常数情形 $\dfrac{\mathrm{d}m}{\mathrm{d}t}=am$ 的解 $m(t)=m(0)e^{at}$ 已会。**这节速率随时间变,唯一的改动是把常数 $a$ 换成随时间变的 $a(t)$,解里的指数也只把 $at$ 换成一个积分 $\int_0^t a(s)\,\mathrm{d}s$。**这个积分按定积分的常规办法算:先找原函数,再代上下限相减。
> [!abstract] 这类题长什么样、答案套哪个公式
> 常数情形里速率 $a$ 是固定的数。这节速率随时间变,记成 $a(t)$。方程只在一个地方变,把 $a$ 换成 $a(t)$:
> $\frac{\mathrm{d}m}{\mathrm{d}t}=a(t)\,m$
> 解也只在一个地方变,把指数 $at$ 换成积分:
> $m(t)=m(0)\,e^{\int_0^t a(s)\,\mathrm{d}s}$
> 指数里这个积分,$a(s)$ 是速率,$s$ 是从 $0$ 跑到 $t$ 的时刻,$t$ 是当前时刻,整个就是把速率从 $0$ 累到 $t$。具体怎么算,就是定积分:找原函数、代上下限相减。
>
> 这个公式才是本节要用的,真要解题在下一张。这里先做一个检查,看它跟常数情形不打架。
> 把速率 $a(t)$ 固定成一个不变的常数 $a$,这正好就是那种常数情形(速率不随时间变)。这时指数里是常数的积分:
> $\int_0^t a\,\mathrm{d}s=at$
> 公式就变成 $m(t)=m(0)e^{at}$,跟常数情形解出来的结果一模一样。说明本节的新公式把常数情形当成自己的一个特例(速率恰好不变那种),不是另起一套。
> [!note]- 为什么 a 变了,指数位就从 at 变成积分
> 本质一句话:指数位永远是「速率曲线下的面积」。面积是什么形状,就用什么算法。
>
> - 速率不变 → 面积是矩形,面积 = 高 × 宽 = $a\times t$。这就是常数情形里的 $at$,矩形面积用一个乘法就能算出来。
> - 速率随时间变 $a(s)$ → 面积是曲边形。把它切成很多窄条:每条高 = 那一刻的速率 $a(s)$,宽 = 一小段 $\mathrm{d}s$,面积 = $a(s)\,\mathrm{d}s$。全部加起来就是 $\int_0^t a(s)\,\mathrm{d}s$。
>
> 同一块面积,矩形用乘法 $at$,曲边形用积分 $\int_0^t a(s)\,\mathrm{d}s$。
>
> 判断一道题落在哪档,就看 $a$ 里带不带 $s$:不带 $s$ → 速率恒定 → 矩形,积分按「高 × 宽」算(这就是常数情形);带 $s$ → 速率随时间变 → 曲边形,要真算积分。
> [!abstract] 完整解一道:从方程读出 $a(t)$,套公式得 $m(t)$
> 取 $a(t)=t$,意思是速率等于当前时刻,越往后速率越大。
> 先写速率在时刻 $s$ 的值。$a(t)=t$ 说「速率 = 时刻」,所以 $a(s)=s$。指数那格变成:
> $\int_0^t s\,\mathrm{d}s$
> 这里两个 $s$ 长一样、活不同,$\mathrm{d}s$ 的 $s$ 管对哪个时间积分(没变),前面那个 $s$ 是速率的值(这个例子里正好等于时刻 $s$)。
> 这个积分这样算:$s$ 的原函数是 $\tfrac12 s^2$,代上下限,
> $\int_0^t s\,\mathrm{d}s=\Big[\tfrac12 s^2\Big]_0^t=\tfrac12 t^2-0=\tfrac12 t^2$
> 填回解:
> $m(t)=m(0)\,e^{\frac12 t^2}$
> [!question]- 练习
> 做之前先看每题 $a$ 里带不带 $s$:不带 $s$ 是矩形档(退回常数情形),带 $s$ 是曲边形档。两题各占一档。
> 一,$\dfrac{\mathrm{d}m}{\mathrm{d}t}=-\tfrac12\beta\,m$,其中 $\beta$ 是常数,$m(0)=x_0$,写出 $m(t)$。
> 二,$\dfrac{\mathrm{d}m}{\mathrm{d}t}=2t\,m$,$m(0)=1$,写出 $m(t)$。
> [!note]- 练习答案
> 两道题对应「矩形 / 曲边形」两档,关键看 $a$ 里带不带 $s$。
>
> 第一题(矩形档) $\dfrac{\mathrm{d}m}{\mathrm{d}t}=-\tfrac12\beta\,m$,$\beta$ 是常数,$m(0)=x_0$。
> 读出 $a(s)=-\tfrac12\beta$,不带 $s$ → 速率恒定,面积是矩形。
> 积分按「高 × 宽」算,宽就是 $t$:
> $\int_0^t -\tfrac12\beta\,\mathrm{d}s=-\tfrac12\beta\cdot t$
> 放上指数,代 $m(0)=x_0$:
> $m(t)=x_0\,e^{-\frac12\beta t}$
>
> 第二题(曲边形档) $\dfrac{\mathrm{d}m}{\mathrm{d}t}=2t\,m$,$m(0)=1$。
> 读出 $a(s)=2s$,带 $s$ → 速率随时间变,面积是曲边形。
> 积分要真算(切窄条累加):
> $\int_0^t 2s\,\mathrm{d}s=\big[s^2\big]_0^t=t^2$
> 放上指数,代 $m(0)=1$:
> $m(t)=e^{t^2}$
>
> 对照:$a$ 不带 $s$ → 矩形 → 积分是「高 × 宽」;$a$ 带 $s$ → 曲边形 → 真的要算积分。两题各占一档。
> [!note]- 和扩散对上:把均值翻译成连续写法
> 把这几节学的 ODE 解法,套到你熟的 DDPM 均值上,看它怎么变成论文里的连续写法。一步步来,用到的旧东西都在原地写出来,不用回翻。
>
> 第一步,从 DDPM 一步,写出均值每步怎么变
> DDPM 前向一步你熟:
> $x_t=\sqrt{1-\beta_t}\,x_{t-1}+\sqrt{\beta_t}\,\epsilon$
> 两边各套一个求均值符号 $\mathbb{E}[\cdot]$:
> $\mathbb{E}[x_t]=\sqrt{1-\beta_t}\,\mathbb{E}[x_{t-1}]+\sqrt{\beta_t}\,\mathbb{E}[\epsilon]$
> $\epsilon$ 是标准噪声,均值是 $0$:
> $\mathbb{E}[\epsilon]=0$
> 所以最后一项整项没了:
> $\mathbb{E}[x_t]=\sqrt{1-\beta_t}\,\mathbb{E}[x_{t-1}]$
> 均值这个量反复出现,给它起个短名字:
> $m_t:=\mathbb{E}[x_t]$
> 上面那行就写成:
> $m_t=\sqrt{1-\beta_t}\,m_{t-1}$
> 就是说,均值每走一步,乘一个 $\sqrt{1-\beta_t}$。
>
> 第二步,把根号拆开
> $\beta_t$ 是每步加的噪声量,很小,接近 $0$。把 $\sqrt{1-\beta}$ 看成 $\beta$ 的函数,在 $\beta=0$ 附近用一阶线性近似(用 $\beta=0$ 处那条切线代替曲线,函数值 $1$、斜率 $-\tfrac12$):
> $\sqrt{1-\beta_t}\approx 1-\tfrac12\beta_t$
> 那个 $\tfrac12$ 是这条切线的斜率带出来的。代回上一步:
> $m_t\approx\big(1-\tfrac12\beta_t\big)m_{t-1}$
>
> 第三步,写成「一步变化了多少」
> 把 $m_{t-1}$ 移过去,看这一步均值变了多少:
> $m_t-m_{t-1}\approx-\tfrac12\beta_t\,m_{t-1}$
> 左边是这一步的变化量,右边等于 $-\tfrac12\beta_t$ 乘当前的均值。负号表示均值在往下缩。
>
> 第四步,步长缩到 $0$,变成变化率方程
> 一步的变化量除以一步的时长就是变化率。把每步看成一小段时间,步长趋于 $0$ 时,左边 $m_t-m_{t-1}$ 这种差变成导数 $\dfrac{\mathrm{d}m}{\mathrm{d}t}$,离散的 $\beta_t$ 写成连续的 $\beta(t)$:
> $\frac{\mathrm{d}m}{\mathrm{d}t}=-\tfrac12\beta(t)\,m$
> 这条就是连续版的均值方程。它不是凭空定义的,是上面四步从 DDPM 一步步推下来的。
>
> 第五步,认出这就是这节的题型,套解法
> 这节的题型是
> $\frac{\mathrm{d}m}{\mathrm{d}t}=a(t)\,m$
> 解是
> $m(t)=m(0)\,e^{\int_0^t a(s)\,\mathrm{d}s}$
> 对照一下,这里的 $a(t)$ 就是 $-\tfrac12\beta(t)$。把它放进指数那个积分:
> $\int_0^t a(s)\,\mathrm{d}s=\int_0^t -\tfrac12\beta(s)\,\mathrm{d}s=-\tfrac12\int_0^t\beta(s)\,\mathrm{d}s$
> 所以解是:
> $m(t)=m(0)\,e^{-\frac12\int_0^t\beta(s)\,\mathrm{d}s}$
>
> 第六步,跟你熟的 $\sqrt{\bar\alpha}\,x_0$ 对上
> 起点 $t=0$ 还没加噪,均值就是干净数据:
> $m(0)=x_0$
> 你的 DDPM 里 $\sqrt{\bar\alpha_t}=\sqrt{\prod_{i=1}^t(1-\beta_i)}$,是一堆 $\sqrt{1-\beta_i}$ 连乘,正好就是第一步那个「每步乘一个 $\sqrt{1-\beta}$」乘到第 $t$ 步的结果。连续化之后,这个连乘写成了 $e^{-\frac12\int_0^t\beta(s)\,\mathrm{d}s}$。把这个 $\exp$ 记作连续版的 $\sqrt{\bar\alpha}(t)$,解就写成:
> $m(t)=\sqrt{\bar\alpha}(t)\,x_0$
> 这就是你一直用的 $\sqrt{\bar\alpha}\,x_0$。**它在离散里是连乘出来的,在连续里是这条 ODE 解出来的,两个是同一个东西,只是连乘换成了 $\exp$ 一个积分。**
> [!note]- 离散和连续取同一个 $t$,数值对得上
> 离散版和连续版都是「输入 $t$,输出一个收缩系数,乘 $x_0$ 得均值」。挑同一个 $t$、同一套 $\beta$,看两边给的系数是不是一致。
>
> 取每步噪声都一样,$\beta_i=0.1$,看到第 $t=3$ 步。
>
> 离散版,把三项连乘再开根号:
> $\sqrt{\bar\alpha_3}=\sqrt{(1-0.1)^3}=\sqrt{0.9^3}=\sqrt{0.729}\approx 0.8538$
> 均值是 $0.8538\,x_0$。
>
> 连续版,$\beta(s)$ 取常数 $0.1$,先算指数里的积分(常数的积分 $\int_0^t c\,\mathrm{d}s=ct$):
> $\int_0^3 0.1\,\mathrm{d}s=0.1\times 3=0.3$
> 代进 $\exp$:
> $\sqrt{\bar\alpha}(3)=e^{-\frac12\times 0.3}=e^{-0.15}\approx 0.8607$
> 均值是 $0.8607\,x_0$。
>
> 对比,$0.8538$ 对 $0.8607$,差约八千分之七。两个不会一模一样,因为连续版用了一阶线性近似 $\sqrt{1-\beta}\approx 1-\tfrac12\beta$,这里 $\beta=0.1$ 不算很小,近似留了点误差。$\beta$ 越小,两边贴得越紧。
>
> 把 $\beta$ 缩到 $0.01$、走 $30$ 步(总噪声量还是 $0.3$):
> $\text{离散}\quad\sqrt{0.99^{30}}=\sqrt{0.7397}\approx 0.8600$
> $\text{连续}\quad e^{-0.15}\approx 0.8607$
> 这回差只剩万分之七,明显更近了。所以两个取的是同一个量,连续版是离散版在步子迈得很小时的极限,$\beta$ 越小、步数越密,越重合。