扩散模型,特别是U-Net,被训练来预测在时间步t时含噪输入xt中的噪声ϵ。利用这个训练好的模型,可以生成新的数据。去噪扩散概率模型(DDPM)算法为此生成过程提供了原始的基本方法。
正如本章引言中所述,核心思想是从纯噪声开始,并使用学到的去噪步骤逐步对其进行精细化。我们首先从标准高斯分布中采样一个初始张量xT,即xT∼N(0,I)。这个xT表示最大熵、纯噪声,对应于前向扩散过程的最终状态。
DDPM采样算法随后迭代应用学到的逆向过程,从时间步t=T逐步向后退到t=1。在每一步中,目标是给定当前状态xt,采样得到一个噪声稍小的版本xt−1。
去噪步骤
回顾第3章,逆向转换pθ(xt−1∣xt)由一个高斯分布近似,其均值μθ(xt,t)取决于xt和预测噪声ϵθ(xt,t),其方差σt2与噪声调度βt相关。
模型ϵθ(xt,t)接收当前含噪图像xt和时间步t作为输入,并输出它对从x0到xt过程中添加的噪声成分的预测。使用这个预测,我们可以估计前一状态xt−1的分布均值。均值μθ(xt,t)的方程是从前向和逆向过程的属性推导出来的:
μθ(xt,t)=αt1(xt−1−αˉt1−αtϵθ(xt,t))
此处,αt=1−βt和αˉt=∏i=1tαi是从前向过程中使用的噪声调度βt派生出的参数 (parameter)。这个方程本质上是取当前含噪样本xt,并减去按比例缩放的预测噪声ϵθ,以估计前一个噪声较小状态xt−1的均值。
逆向步骤的方差σt2也由噪声调度决定。一个常用的选择,为了匹配前向过程后验分布q(xt−1∣xt,x0)的方差而推导出的,是:
σt2=β~t=1−αˉt1−αˉt−1βt
注意,当t=1时,σt2=0。为了执行一个去噪步骤并从xt采样得到xt−1,我们使用模型的预测计算均值μθ(xt,t),然后添加按标准差σt缩放的高斯噪声:
xt−1=μθ(xt,t)+σtz
其中z∼N(0,I)是标准高斯噪声。这个添加的噪声z为生成过程引入了随机性,使得模型即使从相同的初始xT开始也能生成多样化的样本(尽管通常我们从不同的xT样本开始)。然而,对于最后一步(t=1),我们通常将z=0以获得最终的确定性均值预测作为我们的输出x0。
完整的DDPM算法
将这些步骤结合起来,完整的DDPM采样算法如下进行:
- 初始化:采样初始噪声张量xT∼N(0,I)。这个张量应与期望的输出数据(例如,图像的高度、宽度、通道数)具有相同的维度。
- 迭代去噪:从时间步t=T,T−1,…,1开始,向后循环。
- 采样标准高斯噪声z∼N(0,I)。如果t=1,则设置z=0。
- 使用训练好的神经网络 (neural network)ϵθ预测当前状态中存在的噪声:ϵpred=ϵθ(xt,t)。
- 使用预测噪声计算逆向分布的均值:
μθ(xt,t)=αt1(xt−1−αˉt1−αtϵpred)
- 计算方差σt2=β~t(从噪声调度中预先计算)。
- 使用计算出的均值和方差采样下一个状态(噪声较小):
xt−1=μθ(xt,t)+σtz
- 输出:循环结束后(在t=1时),得到的张量x0就是生成的样本。
此过程可视化如下:
图表说明了迭代的DDPM采样过程。从噪声xT开始,每一步都使用噪声预测器ϵθ来计算前一状态的均值μθ,然后通过添加缩放噪声σtz来采样xt−1(除了最后一步z=0)。
最终样本x0的质量在很大程度上取决于训练好的噪声预测器ϵθ的准确性以及所选的噪声调度(βt)和扩散步数(T)。DDPM通常需要大量的步骤(例如T=1000)才能获得高质量结果,这可能导致采样相对缓慢。我们将在后续章节中讨论像DDIM这样更快的替代方法。