本章任务:不递归模拟也能精确构造加噪样本
上一章的流时间从噪声走向数据。本章单独定义离散步号 : 是干净数据, 是逐步加噪后的变量。符号相似不代表方向相同。DDPM 是离散去噪扩散概率模型的简称;先规定一个不学习的前向马尔可夫链,再学习反向生成。本章只完成前向链、任意时刻条件分布和噪声监督,不把可制造噪声误称为已经会生成。
马尔可夫在这里的意思是:给定当前状态后,下一次转移不再额外依赖更早的状态。它是我们设计加噪过程的条件独立假设,不是说原始数据的像素或二维坐标本来就独立。设每步新噪声 是相互独立的标准正态向量,也独立于干净样本;每步方差参数 严格位于零和一之间,并记 。
一、两步展开说明为何要累乘保留率
第一步的数据系数是 。把第一步结果代入第二步,数据系数变成 ,而两项噪声分别带系数 和 。独立标准正态的线性组合仍是正态,其方差为系数平方之和;因此噪声方差是 ,化简为 。这里每一处相加都依赖噪声独立,若复用同一个噪声而不加交叉项,公式就失效。
定义累计保留率 ,并约定 。假设第 步噪声方差为 ,再做一次转移,得到 ;数据系数同步乘上 。这就是归纳证明,不需要把所有步写成巨大的噪声和。我们由此获得可直接采样的条件边缘分布。
最后一句限制很实际。训练若只随机抽一个步号,只需构造该时刻的条件样本,不必走完之前所有步。若要研究同一条链在两个时刻的联合协方差,却不能把两个直接采样的噪声随便设成独立,然后声称它们是同一条真实前向轨迹。边缘相同并不固定耦合关系;上一章端点耦合的警告在离散链中仍然适用。
算例一:累计方差与噪声还原
考虑一维干净值二,前两步都取 ,所以两次 均为零点八,累计保留率是零点六四。第二步的条件均值是零点八乘二,得到一点六;条件方差是零点三六,标准差为零点六。若直接噪声取负一,样本就是一点六减零点六,得到一。反过来,已知这个样本一与噪声负一,可用先减噪声项再除数据系数还原干净值二。
两步展开还能独立检查方差:第二步之前的噪声系数平方为零点八乘零点二,等于零点一六;第二步新噪声贡献零点二,两者和为零点三六。错误地把两次方差直接相加会得到零点四,漏掉第一份噪声也被后一步缩放。错误地把累计保留率写成零点八加零点八会超过一,平方根噪声项甚至不再有实数意义。这些是应明确报错的日程失败,而不是训练不稳定的神秘现象。
二、条件高斯不等于整个数据边缘高斯
固定 后,以上条件式是高斯;让 来自复杂数据后,必须对数据积分才能得到 。若干净数据为第一章四簇混合,每个簇中心缩成 ,簇内方差变为 ,因此整体仍是四个高斯的混合,而不一定是单个高斯。把条件分布的形式直接当作无条件边缘,是推导反向去噪时一个常见的逻辑跳步。
当累计保留率很小时,各簇中心靠近零、簇内方差靠近一,整个边缘可以接近标准正态。但有限步下“接近”不是“完全相等”,特别是数据的尺度或尾部很大时。反向采样从标准正态开始,是一个需检查终端误差的约定。不能仅因为用了很多步就断言终端已经精确匹配;应检查累计保留率、原数据尺度,以及实际终端分布的矩和形状。
算例二:信噪比比较的是方差尺度
暂把干净变量标准化到单坐标方差一,并定义信噪比为信号方差除噪声方差,即 。累计保留率零点九、零点五、零点一时,信噪比分别为九、一、九分之一。注意系数是平方根,信噪比却用方差,不能再对这个比值取平方根后仍称作同一指标。对于方差四点零九的未标准化目标,信号方差还需乘四点零九,数值随数据尺度而变。
假设两套日程在某一步都写着 ,这不能说明该步噪声程度一样:之前的累乘可能一个为零点九,另一个为零点一。决定直接条件样本尺度的是累计量。训练代码应保存完整日程或可重建它的参数及总步数,不能只保存“使用了百分之一噪声”这样含糊的标签。步号嵌入也应对应这份日程,换日程后沿用旧步号含义会让网络读取错误条件。
三、噪声预测标签从哪里来
用上面的直接采样式构造训练对时,我们自己抽到了 ,所以能把它作为监督标签。噪声网络 接收带噪样本和步号,输出同维向量,参数 是要训练的数。常用平方误差要求它接近实际抽到的噪声;但给定同一个带噪点,可能有许多干净样本与噪声组合,因此网络通常不能逐例完美找回那个隐藏噪声。最优回归量是条件平均,第四章会推导它与 score 的联系。
目标公式还没有说明按坐标取和还是平均、时间步如何采样、是否对不同时间加权。实现必须固定这些约定。取和与平均只差常数,不改变理想最优点,却会改变梯度尺度与学习率的解释;改变时间权重则会改变有限网络容量分配。不要把所有不同实现都叫“同一个 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
提示 2
对照参考解答
TRY IT YOURSELF
练习二|跳过若干前向步
已知两个时刻累计保留率分别为0.8和0.2,后时刻比前时刻更噪。写出前向跨步转移的数据系数与噪声方差,说明为何不能随便使用某一步β。
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三|数据边缘的协方差
干净二维目标协方差为4.09I,当累计保留率为0.25时,带噪边缘协方差是多少?它是否足以证明边缘为高斯?