AI Hero Club

扩散模型与 Flow Matching · 第 2 章

已自行标记完成0 / 8

仅保存在当前浏览器;完成标记不代表通过项目验收。

本章提纲 7 个小节
全课目录 8 章
完整课程计划 ↗
扩散模型与 Flow Matching / 课程计划 ↗

CHAPTER 02 / 8建议学习 160 分钟

DDPM前向链、累计噪声与训练标签

连续加许多次高斯噪声后,怎样直接写出任意一步的样本分布和训练标签?

本章要解决的 3 个问题
  • 逐步展开并归纳任意时刻条件分布
  • 区分条件噪声、数据边缘与累计信噪比
  • 固定噪声预测目标及其信息边界
课程项目 ZIP ↓

本章任务:不递归模拟也能精确构造加噪样本

上一章的流时间从噪声走向数据。本章单独定义离散步号 j=0,1,…,Jj=0,1,\ldots,J:x0x_0 是干净数据,xJx_J 是逐步加噪后的变量。符号相似不代表方向相同。DDPM 是离散去噪扩散概率模型的简称;先规定一个不学习的前向马尔可夫链,再学习反向生成。本章只完成前向链、任意时刻条件分布和噪声监督,不把可制造噪声误称为已经会生成。

马尔可夫在这里的意思是:给定当前状态后,下一次转移不再额外依赖更早的状态。它是我们设计加噪过程的条件独立假设,不是说原始数据的像素或二维坐标本来就独立。设每步新噪声 zjz_j 是相互独立的标准正态向量,也独立于干净样本;每步方差参数 βj\beta_j 严格位于零和一之间,并记 αj=1−βj\alpha_j=1-\beta_j。

xj=αjxj−1+βjzj,q(xj∣xj−1)=N(αjxj−1,βjI)x_j=\sqrt{\alpha_j}x_{j-1}+\sqrt{\beta_j}z_j,\qquad q(x_j\mid x_{j-1})=\mathcal N(\sqrt{\alpha_j}x_{j-1},\beta_j I)
日程是预先指定的一列方差,不是网络输出。

一、两步展开说明为何要累乘保留率

第一步的数据系数是 α1\sqrt{\alpha_1}。把第一步结果代入第二步,数据系数变成 α2α1\sqrt{\alpha_2\alpha_1},而两项噪声分别带系数 α2β1\sqrt{\alpha_2\beta_1} 和 β2\sqrt{\beta_2}。独立标准正态的线性组合仍是正态,其方差为系数平方之和;因此噪声方差是 α2β1+β2\alpha_2\beta_1+\beta_2,化简为 1−α1α21-\alpha_1\alpha_2。这里每一处相加都依赖噪声独立,若复用同一个噪声而不加交叉项,公式就失效。

定义累计保留率 αˉj=∏i=1jαi\bar\alpha_j=\prod_{i=1}^j\alpha_i,并约定 αˉ0=1\bar\alpha_0=1。假设第 j−1j-1 步噪声方差为 1−αˉj−11-\bar\alpha_{j-1},再做一次转移,得到 αj(1−αˉj−1)+βj=1−αˉj\alpha_j(1-\bar\alpha_{j-1})+\beta_j=1-\bar\alpha_j;数据系数同步乘上 αj\sqrt{\alpha_j}。这就是归纳证明,不需要把所有步写成巨大的噪声和。我们由此获得可直接采样的条件边缘分布。

q(xj∣x0)=N(αˉjx0,(1−αˉj)I),xj=αˉjx0+1−αˉj ϵq(x_j\mid x_0)=\mathcal N(\sqrt{\bar\alpha_j}x_0,(1-\bar\alpha_j)I),\qquad x_j=\sqrt{\bar\alpha_j}x_0+\sqrt{1-\bar\alpha_j}\,\epsilon
这里的 ε 是合成后的标准正态噪声;直接采样能匹配单时刻条件分布,但不自动保留整条链的联合噪声关联。

最后一句限制很实际。训练若只随机抽一个步号,只需构造该时刻的条件样本,不必走完之前所有步。若要研究同一条链在两个时刻的联合协方差,却不能把两个直接采样的噪声随便设成独立,然后声称它们是同一条真实前向轨迹。边缘相同并不固定耦合关系;上一章端点耦合的警告在离散链中仍然适用。

算例一:累计方差与噪声还原

考虑一维干净值二,前两步都取 β=0.2\beta=0.2,所以两次 α\alpha 均为零点八,累计保留率是零点六四。第二步的条件均值是零点八乘二,得到一点六;条件方差是零点三六,标准差为零点六。若直接噪声取负一,样本就是一点六减零点六,得到一。反过来,已知这个样本一与噪声负一,可用先减噪声项再除数据系数还原干净值二。

