【文生图系列】Denoising Diffusion Probabilistic Models论文解读


此篇论文是DDPM的奠基之作,后续扩散模型相关论文都基本继承了前向加噪-反向降噪-训练这样的框架。论文全是公式,理解起来好难好难。

【文生图系列】基础篇-马尔可夫链
【文生图系列】基础篇-变分推理(数学推导)

扩散模型

扩散模型是扩散概率模型(diffusion probabilistic model)的简称,它是一个参数化的马尔科夫链,使用变分推理进行训练,以在有限的时间后生出与数据匹配的样本。扩散模型包括前向过程(forward process)和反向过程(reverse process),其中前向过程也被成为扩散过程(diffusion process),它逐渐地从方差表(variance schedule) β 1 , ⋯   , β T \beta_{1}, \cdots, \beta_{T} β1,,βT中向数据中添加高斯噪声。反向过程则相反,不断去除噪声,用于生成图片。
在这里插入图片描述
如上图所示,前向扩散过程是从 x 0 → x T x_{0} \to x_{T} x0xT,每一步的条件概率分布定义为 q ( x t ∣ x t − 1 ) q\left( x_{t} | x_{t-1} \right) q(xtxt1),逐步地向人脸图像中添加噪声,直至第 T T T步时,人脸图像彻底为一张噪声图片。反向过程是从 x T → x 0 x_{T} \to x_{0} xTx0,每一步的条件概率分布定义为 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt),逐步地去除噪声图片中的噪声,以生成人脸图像。但是 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt)却是难以计算的,因此需要学习一个模型 p θ p_{\theta} pθ近似条件概率。

在这里插入图片描述

扩散过程

从一个真实数据分布中选择一个样本点 x 0 ∼ q ( x ) x_{0} \sim q\left( x \right) x0q(x),每一次向样本中添加少量高斯噪声,执行T次,得到噪音样本序列 x 1 , ⋯   , x T x_{1}, \cdots, x_{T} x1,,xT。前向过程用公式定义如下:
在这里插入图片描述

执行步数由方差表 { β t ∈ ( 0 , 1 ) } t = 1 T \{ \beta_{t} \in \left( 0, 1 \right) \}_{t=1}^{T} {βt(0,1)}t=1T控制, β t \beta_{t} βt为第 t t t步所采用的方差,它介于 ( 0 , 1 ) \left( 0, 1 \right) (0,1)之间。通常情况下,方差的取值会随着 T T T的增大而越来越大 β 1 < β 2 < ⋯ < β T \beta_{1} < \beta_{2} < \cdots < \beta_{T} β1<β2<<βT。而且随着 T T T的增大,样本数据 x 0 x_{0} x0会逐渐失去它的分布特征,当 T T T趋于无穷时, x T x_{T} xT则等价于一个各向同性高斯分布(isotropic Gaussian distribution)。

已知,扩散过程是一个马尔可夫链,每一步都会生成带噪音的数据 x t x_{t} xt。扩散过程的一个重要特性就是可以基于原始样本数据 x 0 x_{0} x0使用重参数技巧(reparameterization trick)采样任意 t t t步的生成数据 x t x_{t} xt, q ( x t ∣ x 0 ) = N ( x t , α ˉ t x 0 , ( 1 − α ˉ t ) I ) q\left(x_{t} | x_{0} \right)=N\left ( x_{t}, \sqrt{\bar{\alpha }_{t} } x_{0}, \left ( 1 - \bar{\alpha }_{t} \right ) I \right ) q(xtx0)=N(xt,αˉt x0,(1αˉt)I)

α t = 1 − β t , α ˉ t = ∏ s = 1 t = α s \alpha_{t} = 1 - \beta_{t}, \bar{\alpha}_{t}=\prod_{s=1}^{t}=\alpha_{s} αt=1βt,αˉt=s=1t=αs q ( x t ∣ x 0 ) q\left(x_{t} | x_{0} \right) q(xtx0)的推理过程如下所示:

在这里插入图片描述

