附录 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 有关的正系数。
完整的 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^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 章 |
不要从头读到尾。
遇到下面三种情况再来查:
- 正文说”可以证明”——来这里找证明
- 公式里有个符号不认识——回 A.1
- 想不通”为什么要这一项”——看对应小节的”用在哪”
如果你在准备考试:A.2 的四个推导必须能独立写出来。 其余可以查。