两步展开还能独立检查方差:第二步之前的噪声系数平方为零点八乘零点二,等于零点一六;第二步新噪声贡献零点二,两者和为零点三六。错误地把两次方差直接相加会得到零点四,漏掉第一份噪声也被后一步缩放。错误地把累计保留率写成零点八加零点八会超过一,平方根噪声项甚至不再有实数意义。这些是应明确报错的日程失败,而不是训练不稳定的神秘现象。

二、条件高斯不等于整个数据边缘高斯

固定 x0x_0 后,以上条件式是高斯;让 x0x_0 来自复杂数据后,必须对数据积分才能得到 qj(x)q_j(x)。若干净数据为第一章四簇混合,每个簇中心缩成 αˉjμk\sqrt{\bar\alpha_j}\mu_k,簇内方差变为 αˉjσ2+1−αˉj\bar\alpha_j\sigma^2+1-\bar\alpha_j,因此整体仍是四个高斯的混合,而不一定是单个高斯。把条件分布的形式直接当作无条件边缘,是推导反向去噪时一个常见的逻辑跳步。

当累计保留率很小时,各簇中心靠近零、簇内方差靠近一,整个边缘可以接近标准正态。但有限步下“接近”不是“完全相等”,特别是数据的尺度或尾部很大时。反向采样从标准正态开始,是一个需检查终端误差的约定。不能仅因为用了很多步就断言终端已经精确匹配;应检查累计保留率、原数据尺度,以及实际终端分布的矩和形状。

算例二:信噪比比较的是方差尺度

暂把干净变量标准化到单坐标方差一,并定义信噪比为信号方差除噪声方差,即 SNRj=αˉj/(1−αˉj)\mathrm{SNR}_j=\bar\alpha_j/(1-\bar\alpha_j)。累计保留率零点九、零点五、零点一时,信噪比分别为九、一、九分之一。注意系数是平方根,信噪比却用方差,不能再对这个比值取平方根后仍称作同一指标。对于方差四点零九的未标准化目标,信号方差还需乘四点零九,数值随数据尺度而变。

假设两套日程在某一步都写着 βj=0.01\beta_j=0.01,这不能说明该步噪声程度一样:之前的累乘可能一个为零点九,另一个为零点一。决定直接条件样本尺度的是累计量。训练代码应保存完整日程或可重建它的参数及总步数,不能只保存“使用了百分之一噪声”这样含糊的标签。步号嵌入也应对应这份日程,换日程后沿用旧步号含义会让网络读取错误条件。

三、噪声预测标签从哪里来

用上面的直接采样式构造训练对时,我们自己抽到了 ϵ\epsilon,所以能把它作为监督标签。噪声网络 ϵθ(xj,j)\epsilon_\theta(x_j,j) 接收带噪样本和步号,输出同维向量,参数 θ\theta 是要训练的数。常用平方误差要求它接近实际抽到的噪声;但给定同一个带噪点,可能有许多干净样本与噪声组合,因此网络通常不能逐例完美找回那个隐藏噪声。最优回归量是条件平均,第四章会推导它与 score 的联系。

Lϵ=Ex0,j,ϵ[∥ϵθ(xj,j)−ϵ∥2]\mathcal L_{\epsilon}=\mathbb E_{x_0,j,\epsilon}\left[\|\epsilon_\theta(x_j,j)-\epsilon\|^2\right]
本式先定义一个可计算的回归目标;它与变分似然的权重关系下一章单独推导。

目标公式还没有说明按坐标取和还是平均、时间步如何采样、是否对不同时间加权。实现必须固定这些约定。取和与平均只差常数,不改变理想最优点,却会改变梯度尺度与学习率的解释;改变时间权重则会改变有限网络容量分配。不要把所有不同实现都叫“同一个 MSE”,再用完全相同的学习率作无条件公平比较。

我们后面的可运行项目训练的是流速度,不是这个噪声网络。因此本章独立代码只检查前向日程与条件代数,不声称已经完成 DDPM 训练。将离散扩散推导和连续流实验并置,是为了比较监督目标与采样机制;它们共享生成任务,却不是同一套模型权重或同一个时间方向。最终验收会分别标明理论覆盖和代码实际覆盖。

独立运行直接核对两步条件矩;这里没有假装训练去噪网络。
from math import sqrt
beta=[0.2,0.2]
bar=1.0
for value in beta:
    assert 0<value<1
    bar*=1-value
