为什么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秒

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

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

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

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