附录 A — 数学补充

这份附录是正文的”推导仓库”。

正文里每一处”完整展开见附录 A.2”的承诺,都在这里兑现。 读法有两种:遇到卡住的地方来查一节;或者从头读一遍,当作全书的数学复习。

每一条都标了”用在哪”,你可以只读自己需要的那几条。

A.1 符号与约定

先把记号钉死。全书只用这一套。

记号 含义 例子
x 向量(默认列向量) x_t\in\mathbb{R}^d
x_i 向量的第 i 个分量 x_1 是第一个数
A^\top 矩阵转置 (QK^\top)_{ij}=q_i\cdot k_j
\lVert x\rVert 欧氏范数 \sqrt{x^\top x} \lVert x\rVert^2=\sum_i x_i^2
\nabla_x f 对 x 的梯度(和 x 同形状) \nabla_x\lVert x\rVert^2=2x
\mathbb{E}[X] 期望 \mathbb{E}[\varepsilon]=0
\operatorname{Var}(X) 方差 \operatorname{Var}(\varepsilon)=I
\mathcal{N}(\mu,\Sigma) 高斯分布 \mathcal{N}(0,I) 是标准正态
I 单位矩阵 Ix=x
\odot 逐元素乘 a\odot b
\propto 正比于(差一个常数因子) p(x)\propto e^{-x^2/2}
\log 自然对数 \log e=1

三个约定值得单独说。

① 下标 t 永远指扩散步,不指时间连续变量。 连续版本用 \tau,只在 A.2 和 A.4 出现。

② 噪声用 \varepsilon,不用 \xi 或 z。 z 留给潜变量,\xi 留给”另一个噪声”(比如重参数化里的辅助变量)。

③ 所有向量默认是列向量,但代码里是行向量。 数学上 QK^\top 的 Q 是 (N,d)、K 是 (M,d), 写代码时不用转置——这是 numpy 传统,不是数学错误。

注记为什么记号值得花一节

因为这本书里同一个字母在不同章节有不同含义。

  • w:第 7 章是引导强度,第 8 章是 token 的权重(word:1.3)
  • c:第 7 章是类别下标,第 8 章是一整句话
  • t:扩散步;第 8 章的 t 也指扩散步,但第 1 章的 t 是序列位置

每次换章,先看一眼这一节的表。


A.2 四个完整推导

这一节是全书推导密度最高的地方。 四个推导分别对应正文里四个”只给结论”的地方。

A.2.1 配方法:后验 q(x_{t-1}\mid x_t,x_0) 是怎么来的

正文第 5 章直接给了结果:

q(x_{t-1}\mid x_t,x_0)=\mathcal{N}\left(\tilde\mu_t(x_t,x_0),\tilde\beta_t I\right)

