用设计师能理解的语言
来解释AIGC中的技术名词
“AIGC 属于跨学科的产物,涉及领域众多,包括高等数学、统计学、计算机图形图像学、机器学习等各个领域。AIGC 设计软件的界面上往往会涉及到许多这些领域的技术术语。要想搞清楚它们背后的知识体系需要展开的知识树体量十分庞大繁杂。术业有专攻,我们无法全面俱到地在每一个领域都做到精通,但又需要了解到一定的程度,以便更好地使用 AIGC 的相关软件。所以,我们将尽量以设计行业从业者能理解的语言来解释那些经常遇到无法绕开的技术术语。
Stable Diffusion 稳定扩散模型(下)
为了讲解 Clip text 文本编码器,我们需要先了解 Latent Space(潜空间)。我们在之前的介绍中解释过 Latent Space(潜空间)的最基础的概念和思维方式。在下面,我们将结合 Stable Diffusion 的工作流程来看一下 Latent Space(潜空间)是如何在其中发挥作用的。
为了找到图片与图片之间潜在的联系与规律,Stable Diffusion 的运行不是在图像本身的像素上来进行的,而是在图像的压缩版本即潜空间中进行的。这种压缩和解压缩过程是通过 Autoencoder 自动编码器完成的。自动编码器中的 Encoder 编码器将图像压缩到潜空间中,然后把处理过的潜空间中的信息再交给 Decoder 解码器来重建图像。这个 Autoencoder 其实是一个VAE,Variational Autoencoder 变分自编码器(之前的课程中我们详细讲过VAE)。
VAE 模型架构
Stable Diffusion 的运行是在压缩后的潜空间中进行的。让我们再回顾一下,之前一直提到的噪点是以潜空中的噪点切片(slices)来存在的(上图中用黄色网格来表示),这实际上就是一个噪点数据矩阵,而不是像素图像的噪点。因此,噪点预测器 U-Net 实际是被训练用来预测压缩潜空间中的噪点数据矩阵的。
正向过程
前向过程是把图片压缩到潜空间,逐步加噪点,生成数据,来训练噪点预测器 U-Net 。一旦它被训练成功,我们便可以利用它通过反向过程来逐步去噪点生成图像。
正向过程与反向过程
这两个流程在 LDM/Stable Diffusion 论文的图 3 中进行了更技术性的展示(论文:https://arxiv.org/abs/2112.10752):
LDM/Stable Diffusion 论文的图 3:Stable Diffusion 模型架构
可以看到,此图最右侧还显示了输入“条件”(Conditioning)组件,这就是用来描述所生成的图像的文本提示词的转化组件 Clip text ,让我们解剖一下这个组件 。
Clip text 是一个 Text Encoder 文本编码器,就是之前这个图中深蓝色模块,它本身是一个 Transformer 自然语言模型,它把输入的文本提示词生成①的Token embeddings。embedding 是指将高维度的数据(可以是文字、图片、声音等)映射到低维度空间的过程,其结果也可以称为 embeddings。在 embedding 中,文本的数据表示成一个维度空间中连续数值的点。
早期的 Stable Diffusion 模型使用的是 OpenAI 公司发布的用于 GPT 的经过预先训练的 ClipText 模型,在 Stable Diffusion V2 版本中则切换到了2022年发布的 CLIP 模型的改进变种,更大更好的 OpenCLIP 模型,这类模型都被统称为 CLIP 模型。( https://laion.ai/blog/large-openclip/ ;https://stability.ai/blog/stable-diffusion-v2-release)
CLIP, 全称是 Contrastive Language-Image Pre-Training,中文的翻译是:通过语言与图像比对方式进行预训练,可以简称为图文匹配模型,即通过对语言和图像之间的一一对应关系进行比对训练,然后产生一个预训练的模型,能为日后有文本参与的生成过程所使用。CLIP 本身也是一个神经网络,它将 Text Encoder 从文本中提取的语义特征和 Image Encoder 从图像中提取的图像特征进行匹配训练。这样的训练方式简单直接,且效果突出。研究人员发现在后续处理环节中,用来生成图像的 Diffusion 与表示的文本数据的 CLIP 可以非常好地协同工作,这也是为什么 Stable Diffusion 选择 CLIP 作为其图像生成方面的三大基础模型之一的原因。( Stable Diffusion 的三大基础模型为 CLIP、Diffusion、VAE )
CLIP模型的架构
既然是神经网络,CLIP 也同样有若干层,也是一种深度学习算法。我们现在已经知道神经网络的第一层(图中layer0)是输入层,它把“dog”的Token数值通过阈值与权重的计算后的结果输出给第二层(图中layer1),然后再由第二层做类似的运算再输入给下一层,直至最后到第十二层,即输出层进行输出。虽然大体上的运算方式类似,但是层与层之间的区别在于这些阈值和边权的权重数值不同,这些不同是早先 CLIP 在预训练阶段就固化下来的特有数据,即 CLIP 模型。因此,如果数据在未跑完全部12个层时提前出来,输出给 Diffusion 扩散模型用于生图,则意味着用该数据生成的图像也会有区别。
Stable Diffusion WebUI 中的被简化显示的 CLIP 的 12 个层结构
在 Stable Diffusion WebUI 软件中设有 CLIP Skip 参数调节滑块,可以在1至12的档位之间进行调节。12个调节档位,代表了CLIP神经网络的12个层中我们期望CLIP运算停止在
倒数第几层然后输出结果给 Diffusion 扩散模型用于图片生成运算的意思。比如滑块设置到2,那就意味着 CLIP运算到倒数第二层(图中为layer10,因为是layer0为起始输入层的即第一层)直接输出,从而放弃了传导至第十二层再输出的步骤。这样导致的结果是输出给 Diffusion 扩散模型的文本比对数据含有一些信息噪点,即尽管图像与文本的匹配精度略微降低,但图像的信息包容度提高了。
反观第十二层输出由于过于苛求图文比对的精度,于是导致了些许的过拟合情况发生,从而导致生成的图像反而缺失了某些信息。但,如果 CLIP 的进程过早地提前终止而输出,则会导致图像与文本过于不匹配,从而无法实现我们想通过 Stable Diffusion 对生图做精准控制的诉求。
Stable Diffusion 模型实际上就是在 CLIP 处于倒数第二层时训练出来的,所以很多时候,你会发现把 CLIP Skip 设置为2时,生成的图像会更好,更接近于我们所希望提示词所表达的含义,且画面质感很 nice。当然,这也并不绝对,很多时候图像领域的好与坏因人而异,因项目需要而异,具体的设置还需要在实际的工作中进行微调来满足不同的需求。
那么,这个CLIP模型是如何训练出来的呢?
CLIP 模型是通过一张图和图的文字说明一起训练出来的,这样的训练样本足足有4亿张!当然,这些图片与文字说明部分,基本都来自于网络上抓取的图片和这些图片在网页上的 “alt” 标签的内容( “alt” 标签是网页上的代码中Html图像标签中的一个属性标签,它利用文字内容描述当前的图片,告知搜索引擎这张图代表什么) 。
CLIP 训练样本示例
下面把 CLIP 拆解开看看细节,其内部是图像编码器和文本编码器的组合。首先将一张图片和它对应的文字说明分别输入到 Text Encoder 文本编码器中,分别输出为 Image embedding 和 Text embedding,即两组向量。
然后,通过一种叫“余弦相似度”(cosine similarity)的向量对比方法来对比这两个生成出来的 embedding 向量。在刚开始训练时,即使在输入端来看文本准确地描述了图像,但在输出来看相似度很低,即通过余弦相似度(cosine similarity)对比后的结果都显示相似度很低。
然后,我们把差值更新进入这两个编码器 Image Encoder 和 Text Encoder,以便在第二次再对同一组图和文字说明进行编码后产生的 embedding 向量之间的相似度能够有所提高。