sd中的CLIP
sd主要包含了3大块,VAE、CLIP和UNet。其中CLIP(Contrastive Language-Image Pre-training)主要是用来将提示词转为tokens,通俗的说,就是把文字转化为可以模型可以理解的信息。这些语义信息是77*768大小的向量,在UNet阶段一步一步嵌入进去,这样生成的图片就能附带提示词的内容,嵌入方式为cross attention。对输入text提取text embeddings的方式可以是其他的,目前sd主要使用OpenAI的CLIP。
CLIP论文:https://arxiv.org/pdf/2103.00020.pdf
CLIP本身可以做很多下游任务,在论文中,主要展示的是zero-shot linear classifier,也就是没在数据集上微调的情况下,精度和ResNet-50相当,虽然在分类任务中 ResNet-50已经被很多模型超越了,但最先进的模型也没有与ResNet-50拉开太大的差距,从侧面反映了CLIP在分类任务中有着不俗的能力。
CLIP训练
CLIP的训练过程如下图所示,输入的数据是图片和文本,一个batch的数据包含N对(image,text),text是对image内容的描述,作者收集了大量的数据,其中很多text都是简短的,只有大致的描述,也就是说标签的强度很弱。总之,CLIP可以通过大量的弱标签数据学习,得到强大的能力。
CLIP的训练采用对比学习的方式,一个batch的数据互为负标签,具体的损失计算可以去看原论文。text encoder都是Transformer结构;image encoder,作者尝试了多种结构ResNet和ViT。
CLIP应用
在sd生成图像时,仅仅使用了CLIP的test encoder,将提示词转为text embeddings,嵌入text embeddings的方式为cross attention。Self Attention的查询、键和值都来自同一个输入序列,而cross attention的查询来自一个输入序列,而键和值来自另一个输入序列;sd中查询来自UNet,键和值来自condition embedding,也就是提示词的语义信息。
CLIP的image encoder能用来反推语义信息,输入为一个图片,输出为描述图片中内容的text。这一能力也被集成在sd webUI,在不知道该如何写提示词的时候,可以将样图放进去学习反推的text。
sd webUI中有一个可以设置的参数,CLIP终止层数,可以设置0-12,我还不理解这个参数的含义,带着这个问题,即将开始sd中UNet的学习。