\tilde\mu_t=\frac{\sqrt{\bar\alpha_{t-1}}\beta_t\,x_0+\sqrt{\alpha_t}(1-\bar\alpha_{t-1})\,x_t}{1-\bar\alpha_t}, \qquad \tilde\beta_t=\frac{\beta_t(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}

这里把每一步都写出来。

起点是两个高斯相乘:

q(x_{t-1}\mid x_t,x_0)\propto \underbrace{\exp\left[-\frac{\lVert x_{t-1}-\sqrt{\bar\alpha_{t-1}}x_0\rVert^2}{2(1-\bar\alpha_{t-1})}\right]}_{q(x_{t-1}\mid x_0)} \cdot \underbrace{\exp\left[-\frac{\lVert x_t-\sqrt{\alpha_t}x_{t-1}\rVert^2}{2\beta_t}\right]}_{q(x_t\mid x_{t-1})}

第一步:把指数里的平方展开,只保留和 x_{t-1} 有关的项。

第一项的指数:

-\frac{\lVert x_{t-1}\rVert^2-2\sqrt{\bar\alpha_{t-1}}\,x_0^\top x_{t-1}+\bar\alpha_{t-1}\lVert x_0\rVert^2}{2(1-\bar\alpha_{t-1})}

第二项的指数:

-\frac{\lVert x_t\rVert^2-2\sqrt{\alpha_t}\,x_t^\top x_{t-1}+\alpha_t\lVert x_{t-1}\rVert^2}{2\beta_t}

和 x_{t-1} 无关的项(\lVert x_t\rVert^2、\bar\alpha_{t-1}\lVert x_0\rVert^2) 在归一化时会被消掉,先扔掉。

第二步:收集 \lVert x_{t-1}\rVert^2 的系数。

\frac{1}{2(1-\bar\alpha_{t-1})}+\frac{\alpha_t}{2\beta_t} =\frac{\beta_t+\alpha_t(1-\bar\alpha_{t-1})}{2\beta_t(1-\bar\alpha_{t-1})}

用 \alpha_t=1-\beta_t 化简分子:

\beta_t+\alpha_t-\alpha_t\bar\alpha_{t-1}=1-\alpha_t\bar\alpha_{t-1}=1-\bar\alpha_t

所以二次项系数是

\frac{1-\bar\alpha_t}{2\beta_t(1-\bar\alpha_{t-1})}

第三步:认方差。

高斯密度里二次项的系数是 1/(2\sigma^2),所以

\tilde\beta_t=\frac{\beta_t(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}

第四步:收集 x_{t-1} 的一次项。

\frac{\sqrt{\bar\alpha_{t-1}}\,x_0^\top x_{t-1}}{1-\bar\alpha_{t-1}} +\frac{\sqrt{\alpha_t}\,x_t^\top x_{t-1}}{\beta_t}

第五步:从一次项读出均值。

对 \mathcal{N}(\mu,\sigma^2),一次项是 \mu x/\sigma^2。 所以 \mu=\sigma^2\times(\text{一次项系数}):

\tilde\mu_t=\frac{\beta_t(1-\bar\alpha_{t-1})}{1-\bar\alpha_t} \left[\frac{\sqrt{\bar\alpha_{t-1}}x_0}{1-\bar\alpha_{t-1}}+\frac{\sqrt{\alpha_t}x_t}{\beta_t}\right]

约掉两个因子:

\tilde\mu_t=\frac{\sqrt{\bar\alpha_{t-1}}\beta_t\,x_0+\sqrt{\alpha_t}(1-\bar\alpha_{t-1})\,x_t}{1-\bar\alpha_t}

这就是正文那个式子。

重要这个推导里唯一”技巧”的地方

只有一步:认出二次项系数等于 1/(2\sigma^2)。

其余全是展开、合并、约分。

所以如果你在别处看到”配方法很神奇”,那是在骗你—— 它只是”把高斯乘起来,按二次型重新读参数”。

同样的套路可以用在任何”两个高斯相乘”的场合, 包括第 8 章那个”先验乘似然得到后验”的贝叶斯视角。

A.2.2 ELBO 逐项展开

正文第 5 章给了 ELBO 的分解。这里补齐每一步。

起点是负对数似然:

-\log p_\theta(x_0)=-\log\int p_\theta(x_{0:T})\,dx_{1:T}

引入一个任意分布 q(x_{1:T}\mid x_0),乘一除一:

-\log p_\theta(x_0)=-\log\int q(x_{1:T}\mid x_0)\frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)}\,dx_{1:T}

用 Jensen 不等式(-\log 是凸函数,所以 \mathbb{E}[-\log X]\ge -\log\mathbb{E}[X]):

-\log p_\theta(x_0)\le-\mathbb{E}_{q}\left[\log\frac{p_\theta(x_{0:T})}{q(x_{1:T}\mid x_0)}\right]

右边就是 ELBO 的相反数。把它写成 L:

L=\mathbb{E}_q\left[\log\frac{q(x_{1:T}\mid x_0)}{p_\theta(x_{0:T})}\right]

现在拆分子分母。

分母(用马尔可夫性):

p_\theta(x_{0:T})=p_\theta(x_T)\prod_{t=1}^{T}p_\theta(x_{t-1}\mid x_t)

分子:

q(x_{1:T}\mid x_0)=\prod_{t=1}^{T}q(x_t\mid x_{t-1})

把连乘代进去,并把 t=1 那一项单独拿出来:

L=\mathbb{E}_q\left[\log\frac{q(x_1\mid x_0)}{p_\theta(x_0\mid x_1)} +\sum_{t=2}^{T}\log\frac{q(x_t\mid x_{t-1})}{p_\theta(x_{t-1}\mid x_t)} -\log p_\theta(x_T)\right]

关键一步:把 q(x_t\mid x_{t-1}) 换成”以 x_0 为条件的后验”。

用贝叶斯公式:

q(x_t\mid x_{t-1})=q(x_t\mid x_{t-1},x_0) =\frac{q(x_{t-1}\mid x_t,x_0)\,q(x_t\mid x_0)}{q(x_{t-1}\mid x_0)}

这一步之所以成立,是因为给定 x_0 之后,x_t 只依赖 x_{t-1}—— 反向也成立(扩散过程是马尔可夫的)。

代进求和项:

\log\frac{q(x_t\mid x_{t-1})}{p_\theta(x_{t-1}\mid x_t)} =\log\frac{q(x_{t-1}\mid x_t,x_0)}{p_\theta(x_{t-1}\mid x_t)} +\log\frac{q(x_t\mid x_0)}{q(x_{t-1}\mid x_0)}

第二项是个望远镜求和:

