当前位置:首页 > AI图像类

Stable Diffusion 为什么能在普通显卡上跑?潜在扩散模型与 VAE 潜空间拆解

6天前AI图像类17

文生图模型动辄要生成 1024×1024 的大图,早期扩散模型却在"像素"上一步步算,慢得让人抓狂。Stable Diffusion 能在一张普通显卡上跑,靠的正是一个关键改造——不直接处理像素,而是先压进一个更小的"潜空间"再去扩散。

这套思路,官方叫潜在扩散模型(Latent Diffusion Model,简称 LDM)。这篇从"像素级扩散为什么贵"这个问题倒推,看它怎么一步步把计算量省下来。

ldm-cover.jpg

先看清问题:在像素上做扩散,有多重

扩散模型的加噪、去噪,都发生在一个"空间"里。如果这个空间是原始像素,那么每一步都要对一个由几十万、上百万个像素构成的张量做一次完整的网络前向——而采样又往往要走几十上百步,每一步都是全尺寸算一遍。

1024×1024 的图,单张就有上百万像素,再乘上采样步数,计算量立刻就顶到很不现实的位置。这一重,直接把"在家用显卡上生成高清图"这件事挡在了门外。

但它也逼出了一个很自然的追问:去噪这件事,真的有必要在像素那么细的层上做吗?

关键洞察:图像有大量冗余,先压缩再干活

答案藏在一个常识里——图像的信息,远没有像素数量看起来那么多。一张猫的照片,真正有意义的是"猫的样子、毛色、姿态"这些高层结构,而不是每一个像素点各是什么值。大量像素之间高度相关,冗余得很。

既然如此,与其在像素这种又大又冗余的空间里扩散,不如先把图压成一个更紧凑、更"信息密集"的表征,在这个小空间里做去噪,再还原成像素。省下的是绝大多数无谓的逐像素运算。

干这个"压缩 + 解压"的部件,就是变分自编码器,简称 VAE。

VAE:把大图压成小潜变量,再还回去

VAE 由两个网络组成。编码器(encoder)吃进一张像素图,吐出一个小得多的潜变量 z——它保留了图的主要语义,却把分辨率抽低了好几倍;解码器(decoder)反过来,从潜变量 z 重建出一张像素图。

打个比方:编码器像把一张高清照片压缩成一张"信息浓缩的底片",解码器则是冲洗机器,能把底片洗回照片。潜空间(latent space),就是这些浓缩底片所在的空间。

到这里,LDM 的思路就清楚了:扩散过程不在像素 x 上做,而在潜变量 z 上做。加噪、去噪都在这个缩小了数倍的小空间里进行,到采样完成,再让 VAE 解码器把潜变量洗回大图。计算主要在"小空间"里发生,成本骤降。

拼起来看 Stable Diffusion:三块部件各司其职

把 LDM 这套装起来,就是 Stable Diffusion 的大致模样。它由三块核心部件组成。

一是文本编码器,把提示词转成条件向量,告诉模型"要画什么",常见用的是 CLIP 的文本编码器。

二是去噪网络(U-Net),在潜空间里干活:拿带噪的潜变量、时间步、文本条件,预测该去掉的噪声,一步步把潜变量往清晰方向还原。

三是 VAE,负责"像素 ↔ 潜变量"两个空间的往返——编码器把真实图压进潜空间供训练,解码器把训好的潜变量还原成高清像素图。

整条生成链路走下来是:提示词先进文本编码器变条件;再从一摊随机噪声出的潜变量出发,由 U-Net 在条件引导下逐步去噪;去噪到位后,VAE 解码器把潜变量放大还原成你看到的那张图。

潜空间省下的,不止是算力

把扩散从像素挪到潜空间,好处是双份的。

省算力是一份:潜变量比像素小得多(常见是宽高各压缩数倍),每步网络前向处理的张量小了几个量级,这正是普通显卡能扛下来的关键。

顺带还有一份"聚焦":VAE 压缩时,会优先保住语义和结构,丢掉一部分高频的、与主体无关的细节。这相当于扩散在去噪时,可以把注意力放在"大模样对不对"上,而不是被像素级的琐碎噪声牵着走。用更小的空间,反而把生成的重心摆更稳。

小结

把潜在扩散模型收一下:像素级扩散是全尺寸逐像素算,又重复几十上百步,成本高到不现实;但图像信息冗余,不必在像素层细抠,于是引入 VAE,用编码器把图压成小得多的潜变量,解码器再还回像素;扩散的加噪去噪都在潜空间 z 上做,计算量降了几个量级;Stable Diffusion 就是"文本编码器 + U-Net 潜空间去噪 + VAE 编解码"三件套的组合。

记住一句话:Stable Diffusion 不靠硬算顶,它先把图缩小到潜空间里慢慢打磨,再放大还给你一张高清图。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。