Skip to content

LDM

Latent Diffusion Model

先把图像压到一个更小、但仍保留主要语义和视觉结构的 latent space,再在这个 latent space 里训练 diffusion model。

如果把传统 diffusion model 看成“直接在像素空间里加噪、去噪”,那么 LDM 的核心变化只有一个:

不再直接处理 H×W×3 的原始图像,而是先经过一个训练好的 autoencoder,把图像变成更紧凑的 latent,再在 latent 上做 diffusion。

这件事带来的直接收益是:

  • 训练更省算力;
  • 采样更快;
  • 同时还能尽量保住图像质量;
  • 更容易扩展到高分辨率和文本条件生成。

所以 LDM 的关键不只是“也能做 diffusion”,而是:

它把 diffusion 从 pixel space 搬到了更合适的 latent space。

为什么要从像素空间搬到 latent 空间

传统 diffusion model 在图像生成上的效果很好,但它有一个很现实的问题:

图像本身维度太高了。

如果输入是一张 512×512×3 的图像,那么模型每一步都要在这么大的空间里做去噪。扩散模型又不是只跑一步,而是要反复跑很多步,所以训练和采样都很贵。

LDM 论文的观察是:

  • 图像里有很多高频细节,对人眼几乎不可感知;
  • 真正重要的,是物体、布局、语义、风格这些“更高层”的信息;
  • 如果能先把图像压缩到一个“视觉上基本等价”的 latent space,再去学生成,就能避免把大量算力浪费在像素级细枝末节上。

所以 LDM 不是想“把图像压得越小越好”,而是想找到一个折中点:

既足够小,能显著降低计算量;又足够好,不至于丢掉太多视觉质量。

这也是论文里反复强调的 trade-off:不是极端压缩,而是 mild compression

LDM 的整体结构

LDM 可以分成两个阶段来看。

第一阶段:先训练一个 autoencoder

给定图像 x,先用编码器把它映射到 latent:

z=E(x)

再用解码器把 latent 重建回图像:

x~=D(z)=D(E(x))

这里:

  • xRH×W×3 是原图;
  • zRh×w×c 是 latent;
  • 编码器会把空间尺寸下采样;
  • 论文里把下采样因子写成
f=H/h=W/w

也就是说,latent 的空间分辨率比原图更低。

这个 autoencoder 的目标不是做一个最强压缩器,而是尽量满足两点:

  • 重建要足够好;
  • latent 要足够紧凑。

所以它学到的是一个“对生成友好”的表示空间,而不只是一个普通特征提取器。

第二阶段:在 latent 空间做 diffusion

有了 z 以后,就不再在像素空间做 diffusion,而是在 latent 空间里做。也就是说,后面的扩散过程处理的是 z,不是 x

于是,整个生成流程就变成:

  1. 图像通过编码器进入 latent 空间;
  2. diffusion model 在 latent 空间里学习分布;
  3. 采样时先在 latent 空间生成一个 latent;
  4. 最后再通过解码器把 latent 变回图像。

所以 LDM 本质上是一个 two-stage generative model

  • 第一阶段学表示;
  • 第二阶段学 latent 分布。

先回顾普通 diffusion 的训练目标

在普通 diffusion model 里,常见做法是让网络预测加到样本上的噪声。把输入记成 x,加噪后的变量记成 xt,网络记成 ϵθ,那么一个典型的噪声预测目标可以写成:

LDM=Ex,ϵ,t[ϵϵθ(xt,t)22]

这里:

  • t 是扩散时间步;
  • ϵN(0,I) 是高斯噪声;
  • xt 是把噪声加到原始样本后得到的结果;
  • 网络的任务是根据 noisy sample xt 和时间步 t,把原来的噪声预测出来。

这类训练目标的直觉是:

如果模型能准确预测噪声,它就等价于学会了如何一步步把噪声去掉。

LDM 的关键改动:把 x 换成 z

LDM 的核心数学变化其实非常简单。

普通 diffusion 是在像素空间训练:

LDM=Ex,ϵ,t[ϵϵθ(xt,t)22]

LDM 则把图像先编码成 latent:

z=E(x)

然后把 diffusion 的训练对象从 x 改成 z,于是目标变成:

LLDM=EE(x),ϵ,t[ϵϵθ(zt,t)22]

保留 diffusion 的主体训练方式,只是把训练空间从 pixel space 换到了 latent space。

为什么这样会更省算力

设原图大小是 H×W,latent 大小是 h×w,并且下采样因子是

f=H/h=W/w

那么 latent 的空间分辨率大约缩小了 f2 倍。

虽然 latent 通道数 c 不一定等于 3,但从整体上看,UNet 要处理的空间张量已经显著变小了。由于扩散模型训练和采样都要反复运行 UNet,这个空间维度上的缩减会直接变成算力和显存上的节省。

所以可以粗略理解成:

LDM 不是让每一步 diffusion 更聪明,而是让每一步 diffusion 工作在一个更小、更有语义的空间里。

LDM 学的到底是什么

LDM 并不是直接学“像素怎么恢复”,而是在 latent 空间学一个生成分布。

也就是说,它学的是:

  • 哪些 latent 是自然图像对应的 latent;
  • 在这个 latent 空间里,语义结构大概怎样分布;
  • 如何从纯噪声出发,一步步走回一个合理的 latent。

最后再由解码器把 latent 变成图像。

所以从生成路径上看:

noise in latent spacez0D(z0)image

这和像素空间 diffusion 的区别是:

  • 像素 diffusion 直接生成像素;
  • LDM 先生成 latent,再 decode 成像素。

条件生成:LDM 怎么接文本

