Diffusion model

Diffusion model

  • DDPM by blog[1]

  • paper:DDPM[2]

​#10423#​

Diffusion Model by 10-423

基础网络结构:U-Net 及其应用

输入输出维度相同

  1. U-Net 的核心架构

    • 收缩路径(Contracting Path)

      • 每块包含“2 次 3x3 卷积 +ReLU 激活 +2x2 最大池化(步长 2)”

      • 重复 $N$ 次后通道数翻倍(如 128→256→512)。

        作用:通过下采样逐步压缩空间维度,提取高层语义特征。

    • 扩展路径(Expanding Path)

      • 每块包含“2x2 转置卷积(上采样)

        与收缩路径同尺度特征拼接

        2 次 3x3 卷积

        ReLU 激活

      • 重复 $N$ 次后通道数减半(如 512→256→128)。
        作用:通过上采样恢复空间维度,结合低层细节特征与高层语义特征,最终输出与输入尺寸一致的结果(如 224x224 输入 →224x224 输出)。

  2. U-Net 的应用场景

    • 语义分割:为图像中每个像素预测类别(如“猫”“狗”“背景”),需考虑像素间的强关联性(例如“猫”的像素更可能相邻)。
    • 实例分割:在语义分割基础上进一步区分同类别的不同个体(如同一图像中的“猫 1”与“猫 2”),典型框架如 Mask R-CNN(结合目标检测与像素级掩码预测)。
    • 生物医学分割:U-Net 的原始设计目标,例如 ISBI 细胞追踪挑战中,能精准分割细胞边界(如图 4 中 cyan mask 与黄色手动标注的高度吻合)。

无监督学习框架

扩散模型属于无监督生成模型,其设计需满足无监督学习的核心目标:逼近数据分布 $q(x_0)$。

  1. 无监督学习的核心框架

    • 假设

      1. 数据来自未知分布 $q(x_0)$(如真实图像、文本);

      2. 模型分布 $p_\theta(x_0)$ 需支持高效采样

        (即能从 $p_\theta$ 中快速生成符合分布的样本)。

    • 目标:学习参数 $\theta$,使 $p_\theta(x_0)$ 尽可能接近 $q(x_0)$。

  2. Examples

    • 自回归语言模型(Autoregressive LMs)

      • 原理:通过条件概率 $p(x_t|x_1,...,x_{t-1})$ 建模序列数据(如文本),采样时按顺序生成( ancestral sampling)。

      • 优势:可直接计算 $\log p_\theta(x_0)$ 并通过梯度下降优化

        问题:这里不是监督学习嘛? #confusion#​

        不然这个 $log p_{\theta}$ 怎么算出来的?

      • 局限:生成速度慢(需逐元素生成),不适合高维数据(如图像)。

    • 生成对抗网络(GANs)

      • 原理:

        • 生成器 $G(z)$ 从噪声 $z \sim \mathcal{N}(0,I)$ 生成样本

        • 判别器 $D(x)$ 区分真实/生成样本

        • 二者通过 minimax 博弈优化

          • $G$ 最小化 $\log(1-D(G(z)))$
          • $D$ 最大化 $\log D(x) + \log(1-D(G(z)))$)。
      • 优势:采样高效(一步生成),样本质量高。

      • 局限:无法计算 $\log p_\theta(x_0)$

        因 $p_{\theta}(x_0) = \int_z p_{\theta}(x_0|z)p(z)dz$ 的积分不可解

        训练不稳定(易模式崩溃)

        问题是什么叫 marginalized distribution #confusion#​

    • 扩散模型(Diffusion Models)

      • 原理:通过前向加噪与反向去噪的逐步过程建模,兼顾采样 tractability 与分布可优化性。
      • 优势:训练稳定(无对抗博弈),样本质量与多样性均衡,可通过变分下界间接优化 $\log p_\theta(x_0)$。
      • 局限:采样速度慢(需 $T$ 步迭代)。

Latent Variable Models

  • 假定我们观测的数据是与一个隐空间的变量有关的
  • GAN 中的 noise vector z 就是这样一个隐空间变量
  • 而 GAN 就是学习了图像与隐空间的映射关系,让我们能够在隐空间中对图像做插值Screenshot 2025-08-15 at 02.31.57