\sum_{t=2}^{T}\log\frac{q(x_t\mid x_0)}{q(x_{t-1}\mid x_0)} =\log\frac{q(x_T\mid x_0)}{q(x_1\mid x_0)}

把它和第一项、最后一项合起来:

L=\underbrace{\mathbb{E}_q\left[\log\frac{q(x_T\mid x_0)}{p_\theta(x_T)}\right]}_{L_T} +\underbrace{\mathbb{E}_q\left[\log\frac{q(x_{t-1}\mid x_t,x_0)}{p_\theta(x_{t-1}\mid x_t)}\right]}_{L_{t-1}\ (t=2\dots T)} +\underbrace{-\mathbb{E}_q\left[\log p_\theta(x_0\mid x_1)\right]}_{L_0}

这就是正文那张三项分解。

注记三项各是什么
  • L_T:先验和噪声分布差多远。训练中不优化——q 没有参数,p_\theta(x_T)=\mathcal{N}(0,I) 固定。
  • L_{t-1}:每一步的去噪误差。这是训练的主项。
  • L_0:最后一步还原 x_0 的负对数似然(越小越好)。

L_{t-1} 里的两个分布都是高斯(q 是 A.2.1 推的后验,p_\theta 是模型), 所以它可以写成闭式——下一小节。

A.2.3 高斯 KL 与”为什么最终变成 MSE”

两个同方差高斯的 KL:

\operatorname{KL}\left(\mathcal{N}(\mu_1,\sigma^2)\Vert\mathcal{N}(\mu_2,\sigma^2)\right) =\frac{\lVert\mu_1-\mu_2\rVert^2}{2\sigma^2}

推导:两个密度相除,指数部分合并,

\log\frac{p_1}{p_2}=-\frac{\lVert x-\mu_1\rVert^2}{2\sigma^2}+\frac{\lVert x-\mu_2\rVert^2}{2\sigma^2}

对 x\sim p_1 取期望。 用 \mathbb{E}\lVert x-\mu_1\rVert^2=d\sigma^2:

\mathbb{E}[\log p_1-\log p_2] =-\frac{d}{2}+\frac{\mathbb{E}\lVert x-\mu_2\rVert^2}{2\sigma^2} =-\frac{d}{2}+\frac{d\sigma^2+\lVert\mu_1-\mu_2\rVert^2}{2\sigma^2} =\frac{\lVert\mu_1-\mu_2\rVert^2}{2\sigma^2}

方差相同,归一化项抵消,只剩均值差。

代进 L_{t-1}:

L_{t-1}=\mathbb{E}_q\left[\frac{\lVert\tilde\mu_t(x_t,x_0)-\mu_\theta(x_t,t)\rVert^2}{2\tilde\beta_t}\right]+\text{常数}

所以”最小化 KL”就是”最小化均值的平方误差”。

再把两个均值都写成 \varepsilon 的形式(正文式 5-x):

\tilde\mu_t=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\tilde\varepsilon_t\right), \qquad \mu_\theta=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\varepsilon_\theta\right)

相减,x_t 和 1/\sqrt{\alpha_t} 都消掉:

\tilde\mu_t-\mu_\theta=\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\bar\alpha_t}}(\varepsilon_\theta-\tilde\varepsilon_t)

代回 L_{t-1},前面的系数是

\frac{1}{2\tilde\beta_t}\cdot\frac{\beta_t^2}{\alpha_t(1-\bar\alpha_t)}

用 \tilde\beta_t=\beta_t(1-\bar\alpha_{t-1})/(1-\bar\alpha_t) 化简。 先把 1/(2\tilde\beta_t) 展开:

\frac{1}{2\tilde\beta_t}=\frac{1-\bar\alpha_t}{2\beta_t(1-\bar\alpha_{t-1})}

代回去,(1-\bar\alpha_t) 上下约掉:

\frac{1-\bar\alpha_t}{2\beta_t(1-\bar\alpha_{t-1})}\cdot\frac{\beta_t^2}{\alpha_t(1-\bar\alpha_t)} =\frac{\beta_t}{2\alpha_t(1-\bar\alpha_{t-1})}

这是一个只和 t 有关的正系数。

重要到这一步,DDPM 的训练目标就”推”出来了

完整的 L_{t-1} 是:

L_{t-1}=\frac{\beta_t}{2\alpha_t(1-\bar\alpha_{t-1})} \mathbb{E}\left[\lVert\varepsilon-\varepsilon_\theta(x_t,t)\rVert^2\right]

DDPM 的做法是:把这个系数扔掉,直接用 \lVert\varepsilon-\varepsilon_\theta\rVert^2。

这不是”近似”,是”换了一个目标”—— 新目标仍然是 ELBO 的一个加权版本(权重是上面那个系数), 只是权重不再等于理论值。

