Diffusion model
Diffusion model
#10423#
Diffusion Model by 10-423
基础网络结构:U-Net 及其应用
输入输出维度相同
-
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 输出)。
-
-
-
U-Net 的应用场景
- 语义分割:为图像中每个像素预测类别(如“猫”“狗”“背景”),需考虑像素间的强关联性(例如“猫”的像素更可能相邻)。
- 实例分割:在语义分割基础上进一步区分同类别的不同个体(如同一图像中的“猫 1”与“猫 2”),典型框架如 Mask R-CNN(结合目标检测与像素级掩码预测)。
- 生物医学分割:U-Net 的原始设计目标,例如 ISBI 细胞追踪挑战中,能精准分割细胞边界(如图 4 中 cyan mask 与黄色手动标注的高度吻合)。
无监督学习框架
扩散模型属于无监督生成模型,其设计需满足无监督学习的核心目标:逼近数据分布 $q(x_0)$。
-
无监督学习的核心框架
-
假设:
-
数据来自未知分布 $q(x_0)$(如真实图像、文本);
-
模型分布 $p_\theta(x_0)$ 需支持高效采样
(即能从 $p_\theta$ 中快速生成符合分布的样本)。
-
-
目标:学习参数 $\theta$,使 $p_\theta(x_0)$ 尽可能接近 $q(x_0)$。
-
-
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 就是学习了图像与隐空间的映射关系,让我们能够在隐空间中对图像做插值
扩散模型的核心原理
如果把 $x_0$ 视为图像,$x_t$ 是不断混乱,最后变成噪声的过程
-
前向过程:从数据到噪声
-
从原始数据 $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)
-
-
反向过程:从噪声到数据
-
定义:从纯噪声 $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$ 越接近纯噪声。
-
正向传播时,Very Convenient property:
-
$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)$,则:
-
$X + Y \sim N(\mu_x + \mu_y, \sigma_x^2 + \sigma_y^2)$ (解释后为什么 gaussian 噪声的加法为什么这样可行)
-
$X - Y \sim N(\mu_x - \mu_y, \sigma_x^2 + \sigma_y^2)$
-
Gaussian Condition
$z \sim N(\mu_2 = X, \epsilon_z) \Rightarrow p(z|x) \sim N( . | ,)$
-
非线性无 3. 性质:$W \sim N(\mu_2 = f(X), \epsilon_w) \nRightarrow p(w|x) \sim N( . | ,)$
- 否,实际上,DM 只需要足够长的 tImestep T,就能捕获所有平滑分布
-
-
-
估计 $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$,这个去噪声就会是很简单的公式直接去算
-
-
反向过程的参数化
-
目标:使 $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:
-
预期学习这个 $\epsilon$, 直接固定为 $\sigma_t^2 I$(无需学习,直接复用 $q$ 的方差);
-
$\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 的训练聚焦于优化噪声预测损失,采样则通过逐步去噪生成样本。
-
训练算法
-
A:直接硬学 $\mu_q$
-
B:学习从 $(x_t, t)$ 中生成 $x_0$
-
C: 学习怎么整出更好的 $\epsilon$ !(woc)
(用的 prior 是最多的!)
问题:还能更强的 prior 吗?? #confusion#
-
核心逻辑:通过学习预测添加的[?],间接使 $p_\theta$ 逼近 $q$。
-
-
采样算法
-
A:
-
B:
-
C:
-
-
Noise schedule
-
linear v.s. cos
- linear:$\alpha_t$ 随时间步 t 线性变化,实现简单,但可能存在加噪前期或后期噪声添加不够均匀的问题(比如前期快速衰减,导致噪声集中在某些阶段 )
- cos:基于余弦函数设计的调度,能让噪声添加在时间推移中更均匀,避免线性调度的 “不均衡” 问题,让前向加噪过程更平滑
-
理论基础:KL 散度与变分下界(这里是在讲变分推理其实)
扩散模型通过优化变分下界间接最大化 $\log p_\theta(x_0)$,其核心是 KL 散度对分布差异的度量。
-
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 显著增大)。
-
-
变分下界($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)$。
-
DDPM by blog
作者:CodeCrafter
链接:https://www.zhihu.com/question/658056360/answer/1936464877767090639
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。阶段二:硬核攻坚DDPM (1-2个月,这是关键)
现在,可以正式啃Diffusion这座大山了。直接从祖师爷级别的论文 《Denoising Diffusion Probabilistic Models》(简称DDPM) 下手。
学习资源“三件套”:
- 论文原文: Ho, Jonathan, et al. “Denoising diffusion probabilistic models.” 2020。打印出来放手边。
- 代码实现: GitHub上搜
lucidrains/denoising-diffusion-pytorch。这个人叫Phil Wang,是AI圈一个很有名的大佬,他的代码实现以简洁、清晰、易读著称。是我们这种非科班出身的福音。 - 视频/博客解析:
- YouTube: 搜 “AI Coffee Break with Letitia” 的 DDPM 视频,或者 “Yannic Kilcher” 的视频。他们会逐行逐公式地过论文。听不懂英文也没关系,开着机翻字幕,主要是看他们把鼠标指到哪个公式,再对应到代码的哪一块。
- 中文博客: 还是推荐苏剑林大佬的博客,搜“苏剑林 diffusion”,他的讲解能帮你理解很多数学上的“为什么”。
“代码-公式”对读法(我的独门秘籍),这是最关键的一步,能救你于水火。
- 先看前向过程 (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这些鬼东西就是提前算好的一堆控制噪声大小的常量而已。 - 再看反向过程 (Reverse Process),也就是训练的核心: 论文里最吓人的是公式(3)和那个目标函数
L_simple (公式14)。一堆期望、KL散度,直接劝退。
别怕,直接看代码里的 p_losses 函数! 你会发现,扒光了所有数学外衣,它最后干的事儿可能就是一行:loss = F.l1_loss(noise, predicted_noise)。
我当时看到这就直接拍大腿了! 嗨,搞了半天,你这个U-Net模型训练的目标,不就是预测出你在前向过程里亲手加进去的那个noise 吗?这么简单一个事儿,非要用变分下界、KL散度这些复杂的数学语言去包装,显得自己“学术”!
这一刻,你就打通了任督二脉。你就知道了,Diffusion模型训练时,就是在做一个“猜噪声”的游戏。
这个阶段,你要反复地在论文的数学符号和代码的具体实现之间横跳。一个公式看不懂,就去代码里找它“长啥样”;一段代码看不懂,就回论文里找它的“理论依据”。一个月下来,你就算不能手推公式,也绝对能把DDPM的整个流程讲得明明白白。
gogogo!!!
-
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#
paper:DDPM
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
↩︎

浙公网安备 33010602011771号