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

作者 : admin 本文共2875个字,预计阅读时间需要8分钟 发布时间: 2024-06-3 共2人阅读

1、前言

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

参考论文:High-Resolution Image Synthesis with Latent Diffusion Models (arxiv.org)

官方代码:GitHub – CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models

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

演示:

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

2、Stable Diffusion

2.1、隐空间扩散

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

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

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

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

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

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

其中编码器对应图中的

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_ heta(x_t,t,y)||^2 ag{1}

L=∣∣ϵϵθ(xt,t,y)2(1)
为什么可以这样?我们回忆一下DDPM里面的损失函数

L

=

ϵ

ϵ

θ

(

x

t

,

t

)

2

(2)

L=||\epsilon-\epsilon_ heta(x_t,t)||^2 ag{2}

L=∣∣ϵϵθ(xt,t)2(2)
区别在哪里,那就是Eq.(1)里面神经网络的输入多加了一个条件y。这个条件y可以是标签,文本等等信息。

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

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

我们最终只使用噪声而已。那假如我们预测的是原始图像呢?

L

=

x

0

x

θ

(

x

t

,

t

)

2

L=||x_0-x_ heta(x_t,t)||^2

L=∣∣x0xθ(xt,t)2
如果我们加入一个条件y

L

=

x

0

x

θ

(

x

t

,

t

y

)

2

L=||x_0-x_ heta(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}_ heta(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_ heta(z_t,t,\mathcal{T}_ heta(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}_ heta(y),V=W_V^{(i)}\cdot\mathcal{T_{ heta}}(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_ heta

ϵθ的U-Net的中间表征。

那么,里面的

T

θ

\mathcal{T}_ heta

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

2.4、训练

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

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

2.5、采样

很简单,从高斯分布中采样一个

z

T

z_T

zT,然后设置条件。慢慢去噪。到了

z

0

z_0

z0之后,使用解码器,就可以得到图像

3、结束

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

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

本站无任何商业行为
个人在线分享 » Stable diffusion文生图大模型——隐扩散模型原理解析
E-->