寒夏摸鱼站

Stable Diffusion 拆解分析笔记 #1

…浏览 §技术

太长不看

文章深入探讨了 Stable Diffusion(SD)的工作原理,重点介绍了其从文字到图像的生成过程。SD 通过文本编码器(如 CLIP 模型)将输入文字转换为向量,再利用 UNet 和调度器进行多轮去噪,最终通过自编解码器生成可理解的图像。文章还解释了扩散的概念,即通过逐步去噪使图像信息从噪声中逐渐清晰。

Stable Diffusion 也出来一大段时间了,不管是美称为行业革命,还是被污蔑为版权小偷,技术就是技术
想要获得客观的认知,我们唯有对其进行深入研究学习

参考资料

这些参考资料详细地解释了 Stable Diffusion 的工作流程,但他们都是英文的
当然你也可以把本文当作以下资料的一点烤肉翻译罢了

  1. https://jalammar.github.io/illustrated-stable-diffusion
  2. https://poloclub.github.io/diffusion-explainer

从文字到图像

SD 之所以流行,最大的特点就是实现了 从文字到图像 的过程,使得画图这一严重依赖人类劳动知识经验的过程大大地简化为提示词组合
当然,还有可能有别的图像作为输入,配合文字一起生成新的图像,即 图生图

Diagram

就 SD 最出名的文生图过程而言,我们可以很容易地提出一个推理步骤:SD 需要先理解文字,然后再生成图像

Diagram

当然我们是站在模型高层出发的,SD 整体实际上是由多个不同的部分模型组成
比如,对于理解文字,我们实际上做的是 文字编码 工作,即 文本编码器
而文本编码器本身又可以是其他的某一个 AI 模型(就如 SD 使用的 CLIP 模型)

文本编码器在接收到输入文字之后,会将其转换成图像生成器所能理解的一串数字向量,而这个向量本身与原文是有一定的对应关系的

Diagram

在向量到达图像生成部分时,实际上它还会经过两个内部阶段:

  1. 图像信息生成

既然我们已经从文本编码器得到了向量,那么我们起始就可以马上生成图片了
这一生成过程就是 SD 的名字由来 —— 稳定扩散
利用向量信息对一张初始的噪声图不断地进行多轮去噪,得到最终的一张目标图片
这里会使用到 UNet调度器 来实现降噪和多轮进行

Diagram

但是此时这个步骤生成的图片仍然是人类难以理解的,因为我们此时所有的数据都是在 潜空间 里计算的
简单的来说,就是目前所谓的“图片”还是一串串的数字矩阵

  1. 图片解码

为了得到一张我们能“看懂”的图片,我们需要将潜空间图片解码
我们只需要进行一次解码就可以得到最终图像
SD 使用的是 自编解码器

Diagram

SD 的模型参数

这时我们可以拿着上图对照着 SD 使用的模型参数来看了:

  • ClipText 模型:用于文本编码
    输入:文本
    输出:77 个 Token 嵌入向量,每个向量有 768 维
  • UNet + 调度器:用于逐渐扩散潜空间中的信息
    输入:token 嵌入向量和一个由噪音组成的多维张量
    输出:经过扩散后的 4x64x64 张量
  • 自编解码器:用于将最终的扩散张量处理成图片
    输入:经过扩散的张量
    输出:一张 512x512 的 RGB 图像
Diagram

所以扩散到底是什么

扩散就是发生在图片信息生成器里的一系列过程,77x768 Token 嵌入向量和 4x64x64 的随机张量被作为生成器的参数输入

Diagram

生成器利用这些信息,使用 UNet 模型一步一步地对随机张量进行去噪,让高频噪声中的信息变得越来越清晰
这里出现的步数 —— 如果你对 SD 很熟悉的话 —— 就是你经常使用的 Step 参数
因此步数越多,信息将变得更加有序,最后达到稳定

Diagram

小结

我们大致拆解了 SD 的运行流程,简单讨论了“扩散”这一概念

下期内容我们将着重介绍扩散是怎么工作的,它是如何将一张图片从噪声中提取出来的