Diffusion-原理解析

这是我学习Diffusion时记录的一些笔记 ,希望能对你有所帮助😊

基本概念

Diffusion Model(扩散模型)包含两个核心过程:

  • 前向过程 (Forward Process): 这是一个固定的过程。它在 $T$ 个时间步内,逐步地向一个清晰的原始图像 $x_0$ 中添加高斯噪声,直到图像在 $T$ 时刻变为一个纯粹的随机噪声 $x_T$。

  • 反向过程 (Reverse Process): 这是一个可学习的过程。模型从纯粹的噪声 $x_T$ 开始,通过一个神经网络(通常是 U-Net)在 $T$ 个时间步内逐步去噪,最终重建出清晰的图像 $x_0$。

与 VAE (Variational Autoencoder) 相比,VAE 试图通过 Encoder 将图像压缩到一个潜在向量,再通过 Decoder 重建,而 Diffusion Model 则是将这个过程分解为 N 个“加噪”和“去噪”的步骤。

Framework

Overview

image.png

  • 内部大致是三个模块,分别进行训练

Examples

  • Stable Diffusion、DALL-E、Imagen 的架构类似

image.png
image.png
image.png

  • 其实可以发现,第三个Decoder 就是一个超分模块,将低像素的模糊图片转换为清晰的图片

组成

1、Text Encoder

FID

image.png

  • FID 用来衡量生成的图片的质量
  • 将真实图片与生成图片的 latent space 的分布视为 Gaussian Distribution,然后计算两个Gaussian Distribution之间的距离

重要性

  • 由图观察可知,encoder的大小 质量 对最后生成的图片的质量影响更大,相比之下,U-Net 也就是 Generation Model 的影响没那么显著

image.png

CLIP

  • Contrastive Language-Image Pre-Training
  • 在 400 million image-text pairs 上训练
  • 具备通用的图文理解能力

2、Decoder

  • Decoder can be trainedwithout labelled data.
  • 其实是一个超分模块
  • 可以将原始图片通过一个Encoder 变小后 再用来训练 Decoder
  • Latent Representation
    image.png
    image.png

3、Generation

image.png

核心算法 (DDPM)

  • 重点介绍DDPM (Denoising Diffusion Probabilistic Models) 的两个核心算法
    image.png

算法 1:训练 (Training)

训练的目标是让神经网络学会“预测噪声”。

  1. 从数据集中随机采样一个清晰的图像 $x_0$。
  2. 随机选择一个时间步 $t$(从 $1$ 到 $T$)。
  3. 随机采样一个与 $x_0$ 同样大小的标准高斯噪声 $\epsilon$。
  4. 关键步骤: 使用一个“捷径”公式(前向过程的数学技巧),直接根据 $x_0$, $t$, $\epsilon$ 生成在 $t$ 时刻的带噪图像 $x_t$:
    $$
    x_t = \sqrt{\overline{\alpha}{t}}x{0}+\sqrt{1-\overline{\alpha}_{t}}\epsilon
    $$
  5. 将 $x_t$ 和时间步 $t$ 一起输入到噪声预测网络 $\epsilon_{\theta}$ 中,得到网络预测的噪声 $\epsilon_{\theta}(x_t, t)$。
  6. 计算网络预测的噪声 $\epsilon_{\theta}$ 与步骤 3 中采样的真实噪声 $\epsilon$ 之间的均方误差 (MSE) 损失。
  7. 通过梯度下降更新网络参数 $\theta$ 来最小化这个损失。

训练目标(损失函数):
$$
\nabla_{\theta}||\epsilon-\epsilon_{\theta}(\sqrt{\overline{\alpha}{t}}x{0}+\sqrt{1-\overline{\alpha}_{t}}\epsilon,t)||^{2}
$$

简单来说,就是训练一个网络,让它在给定 $t$ 时刻的带噪图像 $x_t$ 时,能准确预测出当初添加的噪声 $\epsilon$。

算法 2:采样 (Sampling / Inference)

在采样(即生成图像)阶段,我们执行“反向过程”。

  1. 从一个标准高斯分布中采样一个纯噪声图像,作为 $x_T$。

  2. 从 $t=T$ 开始,循环递减到 $t=1$:
    a. 将当前的带噪图像 $x_t$ 和时间步 $t$ 输入到训练好的噪声预测网络 $\epsilon_{\theta}$,得到预测的噪声 $\epsilon_{\theta}(x_t, t)$。
    b. 使用 $x_t$ 和预测出的噪声 $\epsilon_{\theta}(x_t, t)$,通过以下公式计算出上一个时间步 $x_{t-1}$(即一个噪声少一点的图像)。
    c. 采样公式:
    $$
    x_{t-1}=\frac{1}{\sqrt{\alpha_{t}}}(x_{t}-\frac{1-\alpha_{t}}{\sqrt{1-\overline{\alpha}{t}}}\epsilon{\theta}(x_{t},t))+\sigma_{t}z
    $$
    (其中 $z$ 是一个在 $t>1$ 时采样的标准高斯噪声,在 $t=1$ 时 $z=0$)

  3. 当循环在 $t=1$ 结束时,得到的 $x_0$ 就是最终生成的清晰图像。


