潜空间扩散(Latent Diffusion):为什么 Stable Diffusion 在压缩空间里操作,而不是直接画像素

我第一次跑 Stable Diffusion 的时候,最让我困惑的不是它画得好不好,而是它生成一张 512×512 的图只要几秒钟。我当时的认知是:扩散模型不是要逐像素去噪吗?那应该是先有一张 512×512 的纯噪声图,然后模型一点一点地“擦”出画面,每一步都要处理 262,144 个像素。这不得算到天荒地老?

AI technology illustration

后来我发现,我搞错了一个关键点:去噪并不发生在像素空间。那张 512×512 的噪声图,其实是一张 64×64 的“潜变量”图被解码器放大后才变成的。模型真正在操心的,是那个 64×64 的小空间。这就是潜空间扩散(Latent Diffusion)的核心——把扩散过程从高维的像素空间,搬进一个压缩过的、更“聪明”的低维空间。这个想法直接催生了 Stable Diffusion,也让万亿参数的文生图模型从“跑不动”变成了“随便跑”。

我最早对感知压缩的理解,是把它类比成 JPEG 压缩——把原始图像通过 DCT 变换扔掉高频细节,得到一个更小的文件。但 VAE 的压缩比这高级得多,它学到的不是像素的统计冗余,而是图像的语义结构。比如“猫”这个高级概念,在像素空间里是几百万个颜色值,在潜空间里可能只是一个几十维的向量,而解码器知道怎么把这个向量重新展开成一只猫的具体样子。换句话说,潜空间里的每一个数字,都对应着“猫耳朵的弧度”、“毛发的纹理方向”这类更抽象的东西,而不是某个像素的 RGB 值。

那为什么一定要压缩?直接像素扩散不行吗?做个简单的计算你就明白了。一张 512×512 的 RGB 图像,像素空间维度是 3×512×512 ≈ 786,432。训练一个扩散模型要对这个空间里的分布进行建模,每一步都要用 U-Net 处理这个尺寸的输入,而 U-Net 本身又是个计算大户。更致命的是,在推理阶段,你要跑几十步甚至上百步去噪,每一步都要把那个巨大的张量扔进网络。早期的一些像素空间扩散模型,比如 OpenAI 的 GLIDE,虽然能生成漂亮的图,但生成一张 256×256 的图像就得跑几分钟,512×512 更是慢到不可用。潜空间扩散的作者在论文里就直说:“在高维像素空间里操作扩散模型,就像在显微镜下绣花——太费劲了。”

潜空间扩散的解决方案极其优雅:先训练一个极致的压缩器——感知压缩自编码器(Perceptual Compression Autoencoder),把图像压缩到原来的 1/4 到 1/8 大小,然后在那个小得多的潜空间里训练扩散模型。生成时,先在潜空间里完成去噪,最后把潜变量解码回像素。这就像本来你要在一片 1000 亩的沙地上雕一幅沙画,现在你改成先在一块 10 平米的木板上刻出浮雕,然后用一个放大镜把浮雕的纹理投射到沙地上——绝大部分细节不是你自己雕的,而是那个投射过程(解码器)根据你的粗糙稿子补出来的。你只需要负责大的构图和语义,省了无数力。

具体来说,Stable Diffusion 用的 VAE 会把一个 512×512×3 的图像编码成 64×64×4 的潜变量,压缩了 48 倍。你感受一下:786,432 个数字变成了 16,384 个数字,而且后者还保留了前者 99% 的感知信息。这就是为什么 512×512 的图能几秒生成,因为扩散模型实际处理的尺寸是 64×64,计算量小了不止一个数量级。

