在 Stable Diffusion 的生成流程中,噪声向量会被投射到潜在空间,然后通过 UNet 逐步去噪,最终映射回像素空间。请问这种噪声采样的分布方式、潜在空间的维度选择以及去噪步骤的调度机制具体是怎样的?大家对实现细节有什么推荐的参考资料或源码阅读路径?
Stable Diffusion 中的噪声采样与潜在空间映射是如何实现的?
👁️ 65 görüntüleme💬 1 cevap❤️ 0 beğeni
1 Cevap
在 Stable Diffusion 中噪声的采样默认采用标准正态分布 \( \mathcal{N}(0,\mathbf{I})\),即每个 latent 维度独立同分布的高斯噪声。采样时会依据预设的噪声调度(schedule)把噪声逐步注入到 latent 空间,这个调度一般由线性、余弦或自适应的 β‑序列决定,具体实现可以在 `ldm/models/diffusion/ddpm.py` 中找到。选择的 β 值直接影响每一步的去噪幅度,常用的 cosine schedule(如论文《Improved Denoising Diffusion Probabilistic Models》)在保持生成质量的同时减小了步数需求。
潜在空间的维度并不是随意设定的,而是由模型的编码器决定的。以官方 1.5 版为例,VAE 编码器把 512×512 的像素图下采样 8 倍,得到 64×64 的 latent 网格,每个位置有 4 × 64 = 256 个通道(即 channel=4,宽高各除以 8)。这种 4‑channel 结构源自 “Latent Diffusion Models” 论文中将噪声投射到一个相对低维的 latent 空间,以降低计算量并保留语义信息。若需要更高分辨率,可通过调节 VAE 的 downsample factor(如改为 4×)或增加 channel 数,但会显著提升显存占用。
去噪步骤的调度机制本质上是一个采样器(sampler),常见的有 DDIM、Euler‑a、DPM‑solver 等。它们在相同的 β‑schedule 上通过不同的数值积分方式逼近逆扩散过程,从而决定每一步的噪声预测和图像更新方式。DDIM 通过非随机的一步步推进可以在 25‑50 步内得到较好结果;Euler‑a 则在保留随机性的同时提供更平滑的轨迹,适合追求更细腻细节的场景。代码实现分别位于 `ldm/models/diffusion/ddim.py` 和 `ldm/models/diffusion/euler.py`,阅读时注意 `sample_loop` 与 `predict_x0` 的交互。
如果想深入了解实现细节,推荐以下路径:①阅读原始论文《High-Resolution Image Synthesis with Latent Diffusion Models》(附带公式推导);②浏览 CompVis 官方 GitHub(`stable-diffusion` 代码库),重点查看 `autoencoder`, `unet` 与 `sampler` 模块;③参考 HuggingFace Diffusers 的文档和注释,尤其是 `NoiseScheduler` 与 `SchedulerMixin` 的实现;④如果对调度策略感兴趣,可尝试 “cosine‑beta schedule” 与 “scaled‑linear schedule” 的对比实验,看看在不同采样步数下的 PSNR/SSIM 变化。这样既能把握理论,又能在代码层面验证自己的猜想。