为什么可以这么换? 看那个系数的形状:

c_t=\frac{\beta_t}{2\alpha_t(1-\bar\alpha_{t-1})}

t 小(低噪声)时 1-\bar\alpha_{t-1}\approx\beta_1,系数很大; t 大(高噪声)时 1-\bar\alpha_{t-1}\approx1,系数小一个多数量级。

所以理论目标把注意力集中在低噪声步。

扔掉权重 = 把各步拉平 = 相对提高高噪声步的重要性。

DDPM 的实验发现这样训练反而更稳、生成更好。 一个常见的解释是:低噪声步的像素级误差和感知质量关系不大, 而高噪声步决定了整体结构。

这是本书反复出现的主题:理论给你一个目标,工程给你一个更好的目标。

A.2.4 score matching 与 ε-预测的等价性

这是正文承诺过的”完整证明”。

先定义两个东西。

score:对数密度的梯度

s(x,t)=\nabla_x\log p_t(x)

去噪分数匹配(denoising score matching)的目标:

J_{\text{DSM}}(\theta)=\mathbb{E}_{t,x_0,x_t}\left[\left\lVert s_\theta(x_t,t)-\nabla_{x_t}\log q(x_t\mid x_0)\right\rVert^2\right]

注意它不需要知道 p_t(x) 本身——只需要知道”给定 x_0 时 x_t 的分布”, 而那个分布是我们自己定义的前向过程,有闭式。

第一步:算 \nabla_{x_t}\log q(x_t\mid x_0)。

q(x_t\mid x_0)=\mathcal{N}\left(\sqrt{\bar\alpha_t}x_0,(1-\bar\alpha_t)I\right)

高斯密度的对数:

\log q=-\frac{\lVert x_t-\sqrt{\bar\alpha_t}x_0\rVert^2}{2(1-\bar\alpha_t)}+\text{常数}

求梯度:

\nabla_{x_t}\log q=-\frac{x_t-\sqrt{\bar\alpha_t}x_0}{1-\bar\alpha_t}

第二步:用前向过程的定义替换分子。

x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\,\varepsilon \quad\Longrightarrow\quad x_t-\sqrt{\bar\alpha_t}x_0=\sqrt{1-\bar\alpha_t}\,\varepsilon

代进去:

\nabla_{x_t}\log q=-\frac{\sqrt{1-\bar\alpha_t}\,\varepsilon}{1-\bar\alpha_t} =-\frac{\varepsilon}{\sqrt{1-\bar\alpha_t}}

第三步:假设模型用 ε-参数化。

s_\theta(x_t,t)=-\frac{\varepsilon_\theta(x_t,t)}{\sqrt{1-\bar\alpha_t}}

代进 J_{\text{DSM}}:

J_{\text{DSM}}=\mathbb{E}\left[\left\lVert -\frac{\varepsilon_\theta}{\sqrt{1-\bar\alpha_t}}+\frac{\varepsilon}{\sqrt{1-\bar\alpha_t}} \right\rVert^2\right] =\mathbb{E}\left[\frac{\lVert\varepsilon-\varepsilon_\theta\rVert^2}{1-\bar\alpha_t}\right]

这就是结论:

J_{\text{DSM}}(\theta)=\mathbb{E}_{t,x_0,\varepsilon}\left[\frac{1}{1-\bar\alpha_t} \lVert\varepsilon-\varepsilon_\theta(x_t,t)\rVert^2\right]

重要“等价”到底等价在哪

它和 DDPM 的简单损失差一个权重 1/(1-\bar\alpha_t)。

这个权重在 t 大时很大(\bar\alpha_t\to0), 在 t 小时接近 1。

所以:

  • 如果你相信”模型足够表达”,两个目标的全局最优是同一个函数—— 都是 s^*(x,t)=\nabla\log p_t(x),只是在不同 t 上强调的程度不同。
  • 如果模型容量有限,权重会改变它优先拟合哪些噪声水平。

DDPM 扔掉这个权重,等于”主动降低高噪声步的重要性”。 这个选择在实践上更好,但没有理论上的”必须”。

这就是”等价”的准确含义: 不是”完全一样”,是”同一个最优解,不同的加权路径”。

还有一件事值得说清楚:为什么 score matching 有用?

因为 s(x,t)=\nabla\log p_t(x) 不需要归一化常数。

如果 p_t(x)=\frac{1}{Z}\tilde p_t(x),那么

\nabla\log p_t=\nabla\log\tilde p_t-\underbrace{\nabla\log Z}_{=0}

Z 是常数,梯度为零。

所以模型可以直接学”未归一化的密度”的梯度, 而不必算那个积不出来的 Z。

这是扩散模型能绕开”配分函数”的根本原因。


A.3 高斯分布的五条性质