扩散模型的核心原理

如果把 $x_0$ 视为图像,$x_t$ 是不断混乱,最后变成噪声的过程

  1. 前向过程:从数据到噪声

    • 从原始数据 $x_0 \sim q(x_0)$ 开始,逐步添加高斯噪声,最终得到纯噪声 $x_T$。其联合分布为:

      $$
      q_{\phi}(x_{0:T}) = q_{\phi}(x_0) \prod_{t=1}^T q_{\phi}(x_t|x_{t-1})
      $$

      • 问题:隐空间是什么
        实际上,$q_{\phi}(x_{1:t})$ 是与 $x_0$ 有关的分布,他们是不是 $z_t$
      • 实际上,$q_{\phi}(x_t|x_{t-1}) = \frac{p(x_{t-1}, x_t)}{p(x_t)} = \frac{\int_{x_{0:t-2},x_{t+1:T}}p(x_{0:T})dx}{\int_{x_{0:t-1},x_{t+1:T}}p(x_{0:T})dx}$
    • 如果能得到 $q_{\phi}(x_0)$,一切都结束了;所以别想

    • 所以,我们希望能学习这样的一个实际上需要的 Reverse Process q

    • Approximat Reverse Process:​
      ​$p_{\theta}(x_{0:T}) = p_{\theta}(x_0) \prod_{t=1}^T p_{\theta}(x_t|x_{t-1})$

      • 希望能学会参数化的 $p_{\theta}(x_{t-1}|x_{t})$,match $q(x_{t-1}|x_{t})$
    • 为此:Denoising Diffusion Probobalistic Model(DDPM)

    Screenshot 2025-08-15 at 02.59.42

    Screenshot 2025-08-15 at 17.55.42


  2. 反向过程:从噪声到数据

    • 定义:从纯噪声 $x_T \sim p_\theta(x_T)$(通常设为 $\mathcal{N}(0,I)$)开始,学习条件分布 $p_\theta(x_{t-1}|x_t)$,逐步去噪恢复原始数据。其联合分布为:

      $$
      p_\theta(x_{1:T}) = p_\theta(x_T) \prod_{t=1}^T p_\theta(x_{t-1}|x_t)
      $$

    • 核心挑战:精确反向过程 $q(x_{t-1}|x_t)$ 因依赖 $q(x_0)$ 而不可解(需积分 $q(x_{t-1}|x_t) = \int q(x_{t-1}|x_t,x_0)q(x_0|x_t)dx_0$,而 $q(x_0|x_t)$ 未知)。因此,需学习 $p_\theta(x_{t-1}|x_t)$ 逼近可解的 $q(x_{t-1}|x_t,x_0)$(条件于 $x_0$ 的反向分布)。

DDPM

假设你有一个原始画作,经过 t 次涂抹后,你能不能恢复 t-1 次的图片?

t-1 到 t 只是加入了随机噪声,怎么恢复?

如果不知道 $x_0$,无法恢复,你不知道结构是什么,怎么恢复有意义的结构?