反向过程

反向过程是前向过程的反向,从一个高斯噪声输入 x T ∼ N ( 0 , 1 ) x_{T} \sim N \left( 0, 1 \right) xTN(0,1)中创建真实案例的过程,如果 β t \beta_{t} βt足够小,那么 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt)也符合高斯分布。但是,需要全部的数据计算 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt),这是一件很困难的事情,因此,为了能够运行反向扩撒模型,需要学习一个模型 p θ p_{\theta} pθ近似估计条件概率。

假设 x 1 , ⋯   , x T x_{1}, \cdots, x_{T} x1,,xT为与数据 x 0 ∼ q ( x 0 ) x_{0} \sim q\left( x_{0} \right) x0q(x0)有相同维度的隐藏变量,扩散模型就是一个隐藏变量模型,用公式表示为 p θ ( x 0 ) : = ∫ p θ ( x 0 : T ) d x 1 : T p_{\theta}\left( x_{0} \right) := \int p_{\theta} \left( x_{0:T} \right) dx_{1:T} pθ(x0):=pθ(x0:T)dx1:T。反向过程则可被定义成这样的一个马尔可夫链,初始状态转移为 p ( x T ) = N ( x T , 0 , I ) p\left( x_{T} \right) = N\left( x_{T}, 0, I \right) p(xT)=N(xT,0,I)
在这里插入图片描述
p θ ( x t − 1 ∣ x t ) p_{\theta}\left( x_{t-1} | x_{t} \right) pθ(xt1xt)为参数化的高斯分布,均值和方差分别是训练的网络 μ θ ( x t , t ) \mu_{\theta}\left( x_{t}, t \right) μθ(xt,t) ∑ θ ( x t , t ) \sum_{\theta}\left( x_{t}, t \right) θ(xt,t)。最终的生成模型就是由这些均值和方差网络组成。

虽然条件分布 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt)是不可直接处理的,但是加上条件 x 0 x_{0} x0的后验分布 q ( x t − 1 ∣ x t , x 0 ) q\left(x_{t-1} | x_{t} , x_{0} \right) q(xt1xt,x0)却是可处理的。

在这里插入图片描述
推理过程如下图所示。第一步的 C ( c t , c 0 ) C\left( c_{t}, c_{0} \right) C(ct,c0) x t − 1 x_{t-1} xt1无关,可以省略。后验分布 q ( x t − 1 ∣ x t , x 0 ) q\left(x_{t-1} | x_{t} , x_{0} \right) q(xt1xt,x0)的方差是一个定量,均值是一个依赖 x t x_{t} xt的函数。

在这里插入图片描述

σ t 2 = β t ~ = 1 − α ˉ t − 1 1 − α t ˉ β t \sigma_{t}^{2} = \tilde {\beta_{t}} = \frac{1 - \bar{\alpha}_{t-1}}{1-\bar{\alpha_{t}}}\beta_{t} σt2=βt~=1αtˉ1αˉt1βt,其中 β t = 1 − α t \beta_{t} = 1 - \alpha_{t} βt=1αt,那么从分布 p θ ( x t − 1 ∣ x t ) p_{\theta}\left( x_{t-1} | x_{t} \right) pθ(xt1xt)中采样 x t − 1 x_{t-1} xt1,计算公式为 x t − 1 = 1 α t ( x t − β t 1 − α ˉ t ϵ t ) + σ t z x_{t-1} = \frac{1}{\sqrt{\alpha_{t}}} \left ( x_{t} - \frac{\beta_{t}}{\sqrt{1 - \bar{\alpha}_{t} } } \epsilon_{t} \right ) + \sigma_{t}z xt1=αt 1(xt1αˉt βtϵt)+σtz,其中 z z z服从正态分布 z ∼ N ( 0 , I ) z \sim N \left( 0, I \right) zN(0,I)。采样整体过程伪代码见下图Algorithm 2。

在这里插入图片描述

优化目标