这一节是工具,不是推导。每条都标了用在哪。

A.3.1 性质一:线性变换还是高斯

若 x\sim\mathcal{N}(\mu,\Sigma),则

Ax+b\sim\mathcal{N}(A\mu+b,\ A\Sigma A^\top)

用在哪:第 5 章的”加噪”就是 x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\varepsilon, 一个线性变换。

A.3.2 性质二:独立高斯的和

若 x\sim\mathcal{N}(\mu_1,\Sigma_1)、y\sim\mathcal{N}(\mu_2,\Sigma_2) 独立,则

x+y\sim\mathcal{N}(\mu_1+\mu_2,\ \Sigma_1+\Sigma_2)

注意方差是相加,不是相减。

用在哪:q(x_t\mid x_0) 的闭式,就是把 t 个独立噪声加起来。

A.3.3 性质三:重参数化

若 \varepsilon\sim\mathcal{N}(0,I),则

x=\mu+\sigma\varepsilon\sim\mathcal{N}(\mu,\sigma^2 I)

反过来,任何高斯样本都可以写成”确定性变换 + 标准噪声”。

用在哪:整个扩散模型的采样。 也是”为什么可以对随机过程求梯度”的答案—— 随机性被隔离在 \varepsilon 里,\mu,\sigma 是可导的。

A.3.4 性质四:条件高斯

若

\begin{pmatrix}x\\y\end{pmatrix}\sim\mathcal{N}\left( \begin{pmatrix}\mu_x\\\mu_y\end{pmatrix}, \begin{pmatrix}\Sigma_{xx}&\Sigma_{xy}\\\Sigma_{yx}&\Sigma_{yy}\end{pmatrix}\right)

则

x\mid y\sim\mathcal{N}\left(\mu_x+\Sigma_{xy}\Sigma_{yy}^{-1}(y-\mu_y),\ \Sigma_{xx}-\Sigma_{xy}\Sigma_{yy}^{-1}\Sigma_{yx}\right)

用在哪:A.2.1 的配方法就是它的”标量版”。 第 8 章的贝叶斯视角(条件分数 = 无条件分数 + 匹配项)也是它的梯度版。

A.3.5 性质五:高斯熵

H\left(\mathcal{N}(\mu,\Sigma)\right)=\frac12\log\left((2\pi e)^d\det\Sigma\right)

用在哪:第 8 章把”损失差”换算成”信息差”那一步:

\Delta H=\frac12\log\frac{\text{MSE}_1}{\text{MSE}_2}

注意这个换算只在”条件高斯”的假设下成立, 正文已经标注了这个前提。


A.4 分数、Tweedie 与 x_0 估计

第 5 章给过 x_0 的估计式。这里说明它和 score 的关系。

Tweedie 公式(高斯情形):

\mathbb{E}[x_0\mid x_t]=\frac{1}{\sqrt{\bar\alpha_t}}\left(x_t+(1-\bar\alpha_t)\nabla_{x_t}\log p_t(x_t)\right)

把它和 \varepsilon=-\sqrt{1-\bar\alpha_t}\,\nabla\log p_t 代进去:

\mathbb{E}[x_0\mid x_t]=\frac{x_t-\sqrt{1-\bar\alpha_t}\,\varepsilon}{\sqrt{\bar\alpha_t}}

这正是正文那个 \hat x_0。

所以三个东西是同一件事的三种写法:

写法 形式 优点
x_0 预测 \hat x_0 直观,能直接 clamp
\varepsilon 预测 \hat\varepsilon 数值范围稳定(第 5 章实测差 8500 倍)
score 预测 \nabla\log p_t 理论工具多(SDE、ODE)

转换关系:

\hat x_0=\frac{x_t-\sqrt{1-\bar\alpha_t}\hat\varepsilon}{\sqrt{\bar\alpha_t}}, \qquad \hat\varepsilon=\frac{x_t-\sqrt{\bar\alpha_t}\hat x_0}{\sqrt{1-\bar\alpha_t}}, \qquad s_\theta=-\frac{\hat\varepsilon}{\sqrt{1-\bar\alpha_t}}

记住任意一行,另外两行都能推出来。


A.5 softmax 与交叉熵的梯度

第 1 章说”softmax 把 logits 变成概率”,第 8 章说”梯度会流回文本”。 这里把两个都用到的梯度补全。

A.5.1 softmax 的雅可比

设 p=\text{softmax}(z),即

p_i=\frac{e^{z_i}}{\sum_j e^{z_j}}

求导:

\frac{\partial p_i}{\partial z_j}=p_i(\delta_{ij}-p_j)

写成矩阵:

\frac{\partial p}{\partial z}=\operatorname{diag}(p)-pp^\top

