Stable Diffusion 详解

简介
Stable Diffusion (SD) 是一款由Stability AI团队带头研发的开源的、先进的图片生成模型,该模型隶属于一个广泛而知名的模型类——扩散模型(diffusion models),是一种能基于文本生成复杂且高质量的图片的生成式模型。SD模型借由其强大的开源社区,拥有免费使用、操作便利、功能强大等各种优势,成为当今热门图片生成模型。虽然直接上手SD模型使用就能很轻松的掌握SD模型的各个功能,但了解其内在本质和原理能让使用者更加得心应手,并且也能帮助使用者更好的利用发散思维,利用SD模型创造出更多意想不到的使用场景。本文将用尝试用简单易懂的语言尽可能详尽的介绍SD模型的工作原理,为更多的使用者提供帮助。
ps. 本文不会关注模型内部具体实现的技术细节,而是根据使用时会遇到的功能所涉及到的工作原理进行介绍,想要了解模型内部实现细节的小伙伴可以参考 [1] [2] [3] 这三篇文章,图和内容都非常详尽。
生成原理
正如知名up主秋葉aaaki在对SD原理介绍的视频 [4] 中所说:不管怎么样,反正提到SD,就必须要说这张图:
这张图是描绘了潜在扩散模型(Latent Diffusion Model)工作流程的基本框架,总体分为像素空间、潜空间以及条件设定区(不知道翻译的准不准确),SD模型正是基于这样的LDM实现的扩散模型。
它整体的工作模块包括:
- 图片编码器和图片解码器模块,使得图片在像素空间和潜空间中转换。
- 潜空间向量扩散与去噪模块,作为生成图片过程中最核心的功能。
- 条件设定模块,输入图片、文字等信息作为生成的控制条件。
接下来将对于这三个模块分别介绍:
TODO: add figure
1 图片编码器与解码器
所谓像素空间,就是由像素组成的我们肉眼可识别的图片,而潜空间则是一组相较于像素空间而言更加低维的向量。为使得SD模型能更加高效的进行扩散操作,SD模型首先会使用图片编码器将图片从像素空间压缩到潜空间,将一些高频的、难以察觉的细节抽象化,以适配基于似然(likelihood-based)方法的生成模型。在经过了多轮的扩散和去噪过程后,SD模型会将改造后的潜空间向量重新通过解码器转回像素图片,即最后生成的图片。
而图片编码器(图中E)和图片解码器(图中D)也统称为变分自编码器(Variational Autoencoder, VAE)
2 潜空间向量的扩散与去噪
扩散与去噪操作是扩散模型训练与生成图片的核心部分,在图1中潜空间部分可以看到上下两部分就分别表示着扩散过程和去噪过程。一次图生图的过程首先需要经历的就是扩散,也就是给图片一步步添加噪声的过程,使图片变得模糊,随后再经过受条件信息引导的去噪之后,还原出想要的高质量图片。而文生图则是采用一张随机噪声图片开始,经理相同的过程之后得出想要的图片。
2.1 扩散过程
扩散过程在图生图中起到了给原图添加噪声的作用,但其更为重要的作用是训练一个噪声的预测器,也就是图中的U-Net。训练过程主要为:
- 生成数据集:选取一些图片,将其分别加上不同等级的随机生成的噪声样本,作为数据集。
- 输入数据:将加噪后的图片以及该图片所含噪声的等级作为输入,供模型进行训练。
- 监督学习:模型使用图片加入的真实噪声样本做标签,进行监督学习,训练模型预测图片中所含的噪声样本。
ps. 以上所说的图片均指潜空间向量,经过训练后的U-Net能够以潜空间向量以及噪声等级作为输入,精准的预测并生成一份噪声样本,供去噪过程使用。
2.2 去噪过程
去噪过程会用上已经训练好的U-Net。在提供一个噪声等级以及图片输入之后,U-Net会生成一份噪声样本,用输入的图片去除掉生成的噪声生成一张新的图片,至此完成一次去噪。整个去噪过程会不断重复单次去噪过程,输出的图片会作为下一次去噪的输入,重复次数就是我们在使用SD模型生成时设定的迭代次数。通常输入的噪声等级会根据当前已运行的迭代次数(时间步,Time Step)变化,随着迭代进行,后续输入的噪声等级会逐渐下降。
3 条件设定区
CLIP
TODO: fill the content