如果将扩散模型中间产生的变量看作隐变量的话,那么扩散模型其实就是包含 T T T个隐变量的隐变量模型,与VAE相似,不同的是扩散模型的隐变量与原始数据同纬度。那么就可以基于变分推断得到ELBO作为最大优化目标。

推导过程如下图所示,最后的优化目标共包含 T + 1 T+1 T+1项。
在这里插入图片描述
在这里插入图片描述

  1. L T L_{T} LT计算的是噪音分布和先验分布的KL散度,先验 p ( x T ) p\left( x_{T} \right) p(xT)服从正太分布,扩散过程最后得到的随机噪音 q ( x T ∣ x 0 ) q\left( x_{T} | x_{0} \right) q(xTx0)也近似正太分布,所以它们两之间的KL散度近似为0。

  2. 假设图像数据为的整数,线性缩放到,这样能够保证神经网络反向过程从标准正太分布先验开始,在一致缩放的输入上进行操作。为了能够获得离散对数似然,反向过程中的最后一项设置为一个独立的离散解码器,该解码器源自于高斯分布 N ( x 0 , μ θ ( x 1 , 1 ) , σ 1 2 I ) N \left( x_{0}, \mu_{\theta} \left( x_{1}, 1 \right), \sigma_{1}^{2}I \right) N(x0,μθ(x1,1),σ12I)

在这里插入图片描述

  1. L t L_{t} Lt为前向过程和反向过程的KL散度。依据KL散度的定义和上述前向和反向过程的公式定义,对 L t L_{t} Lt进行参数化。

在这里插入图片描述

训练扩散模型时,发现忽略权重项,一个简化版的 L t L_{t} Lt会让模型性能更好。简化版的 L t L_{t} Lt如下所示。这就是上述Algorithm 1 训练伪代码第5行公式的由来。

在这里插入图片描述

训练过程

训练部署设置为 T = 1000 T=1000 T=1000,前向过程中方差从 β 1 = 1 0 − 4 \beta_{1} = 10^{-4} β1=104线性增长到 β T = 0.02 \beta_{T} = 0.02 βT=0.02

神经网络backbone是一个U-Net网络。U-Net属于编码-解码架构,编码器分成不同的stages,每个stage都包含下采样模块降低特征的空间大小;解码器将编码器压缩的特征上采样恢复。

参考

  1. Denoising Diffusion Probabilistic Models
  2. hojonathanho/diffusion
  3. What are Diffusion Models
  4. 扩散模型之DDPM
  5. 十分钟读懂Diffusion:图解Diffusion扩散模型
  6. Denoising Diffusion-based Generative Modeling: Foundations and Applications