DDPM 是扩散模型的具体实现,通过高斯分布假设与参数化设计,使反向过程可学习、可优化

  • Goal:最后需要学习到的就是 $p_{\theta}$

  • model definition

    • $q(x_0)😒 data sets, unknow

    • $p_{\theta}(x_T) \sim N(0, I)$

    • $q_{\theta}(x_t|x_{t-1}) \sim N(\sqrt{\alpha_t}x_{t-1}, (1 - \alpha_t)I)$
      也就是:$x_t = \sqrt{\alpha_t}x_{t-1} + (1 - \alpha_t) \epsilon$

    • $p_{\theta}(x_{t-1}|x_t) \sim N(\mu_{\theta}(x_t, t), \epsilon_{\theta}(x_t, t))$

      这里想选择一个 fIxed schedule, 让 $q_{\theta}(x_T) \sim N(, I)$, 类似 $p_{\theta}(x_T)$

      这里顺带强调一下,q 为加噪声,p 为去噪声

      为什么是 $q_{\theta}(x_t|x_{t-1}) \sim N(\sqrt{\alpha_t}x_{t-1}, (1 - \alpha_t)I)$, 平方和为 1,之后都是一样平方和 1,方便算

  • $\alpha_t$ 控制噪声强度,$\sqrt{\alpha_t}x_{t-1}$ 为保留的原始信号,$(1-\alpha_t)I$ 为添加的噪声方差,$t$ 越大,$x_t$ 越接近纯噪声。

  1. 正向传播时,Very Convenient property:

    1. $x_t$ 可直接从 $x_0$ 采样,无需逐步计算:

      $$
      q(x_t|x_0) \sim N(\sqrt{\bar{\alpha_t}}x_0, (1-\bar{\alpha_t})I),
      \bar{\alpha}t = \Pi^t
      \alpha_s
      \
      x_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon,\quad \epsilon \sim \mathcal{N}(0,I)
      $$

      • $\bar{\alpha}t = \prod^t \alpha_s$(累计系数),物理意义:$x_t$ 是 $x_0$ 与噪声 $\epsilon$ 的加权组合,权重由 $\bar{\alpha}_t$ 控制。

      • 所以,一定步后,变成了完全的噪声的图像

      • $q(x_T|x_0) \sim N(0, I)$

      • 如果是单纯加噪,为什么 $p_{\theta}$ interesting​?

        • claim 说:$q_{\theta}$ is not just a noise dist, and $p_{\theta}$ must capture the insteresting variability.

          意思是说,$p_{\theta}$ 要学习一些与 $x_0$ 有关的内容,往后看就行

      • But if $p_{\theta}(x_{t-1}|x_t)$ is Gaussian, how can it learn $\theta$ that $p_{\theta}(x_0) = q(x_0)$? Won't $p_{\theta}(x_0)$ be Gaussian too?

        Gaussians $x \sim N(\mu_x, \sigma_x^2) y \sim N(\mu_y, \sigma_y^2)$,则:

        1. $X + Y \sim N(\mu_x + \mu_y, \sigma_x^2 + \sigma_y^2)$ (解释后为什么 gaussian 噪声的加法为什么这样可行)

        2. $X - Y \sim N(\mu_x - \mu_y, \sigma_x^2 + \sigma_y^2)$

        3. Gaussian Condition

          $z \sim N(\mu_2 = X, \epsilon_z) \Rightarrow p(z|x) \sim N( . | ,)$

        4. 非线性无 3. 性质:$W \sim N(\mu_2 = f(X), \epsilon_w) \nRightarrow p(w|x) \sim N( . | ,)$

        • 否,实际上,DM 只需要足够长的 tImestep T,就能捕获所有平滑分布
    2. 估计 $q(x_{t-1}|x_t)$ 很难处理,因为马尔可夫链最后有个 $q(x_0)$

      但是加上 $x_0$ 这个条件, $q(x_{t-1}|x_t,x_0)$ 是可行的

      $q(x_{t-1}|x_t,x_0) \sim N(\bar{\mu}_q(x_t,x_0), \sigma_t^2I)$,可以这样推:

      • 本质上是假设已知 $x_t,x_0$ 来推出 $x_{t-1}$ 的条件概率。好处是,这个条件概率能通过前向扩散的定义,用简单的高斯分布性质推导出来
      • $\mathbf{x}t = \sqrt{\alpha_t} \mathbf{x} + \sqrt{1 - \alpha_t} \boldsymbol{\epsilon}_t$,$\mathbf{x}_t = \sqrt{\bar{\alpha}_t} \mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t} \boldsymbol{\epsilon}_t$
      • $\mathbf{x}{t-1} = \sqrt{\bar{\alpha}{t-1}} \mathbf{x}0 + \sqrt{1 - \bar{\alpha}{t-1}} \boldsymbol{\epsilon}_{t-1}$
      • 因为 $\epsilon_t, \epsilon_{t-1}$ 都是高斯分布,用高斯分布加减法的性质消 $\epsilon$

      根据采样过程假设的信息,这里

      $$
      \begin{align}
      \bar{\mu}q(x_t,x_0) &= \frac{1}{1 - \bar{\alpha}t} {\sqrt{\bar{\alpha}{t-1}}(1 - \alpha_t)x_0 + \sqrt{\alpha_t}(1-\bar{\alpha})x_t} \
      \sigma^2_t &= (1 - \alpha_t)(1 - \bar{\alpha}_{t-1})/(1 - \bar{\alpha}_t)

      \end{align}
      $$

      • 如果知道 $x_0$,这个去噪声就会是很简单的公式直接去算
  2. 反向过程的参数化

    • 目标:使 $p_\theta(x_{t-1}|x_t) \sim \mathcal{N}(\mu_\theta(x_t,t), \Sigma_\theta(x_t,t))$ 逼近 $q(x_{t-1}|x_t,x_0) \sim \mathcal{N}(\tilde{\mu}_q(x_t,x_0), \sigma_t^2 I)$,其中:

      $$
      \tilde{\mu}q(x_t,x_0) = \frac{\sqrt{\bar{\alpha}{t-1}}(1-\alpha_t)}{1-\bar{\alpha}t}x_0 + \frac{\sqrt{\alpha_t}(1-\bar{\alpha})}{1-\bar{\alpha}_t}x_t
      $$

      $$
      \sigma_t^2 = \frac{(1-\bar{\alpha}_{t-1})(1-\alpha_t)}{1-\bar{\alpha}_t}
      $$

    • 简化策略 IDEA

      1. 预期学习这个 $\epsilon$, 直接固定为 $\sigma_t^2 I$(无需学习,直接复用 $q$ 的方差);

      2. $\mu_\theta$ 基于 $q(x_{t-1}|x_t,x_0)$,$\mu_\theta(x_t, t) = \tilde{\mu}q(x_t,x(x_t, t)) = \alpha_t{(0)}x_{\theta}(x_t, t) +\alpha_t^{(t)} x_t$

        • a U-Net thar tries to predict what $x_0$ would be, based $x_t$

