Diffusion Model(扩散模型)是一类生成模型,可以从随机噪声逐步“还原”出高质量数据(如图像),其核心思想是:
正向过程把数据逐步加噪变成纯噪声,反向过程学会从噪声中一步步“去噪”还原出原始数据。
这是一种马尔可夫过程,形式化如下:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI) q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I}) q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
其中:
下面来详细拆解你没看懂的这个扩散过程的公式:
我们说的 正向扩散过程(Forward Diffusion) 的公式是:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI) q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I}) q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
它表示第 ttt 步图像 xtx_txt 是在第 t−1t-1t−1 步图像 xt−1x_{t-1}xt−1 的基础上加噪声得到的。
我们把这个公式拆成两部分讲:
这表示:
“在给定上一时刻图像 xt−1x_{t-1}xt−1 的前提下,第 ttt 步的图像 xtx_txt 是一个正态分布随机变量”。
这是马尔可夫链的经典形式:当前状态只依赖于上一个状态。
这说明我们对上一步的图像进行缩放(<1),意思是“保留一部分原图内容”。
简化理解:
“我们保留一部分旧图像,并加上一点高斯噪声。”
每一步的图像 xtx_txt 是这样来的:
“拿上一步的图像 xt−1x_{t-1}xt−1,稍微压一压(乘 1−βt\sqrt{1 - \beta_t}1−βt),再撒一层噪声粉末(加高斯噪声)”。
就像你用 Photoshop 滤镜一点点“模糊”一张照片。
想象我们有一张猫的清晰图片:
这中间的每一步,都是基于上一帧加了一点点噪声得到的,而公式就是在数学上描述这个过程。
x_t = sqrt(1 - beta_t) * x_{t-1} + sqrt(beta_t) * torch.randn_like(x_{t-1})
这就是实际 PyTorch 实现中最核心的一行代码。