Stable Diffusion 模型技术架构与原理

标签: 人工智能 Stable Diffusion | 发表时间:2023-07-31 20:08 | 作者:Yanjun
出处:http://shiyanjun.cn

Stable Diffusion 是一个文本到图像(txt2img)的潜在扩散模型(LDM),是由 CompVis、Stability AI 和 LAION 的研究人员实现并开源的。我们站在 Stable Diffusion 模型应用用户的角度来看,其实没有多么复杂,核心就是根据文本生成图像,其中可以通过一些技巧或者说调整用户参数,来改变文本生成图像的过程,从而达到优化最终生成图像的目的。但是,Stable Diffusion 底层技术的角度看,这个过程非常非常复杂,所以我们这里先给出模型的 Architecture Overview,先从总体上看整个架构或结构是什么样的,然后深入到每一个部分去了解具体的技术细节或原理。

1 模型架构概览

从 High-level 的视角,Stable Diffusion 模型都包含哪些主要组件,以及整体的处理流程,我们引用了 The Illustrated Stable Diffusion 一文中的一个图,并在原图上做了微小改动(为了方便理解添加了表示三个核心步骤的数字序号),来表示 Stable Diffusion 模型的处理机制,如下图所示:

stable-diffusion-architecture

基于上图,我们分步骤描述一下 txt2image 处理的整个过程:

首先,输入 Prompt 提示词 “paradise, cosmic, beach”,经过 Text Encoder 组件的处理,将输入的 Prompt 提示词转换成 77×768 的 Token Embeddings,该 Embeddings 输入到 Image Information Creator 组件;
然后,Random image information tensor 是由一个 Latent Seed(Gaussian noise ~ N(0, 1)) 随机生成的 64×64 大小的图片表示,它表示一个完全的噪声图片,作为 Image Information Creator 组件的另一个初始输入;
接着,通过 Image Information Creator 组件的处理(该过程称为 Diffusion),生成一个包含图片信息的 64×64 的 Processed image tensor,该输出包含了前面输入 Prompt 提示词所具有的语义信息的图片的信息;
最后,上一步生成的 Processed image tensor 信息经过 Image Decoder 组件处理后生成最终的和输入 Prompt 提示词相关的 512×512 大小的图片输出。

最终使用 Stable Diffusion 模型来进行推理,得到我们需要的根据提示词生成的图像(当然 Stable Diffusion 模型不只是能够实现 txt2image,也可以实现其它的推理功能,如 image2image、txt + imange => image)。我们通过一个详细的流程图,展示整个推理的过程,如下图所示:

stable-diffusion-detailed-process

下面,我们从组件的视角来理解,上面提到的其中三个核心组件,深入到这些组件的内部来了解具体都做了什么处理工作。

2 Text Encoder

Text Encoder 是用来处理输入的 Prompt 提示词的,将其转换成对应的 Token Embeddings,它使用了由 OpenAI 开发实现的 ClipText 模型,该模型是基于 BERT 实现的预训练语言模型(Language Model),模型包含 63M 参数。如果对语言模型有所了解,从模型中提取 Token Embedding 是最基础的功能,Stable Diffusion 模型使用 ClipText 将输入 Prompt 提示词转换成对应的 Token Embeddings。

3 Image Information Creator

Image Information Creator 是最核心也最复杂的组件,它是在原始的 image2image 处理流程中进行改造和优化,使用了输入 Prompt 提示词给定的语义信息,从一个随机的 Random image information tensor 经过迭代生成了最终包含图片所有信息的 Processed image tensor。Image Information Creator 包含一个神经网络 UNet 和调度器 Scheduler,实现的核心功能就是 Diffusion,它是在 Latent Space 中实现的,其中包含一个 Forward Diffusion 过程和一个 Reverse Diffusion 过程。
为了直观理解,我们将看一下在 UNet 网络训练过程中,初始输入的 Random image information tensor 是如何逐步加入 Prompt 提示词语义信息并影响最终生成的图片质量,假设 UNet 网络去噪(Denoising)迭代 50 次,直接把每次的迭代结果通过 Image Decoder 解码成图像,如下图所示:

stable-diffusion-denoising

可见,最初的 Random image information tensor 完全是噪声数据,经过一次一次地迭代去噪,注入提示词语义,图片逐渐具备了我们所期望的内容和质量。

3.1 神经网络视角:UNet 网络架构