训练与采样算法

DDPM 的训练聚焦于优化噪声预测损失,采样则通过逐步去噪生成样本。

  1. 训练算法

    • A:直接硬学 $\mu_q$Screenshot 2025-08-15 at 18.31.46

    • B:学习从 $(x_t, t)$ 中生成 $x_0$Screenshot 2025-08-15 at 18.53.31

    • C: 学习怎么整出更好的 $\epsilon$!(woc)

      (用的 prior 是最多的!)

      问题:还能更强的 prior 吗?? #confusion#​

      Screenshot 2025-08-15 at 18.55.11

    • 核心逻辑:通过学习预测添加的[?],间接使 $p_\theta$ 逼近 $q$。

  2. 采样算法

    • A:

    • B:

    • C:

  • Noise schedule

    • linear v.s. cosScreenshot 2025-08-15 at 19.01.39

      • linear:$\alpha_t$ 随时间步 t 线性变化,实现简单,但可能存在加噪前期或后期噪声添加不够均匀的问题(比如前期快速衰减,导致噪声集中在某些阶段 )
      • cos:基于余弦函数设计的调度,能让噪声添加在时间推移中更均匀,避免线性调度的 “不均衡” 问题,让前向加噪过程更平滑

理论基础:KL 散度与变分下界(这里是在讲变分推理其实)