mean=sqrt(bar)*2
variance=1-bar
observed=mean+sqrt(variance)*(-1)
reconstructed=(observed-sqrt(variance)*(-1))/sqrt(bar)
assert abs(mean-1.6)<1e-12
assert abs(variance-0.36)<1e-12
assert abs(reconstructed-2)<1e-12
print(bar,mean,variance,observed,reconstructed)

训练步号通常只从一到总步数中抽取,不包含零。零时刻没有加入噪声,若仍要求通过带噪样本反推出一个任意抽到的噪声,标签与输入没有相同的信息含义;涉及除以噪声标准差的公式还会出现零分母。实现应明确拒绝无效日程,或者把端点作为单独定义的极限问题,而不是在分母后随手加一个很小常数就声称推导未变。数值补丁可以用于稳定程序,但必须说明它改变了什么计算。

噪声目标还依赖数据预处理。若把二维坐标整体乘十而不改日程,同一累计保留率对应的真实信号方差放大一百倍,网络面对的有效信噪比就不同。保存标准化的中心、尺度及逆变换,是模型定义的一部分;评价输出时必须回到同一坐标单位。不同预处理下的噪声回归曲线不能简单视为同条件对照,尤其不能把较小的坐标数值自动解释成更好的分布建模。

练习与完整解答

TRY IT YOURSELF

练习一|不等噪声率

第一步β为0.1、第二步β为0.2,干净值三。求第二步条件均值、方差和标准差,并用递推独立检查。

提示 1
先算每步alpha与累计alpha,再区分条件方差和标准差。
提示 2
另沿两步递推传播第一步噪声方差,再加第二步新噪声;数据系数也应连乘一致。
对照参考解答
两步保留率分别零点九和零点八,累计值零点七二。条件均值为三乘根号零点七二,约二点五四五六;条件方差为零点二八,标准差约零点五二九二。递推计算噪声方差:第一步的零点一被第二步保留率零点八缩放,贡献零点零八,第二步新加零点二,合计零点二八。数据系数是根号零点九再乘根号零点八,正好等于根号零点七二。两种计算核对的是同一个条件边缘。

TRY IT YOURSELF

练习二|跳过若干前向步

已知两个时刻累计保留率分别为0.8和0.2,后时刻比前时刻更噪。写出前向跨步转移的数据系数与噪声方差,说明为何不能随便使用某一步β。

提示 1
跨步系数要使前时刻的累计信号变成后时刻的累计信号。
提示 2
设保留率rho,解rho×前累计=后累计,再让新噪声补足方差;不能任取原单步beta。
对照参考解答
跨步转移必须把已有信号系数从根号零点八变成根号零点二,因此保留率为零点二除零点八,即零点二五;数据系数为零点五,新加噪声方差为零点七五。已有噪声同时缩放,才能使后时刻总条件方差从零点二变成零点八。若照搬一个原单步β,通常不满足这个累计比例,实际模拟的是另一条链。这里推的是前向跨步高斯转移,不是任意跳步反向采样公式。

TRY IT YOURSELF

练习三|数据边缘的协方差

干净二维目标协方差为4.09I,当累计保留率为0.25时,带噪边缘协方差是多少?它是否足以证明边缘为高斯?

提示 1
随机干净数据与独立噪声都贡献边缘协方差。
提示 2
先缩放数据协方差再加噪声协方差;与固定x0的条件方差区分,并问二阶矩是否决定完整密度。
对照参考解答
独立噪声贡献零点七五I,原数据协方差缩成零点二五乘四点零九I,即一点零二二五I,相加为一点七七二五I。若直接回答零点七五I,算的是固定干净样本时的条件噪声,而不是整个边缘。协方差只给二阶信息,不能确定分布形状;四簇混合在此时的中心仍为原中心的一半,簇内方差为零点七七二五,整体一般仍是混合。单高斯可以共享这些矩,但不是由此得到的唯一分布。

CHECK YOUR UNDERSTANDING

检验理解

先作答,再决定是否展开解析。选择题用于发现理解缺口;独立实现与迁移任务仍需另行检验。

1. 前向直接采样的噪声标准差是?

查看解析协方差为一减累计保留率,抽样系数要取平方根。
2. 固定干净点的条件高斯意味着数据边缘高斯吗?

查看解析条件形式不能直接替代边缘分布。
3. 累计保留率如何更新?

查看解析每步线性信号系数相乘,对应保留率累乘。
4. 本章已实现什么?

查看解析噪声预测目标已定义,但本章程序没有训练网络。

自行标记用于记录学习进度,不代表通过项目验收。