那么,这个压缩怎么做到的?关键在 VAE 的训练目标。普通的自编码器只追求像素级别的重建,比如均方误差越小越好,结果就是重建出来的图很模糊,因为模型学的是平均像素值。但感知压缩自编码器在此基础上加了一个 LPIPS(Learned Perceptual Image Patch Similarity) 感知损失,以及一个对抗损失(GAN loss)。LPIPS 让模型去比较深层特征图的差异,而不是直接比较像素,这就迫使解码器学会重建那些“看起来像”的纹理和细节,哪怕个别像素值有偏差。对抗损失则让解码器输出更逼真、更锐利。所以,哪怕从 64×64 的潜变量恢复到 512×512,解码器也能把丢失的细节“猜”回来,而且猜得相当合理。

这里有一个我踩过的坑,也是很多人误解的地方:潜空间扩散不是把扩散模型加在 VAE 的编码结果上就完事了,而是整个扩散过程都在潜空间里训练和推理。 也就是说,前向扩散过程(加噪)是在潜变量上加高斯噪声,逆向去噪过程也是用一个 U-Net 在潜空间里预测噪声,U-Net 的输入输出都是 64×64×4 的潜变量。这跟 VAE 编码器本身无关——编码器只在训练集准备阶段用一次,把全部图像都编码成潜变量存起来,之后扩散模型就只碰这些潜变量,再也不碰像素了。推理时也一样,从纯噪声开始,在潜空间里一步步去噪,最后一步得到干净潜变量,然后扔给解码器出图。编码器在前向过程中根本不被调用,因为不需要从像素出发,一开始就是噪声。

这个设计还有一个顺带的好处:条件注入变得极其灵活。因为潜空间本身是连续的、结构化的,我们可以在 U-Net 的中间层,通过交叉注意力(Cross-Attention)把文本、图像、语义图等条件信号“写”进潜变量里。Stable Diffusion 的文本控制就是这么做的:CLIP 文本编码器把 prompt 编码成一系列 token 向量,然后这些向量作为 key 和 value,U-Net 中间层的潜变量作为 query,做交叉注意力。这样,文本语义就能直接引导潜变量的去噪方向,而不需要像早期像素空间扩散那样,用额外的分类器梯度来引导。这也就是为什么 Latent Diffusion 论文里把这种条件机制称为“通用条件注入框架”,它几乎可以接任何模态。

不过,压缩总会有代价。潜空间扩散的主要局限就是解码器可能引入伪影。比如你可能会发现,Stable Diffusion 生成的图在极端光照或者复杂几何结构下,会出现一些不自然的条纹或块状效应,这通常是解码器在“猜”细节时猜错了方向。另外,小尺寸的潜空间虽然省算力,但也限制了模型对精细结构的控制力——比如生成文字时,小字体的笔画往往扭曲,因为 64×64 的潜空间每个维度对应的像素太多,一个维度上的小扰动经解码放大后,就会让好几个像素一起偏移。所以现在很多超真实感方案会采用级联扩散(Cascaded Diffusion),先用潜空间扩散生成低分辨率基础,再用像素空间扩散的“超分模型”逐级放大,把细节补回来。

但不管怎样,潜空间扩散已经把文生图的大门彻底推开了。从 Latent Diffusion 论文(Rombach et al., 2022)发表到现在,它几乎成了所有实用级扩散模型的标准架构,DALL·E 2 的 unCLIP 其实也是类似思路,只不过它把潜空间换成了 CLIP 图像嵌入。而 Stable Diffusion 开源后,全球开发者可以在消费级 GPU 上跑自己的模型,这背后最根本的推力,就是那个 64×64 的潜空间。没有它,扩散模型可能还停留在实验室的论文里。

我现在的理解是:潜空间扩散不是简单的“压缩一下再算”,而是一种感知上的分工——让扩散模型负责图像的高级语义和全局结构,把低级的纹理、边缘、高频细节外包给解码器。解耦之后,两个模块各司其职,整体效率飙升。这种“分离关注点”的工程哲学,在 AI 里一次又一次被证明是对的。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/73.html

(0)
上一篇 2026年8月14日 上午12:31
下一篇 2026年8月14日 上午12:32

相关推荐