为什么Stable Diffusion比Disco Diffusion快几个数量级?

上一篇写AI 绘画 AI 绘画很酷可是…原理是什么Stable Diffusion 尚未发布文末的原理介绍其实是关于 Disco Diffusion本文想从这两个模型背后的原理层面来比较二者同时回答(也是回答自己)为什么 Stable Diffusion 可以这么快

Disco Diffusion 单张耗时在 5-10minStable Diffusion 则只需要 5-10s

一.原理复习

Diffusion 模型的作用是将图像"降噪"也就是说它只是实现将一张带有噪点的图像变清晰这个功能AI 能够绘画依托于模型将用户的输入文本变成能与图像比较的向量例如 CLIP
Stable Diffusion原理图
我画的AI绘画原理图

Disco Diffusion 就是通过不断将用户的文本(Text)输入与 Diffusion 生成的图像计算 CLIP 损失一步步实现 AI 绘画的功能但是这个迭代过程实在是太太太太慢了

原因在于

对于用户指定尺寸的一张分辨率为 1920x1080 图像模型每次都要迭代这张图上一共 3x1920x1080 个像素点的值并且将这个过程循环 240 次(steps)

有没有更好的办法呢今年年初几位科学家提出的Latent Diffusion模型就试图尝试将 Diffusion 过程放在隐空间(latent)上做上一篇文章也有关于隐空间的介绍

二.在隐空间上做 Diffusion

首先一张图片的隐空间(latent)怎么得到呢最简单的方法就是训练一个 Encoder-Decoder 网络比如下面这个模型它的输入是一张 512x512 的图像模型的 Encoder 将这张图像变成一个 64x64 的 latent经过 Decoder 将其还原成原始的 512x512 图像
提取隐变量(latent)

听起来这个模型很蠢好像什么事也没干但假如我们保存这个 latent(即 64x64 尺寸的向量)那么哪天原图丢失模型也可以用 latent+Decoder 还原这张 512x512 的图像而这个 latent 所花费的存储开支是原图的

64x64 / 512x512 = 1/64

简化起见这里不考虑通道数即认为图像的 RGB 通道等同于网络的 channel 数下同

因此可以这么理解

隐空间(latent)包含了一张图像最重要的信息算是某种意义上的极限压缩

Latent Diffusion 的思路是把降噪(diffusion)过程在 latent 层面上做换句话说diffusion 模型的每次迭代并不是在原始图像上进行而是每次试图将模糊的 latent 变得更清晰

仿照介绍 disco diffusion 原理时的手稿这次用 PPT 做了个 latent diffusion 思路流程图如下所示

  • 用户的输入(如"一只狗在微笑")会经过文本编码(Text Embedding)模型变成向量这里使用的是 CLIP这个向量会与随机产生的噪声 noise 一起作为最初的隐变量 latent0
  • diffusion 模型仍然做降噪但这次只对 latent 做而不是真实图像假设 latent 尺寸是 64x64经过两次(steps=2)降噪(diffuse)后得到最终的隐变量(latent2)将其通过上文提到的 Decoder就得到了最终 512x512 的图像输出
    Stable Diffusion在latent空间做diffuse

三.为何 Stable Diffusion 这么快

Stable Diffusion 是基于 latent diffusion 这篇论文在大规模数据上训练得到的模型因此可以假定它的模型速度与 latent diffusion 接近至少在一个数量级

因为 diffusion 是在 latent 层面做模型需要处理的数据与 disco diffusion 完全不在一个量级以一张 512x512 的图像为例

对于 Disco Diffusion 模型图像上所有的像素点均由模型生成并迭代要处理的像素数量 512 x 512 而对于 Stable Diffusion 而言它要处理的 latent 尺寸是 64x64

即便两个模型处理速度一样快它们分别迭代完各自的结果前者所花费的时间大约是后者的

512x512 / 64x64 = 64 倍

这解释了为何 Disco Diffusion 普遍需要几分钟而 Stable Diffusion 仅需 10 秒

更新: 在 Stability 工作的朋友也提了一点正如上图所示Stable Diffusion 没有反向回传 loss 的过程这也是它更快的一个重要原因

要说这么快有什么坏处那可能是 64x64 尺寸的 latent 所包含的信息量太过于有限因此生成内容很难做到精细常常只有轮廓而缺失细节许多使用者发现Stable Diffusion 有点缺乏想象力生成的东西太过于正常不如 Disco Diffusion 天马行空

当然这也许不是一件坏事stability.ai选择将代码开源并且几乎不保留地放出模型值得敬佩也许这个行动能真正让 AI 绘画给普通人带来帮助

文中人脸狗均为我用 6pen.art 的 Stable Diffusion 模型生成