Stable diffusion文生图大模型——隐扩散模型原理解析

1、前言

本篇文章,我们将讲这些年非常流行的文生图大模型——Stable Diffusion。该模型也不难,甚至说很简单。创新点也相对较少,如果你学会了我以前的文章讲过的模型,学习这个也自然水到渠成!

视频:[Stable diffusion生成大模型——隐扩散模型原理解析-哔哩哔哩]

演示:

在这里插入图片描述

2、Stable Diffusion

2.1、隐空间扩散

在传统的扩散模型中,都是一上来就对图像就行加噪去噪。这种做法有一些难以避免的问题——效率。一方面,图像的像素如果非常大,那么计算量将是难以想象地;另一方面,我们在VAE那里说到过,图像之中,总是存在一些冗余地部分。我们直接拿图像去扩散,相当于也把那些冗余的部分也一起计算了。

所以,作者选择先把图像编码成一个维度相对较小的编码向量(或特征图)。然后再训练扩散模型

那么,该如何进行编码呢?答案就是使用VAE(详细请看VAE变分自编码器原理)。总所周知,使用VAE可以把图像编码成维度相对较小的向量(或特征图)

除此之外,就是使用离散化的编码器——VQGAN(详细请看VQGAN原理解析

这两种方法,都可以进行图像的压缩。压缩完成之后,在进行扩散过程

在这里插入图片描述

其中编码器对应图中的 E \mathcal{E} E,解码器对应 D \mathcal{D} D。也就是说,先把图像x通过 E \mathcal{E} E进行编码,再进行Diffusion Process

2.2、条件生成

如果你用过Stable Diffusion。就必然知道它可以进行条件生成。那么该如何把条件引入Diffusion里面呢?在Diffusion系列里面,我其实从没有讲过如何进行条件生成。

其实进行条件生成有一个很简单的理解方式。那就是直接采用下面的损失函数
L = ∣ ∣ ϵ − ϵ θ ( x t , t , y ) ∣ ∣ 2 (1) L=||\epsilon-\epsilon_\theta(x_t,t,y)||^2\tag{1} L=∣∣ϵϵθ(xt,t,y)2(1)
为什么可以这样?我们回忆一下DDPM里面的损失函数
L = ∣ ∣ ϵ − ϵ θ ( x t , t ) ∣ ∣ 2 (2) L=||\epsilon-\epsilon_\theta(x_t,t)||^2\tag{2} L=∣∣ϵϵθ(xt,t)2(2)
区别在哪里,那就是Eq.(1)里面神经网络的输入多加了一个条件y。这个条件y可以是标签,文本等等信息。

为什么多加了一个y就可以进行条件生成?

我们从一个比较简单的方面的来理解。在DDPM里面,我们层提到三种预测方式——均值、原始图像,噪声

我们最终只使用噪声而已。那假如我们预测的是原始图像呢?
L = ∣ ∣ x 0 − x θ ( x t , t ) ∣ ∣ 2 L=||x_0-x_\theta(x_t,t)||^2 L=∣∣x0xθ(xt,t)2
如果我们加入一个条件y
L = ∣ ∣ x 0 − x θ ( x t , t , y ) ∣ ∣ 2 L=||x_0-x_\theta(x_t,t,y)||^2 L=∣∣x0xθ(xt,ty)2
加入的一个条件y(比如假设它是图像的类别标签),这就意味着什么呢?意味着我们告诉了神经网络图像 x 0 x_0 x0的类别是什么。那么让神经网络去预测 x 0 x_0 x0,肯定会相对容易,因为神经网络已经知道了图像的类别,排除了其他类别图像的可能。

所以,对于预测噪声也是同理。那么Eq.(1)也是同理,加入一个条件y。更加有利于去噪。

2.3、损失函数和网络结构

对于DIffusion的网络结构,其实我从来没说过。我只讲了用神经网络去预测噪声。对网络结构这些东西,我以后打算出一个单独的系列来讲。

现在主要讲模型原理。但为了完整性。我还是简单讲一下吧。万一有些读者已经有这些方面的基础呢

那么网络的结构该如何呢?在DDPM中,其实用的是U-Net结构的神经网络去预测噪声。在Stable Diffusion里面的,也沿用了这个结构。

我们前面说过,要给预测噪声的神经网络加入条件。但我们不是纯粹的把条件直接送进去。而是对条件进行编码表征之后再送进去。我们用 T θ ( y ) \mathcal{T}_\theta(y) Tθ(y)表示把条件编码成对应的中间表征。所以损失函数变成了这样
L L D M = E E ( x ) , ϵ ∼ N ( 0 , 1 ) , t [ ∣ ∣ ϵ − ϵ θ ( z t , t , T θ ( y ) ∣ ∣ 2 ] L_{LDM}=\mathbb{E}_{{\mathcal{E}(x)},\epsilon\sim \mathcal{N}(0,1),t}\left[||\epsilon-\epsilon_\theta(z_t,t,\mathcal{T}_\theta(y)||^2\right] LLDM=EE(x),ϵN(0,1),t[∣∣ϵϵθ(zt,t,Tθ(y)2]
其中, z t z_t zt E \mathcal{E} E编码得到图像加噪之后的结果。t代表时刻。

除此之外,如果你看了上面那张图,就能看到有一个Q,K,V的东西。那其实自注意力机制。这玩意儿是Transformer里面的。原本属于自然语言处理那边的。我打算以后分出一个系列讲自然语言处理。

在这里我简单讲一下,如果你会Transformer,应该不会陌生。如果不会,你听了估计也不会明白,我在这里不深入讲。讲到自然语言处理再讲

下面我们来简单过一下。对于里面的Q,K,V。计算如下
Q = W Q ( i ) ⋅ ϕ i ( z t ) , K = W k ( i ) ⋅ T θ ( y ) , V = W V ( i ) ⋅ T θ ( y ) Q=W^{(i)}_Q\cdot\phi_i(z_t),K=W_k^{(i)}\cdot \mathcal{T}_\theta(y),V=W_V^{(i)}\cdot\mathcal{T_{\theta}}(y) Q=WQ(i)ϕi(zt),K=Wk(i)Tθ(y),V=WV(i)Tθ(y)
其中, ϕ i ( z t ) \phi_i(z_t) ϕi(zt)是预测 ϵ θ \epsilon_\theta ϵθ的U-Net的中间表征。

那么,里面的 T θ \mathcal{T}_\theta Tθ究竟是什么呢?这要看具体情况,要根据具体特定领域而选择。比如当y是文本时,我们可以使用Transformer,或者使用CLIP等等。要根据具体情况而定。

2.4、训练

对于Stable Diffusion的训练。DIffusion和编码解码部分,并不是并行训练。

而是先训练好一个编码器和解码器。然后在训练Diffusion。对于条件的编码,一般情况下也是要一个训练好的,而不是跟着Diffusion一起训练。

2.5、采样

很简单,从高斯分布中采样一个 z T z_T zT,然后设置条件。慢慢去噪。到了 z 0 z_0 z0之后,使用解码器,就可以得到图像

3、结束

本篇文章到此结束,如有问题,还望指出。阿里嘎多!

在这里插入图片描述

<think>嗯,用户想了解Stable Diffusion文生算法的工作原理。首先,我需要回顾一下自己掌握的关于Stable Diffusion的知识。记得Stable Diffusion属于扩散模型的一种,结合了潜在空间表示和变分自编码器(VAE)。对了,用户提供的引用里提到了VAE的作用,是将片编码到空间特征,这可能是在预处理阶段减少计算量的关键。 我应该从基本流程开始解释。首先,用户输入文本提示,比如“一只猫”,然后模型通过CLIP这样的文本编码器将其转化为向量。接下来,VAE将高分辨率像压缩到潜在空间,这样在潜在空间中进行扩散过程,计算量更小。然后是扩散过程的核心,包括正向加噪和反向去噪。正向过程逐步添加噪声,直到像变成纯噪声;反向过程则利用UNet模型预测噪声,逐步去除噪声,恢复像。最后,VAE解码器将潜在表示转换回像素空间,生成最终像。 需要提到关键组件,比如VAE、CLIP文本编码器和UNet。VAE负责压缩和重建像,CLIP处理文本理解,UNet则是去噪的主力。还要注意时间步和条件注入,这些是控制生成过程的重要部分。用户可能对CFG Scale参数感兴趣,引用里提到这个参数调节AI对提示的依从度,应该在原理部分关联到条件机制,比如通过调节条件与无条件的权重来实现。 用户可能还关心为什么Stable Diffusion高效,这涉及到潜在空间的降维,相比在像素空间操作,计算效率更高。另外,扩散模型的优势在于逐步细化生成内容,质量较高。可能需要对比以前的GAN模型,说明扩散模型的进步之处。 需要检查是否有遗漏的步骤或组件。比如,调度器在控制噪声步长中的作用,或者训练时的目标函数。此外,解释潜在空间如何平衡信息保留和计算效率,可能帮助用户理解设计选择。 确保使用正确的中文术语,避免直译英文词汇。例如,变分自编码器、空间特征、扩散过程等。同时,按照用户的要求,行内公用$...$,独立公用$$...$$,并正确使用LaTeX语法。 最后,生成相关问题时要围绕用户可能感兴趣的扩展点,比如具体组件的作用、参数影响、与其他模型的比较,以及应用场景。这样可以帮助用户进一步探索相关知识。</think>### Stable Diffusion文生算法原理详解 Stable Diffusion是基于$扩散模型$(Diffusion Model)的生成算法,核心流程可分为以下步骤: 1. **文本编码** 输入文本通过CLIP等$文本编码器$转换为768维向量$T \in \mathbb{R}^{768}$。例如输入"一只猫"会被编码为语义向量[^2]。 2. **潜在空间压缩** VAE(变分自编码器)将原始像$x \in \mathbb{R}^{H \times W \times 3}$压缩到潜在空间: $$z = \text{VAE}_e(x) \in \mathbb{R}^{h \times w \times 4}$$ 其中$h=H/8$, $w=W/8$,实现维度压缩以降低计算量。 3. **正向扩散过程** 在潜在空间逐步添加高斯噪声,经过$T$步后得到纯噪声: $$q(z_t|z_{t-1}) = \mathcal{N}(z_t; \sqrt{1-\beta_t}z_{t-1}, \beta_t\mathbf{I})$$ 其中$\beta_t$是预设的噪声系数。 4. **反向去噪过程** 使用UNet预测噪声并逐步重建: $$\epsilon_\theta(z_t,t,T) = \text{UNet}(z_t,t,T)$$ 通过迭代更新: $$z_{t-1} = \frac{1}{\sqrt{\alpha_t}}(z_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(z_t,t,T)) + \sigma_t\epsilon$$ 其中$\alpha_t=1-\beta_t$, $\bar{\alpha}_t=\prod_{s=1}^t\alpha_s$。 5. **像重建** 最终潜在表示通过VAE解码器恢复为像素空间: $$x_{output} = \text{VAE}_d(z_0)$$ ### 关键组件解析 | 组件 | 功能 | 数学表达 | |------|------|---------| | CLIP | 文本语义编码 | $T = \text{CLIP}(prompt)$ | | VAE | 空间维度压缩 | $z = \text{VAE}_e(x), \hat{x} = \text{VAE}_d(z)$ | | UNet | 噪声预测器 | $\epsilon_\theta(z_t,t,T)$ | | 调度器 | 噪声步长控制 | $\beta_t$调度策略 | ### 参数影响示例 - **CFG Scale**:调节条件权重 $$ \epsilon_{cfg} = \epsilon_{uncond} + s(\epsilon_{cond} - \epsilon_{uncond}) $$ 当$s=7$时平衡创造性与依从性[^1] - **采样步数**:步数$T$越大细节越精细,但耗时增加
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值