UNet 是一个 image2image 的神经网络,更具体一点应该是一个 CNN + inverted CNN 网络,主要目标就是去噪(Denoising),从而生成对应的图像。我们从神经网络的视角,看下 UNet 网络的架构,如下图所示:

UNet-Architecture

上图中没有体现对应的输入 Prompt 提示词语义信息。在 Stable Diffusion 模型中,UNet 网络各层的构建过程,如下所示:

(conv_in): Conv2d(4, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 
(time_proj): Timesteps()
(time_embedding): TimestepEmbedding
	(linear_1): Linear(in_features=320, out_features=1280, bias=True) 
	(act): SiLU()
	(linear_2): Linear(in_features=1280, out_features=1280, bias=True)
(down_blocks):
	(0): CrossAttnDownBlock2D 
	(1): CrossAttnDownBlock2D 
	(2): CrossAttnDownBlock2D 
	(3): DownBlock2D
(up_blocks):
	(0): UpBlock2D
	(1): CrossAttnUpBlock2D 
	(2): CrossAttnUpBlock2D 
	(3): CrossAttnUpBlock2D
(mid_block): UNetMidBlock2DCrossAttn 
	(attentions):
	(resnets):
(conv_norm_out): GroupNorm(32, 320, eps=1e-05, affine=True) 
(conv_act): SiLU()
(conv_out): Conv2d(320, 4, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

上面有添加对应的提示词语义信息,比如 CrossAttnDownBlock2D、CrossAttnUpBlock2D。为了更详细、直观地表示 UNet 网络中的 Attention 信息,我们通过下图来看图片的 Image Tensor 和输入 Prompt 的 Embedding(Text Attention)是如何一起在 UNet 网络中整合在一起的:

unet-with-text

3.2 图像转换视角:原始图像 + 提示词 => 最终图像

从图像转换视角看,我们不能不提到 Pixel Space 和 Latent Space。对于最开始输入的图像,它是在 Pixel Space 中,使用像素表示,这个我们能够比较容易感知和理解。当输入的图像、 Prompt 提示词分别被转换成 Image Embeddings、Token Embeddings 之后,后续的操作就开始进入 Latent Space 中,通过向量来表示和并进行各种处理操作,得到了包含 “原始图像 + 提示词” 信息的图片向量数据信息(Latent Image),最后要把这个生成图片向量数据信息,从 Latent Space 再映射到 Pixel Space,得到我们最终需要生成的视觉图像。这最后一步的映射转换是在 Image Decoder 组件中进行的。

为了直观,我们描述这个过程是如何一步一步完成的(引用文章 How does Stable Diffusion work? 中给出的分析),步骤如下所示:

第 1 步:输入图像被 Encode 到 Latent Space

image2image-step-1
原始图像转换成了 Latent Space 中的向量表示,我们称为 Latent Image。

第 2 步:向图像中添加噪声

image2image-step-2
通过有控制地向 Latent Image 中添加噪声,0 表示没有添加噪声,数字 N 越大表示加入的噪声越多,最后得到的是一个包含噪声的图像的向量数据表示。

第 3 步:输入 Latent Space 中的带噪声图像和 Prompt 提示词,Noise Predictor 预测其中的噪声信息 Latent Noise

image2image-step-3
上面输出的的结果是一个 4x64x64 的噪声 Tensor。

第 4 步:从 Latent Image 中减去 Latent Noise,得到 New Latent Image

image2image-step-4

第 5 步:VAE Decoder 将 Latent Image 转换成 Pixel Space 中的图像

前面 3~4 步骤会循环执行指定次数,这是一个 UpSampling 的过程,得到最终的 Latent Image,最后在执将 Latent Image 转换成最终的图像,如下图所示:
image2image-step-5

4 Image Decoder

最后 Image Decoder 根据得到的 Latent Image,基于 VAE Decoder 生成最终的图像。
关于 VAE(Variational Autoencoder),它是一个神经网络,由 Encoder 和 Decoder 两部分组成,如下图所示:

VAE

其中,Encoder 能够将一个图像压缩到低维空间表示,在 Stable Diffusion 模型中,将原始输入图像通过 Encode 转换成 Latent Space 中的向量表示 Latent Image;Decoder 能够将一个压缩表示的图像向量数据转换成高维空间表示,在 Stable Diffusion 模型中将 Latent Space 中图像的向量表示 Latent Image 通过 Decode 转换成 Pixel Space 中的视觉图像。

5 参考资料

相关 [stable diffusion 模型] 推荐:

Stable Diffusion 模型技术架构与原理

- - 简单之美
Stable Diffusion 是一个文本到图像(txt2img)的潜在扩散模型(LDM),是由 CompVis、Stability AI 和 LAION 的研究人员实现并开源的. 我们站在 Stable Diffusion 模型应用用户的角度来看,其实没有多么复杂,核心就是根据文本生成图像,其中可以通过一些技巧或者说调整用户参数,来改变文本生成图像的过程,从而达到优化最终生成图像的目的.

Stable Diffusion:你所见到的不再是真的

- - 奇客Solidot–传递最新科技情报
今年早些时候 OpenAI、Google 和 Meta 先后宣布了各自的自然语言图像合成 AI 模型,但曲高和寡,能接触到的人并不多,直到 8 月 22 日 Stability AI 开源了它的 AI 模型 Stable Diffusion,称在质量上能匹敌 OpenAI 的 DALL-E 2. Stable Diffusion 的优势是能运行在单张显卡上, 测试显示使用英伟达的 RTX 3060 12GB GPU,能在 10 秒内生成 512×512 图像,如果显卡升级为高端的 3090 Ti,生成每幅图像只需要 4 秒.

Chrome Stable 11.0.696.77发布

- HRS - cnBeta.COM
在 Adobe 官方针对 Flash 的最新安全公告公开后,Chrome Stable/Beta/Dev 三个分支迅速同时进行了升级,除了升级内置的 Flash 外没有其他变化,但是由于安全事大,推荐所有用户马上升级.

Chrome Stable 分支更新到 13.0.782.215

- Jet - Chrome迷
Chrome Stable 分支稳定版今天面向全平台更新到了 13.0.782.215,本次更新主要是修复了11个安全漏洞,其中包含一个紧急安全漏洞、9个高危安全漏洞和一个中级危险安全漏洞,共给提交漏洞的爱好者发出了7837美元的奖金. 详细更新内容可以参考 SVN Revision 日志. 另外与此同时 Chromebooks 中的 Stable 分支 Chrome 也迎来了升级,最新版本号为 13.0.782.216,也是修复了大量的安全问题.

Chrome Stable 分支全平台升级到 14.0.835.163

- 瑠音北樟 - 谷奥——探寻谷歌的奥秘
感谢读者 jlfim 和 dmtabs12 的提醒. Chrome Stable分支for Windows/Mac OS X/Linux和Chrome Frame升级到14.0.835.163,正式进入到V14时代. 除了修复大量紧急bug和安全性更新之外,主要新集成了两个新技术:. Web Audio API:帮助开发者制作音频应用,或是将自己的应用里集成各种奇妙的音频效果,比如房间模拟和空间模拟.

Chrome Stable 分支稳定版更新到 15.0.874.102

- Desmond - Chrome迷
Chrome Stable 分支稳定版今天更新到了 15.0.874.102,修复了大量安全漏洞,Google 为此支付了26511美元的 Bug 提交奖励,其中一个叫做 Sergey Glazunov 的哥们自己一个人就拿走了13674美元,真是高手中的高手.

Chrome Stable 分支进入 V15,后紧急升级到 15.0.874.106

- Chinaxingwei - 谷奥——探寻谷歌的奥秘
Chrome V15已经出世,尽管很多功能我们在Dev分支和Chromium出现时都报道过了,但面对众多Stable用户,在此还是回顾一下. 首先是重新设计的新建标签页,融入了一些移动界面的元素,将应用和最常访问的网页分离成两个独立的界面,你也可以将图标拖拽到下方,创建出自定义的一个新的“主页”(如上图).

模型制作

- 小鱼儿 - 非正常人类研究中心 – Mtime时光网
1.材料:一大袋的一次性筷子(花了60块钱);5支502胶水;5张粗砂纸;记号笔一只;锋利的美工刀片若干,破剪刀一把. 就是这种屌毛筷子,质量也太他妈的差了点,80%都是弯的 . 随便提一下:我的脚丫子还是蛮性感滴 . 开始动工了!!  先做门框跟房子的底架. 3.不好意思,忘了交代一下了,我是先画图纸的,看到那张纸了没有.

MapReduce编程模型

- - CSDN博客云计算推荐文章
MapReduce是一个Google发明的编程模型,也是一个处理和生成超大规模数据集的算法模型的相关实现. 用户首先创建一个Map函数处理一个基于对的数据集合,输出的中间结果基于对的数据集合,然后再创建一个Reduce函数用来合并所有的具有相同中间Key值的中间Value值.