扩散模型通过优化变分下界间接最大化 $\log p_\theta(x_0)$,其核心是 KL 散度对分布差异的度量。

  1. KL 散度,网上抄的

    • 定义:对分布 $q(x)$ 和 $p(x)$,$KL(q|p) = \mathbb{E}_q[\log \frac{q(x)}{p(x)}]$,衡量 $q$ 与 $p$ 的差异。

    • 性质

      • 非对称:$KL(q|p) \neq KL(p|q)$;
      • 最小值为 0,当且仅当 $q(x) = p(x)$ 对所有 $x$ 成立;
      • 对高概率 $q(x)$ 的区域敏感(需 $p(x)$ 也高,否则 KL 显著增大)。
  2. 变分下界($L$

    • 推导:$\log p_\theta(x_0) \geq -L$,其中:

      $$
      L = \underbrace{KL(q(x_T|x_0)|p(x_T))}{L_T} + \sum \underbrace{KL(q(x_{t-1}|x_t,x_0)|p_\theta(x_{t-1}|x_t))}{L{t-1}} + \underbrace{- \log p_\theta(x_0|x_1)}_{L_0}
      $$

    • 意义:​

      • $L_T$:确保前向终点 $q(x_T|x_0)$ 与反向起点 $p(x_T)$ 一致;
      • $L_{t-1}$:确保每步反向分布 $p_\theta$ 逼近条件反向分布 $q$;
      • $L_0$:最终一步去噪的精度($t=1$ 时恢复 $x_0$)。
    • 优化 $L$ 等价于最小化前向与反向过程的分布差异,从而使 $p_\theta(x_0)$ 逼近 $q(x_0)$。



  1. DDPM by blog

    作者:CodeCrafter
    链接:https://www.zhihu.com/question/658056360/answer/1936464877767090639
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    阶段二:硬核攻坚DDPM (1-2个月,这是关键)

    现在,可以正式啃Diffusion这座大山了。直接从祖师爷级别的论文 《Denoising Diffusion Probabilistic Models》(简称DDPM) 下手。

    学习资源“三件套”:

    1. 论文原文: Ho, Jonathan, et al. “Denoising diffusion probabilistic models.” 2020。打印出来放手边。
    2. 代码实现: GitHub上搜 lucidrains/denoising-diffusion-pytorch​。这个人叫Phil Wang,是AI圈一个很有名的大佬,他的代码实现以简洁、清晰、易读著称。是我们这种非科班出身的福音。
    3. 视频/博客解析:
    • YouTube: 搜 “AI Coffee Break with Letitia” 的 DDPM 视频,或者 “Yannic Kilcher” 的视频。他们会逐行逐公式地过论文。听不懂英文也没关系,开着机翻字幕,主要是看他们把鼠标指到哪个公式,再对应到代码的哪一块。
    • 中文博客: 还是推荐苏剑林大佬的博客,搜“苏剑林 diffusion”,他的讲解能帮你理解很多数学上的“为什么”。

    “代码-公式”对读法(我的独门秘籍),这是最关键的一步,能救你于水火。

    1. 先看前向过程 (Forward Process / Diffusion Process): 论文里是公式(2),那个 q(x_t | x_{t-1})​,看着就烦。你别管它。直接去 denoising-diffusion-pytorch​ 代码里找一个叫 q_sample​ 或者类似名字的函数。你会看到它的输入是 x_start​ (也就是x_0​) 和 t​ (时间步),输出是一个加了噪声的 x_t​。
      它的核心代码可能就几行,类似: noise = torch.randn_like(x_start)​,然后 x_t = sqrt_alpha_bar * x_start + sqrt_one_minus_alpha_bar * noise​。
      这时候你再回头看论文里的公式(4)! 是不是一模一样!这时候你瞬间就懂了,哦,原来那个复杂的 q(x_t|x_0)​ 公式,干的活儿就是往原始图片里加点高斯噪声,alpha_bar​这些鬼东西就是提前算好的一堆控制噪声大小的常量而已。
    2. 再看反向过程 (Reverse Process),也就是训练的核心: 论文里最吓人的是公式(3)和那个目标函数 L_simple​ (公式14)。一堆期望、KL散度,直接劝退。
      别怕,直接看代码里的 p_losses函数! 你会发现,扒光了所有数学外衣,它最后干的事儿可能就是一行: loss = F.l1_loss(noise, predicted_noise)​。
      我当时看到这就直接拍大腿了! 嗨,搞了半天,你这个U-Net模型训练的目标,不就是预测出你在前向过程里亲手加进去的那个 noise​ 吗?这么简单一个事儿,非要用变分下界、KL散度这些复杂的数学语言去包装,显得自己“学术”!
      这一刻,你就打通了任督二脉。你就知道了,Diffusion模型训练时,就是在做一个“猜噪声”的游戏。

    这个阶段,你要反复地在论文的数学符号和代码的具体实现之间横跳。一个公式看不懂,就去代码里找它“长啥样”;一段代码看不懂,就回论文里找它的“理论依据”。一个月下来,你就算不能手推公式,也绝对能把DDPM的整个流程讲得明明白白。

    gogogo!!!


    gnn-blog

    • Diffusion 与 VAE

      • 实际上Diffusion和VAE很像,Diffusion是在多步预测、预测该次输入的噪声
    • Training

      • $\sqrt{\alpha_t}, \sigma_t$ 是怎么来的
    • Diffusion的算法需要采样三个数据

      • $x_0 \sim q(x_0)$, 从训练集中取图片
      • $t \sim Uniform({1. \dots, 1000})$: 随机在 1 到 1000 中采样
      • $\epsilon \sim N(0, I)$: 一个随机噪声,认为是要加的噪声

      这时候的loss 就是 : $\nabla_{\theta} = || \epsilon - \epsilon_{\theta}(\sqrt{\alpha_t} x_0 + \sqrt{1 - \alpha_t} \epsilon)||^2$

    • 为什么这样的loss,先荡开一笔

    • 马尔可夫链:表征一个状态的下一状态与之前的状态无关、只与当前状态有关

      $$
      q(x_{T}|x_0) = \pi_{t>0}q(x_t|x_{t-1}) = N(x_t; \sqrt{1 - \beta_t}x_{t-1}, \sqrt{\beta_t} I)
      $$

      • 问题:$\beta_t$是什么

        这里的$\beta_t$和$\alpha_t$都是类似的东西,表示某种加入噪声的强度;ta越大,噪声影响越强,慢慢提升加噪声的强度,最后就是直达噪声; 他们作为超参数是人为设定的!

        为什么要让 $A \times [image] + B \times [noise] $ 为$A^2 + B^2 = 1$?

      • 问题:这个公式怎么蹦出来的?!为什么最后的高斯分布的两个参数是那样

    • 因为loss中有一个加噪声的问题,加噪声有随机性

      • 在训练的时候,分布中采样有随机性 $\to $ 无法求梯度 #confusion#​ 为什么

      • 所以:在已知的分布中采样,再做一个变换(表示噪声强度),不影响反向传播

        已知的正态分布没模型参数,不会影响反向传播;

        但是$\beta_t$就会引入$x_{t-1}$

    • 当前时刻噪声和上一时刻有关系的,根据马尔可夫链的内容;可是代码中的$x_t$ 与 $x_{t-1}$ 可没有关系,为什么?

      • $$
        \begin{align}
        x_t
        &= \sqrt{1 - \beta_t}x_{t-1} + \beta_t \epsilon_{t-1} \
        &= \sqrt{(1 - \beta_{t-1})(1 - \beta_t)}x_{t-2} + \sqrt{(1 - \beta_{t}) \beta_{t-1}}\epsilon_{t-2} + \sqrt{\beta_t} \epsilon_{t-1} \
        &= \sqrt{(1 - \beta_{t-1})(1 - \beta_t)}x_{t-2} + \sqrt{(1 - \beta_{t}) \beta_{t-1}+\beta_{t-1}} \epsilon_{t-1} \

        \end{align}
        $$

        • 为什么是根号下面直接进行加法??? #confusion#​
        • 如果这样可行的话就可以理解这一步符号转换了

    • Sample

      • ????
    • ​#TODO#​

    ↩︎
  2. paper:DDPM

    Screenshot 2025-08-08 at 15.38.08

    Key Insight(Green)

    Analysis(Red)

    Key Design(Blue)

    System Overview(Blue)

    Key Algorithm(Blue)

    Experiment(Purple)

    Intro

    A diffusion probabilistic model (which we will call a “diffusion model” for brevity) is a parameterized Markov chain trained using variational inference to produce samples matching the data after finite time.

    Markov chain:

    variational inference

    ↩︎

posted @ 2025-08-15 19:24  RiJoshin  阅读(53)  评论(0)    收藏  举报