<think>嗯,用户想了解Stable Diffusion的核心基础原理,特别是算法和工作原理。首先,我需要回忆一下Stable Diffusion相关的知识。记得Stable Diffusion属于生成模型的一种,基于扩散模型(Diffusion Model)。之前看过一些资料,比如CSDN的博客,提到它结合了Latent Diffusion Models(LDM)和DDPM(去噪扩散概率模型)。用户提供的引用里提到了Diffusion的工作原理、UNet结构,还有的应用,这些可能需要整合起来。 首先,Stable Diffusion的关键在于扩散过程,也就是逐步添加噪声,然后逆向过程去噪生成像。但和普通扩散模型不同,Stable Diffusion在潜在空间(latent space)进行操作,这样可以降低计算量。这应该是引用中的LDM部分。然后,核心算法是DDPM,它通过预测噪声来逐步去噪,可能需要解释训练过程和采样过程。 接下来,用户可能需要知道Stable Diffusion的三个主要模块:变分自编码器(VAE)、UNet和文本编码器(如CLIP)。VAE负责像和潜在表示之间的转换,UNet进行去噪,文本编码器处理条件输入。这里要注意解释每个模块的作用,尤其是UNet的结构,比如跳跃连接和注意力机制,结合引用里的信息。 另外,用户可能对条件生成机制感兴趣,比如文生时如何将文本提示融入模型。这部分涉及到交叉注意力机制,把文本嵌入向量输入到UNet中,引导生成过程。的话,可能是在初始潜在变量中加入输入像的信息,引用3提到逆扩散阶段根据输入片生成目标像,需要说明这个过程的调整。 还要注意数学公式的正确性,比如扩散过程用$q(x_t|x_{t-1})$表示,逆向过程用$p_\theta(x_{t-1}|x_t)$,可能需要用$$包围独立公式。同时,确保所有行内数学表达式用$符号,比如$\epsilon_\theta$。 最后,生成相关问题时要围绕用户可能感兴趣的扩展点,比如与其他模型对比、训练细节、参数影响等。确保引用正确,引用1、2、3分别对应不同的部分,比如LDM、DDPM、原理。 现在检查是否有遗漏的部分。是否提到了潜在空间的重要性?是的,LDM部分。是否解释了UNet的结构?是的,包括时间步和条件嵌入。条件生成部分是否清晰?应该提到交叉注意力和文本编码器。数学公式是否符合格式要求?需要确认使用$和$$。相关的问题是否覆盖了可能的疑问点?比如性能优化、实际应用、数学基础等。看起来没问题。现在可以组织语言,用中文分步骤解释,并加入引用标注。</think>### Stable Diffusion核心基础原理分步解析 #### 一、核心算法框架 Stable Diffusion基于**Latent Diffusion Models (LDM)**框架[^1],核心算法是**DDPM**(Denoising Diffusion Probabilistic Model)[^2]。其核心思想是将像生成过程分解为两个阶段: 1. **扩散过程**:对像逐步添加高斯噪声,直到变为纯噪声 2. **逆扩散过程**:通过深度学习模型逐步去除噪声,重建目标像 数学表示为: $$q(x_t|x_{t-1}) = \mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t\mathbf{I}) \quad (\text{扩散过程})$$ $$p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1};\mu_\theta(x_t,t),\Sigma_\theta(x_t,t)) \quad (\text{逆扩散过程})$$ #### 二、关键创新:潜在空间操作 与传统扩散模型不同,Stable Diffusion在**潜在空间**进行扩散过程: 1. 使用VAE(变分自编码器)将像压缩到低维潜在空间 2. 潜在空间维度仅为原始像的1/64(如512×512→64×64) 3. 显著降低计算量,使生成高清像成为可能 #### 三、核心组件 1. **VAE(变分自编码器)** - 编码器:$z = \text{Enc}(x)$ 将像映射到潜在空间 - 解码器:$\hat{x} = \text{Dec}(z)$ 从潜在空间重建像 2. **UNet去噪模型** - 多层卷积与注意力机制结合 - 输入:带噪声的潜在变量$z_t$、时间步$t$、条件嵌入 - 输出:预测的噪声$\epsilon_\theta(z_t,t,c)$ - 采用跳跃连接保持空间信息 3. **文本编码器(CLIP)** - 将提示词转换为文本嵌入向量$c$ - 通过交叉注意力机制注入UNet #### 四、工作流程(文生) 1. 文本提示→CLIP→文本嵌入$c$ 2. 随机生成潜在变量$z_T \sim \mathcal{N}(0,I)$ 3. 迭代去噪(T→0): $$z_{t-1} = \frac{1}{\sqrt{\alpha_t}}(z_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(z_t,t,c)) + \sigma_t\xi$$ 4. 最终潜在变量$z_0$→VAE解码器→生成像 #### 五、原理 在场景中[^3]: 1. 输入像通过VAE编码为潜在变量$z_0'$ 2. 添加可控噪声得到$z_t'$ 3. 在逆扩散过程中结合新提示词进行引导生成 4. 通过控制噪声强度和提示词权重实现可控编辑 ```python # 简化的扩散过程代码示意 def diffusion_process(image, steps=1000): for t in range(steps): beta_t = get_beta(t) noise = torch.randn_like(image) image = sqrt(1-beta_t)*image + sqrt(beta_t)*noise return image ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤宁

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值