用在哪:第 8 章”梯度怎么流回文本”那一节, 把 \partial L/\partial s_j 写成 a_j(g_j-\sum_k a_k g_k),用的就是这一条。

A.5.2 交叉熵的梯度

设损失 L=-\sum_i y_i\log p_i,y 是 one-hot。

\frac{\partial L}{\partial z_j}=p_j-y_j

推导:链式法则加上面那条雅可比,

\frac{\partial L}{\partial z_j}=-\sum_i\frac{y_i}{p_i}\cdot p_i(\delta_{ij}-p_j) =-\sum_i y_i(\delta_{ij}-p_j)=-y_j+p_j\sum_i y_i=p_j-y_j

这个式子漂亮得不像话:梯度就是”预测减真值”。

用在哪:第 3 章的训练。它也是”为什么 logits 平移不变”的答案—— 给所有 z_i 加同一个常数,p 不变,梯度也不变。

A.5.3 数值稳定

实现里必须先减最大值:

p_i=\frac{e^{z_i-m}}{\sum_j e^{z_j-m}},\qquad m=\max_j z_j

数学上完全等价,数值上避免 e^{1000} 溢出。

用在哪:第 1 章失败三。在那个规模下看不出差别,但真实模型上会 NaN。


A.6 方差传播与 \sqrt{d_k}

第 1 章说”点积的方差随 d 增长,所以要除以 \sqrt{d_k}“。 这里把方差算出来。

设 q_i,k_i 独立、均值 0、方差 \sigma^2。则

\operatorname{Var}(q\cdot k)=\operatorname{Var}\left(\sum_{i=1}^{d}q_i k_i\right) =\sum_{i=1}^{d}\operatorname{Var}(q_i k_i)

独立同分布,所以是 d 倍。而

\operatorname{Var}(q_i k_i)=\mathbb{E}[q_i^2]\mathbb{E}[k_i^2]-\left(\mathbb{E}[q_i]\mathbb{E}[k_i]\right)^2 =\sigma^4

所以

\operatorname{Var}(q\cdot k)=d\sigma^4,\qquad \text{标准差}=\sigma^2\sqrt d

除以 \sqrt d 之后,标准差变成 \sigma^2——和 d 无关。

注记一个容易混的点

很多人记成”除以 \sqrt{d_k} 让方差变成 1”。

不对。 除以 \sqrt d 让标准差从 \sigma^2\sqrt d 变成 \sigma^2。 只有 \sigma=1 时才是 1。

第 1 章的实测(\sigma\approx0.02)里,缩放后的标准差约 4\times10^{-4}—— 所以那个模型上 softmax 根本不饱和,缩放看起来”没用”。 这就是”小模型上看不出差别”的数学原因。


A.7 信息论三条

A.7.1 熵

离散:

H(X)=-\sum_x p(x)\log p(x)

连续(微分熵):

H(X)=-\int p(x)\log p(x)\,dx

注意微分熵可以为负(方差小于 1/(2\pi e) 时)。

A.7.2 互信息

I(X;Y)=H(X)-H(X\mid Y)=H(Y)-H(Y\mid X)

它衡量”知道 Y 之后,X 的不确定性减少了多少”。

A.7.3 数据处理不等式

若 X\to Y\to Z 构成马尔可夫链(Z 只通过 Y 依赖 X),则

I(X;Z)\le I(X;Y)

直觉:加工不会增加信息。 你只能丢信息,不能凭空造。

用在哪:第 8 章”均值池化丢的是信息,不是精度”。 均值池化是 Y 的一个确定性函数, 所以 I(x_0;c_{\text{mean}})\le I(x_0;c_{\text{token}})。

这个不等式是”结构上不可能”,不是”训练不够”。

A.7.4 一个具体的换算

第 8 章用

\Delta H=\frac12\log\frac{\text{MSE}_1}{\text{MSE}_2}

把两个模型的损失差换成”比特”。

这个式子来自高斯熵(A.3 性质五): 同方差假设下,熵只和方差的对数有关。

代入 0.0480 和 0.0295:

\Delta H=\frac12\log\frac{0.0480}{0.0295}=0.243\ \text{nat}=0.351\ \text{bit}

它的含义是”条件多提供了 0.35 比特”, 不是”模型准确率高了 35%“。


A.8 五个常用不等式

不等式 形式 用在哪
Jensen f(\mathbb{E}X)\le\mathbb{E}f(X)(f 凸) ELBO(A.2.2)
Cauchy–Schwarz \lvert\langle x,y\rangle\rvert\le\lVert x\rVert\lVert y\rVert 余弦相似度、CLIP
log-sum \sum a_i\log\frac{a_i}{b_i}\ge(\sum a_i)\log\frac{\sum a_i}{\sum b_i} KL 非负
AM–GM \frac{a+b}{2}\ge\sqrt{ab} 方差界
union bound P(\cup_i A_i)\le\sum_i P(A_i) 多重比较的保守估计