3. 核心数学原理

为什么是预测噪声?

这是整个 DDPM 数学推导的精华所在。

  1. 最终目标: 我们的目标是训练一个模型 $P_{\theta}(x_{t-1}|x_t)$ 来拟合真实的反向过程 $q(x_{t-1}|x_t, x_0)$。

  2. 目标均值: 通过数学推导(贝叶斯公式),可以证明 $q(x_{t-1}|x_t, x_0)$ 是一个高斯分布,其均值(Mean)为:
    $$
    \frac{\sqrt{\overline{\alpha}{t-1}}\beta{t}x_{0}+\sqrt{\alpha_{t}}(1-\overline{\alpha}{t-1})x{t}}{1-\overline{\alpha}_{t}}
    $$

  3. 问题: 这个均值依赖 $x_0$。在训练时我们可以拿到 $x_0$,但在采样(Inference)时,我们并没有 $x_0$($x_0$ 是我们要生成的目标)。

  4. 关键洞察(重参数化): 我们有前向过程的“捷径”公式:
    $$
    x_{t}=\sqrt{\overline{\alpha}{t}}x{0}+\sqrt{1-\overline{\alpha}{t}}\epsilon
    $$
    我们可以用它来反解 $x_0$:
    $$
    x
    {0} = \frac{x_{t}-\sqrt{1-\overline{\alpha}{t}}\epsilon}{\sqrt{\overline{\alpha}{t}}}
    $$

  5. 代换: 将这个 $x_0$ 的表达式代入到步骤 2 中的均值公式中,经过一系列化简,可以得到一个等价的均值表达式:
    $$
    \frac{1}{\sqrt{\alpha_{t}}}(x_{t}-\frac{1-\alpha_{t}}{\sqrt{1-\overline{\alpha}_{t}}}\epsilon)
    $$

  6. 结论:

    • 这个新的均值公式**只依赖 $x_t$ 和 $\epsilon$**,不再依赖 $x_0$,$x_t$ 是我们已知的(网络的输入)。

    • 这意味着,我们的神经网络 $P_{\theta}$ **只需要预测 $\epsilon$,就可以计算出这个目标均值。这就是为什么 DDPM 的神经网络被设计为噪声预测器 $\epsilon_{\theta}$**。

    • 这也解释了算法 2(采样)中的公式是如何来的。

为什么采样时需要添加随机噪声 $\sigma_t z$?

  • 在算法 2 的采样公式中,除了通过 $\epsilon_{\theta}$ 计算出的均值(确定性部分),还多了一项 $\sigma_t z$(随机性部分)。

  • PPT 提问:为什么不直接取均值,而是要进行“采样”?

  • 猜想(类比文本生成):

    • 在文本生成任务中,如果总是选择概率最高的词(如 Beam Search),会很快陷入重复、无意义的循环(称为 “Neural Text Degeneration”)。

    • 相反,使用“采样”(Sampling)会引入随机性,使得生成的文本更具多样性、更像人类的表达

    • Diffusion Model 也是一个自回归(Autoregressive)的过程,它在 $T$ 步中逐步生成结果。在每一步去噪时都添加一点随机噪声,可以防止模型“卡住”,并极大丰富生成结果的多样性。


4. 扩展应用:离散数据(如文本)

  • 困难点: 文本是离散的(”你好吗?”),无法直接对其施加高斯噪声。

  • 解决方案:

    1. 在隐空间 (Latent Space) 加噪: 不对离散的 token 加噪,而是对它们的连续表示(如 Word Vectors 或 Embeddings)加高斯噪声 (如 Diffusion-LM, DiffuSeq)。

    2. 使用非高斯噪声: 将“加噪”过程替换为更适合离散数据的“损坏”过程,例如“随机 Masking”或“词语替换”,然后训练模型重建原始文本(如 DiffusER, MaskGIT)。这使得 Diffusion 的思想与 Masked Autoencoder(如 BERT)产生了联系。


Diffusion-原理解析
http://pzhwuhu.github.io/2025/11/13/Diffusion-原理解析/
本文作者
pzhwuhu
发布于
2025年11月13日
更新于
2025年11月18日
许可协议