扩散模型的组成
- 1 图像信息生成器
- 2 图像解码器
- 什么是扩散?
- 扩散是如何工作的
- 通过去噪声来绘制图像
- 速度提升:在压缩(潜在)数据上扩散而非在像素数据上
- 文本编码器:一个Transformer语言模型
- CLIP如何训练
- 将文本信息喂给图像生成过程
- Unet噪声预测器的隐层(不包括文本)
- 带有文本的Unet噪声预测器隐层
- 总结
- Resources
- Acknowledgements
- Contribute
- Discuss
- Citation
一篇介绍稳定扩散模型的文章,原文链接,翻译过来以飨读者。
AI 图像生成技术是近期以来最震撼人心的AI能力。通过文本描述生成生动图像所体现的能力,具有一种神奇的特质,并且清晰地指出人类艺术创作的转变。稳定扩散模型的推出是在此发展过程中的一个明确里程碑,有鉴于其对大众提供了高性能的模型能力(不止于图像质量、速度、相对低资源/内存需求)。
在尝试了AI图像生成之后,读者或许会开始想知道它是如何工作的。这是一篇关于StableDiffusion如何工作的通用介绍。
(译者注,上图左侧是“天堂世界的海岸”,中间是SD模型,右侧是据此生成的图像)
扩散模型以其有诸多不同的使用方式而呈现多才多艺性。我们首先关注于仅从文本生成图像(text2imag)。上图展现了从文本输入到图像生成的一个例子。除了文本生成图像,另外的主要使用方式是用它来修改图像(所以这种情况的输入是文本+图像)。
(译者注,左侧上是海盗船,左侧下是海边图像,中间是SD,右侧是修改后的图像,一艘在海边的海盗船)
接下来咱们准备了解下底层原理,这有助于解释模型组成,相互间如何影响,以及图像生成选项/参数的含义。
扩散模型的组成
扩散模型是一个系统,由几个组件和模型构成,而非单独一个模型。
当我们关注底层原理时,首先注意到的是存在一个文本理解组件来将文本内容转变成数字表示来捕捉文本含义。
我们先从更高的视角来开始,稍后的文章再深入更多的机器学习的细节。我们可以说这个文本编码器是一个特殊的Transformer语言模型(技术:多模态的文本编码器)。它接收文本做输入,然后输出数组表示每个词/表征(每个表征都是一个向量)。
这些信息然后被呈现给图像生成器,该生成器本身由一堆组件构成。
这里的图像生成历经下面两个过程:
1 图像信息生成器
这个组件是扩散模型的秘密武器,它是该模型远超之前模型的收益所在。
这个组件分好几步来生成图像信息。Step参数通畅是50或者100,在扩散模型的公开接口或者开放库中。
图像信息生成器完全在图像信息空间(潜在空间)中工作。我们将在后续的博客中介绍其更多的意义。这一特性使得扩散模型比之前在像素空间工作的扩散模型要更快。用技术术语来说,这一组件由网格网络和调度算法组成。
单词“diffusion”描述了这一组件中发生了什么。正是对信息一步一步的处理,使得高质量图像得以最终生成(接下来的组件,是图像解码器)。
2 图像解码器
图像解码器通过前置信息生成器得到的信息来生成图像。它只在最后的运行一次来生成最终的像素图像。
有了这些我们再来看组成SD扩散模型的3个主要组件(每一个都有其自己的神经网络)。
- Clip Text 用于文本编码 输入:文本 输出:77个表征向量,每个有768维度
- 网格网络+调度,逐渐处理/扩散信息到潜在(信息)空间。 输入:文本向量 和 起始多维数组(结构化的数字列表,也叫Tensor)由噪声组成。 输出:处理后的信息数组
- 自编码解码器,绘出最后的图像,借助之前处理过的信息数组。 输入:处理过的信息数组(维度:(4,64,64)) 输出:结果图像(维度:(3,512,512)分别是红/绿/蓝,宽,高)
什么是扩散?
扩散发生于下图粉色组件“图像信息生成器”中。获取表达输入文本的表征向量,以及一个随机启动的图像信息数组,这一过程产生后续的图像解码器用来绘图的所需信息数组。
这一过程以循序渐进的方式发生。每一步增加一些相关信息。为了获得这个过程的直观了解,我们可以观察随机空间数组如何从噪声发生转变的。这里的可视化是透过图像解码器的。
扩散动作发生了多次,每一步都对输入潜在数组上操作以产生更相似于输入文本的新潜在数组,视觉信息来自于模型从所有图像训练语料。
我们可以可视化一系列的这些潜在数组,来看下每一步上增加了那些信息。
这一过程看起来让人叹为观止。
有时候特别令人着迷的事情发生在第二步和第四部之间,就像是突然从噪声中浮现出图像来。
扩散是如何工作的
扩散模型生成图像的主要思路基于业内已有强大的计算机视觉模型这一事实的。只要有足够大的数据集,模型可以学到复杂的操作逻辑。扩散模型通过将问题框定如下所示来实现图像生成。
假设我们有张图片,我们生成了一些噪声,然后把噪声添加到图像上。
(译者注:训练样本生成方式:取随机噪声的一部分加入到训练语料集中(前向扩散))
这样才可以认为是一条训练样本。我们使用相同的方式来生成大量的训练样本,来训练我们的图像生成模型的核心组件。
(译者注:生成第二个训练样本,使用另外一个不同的图像,噪声采样,噪声叠加(前向扩散))
这些例子展示了噪声值的范围覆盖零噪声(0)到全噪声(4),我们据此可以轻松控制增加多少噪声到图片上。因此,我们可以对所有训练语料中的每个图像操作几十次,以生成几十张训练样本。
使用这份数据集,我们可以训练噪声预测器,并最终获得一个非常棒的预测器,用于设置特定配置来真正地生成图像。如果读者接触过机器学习的话,训练步骤应该看起来非常熟悉。
现在让我们看下这是如何生成图像的。
通过去噪声来绘制图像
训练好的噪声预测器可以产生一个噪声图像,接来下的一系列降噪步骤,可以预测一片噪声。
采样噪声被预测了出来,所以如果我们从图像中减去它就能得到尽可能接近于模型训练样本的图像(不是精准的图像本身,而是分布,像素分布的世界里呈现起来天空通常是蓝色,人类有两个眼,小猫看向某个方向,耳朵竖起且专注)。
如果训练样本是美学欣赏的图像(比如莱昂美学 也在稳定扩散模型的训练语料中),那么生成的结果图像也会倾向于美学趣味的。如果我们训练是基于徽标Logo的,那么我们也将得到倾向生成徽标Logo的模型。
如上总结描述了通过扩散模型生成图像的过程,正如文献Denoising Diffusion Probabilistic Models所说一样。现在读者对扩散已经有了直观认识,也已经了解了主要组件不止是稳定扩散模型,还有Dall-E 2和谷歌图像。
需要注意的是,截止目前为止我们所说的扩散生成图像的过程都不包括任何文本数据。所以当我们使用这些模型时,它将生成很好的录像,但是没办法控制图像是个金字塔还是小猫还是其他。接下来的章节,我们将描述文本如何叠加到这一处理中来控制模型生成图像的风格类型。
速度提升:在压缩(潜在)数据上扩散而非在像素数据上
为了加速图像生成的过程,稳定扩散的提出者是在图像的压缩空间上扩散操作,而非在图像的像素本身上扩散。这篇论文名为“Departure to Latent Space”
这里的压缩(和稍后的解压缩/绘制)是经由自编码器完成的。自编码器通过编码器压缩图像到潜在空间,然后只用压缩信息来解码重建。
至此,前向扩散处理在压缩空间上处理完毕。噪声数据是用在这些潜在空间上的,而非像素图片上的。所以,噪声预测器实际上是被训练在压缩表示上(潜在空间)来预测噪声的。
前向处理(使用自编码器的编码器)是如何生成数据来训练噪声预测器。一旦训练完后,我们就可以通过反向处理(使用自编码器的解码器)来生成图像。
这两个流是论文"LDM/Stable Diffusion"中的图3。
这个图还展现了调节组件,关于文本提示什么样的图像应该由模型来生成。
所以,让我们深挖文本组件。
文本编码器:一个Transformer语言模型
Transformer语言模型被用来作为语言理解组件,将文本信息生成为表征向量。公开的稳定扩散模型使用的是ClipText(一个GPT-based model),其背后用的是BERT 图像论文表明语言模型的选择是非常重要的。相比于更大的图像生成组件而言,更大的语言模型对图像生成质量有更大的影响。
(更大/更好的语言模型对图像生成模型的生成质量有非常显著的影响,来源Google Imagen paper by Saharia图A.5)
早期的稳定扩散模型只是插入了OpenAI公开的与训练ClipText模型。未来模型可以转换为最新公开且更大的OpenCLIP版本(CLIP的2022Nov升级版,业已实现Stable Diffusion V2 uses OpenClip)。这一新版本包含了354M参数的文本模型,而非之前63M参数的ClipText模型。
CLIP如何训练
CLIP基于图像及其对应字幕数据集上做训练。想象一下这样的数据集,有足足4亿张图片及其字幕。
实际上,CLIP的训练集是从网络上爬取的图像,顺带着对应的“alt”标签。
CLIP是图像编码器和文本编码器的集合。它的训练过程可以简单理解为输入图像及其描述,然后使用对应的编码器各自做图像和文本编码。
在此之后,我们用余弦相似来对比上述两个编码向量,当我们开始训练过程之后,相似值会变小,即便文本正确地描述了图像。
更新两个编码模型,以使得下次编码向量更相似。
不断重复这一过程,用大Batch训练整个数据集,最终得到的编码器能够编码“一只小狗”的图像向量和“一张小狗图片”的文本向量非常相似。就像Word2Vec的训练一样,此训练过程也同样需要包括负样本,即图像和文本描述不匹配,模型对负样本要打低相似分值。
将文本信息喂给图像生成过程
为了将文本作为图像生成过程的一部分,我们需要调整噪声生成器来适配文本也作为输入。
我们的数据集现在包含了编码的文本。由于我们将要在潜在空间中操作,所以输入的图像和已经预测的噪声都是在潜在空间的。
为了有个更直观的感受,关于文本表征如何在Unet中使用的,让我们再深入到Unet本身。
Unet噪声预测器的隐层(不包括文本)
先看下不用文本的扩散Unet,它的输入和输出像下面所示:
Unet内部:
- Unet是由一系列隐层构成,每层都是工作在隐向量上的transformer。
- 每一层都是在前一层的输出上进行操作。
- 有些输出会跳送(Residual连接)到整个模型的后半段上。
- 时间步长也被转换成了步长时序向量,在隐层中用到。
带有文本的Unet噪声预测器隐层
现在看下如何修改上述系统来涵盖对文本的关注。
对系统的主要改动是增加文本输入的支持,通过在ResNet模块之间增加一个Attention层。
注意到ResNet模块并不能直接看到文本,但是Attention层将文本表达合并到了潜在空间。现在接下来的ResNet可以使用合并过来的文本信息到它的处理过程了。
总结
我希望这个博客能给读者带来关于稳定扩散模型如何工作的一个很好的直观感受。虽然涉及到了很多额外的概念,但是我相信如果读者对上述构成模块熟悉的话,那也是非常容易理解的。下面所列的资源是我找到的有用资源也是很好的补充。如有修正和反馈请联系我Twitter
Resources
- I have a one-minute YouTube short on using Dream Studio to generate images with Stable Diffusion.
- Stable Diffusion with 🧨 Diffusers
- The Annotated Diffusion Model
- How does Stable Diffusion work? – Latent Diffusion Models EXPLAINED Video
- Stable Diffusion - What, Why, How? Video
- High-Resolution Image Synthesis with Latent Diffusion Models The Stable Diffusion paper
- For a more in-depth look at the algorithms and math, see Lilian Weng’s What are Diffusion Models?
- Watch the great Stable Diffusion videos from fast.ai
Acknowledgements
Thanks to Robin Rombach, Jeremy Howard, Hamel Husain, Dennis Soemers, Yan Sidyakin, Freddie Vargus, Anna Golubeva, and the Cohere For AI community for feedback on earlier versions of this article.
Contribute
Please help me make this article better. Possible ways:
- Send any feedback or corrections on Twitter or as a Pull Request
- Help make the article more accessible by suggesting captions and alt-text to the visuals (best as a pull request)
- Translate it to another language and post it to your blog. Send me the link and I’ll add a link to it here. Translators of previous articles have always mentioned how much deeper they understood the concepts by going through the translation process.
Discuss
If you’re interested in discussing the overlap of image generation models with language models, feel free to post in the #images-and-words channel in the Cohere community on Discord. There, we discuss areas of overlap, including:
- fine-tuning language models to produce good image generation prompts
- Using LLMs to split the subject, and style components of an image captioning prompt
- Image-to-prompt (via tools like Clip Interrogator)
Citation
If you found this work helpful for your research, please cite it as following:
@misc{alammar2022diffusion, title={The Illustrated Stable Diffusion}, author={Alammar, J}, year={2022}, url={https://jalammar.github.io/illustrated-stable-diffusion/} }
Written on October 4, 2022