最常用的是 Jensen。它一句话就能证明 KL 非负:

\operatorname{KL}(p\Vert q)=\mathbb{E}_p\left[-\log\frac{q}{p}\right] \ge-\log\mathbb{E}_p\left[\frac{q}{p}\right]=-\log 1=0

注意不等号方向:-\log 是凸函数,所以 \mathbb{E}[-\log X]\ge-\log\mathbb{E}[X]。


A.9 矩阵求导三条

这三个式子在第 5、7、8 章都会出现。

\frac{\partial(a^\top x)}{\partial x}=a

\frac{\partial(x^\top Ax)}{\partial x}=(A+A^\top)x

\frac{\partial\log\det A}{\partial A}=A^{-\top}

第一条:线性函数的梯度就是系数。

第二条:二次型。若 A 对称,就是 2Ax。

第三条:用在”高斯归一化常数对协方差求导”时。

再加一条链式法则的矩阵版:

\frac{\partial L}{\partial x}=\left(\frac{\partial y}{\partial x}\right)^\top\frac{\partial L}{\partial y}

注意转置。形状不对的时候,先检查这一条。


A.10 DDIM 的代数

第 6 章说”DDIM 是确定性采样”。这里把它的更新式推出来。

A.10.1 从”保持边缘分布”开始

我们想要一个非马尔可夫的前向过程,但要求它的边缘分布 q(x_t\mid x_0) 和 DDPM 完全一样。

DDPM 的边缘是

q(x_t\mid x_0)=\mathcal{N}\left(\sqrt{\bar\alpha_t}x_0,\ (1-\bar\alpha_t)I\right)

现在定义

q_\sigma(x_{t-1}\mid x_t,x_0)=\mathcal{N}\left( \sqrt{\bar\alpha_{t-1}}x_0+\sqrt{1-\bar\alpha_{t-1}-\sigma_t^2}\cdot \frac{x_t-\sqrt{\bar\alpha_t}x_0}{\sqrt{1-\bar\alpha_t}},\ \sigma_t^2 I\right)

其中 \sigma_t 是一个可以选的参数。

验证它给出的边缘:

均值:第二项的期望是 0(因为 x_t 的均值是 \sqrt{\bar\alpha_t}x_0), 所以均值是 \sqrt{\bar\alpha_{t-1}}x_0。

方差:

\frac{1-\bar\alpha_{t-1}-\sigma_t^2}{1-\bar\alpha_t}\operatorname{Var}(x_t\mid x_0)+\sigma_t^2 =(1-\bar\alpha_{t-1}-\sigma_t^2)+\sigma_t^2=1-\bar\alpha_{t-1}

正好是 DDPM 的边缘。

重要\sigma_t 是一个”自由度”

它控制”每一步注入多少新噪声”。

  • \sigma_t^2=\tilde\beta_t → 回到 DDPM(马尔可夫、随机)
  • \sigma_t=0 → 完全确定性
  • 中间值 → 一族插值

DDIM 就是”选 \sigma_t=0“的那一个特例。

注意:边缘分布没变,变的只是”路径”。 所以 DDIM 和 DDPM 在 T\to\infty 时给出同一个分布,只是走法不同。

A.10.2 采样更新式

从 q_\sigma(x_{t-1}\mid x_t,x_0) 采一个样本:

x_{t-1}=\sqrt{\bar\alpha_{t-1}}\hat x_0 +\sqrt{1-\bar\alpha_{t-1}-\sigma_t^2}\cdot \frac{x_t-\sqrt{\bar\alpha_t}\hat x_0}{\sqrt{1-\bar\alpha_t}} +\sigma_t\varepsilon

其中 \hat x_0 是模型给出的估计:

\hat x_0=\frac{x_t-\sqrt{1-\bar\alpha_t}\,\varepsilon_\theta(x_t,t)}{\sqrt{\bar\alpha_t}}

把 \hat x_0 代进去,整理成”x_t 的线性组合 + 噪声”:

x_{t-1}=\sqrt{\bar\alpha_{t-1}}\,\hat x_0 +\sqrt{1-\bar\alpha_{t-1}-\sigma_t^2}\,\varepsilon_\theta +\sigma_t\varepsilon

这一步用了

\frac{x_t-\sqrt{\bar\alpha_t}\hat x_0}{\sqrt{1-\bar\alpha_t}}=\varepsilon_\theta

这是 \hat x_0 定义的直接变形。

A.10.3 两个端点

\sigma_t=0:

x_{t-1}=\sqrt{\bar\alpha_{t-1}}\,\hat x_0+\sqrt{1-\bar\alpha_{t-1}}\,\varepsilon_\theta