LDM 很重要的一点,是它不只是无条件生成模型。论文专门把 conditioning mechanism 做成了通用接口,使它可以接:

  • 文本;
  • 语义分割图;
  • bounding boxes;
  • image-to-image 输入;
  • 其他 token-based conditioning。

最关键的做法是:

在 UNet 里加入 cross-attention。

设条件输入是 y,先用一个条件编码器把它映射成中间表示:

τθ(y)

然后在 UNet 的中间层,把 latent feature 作为 query,把条件表示作为 key / value,做 cross-attention:

Attention(Q,K,V)=softmax(QKd)V

其中:

Q=WQ(i)φi(zt),K=WK(i)τθ(y),V=WV(i)τθ(y)

这里:

  • UNet 的当前特征会问:“我现在这个位置、这个尺度,需要关注文本里的什么内容?”
  • 文本编码给出“可以被查询的条件信息”;
  • cross-attention 决定每个空间位置该从条件里读什么。

这一步让 LDM 能非常自然地做 text-to-image。

条件版 LDM 的训练目标

如果把条件输入也写进来,LDM 的目标会变成:

LLDM=EE(x),y,ϵ,t[ϵϵθ(zt,t,τθ(y))22]

这条式子很好理解:

  • zt 是带噪 latent;
  • t 告诉模型当前处在扩散过程的哪一步;
  • τθ(y) 提供条件信息,例如文本 embedding;
  • 模型要在条件约束下预测噪声。

所以 text-to-image LDM 的本质并不是“直接预测一张符合文本的图”,而是:

在文本条件的指导下,做 latent space 的逐步去噪。

采样时在做什么

训练好以后,采样过程可以粗略理解成两步。

第一步,在 latent 空间里从随机噪声开始,一步步去噪,最终得到一个干净 latent:

zTzT1z0

第二步,把这个最终 latent 解码回图像:

x=D(z0)

所以 LDM 的采样成本主要来自那条 latent-space 的反向扩散链,而不是最终的解码器。因为解码器通常只需要一次前向传播,所以它相对便宜。

LDM 和普通像素扩散最大的差别

如果要把两者差别压缩成一句话,那就是:

  • 普通 diffusion:在像素空间建模整个生成过程;
  • LDM:先把图像映射到 latent,再在 latent 空间建模生成过程。

这带来三个非常关键的后果。

第一,计算量显著下降。因为 UNet 不再反复处理整张高分辨率像素图,而是在更小的 latent 上工作。

第二,模型更专注于语义结构,而不是过度浪费容量在人眼不敏感的细微像素细节上。

第三,更容易做高分辨率和多模态条件生成,因为 cross-attention 可以自然接文本等条件,而 latent 空间又让整体成本可控。

为什么不能压得太狠

看到“在 latent 空间做 diffusion 更省”以后,一个自然问题是:

那是不是 latent 压得越小越好?

不是。

如果压缩过强,虽然 diffusion 更快,但很多关键视觉信息也会丢掉;这样后续 diffusion 再强,也很难把根本不存在的细节凭空补回来。

LDM 论文的实验也强调了这一点:

  • 压缩太弱,计算优势不明显;
  • 压缩太强,图像质量会明显掉;
  • 比较好的做法是“适度压缩”。

所以 LDM 的设计哲学不是极限压缩,而是:

找到质量和效率之间的最佳折中。

LDM 为什么重要

LDM 之所以成为一个很关键的节点,是因为它把 diffusion 从“效果很好但算力太重”的状态,推进到了“效果很好并且更实用”的状态。

更具体地说,它的重要性主要体现在三点。

第一,它证明了 diffusion 不一定非要在像素空间做。只要 latent 表示足够好,在 latent 上做 diffusion 同样可以保持很强的生成质量。

第二,它把高分辨率和多模态条件生成变得更可行。文本条件、布局条件、图像条件,都能通过统一的 conditioning 机制接进去。

第三,它直接影响了后来的 Stable Diffusion 这一整条路线。

LDM 和 Stable Diffusion 的关系

在工程上,很多人第一次真正接触 LDM,不是通过论文,而是通过 Stable Diffusion。

一个很简洁的说法是:

Stable Diffusion 就是一类建立在 LDM 思想之上的 text-to-image 系统。

Stable Diffusion 的模型卡也明确写到:

  • 它是 latent diffusion model;
  • 先用 autoencoder 把图像编码成 latent;
  • 文本通过 CLIP text encoder 编码;
  • 文本特征通过 cross-attention 喂给 UNet;
  • 训练目标是预测加到 latent 上的噪声。

所以从结构上看,Stable Diffusion 把 LDM 的核心设计做成了大规模 text-to-image 系统。

总结

LDM = autoencoder + diffusion in latent space + conditional UNet with cross-attention

核心公式

latent 编码:

z=E(x),x~=D(z)

LDM 的核心训练目标:

LLDM=EE(x),ϵ,t[ϵϵθ(zt,t)22]LLDM=EE(x),y,ϵ,t[ϵϵθ(zt,t,τθ(y))22]

LDM 的核心贡献,不是重新发明了 diffusion 的噪声预测目标,而是把 diffusion 搬到了一个更合适的工作空间:先通过 autoencoder 学一个感知上接近原图、但维度更低的 latent representation,再在这个 latent space 上训练 diffusion model。

这样做既保留了 diffusion 在生成质量上的优势,又显著降低了训练和采样成本。进一步地,LDM 通过 cross-attention 把文本等条件自然接进 UNet,使 text-to-image、layout-to-image、inpainting、super-resolution 等任务都能统一到同一框架中。

也正因为如此,LDM 成了后续 Stable Diffusion 这条路线最重要的基础之一。