前言
Stable Diffusion是一个什么架构呢,或者说是由哪些部分构成,各自发挥着怎么样的作用。我们就先从文生图开始探索
文生图
我们打开Stable Diffusion的webui,然后选择Stable Diffusion模型,然后选择VAE模型,CLIP终止层数选择默认为2。
然后在文生图的提示词里面写入:美女,动漫风格,long hair,blue_hair,purple eyes,4K这些文字,在(里面的英文是自动转换的)。然后就是下面的参数:
迭代步数:默认为20,这里我调成了30 采样方法:DPM++ 2M Karras 提示引导词:默认值0.7 随机数种子:随机数种子一致,同样配置生成的图片才能一样。然后点击生成,Stable Diffusion就生成了一张图片。
那么,上面配置的众多参数是干什么的?Stable Diffusion是如何通过众多参数生成的一张图片?带着这些问题我们来学习一下Stable Diffusion。
CLIP
我上面输入了美女,动漫风格,long hair,blue_hair,purple eyes,4K这些文字,在Stable Diffusion被称作text prompt,即文本提示词。但是Stable Diffusion肯定不认识你这些单词,所以就要经过CLIP一系列的内部处理。
CLIP是Open AI开发的一种深度学习模型,Clip 是图像编码器和文本编码器的组合,用于生成任何图像的文本描述。所以CLIP的作用就是将我们输入的提示词,转换成Stable Diffusion可以识别的内容(对应生成图像的文本向量),CLIP处理流程如下:
Tokenizer
首先是tokenizer,将我们输入的提示词,分词之后再转换成一个个数字。但是tokenizer只能分在训练时见过的单词,加入你输入一个dreambeach,但是clip中只有见过dream和beach,这样就将你的一个单词分为两个,成为两个token,所以说一个单词对应的不一定是一个token。
上面的例子中,我输入的其实也没有32个单词,但是提示词已经是32个了,后面的75是token的限制个数,但是现在已经没有限制了,如果超过75他就自动扩展到150,以此类推。
Embedding
然后每个token都会被转换成为一个768维度的向量,被称为Embedding,每个token在clip中都对应着唯一的Embedding,和token一样,Embedding 在clip模型的训练学习阶段,就是被固定的。
Embedding在也是被称作 textual inversion(文本反演)模型微调的一种技术手段,这里的话只做一个简单的了解。我翻阅了一些资料,对Embedding有以下的描述:
万物皆可嵌入:用向量表示物体 Embeddings 是一种将现实世界的对象和关系表示为向量的密集数值表示形式。向量空间量化了类别之间的语义相似性。靠近彼此的嵌入向量被认为是相似的。 例如,man、gentleman和guy的嵌入几乎相同,因为它们可以互换使用总的来说就是:Embedding代表一个物体、一个描述、一个样式等等。找到合适的Embedding可以触发任意的对象和样式。
Text transformer
Embedding需要由Text transformer进行进一步处理,生成conditioning。然后被noise predictor(噪声预测器)消费,用作生成图片的condition,这样才能控制图片生成的最终结果。
那么noise predictor是什么?简单地说就是生成图片的,你输入的text prompt在经过clip转换成conditioning之后,就引导noise predictor去生成图片。如果要说到生成图片的过程的话,就不得不提Stable Diffusion的正向扩散和逆向扩散了,所以下一篇文章就写一写正向扩散和逆向扩散。
这里先提一下noise predictor是一个U-Net model,U-NET是什么,这个后面详细学一下再讲。
画图总结
我们在开篇讲了Stable Diffusion的优势在与latent space计算,所以U-Net model是在潜空间计算的。
中间空白的部分在后面的学习过程中逐渐填补。
结语
这就是文生图中,从输入文本到Latent空间的一个流程,主要讲了clip的处理流程,同时也是conditioning的生成流程。里面的noise predictor和U-Net是本文中留下要学习的地方。所以下一篇文章就主要写一写noise predictor。