这是我们预测的噪声
发布时间:2025-06-24 17:57:54 作者:北方职教升学中心 阅读量:422
2)schedule算法对每次U-Net预测的噪声进行优化处理(动态调整预测的噪声,控制U-Net预测噪声的强度),从而统筹生成过程的进度。
Stable Diffusion XL为了在解决数据集利用率问题的同时不引入噪声伪影,将U-Net(Base)模型与原始图像分辨率相关联,核心思想是将输入图像的原始高度和宽度作为额外的条件嵌入U-Net模型中,表示为C s i z e = ( h e i g h t , w i d t h ) C_{size}=(height,width) Csize=(height,width)height
和width
都使用傅里叶特征编码进行独立嵌入,然后将特征concat
后加在Time Embedding
上,将图像尺寸作为条件引入训练过程。它接收输入并将其下采样到下一层的大小。
因此,引入下面两个记号:
α t = 1 − β t α ˉ t : = ∏ s = 1 t a s \begin{aligned} \alpha_t & =1-\beta_t \\ \bar{alpha}_t & :=\prod_{s=1}^t a_s \end{aligned} αtαˉt=1−βt:=s=1∏tas
代入上述记号,每一步的加噪公式变为:
q ( x 1 ∣ x 0 ) = N ( x 1 , α 1 x 0 , ( 1 − α 1 ) I ) q\left(x_1 \mid x_0\right)=\mathcal{N}\left(x_1, \sqrt{alpha_1} x_0,\left(1-\alpha_1\right) I\right) q(x1∣x0)=N(x1,α1x0,(1−α1)I)
q ( x 2 ∣ x 1 ) = N ( x 2 , α 2 x 1 , ( 1 − α 2 ) I ) q\left(x_2 \mid x_1\right)=\mathcal{N}\left(x_2, \sqrt{alpha_2} x_1,\left(1-\alpha_2\right) I\right) q(x2∣x1)=N(x2,α2x1,(1−α2)I)
整个过程的均值计算如下:
μ t = α t x t − 1 = α t ∗ α t − 1 x t − 2 = α t α t − 1 x t − 2 = α t α t − 1 ∗ α t − 2 x t − 3 = α t α t − 1 α t − 2 x t − 3 = α t α t − 1 α t − 2 ⋯ ∗ α 1 x 0 = α t α t − 1 α t − 2 ⋯ α 1 x 0 = α ˉ t x 0 \begin{gathered} \mu_t=\sqrt{alpha_t} x_{t-1} \\ =\sqrt{alpha_t} * \sqrt{\alpha_{t-1}} x_{t-2}=\sqrt{\alpha_t \alpha_{t-1}} x_{t-2} \\ =\sqrt{\alpha_t \alpha_{t-1}} * \sqrt{\alpha_{t-2}} x_{t-3}=\sqrt{\alpha_t \alpha_{t-1} \alpha_{t-2}} x_{t-3} \\ =\sqrt{\alpha_t \alpha_{t-1} \alpha_{t-2} \cdots} * \sqrt{alpha_1} x_0=\sqrt{\alpha_t \alpha_{t-1} \alpha_{t-2} \cdots \alpha_1} x_0 \\ =\sqrt{\bar{alpha}_t} x_0 \end{gathered} μt=αtxt−1=αt∗αt−1xt−2=αtαt−1xt−2=αtαt−1∗αt−2xt−3=αtαt−1αt−2xt−3=αtαt−1αt−2⋯∗α1x0=αtαt−1αt−2⋯α1x0=αˉtx0
最终可以写出从 0 到 t 的整个过程的公式:
q ( x t ∣ x 0 ) = N ( x t , α ˉ t x 0 , ( 1 − α ˉ t ) I ) q\left(x_t \mid x_0\right)=\mathcal{N}\left(x_t, \sqrt{\bar{alpha}_t} x_0,\left(1-\bar{alpha}_t\right) I\right) q(xt∣x0)=N(xt,αˉtx0,(1−αˉt)I)
然而上述的过程是无法计算的,需要对每一步前向步骤应用重参数化技巧: N ( μ , σ 2 ) = μ + σ ∗ ϵ \mathcal{N}\left(\mu, \sigma^2\right)=\mu+\sigma * \epsilon N(μ,σ2)=μ+σ∗ϵ, 其中ϵ \epsilon ϵ来自于N ( 0 , 1 ) \mathcal{N}(0,1) N(0,1)
q ( x t ∣ x t − 1 ) = N ( x t , 1 − β t x t − 1 , β t I ) = 1 − β t x t − 1 + β t ϵ \begin{gathered} q\left(x_t \mid x_{t-1}\right)=\mathcal{N}\left(x_t, \sqrt{1-beta_t} x_{t-1}, \beta_t I\right) \\ =\sqrt{1-beta_t} x_{t-1}+\sqrt{beta_t} \epsilon \end{gathered} q(xt∣xt−1)=N(xt,1−βtxt−1,βtI)=1−βtxt−1+βtϵ
因为我们知道 t = 1.. T t=1..T t=1..T的公式是什么,我们可以使用这个技巧来得到可计算的方程式。
SDXL Base模型由U-Net、Midjourney、
SelfAttention模块
:SelfAttention模块的整体结构与CrossAttention模块相同,这是输入全部都是图像信息,不再输入文本信息。训练过程不使用与前向过程一致的示例,而是使用来自任意时间步 t 的样本。
Time Embedding正是输入到ResNetBlock模块中,为U-Net引入了时间信息(时间步长T,T的大小代表了噪声扰动的强度),模拟一个随时间变化不断增加不同强度噪声扰动的过程,让SD模型能够更好地理解时间相关性。在实际应用中,Noise Predicter 还会有个文本提示的输入。这是我们预测的噪声。
在块内部,作者添加了两个跳跃连接,与自注意力输出组合。
SD 1.x和SD 2.x一般只能生成中等亮度的图片,即生成平均值相对接近 0.5 的图像(全黑图像为 0,全白图像为 1),之所以会出现这个问题,是因为SD系列模型训练和推理过程的不一致造成的。
Diffusion 的过程是step-by-step 的,逐步生成清晰的图片。
首先,它接收一个形状为 (128, 32, 32) 的下采样张量。
然后重复整个过程,直到模型最终收敛。其值越小越好。 然后在第二和第三个stage这两个维度较小的feature map上使用数量较多的SDXL_Spatial Transformer_X模块,能在大幅提升模型整体性能(学习能力和表达能力)的同时,优化了计算成本。之后,两个张量相加,并发送到下一个块。
Text Condition如何跟latent Feature大小保持一致呢?
因为latent embedding不同位置的H和W是不一样的,但是Text Condition是从文本中提取的,其H和W是固定的。现在接下来的ResNet可以使用合并过来的文本信息到它的处理过程了。在此基础上,再使用Refiner模型进行去噪,以提升图像的整体质量与局部细节。
Stable Diffusion中U-Net主要是进行噪声残差,在SD系列模型训练时和DDPM一样采用预测噪声残差的方法来训练U-Net,其损失函数如下所示:
L S D = E x 0 , ϵ ∼ N ( 0 , I ) , t [ ∥ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t , c ) ∥ 2 ] L_{S D}=\mathbb{E}_{\mathbf{x}_0, \epsilon \sim \mathcal{N}(\mathbf, \mathbf{I}), t}\left[\left\|\epsilon-\epsilon_\theta\left(\sqrt{\bar{alpha}_t} \mathbf{x}_0+\sqrt{1-\bar{alpha}_t} \epsilon, t, \mathbf{c}\right)\right\|^2\right] LSD=Ex0,ϵ∼N(0,I),t[ϵ−ϵθ(αˉtx0+1−αˉtϵ,t,c)2]
这里的c c c为Text Embeddings。CLIP Text Encoder模型将输入的文本Prompt进行编码,转换成Text Embeddings(文本的语义信息)U-Net网络的CrossAttention模块嵌入Stable Diffusion中作为Condition条件,对生成图像的内容进行一定程度上的控制与引导,目前SD模型使用的的是CLIP ViT-L/14中的Text Encoder模型。这种改进使得步骤数减少到50步。Unet模型的作用
预测噪声残差
,并结合Sampling method(调度算法:DDPM、生成式模型中典型的预处理方式是先调整图像尺寸,使得最短边与目标尺寸匹配,然后再沿较长边对图像进行随机裁剪或者中心裁剪。
下图通过图像解码器可视化每个步骤
扩散动作发生了多次,每一步都对输入潜在数组上操作以产生更相似于输入文本的新潜在数组,视觉信息来自于模型从所有图像训练语料。VQ(Vector Quantization)
正则化
过在decoder模块中引入一个VQ-layer,将VAE转换成VQ-GAN,同样为了保证VAE的重建效果,设置较高的codebook采样维度(8192)。
为了使网络是条件化的(依赖于外部输入),我们添加了一个文本嵌入器。
Stable Diffusion 中采用的文本编码器是多模态领域中的CLIP模型(Contrastive Language-Image Pre-training)
中的文本编码器
。文生图模型的基本架构如下:
- 文本编码器(
Text Encoder
)用于编码文本的输入- 生成模型 (
Generation Model
)输入文字和杂讯,生成一个中间产物(这个中间产物可以是人看得懂的一个压缩图片,也可以是噪音)- 解码器 (
Decoder
) 解码器,输入中间产物,得到最终的输出的图片。
然后,为了防止信息丢失,添加跳跃连接(skip connection)
下一步是添加关于当前时间步 t 的信息。
CrossAttention模块是我们 使用输入文本Prompt控制SD模型图片内容生成的关键。
通过上采样层传递输入张量后,我们可以将其与残差连接(来自第一个 ResNet 块)连接起来。但等到Stable Diffusion XL,U-Net模型(Base部分)参数量就增加到2.6B,参数量增加幅度达到了3倍左右。VAE的Decoder(解码器)结构能将低维Latent特征重建还原成像素级图像。
由于P(A,B)也等于P(B|A)P(A) (P(A,B)与P(B,A)含义相同,数值相等),所以推导出贝叶斯公式:
P ( A ∣ B ) = P ( A , B ) P ( B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A \mid B)=\frac{P(A, B)}{P(B)}=\frac{P(B mid A) cdot P(A)}{P(B)} P(A∣B)=P(B)P(A,B)=P(B)P(B∣A)⋅P(A)KL散度
向前扩散过程
给定从真实数据分布中采样的数据点 x 0 ∼ q ( x ) \mathbf{x}_0 \sim q(\mathbf{x}) x0∼q(x),让我们定义一个前向扩散过程,在其中我们在 T T T步中向样本添加小量的高斯噪声,产生一系列带有噪声的样本 x 1 , … , x T \mathbf{x}_1, \ldots, \mathbf{x}_T x1,…,xT。
2) 图像裁剪参数条件化
之前的Stable Diffusion系列模型,由于需要输入固定的图像尺寸用作训练,很多数据在预处理阶段会被裁剪。
(3) BasicTransformer Block模块
BasicTransformer Block模块
:由LayerNorm+SelfAttention+CrossAttention+FeedForward
组成,是在CrossAttention子模块的基础上,增加了SelfAttention子模块和Feedforward子模块共同组成的,并且每个子模块都是一个残差结构,这样除了能让文本的语义信息与图像的语义信息更好的融合之外,还能通过SelfAttention机制让模型更好的学习图像数据的特征。结合随机梯度下降,随机梯度 Langevin 动力学( stochastic gradient Langevin dynamics)可以使用更新的马尔可夫链中的梯度∇ x log p ( x ) \nabla_{\mathbf{x}} \log p(\mathbf{x}) ∇xlogp(x)来从概率密度p ( x ) p(\mathbf{x}) p(x)中产生样本:
x t = x t − 1 + δ 2 ∇ x log p ( x t − 1 ) + δ ϵ t , where ϵ t ∼ N ( 0 , I ) \mathbf{x}_t=\mathbf{x}_{t-1}+\frac{delta}{2} \nabla_{\mathbf{x}} \log p\left(\mathbf{x}_{t-1}\right)+\sqrt{delta} \boldsymbol{epsilon}_t, \quad \text { where } \boldsymbol{epsilon}_t \sim \mathcal{N}(\mathbf, \mathbf{I}) xt=xt−1+2δ∇xlogp(xt−1)+δϵt, where ϵt∼N(0,I)
其中δ \delta δ是 step size. 当 T → ∞ , ϵ → 0 , x T T \rightarrow \infty, \epsilon \rightarrow 0, \mathbf{x}_T T→∞,ϵ→0,xT等同于true probability density p ( x ) p(\mathbf{x}) p(x).
与标准随机梯度下降相比,随机梯度 Langevin 动力学在参数更新中注入高斯噪声,以避免陷入局部最小值。
压缩(和稍后的解压缩/绘制)是经由自编码器完成的。如果说全卷积网络的设计让图像输入尺寸不再受限,那么CLIP的这个设置就让输入的文本长度不再受限(可以是空文本)。
SD模型在训练中进行noise scheduler流程并不能将图像完全变成随机高斯噪声,但是推理过程中,SD模型是从一个随机高斯噪声开始生成的,因此就会存在训练与推理的噪声处理过程不一致。
感知损失的公式如下所示:
L perceptual = ∑ l λ l ⋅ ∥ ϕ l ( I pred ) − ϕ l ( I target ) ∥ 2 2 L_{\text {perceptual}}=\sum_l \lambda_l \cdot\left\|\phi_l\left(I_{\text {pred}}\right)-\phi_l\left(I_{\text {target}}\right)\right\|_2^2 Lperceptual =l∑λl⋅∥ϕl(Ipred )−ϕl(Itarget )∥22其中:ϕ l \phi_l ϕl表示在预训练模型 (比如VGG/ResNet网络) 的第 l l l层的激活特征。
在训练过程中,每次在buckets中随机选择一个bucket并从中采样Batch个数据进行训练。
而Stable Diffusion 将这些过程压缩在低维的Latent隐空间,这样一来大大降低了显存占用和计算复杂度
为了加速图像生成的过程,Stable Diffusion 是在图像的压缩空间上扩散操作。
这样以来,模型在训练过程中能够学习到图像的原始分辨率信息,从而在推理生成阶段更好地适应不同尺寸的图像生成,而不会产生噪声伪影的问题。
表中的三个VAE模型结构是一样的,不同点在于SD 2.x VAE是基于SD 1.x VAE微调训练了Decoder部分,同时保持Encoder部分权重不变,使他们有相同的Latent特征分布,所以SD 1.x和SD 2.x的VAE模型是互相兼容的。
针对上述数据集利用率的问题,常规思路可以借助超分模型将尺寸过小的图像放大。
我们使用相同的方式来生成大量的训练样本。当输入低分辨率条件时,生成的图像较模糊;在不断增大分辨率条件时,生成的图像质量不断提升。脸颊和嘴巴之间遵循特定的空间关系,又比如一只猫有四条腿,并且这是一个特定的生物结构特征。由于在每个ResNetBlock模块中都有Time Embedding,就能告诉U-Net现在是整个迭代过程的哪一步,并及时控制U-Net够根据不同的输入特征和迭代阶段而预测不同的噪声残差。第一步只减去预测噪声的一小部分,后续步骤逐渐减去更多预测的噪声。光线以及阴影方面,使得生成图像的构图比0.9版本更加鲜明准确。图像裁剪参数条件化策略以及多尺度训练策略等。
反向去噪过程
如果我们能够反转上述过程并从 q ( x t − 1 ∣ x t ) q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right) q(xt−1∣xt)中采样,我们将能够从高斯噪声输入 x T ∼ N ( 0 , I ) \mathbf{x}_T \sim \mathcal{N}(\mathbf, \mathbf{I}) xT∼N(0,I)中重新创建真实样本。我们不知道这个分布,但我们的目标是破坏它,我们可以通过向其添加噪声来实现。自编码器通过编码器压缩图像到潜在空间,然后只用压缩信息来解码重建。
通过在ResNet模块之间增加一个Attention层,添加对文本输入的支持。
与传统深度学习中的模型融合类似,Stable Diffusion XL分别提取两个Text Encoder的倒数第二层特征
,并进行concat操作
作为文本条件(Text Conditioning)。
SDXL Refiner模型同样由U-Net、
上表是Stable Diffusion XL与之前的Stable Diffusion系列的对比,从中可以看出,Stable Diffusion 1.x的U-Net参数量只有860M,就算是Stable Diffusion 2.x,其参数量也不过865M。
UpBlock_X模块
:由X个ResNetBlock模块和一个UpSample模块
组成。
4) 使用Offset Noise
在SDXL进行微调时,使用了Offset Noise操作,能够让SDXL生成的图像有更高的色彩自由度(纯黑或者纯白背景的图像)。
Text Condition是三维的,而Latent Feature是四维的,那它们是怎么进行Attention机制的呢?
其实在每次进行Attention机制前,我们需要将Latent Feature从[batch_size,channels,height,width]转换到[batch_size,height*width,channels] ,这样就变成了三维特征,就能够和Text Condition做CrossAttention操作。为什么Context Embedding用来生成K和V,Latent Feature用来生成Q呢?
原因也非常简单:因为在Stable Diffusion中,主要的目的是想把文本信息注入到图像信息中里,所以用图片token对文本信息做 Attention实现逐步的文本特征提取和耦合。
ResNet模块并不能直接看到文本,但是Attention层将文本表达合并到了潜在空间。同时对于不匹配的图片和标签文本,输出的embedding向量计算余弦相似度则会接近0。
为了防止在Latent空间的任意缩放导致的标准差过大,在训练VAE模型的过程中引入了正则化损失
L1回归损失
L1回归损失用在回归问题中衡量预测值与真实值之间的差异。减法量由调度定义。它非常简单,但随着对扩散模型的进一步改进(例如,Stabel Diffusion 增加了整个潜在层用于图像数据嵌入)。U-Net 模型
GSC模块
:Stable Diffusion Base XL U-Net中的最小组件之一,由GroupNorm+SiLU+Conv
三者组成。UpSample模块
:Stable Diffusion Base XL U-Net中的上采样组件,由插值算法(nearest)+Conv组成。
下图可视化一系列的这些潜在数组:
在SD中,U-Net的迭代优化步数(Timesteps)大概是50或者100次,在这个过程中Latent Feature的质量不断的变好(纯噪声减少,图像语义信息增加,文本语义信息增加)回顾Diffusion Model的内部工作原理
假设我们有张图片,我们生成了一些噪声,然后把噪声添加到图像上。训练过程和损失函数
VAE训练
在Stable Diffusion中,需要对VAE模型进行微调训练,主要采用了
L1回归损失
和感知损失
(perceptual loss,Learned Perceptual Image Patch Similarity,LPIPS)作为损失函数,同时使用了基于patch的对抗训练策略
。
CrossAttnUpBlock_X_K模块
:是Stable Diffusion XL Base U-Net中Decoder部分的主要模块,由K个(ResNetBlock模块+SDXL_Spatial Transformer_X模块)+一个UpSample模块
组成。
2) 如果是文生图任务,我们只需要输入文本信息,再用random函数生成一个高斯噪声矩阵作为Latent Feature的“替代”输入
组成:
1)U-Net网络负责预测噪声,不断优化生成过程,在预测噪声的同时不断注入文本语义信息。完成CLIP的训练后,输入配对的图片和标签文本,则Text Encoder和Image Encoder可以输出相似的embedding向量,计算余弦相似度就可以得到接近1的结果。ViT等)不同层中特征图之间的相似度,而不直接进行像素级别的对比。
通常而言,上述的三个模型是分开训练的,最后组合到一起。
FeedForward模块
:Attention机制中的经典模块,由GeGlU+Dropout+Linear组成。
- 当输入是 图片
Stable Diffusion XL和Stable Diffusion一样,首先会使用VAE的Encoder
结构将输入图像转换为Latent特征,然后U-Net不断对Latent特征进行优化,最后使用VAE的Decoder
结构将Latent特征重建出像素级图像。Upsample block
使用一个简单的上采样层,缩放因子为2。总结一下SD模型的前向推理过程:
网络结构
Stable Diffusion模型主要由
VAE
(变分自编码器,Variational Auto-Encoder),U-Net
以及CLIP Text
Encoder三个核心组件构成。
p θ ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta\left(\mathbf{x}_{0: T}\right)=p\left(\mathbf{x}_T\right) \prod_{t=1}^T p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right) \quad p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)=\mathcal{N}\left(\mathbf{x}_{t-1} ; \boldsymbol{mu}_\theta\left(\mathbf{x}_t, t\right), \mathbf{Sigma}_\theta\left(\mathbf{x}_t, t\right)\right) pθ(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt)pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))训练扩散模型来建模 2D swiss roll 数据的示例。
除了提取Latent特征和图像的像素级重建外,VAE还可以改进生成图像中的高频细节,小物体特征和整体图像色彩。Imagen 背後共同的套路
【生成式AI】Diffusion Model 原理剖析 (1/4) (optional)
【生成式AI】Diffusion Model 原理剖析 (2/4) (optional)
【生成式AI】Diffusion Model 原理剖析 (3/4) (optional)
【生成式AI】Diffusion Model 原理剖析 (4/4) (optional)【2】Yotube上的视频,不仅介绍了DDPM基础还有应用
Tutorial on Denoising Diffusion-based Generative Modeling: Foundations and Applications