没有随机项,给定 x_t 就唯一确定 x_{t-1}。 这是 DDIM。

\sigma_t^2=\tilde\beta_t:

代回去,可以验证它等于 DDPM 的后验均值加 \sqrt{\tilde\beta_t}\varepsilon。 这一步的代数有点长,但方向是清楚的: “选多大的 \sigma” = “在确定性和随机性之间插值”。

注记为什么”确定性”能跳步

因为确定性采样对应一个 ODE。

ODE 的数值解可以用高阶方法,也可以跨大步。 随机采样对应 SDE,SDE 的离散化误差更难控制。

所以 DDIM 能 20 步走完,DDPM 不行—— 不是 DDIM “更聪明”,是它解的问题更容易。

第 6 章的那些采样器(DPM-Solver、Heun),都是在这个 ODE 上做文章。


A.11 PCA 与有效维度

第 7 章用”PC1 占比”和”有效维度”来说明分布塌缩。这里把定义和算法写清楚。

A.11.1 协方差与特征值

给定 n 个样本 x_i\in\mathbb{R}^d,先中心化:

\tilde x_i=x_i-\bar x,\qquad \bar x=\frac1n\sum_i x_i

协方差矩阵:

\Sigma=\frac1n\sum_i\tilde x_i\tilde x_i^\top

特征分解:

\Sigma=U\Lambda U^\top,\qquad \Lambda=\operatorname{diag}(\lambda_1,\dots,\lambda_d),\ \lambda_1\ge\cdots\ge\lambda_d\ge0

第 k 个主成分方向是 U 的第 k 列,方差是 \lambda_k。

A.11.2 两个指标

PC1 占比:

\text{share}_1=\frac{\lambda_1}{\sum_i\lambda_i}

它衡量”最大的那个方向占了多少”。

有效维度:

d_{\text{eff}}=\frac{\left(\sum_i\lambda_i\right)^2}{\sum_i\lambda_i^2}

它衡量”真正用了几个维度”。

重要为什么有效维度长这样

先看两个极端。

各向同性:\lambda_1=\cdots=\lambda_d=\lambda。

d_{\text{eff}}=\frac{(d\lambda)^2}{d\lambda^2}=d

正好是 d。

一个方向独大:\lambda_1=\lambda,其余为 0。

d_{\text{eff}}=\frac{\lambda^2}{\lambda^2}=1

正好是 1。

所以 d_{\text{eff}} 是一个”介于 1 和 d 之间”的数, 越接近 1,分布越像一条线。

它比”PC1 占比”更稳健: PC1 占比只看一个方向,d_{\text{eff}} 看整个谱。

A.11.3 一个手算的例子

四维,特征值 \lambda=(0.90,0.05,0.03,0.02)。

\text{share}_1=\frac{0.90}{1.00}=0.90

d_{\text{eff}}=\frac{1.00^2}{0.81+0.0025+0.0009+0.0004} =\frac{1.00}{0.8138}=1.229

PC1 占比 90%,有效维度 1.23。

两个数说的不是一件事: “90% 的方差在一个方向上”不等于”只有一个维度”—— 剩下 10% 还摊在三个方向上。

第 7 章报的是两个数一起看,就是这个原因。

A.11.4 实现的三个坑

① 一定要中心化。 不中心化,第一主成分会指向均值方向。

② 用 torch.linalg.eigh,不要用 eig。 协方差矩阵对称,eigh 更快更稳,而且返回实数。

③ 特征值可能略小于 0(浮点误差)。算有效维度前先 clamp_min(0)。


A.12 用在哪:一张索引

小节 内容 正文用到的地方
A.2.1 配方法 第 5 章后验、第 7 章条件模型
A.2.2 ELBO 分解 第 5 章训练目标
A.2.3 高斯 KL → MSE 第 5 章、第 6 章
A.2.4 score matching 第 6 章、第 5 章 §5.10
A.3 高斯五性质 全书
A.4 Tweedie 第 5 章 \hat x_0
A.5 softmax 梯度 第 1 章、第 8 章梯度
A.6 方差传播 第 1 章 \sqrt{d_k}
A.7 信息论 第 8 章损失→比特
A.8 不等式 ELBO、KL
A.9 矩阵求导 第 5、7、8 章
A.10 DDIM 的代数 第 6 章
A.11 PCA 与有效维度 第 7 章
提示怎么用这份附录

不要从头读到尾。

遇到下面三种情况再来查:

  1. 正文说”可以证明”——来这里找证明
  2. 公式里有个符号不认识——回 A.1
  3. 想不通”为什么要这一项”——看对应小节的”用在哪”

如果你在准备考试:A.2 的四个推导必须能独立写出来。 其余可以查。