文本编码器:一个Transformer语言模型
模型中的语言理解组件使用的是Transformer语言模型,可以将输入的文本提示转换为token嵌入向量。发布的Stable Diffusion模型使用 ClipText (基于 GPT 的模型) ,这篇文章中为了方便讲解选择使用 BERT模型。Imagen论文中的实验表明,相比选择更大的图像生成组件,更大的语言模型可以带来更多的图像质量提升。早期的Stable Diffusion模型使用的是OpenAI发布的经过预训练的 ClipText 模型,而在Stable Diffusion V2中已经转向了最新发布的、更大的CLIP模型变体OpenClip.CLIP是怎么训练的?CLIP需要的数据为图像及其标题,数据集中大约包含4亿张图像及描述。数据集通过从网上抓取的图片以及相应的「alt」标签文本来收集的。CLIP 是图像编码器和文本编码器的组合,其训练过程可以简化为拍摄图像和文字说明,使用两个编码器对数据分别进行编码。然后使用余弦距离比较结果嵌入,刚开始训练时,即使文本描述与图像是相匹配的,它们之间的相似性肯定也是很低的。随着模型的不断更新,在后续阶段,编码器对图像和文本编码得到的嵌入会逐渐相似。通过在整个数据集中重复该过程,并使用大batch size的编码器,最终能够生成一个嵌入向量,其中狗的图像和句子「一条狗的图片」之间是相似的。就像在 word2vec 中一样,训练过程也需要包括不匹配的图片和说明的负样本,模型需要给它们分配较低的相似度分数。
文本信息喂入图像生成过程
为了将文本条件融入成为图像生成过程的一部分,必须调整噪声预测器的输入为文本。所有的操作都是在潜空间上,包括编码后的文本、输入图像和预测噪声。为了更好地了解文本token在 Unet 中的使用方式,还需要先了解一下 Unet模型。Unet 噪声预测器中的层(无文本)一个不使用文本的diffusion Unet,其输入输出如下所示:在模型内部,可以看到:1. Unet模型中的层主要用于转换latents;2. 每层都是在之前层的输出上进行操作;3. 某些输出(通过残差连接)将其馈送到网络后面的处理中4. 将时间步转换为时间步长嵌入向量,可以在层中使用。Unet 噪声预测器中的层(带文本)现在就需要将之前的系统改装成带文本版本的。主要的修改部分就是增加对文本输入(术语:text conditioning)的支持,即在ResNet块之间添加一个注意力层。需要注意的是,ResNet块没有直接看到文本内容,而是通过注意力层将文本在latents中的表征合并起来,然后下一个ResNet就可以在这一过程中利用上文本信息。
参考资料:
https://jalammar.github.io/illustrated-stable-diffusion/
https://www.reddit.com/r/MachineLearning/comments/10dfex7/d_the_illustrated_stable_diffusion_video/