← ALL ARTICLES

扩散模型

全库目录221
本文目录16

随机噪声没有清晰对象,去噪网络却能在条件引导下逐步生成结构。扩散模型根据时间或噪声等级预测状态变化,采样器按训练参数化推进。VAE、条件编码和数值精度共同决定最终图像。

加噪与去噪

前向加噪

训练时逐步向真实样本 x0x_0 加高斯噪声。常见闭式形式:

xt=αˉtx0+1−αˉtϵ,ϵ∼N(0,I)x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\epsilon, \qquad \epsilon\sim\mathcal N(0,I)

αˉt\bar\alpha_t 由噪声计划决定。tt 越大,原始信号越弱,最终接近纯噪声。

模型学习在给定 xtx_t、时间 tt 和条件 cc 时预测噪声、干净样本或速度。具体参数化取决于模型训练,采样器必须匹配。

反向采样

生成从随机噪声 xTx_T 开始,反复调用去噪网络估计下一状态,直到得到 x0x_0。

这不是简单“每一步减一点噪声”。采样器/调度器根据模型预测、噪声计划和随机项离散求解对应 SDE/ODE。不同算法在步数、随机性、稳定性和细节上有取舍。

同一提示词只改采样器或步数,路径就会变化。比较参数时应固定模型、VAE、条件、种子、分辨率和其他设置。

潜空间扩散

像素空间高分辨率去噪很贵。潜空间扩散使用VAE:

text
Image -> VAE Encoder -> Latent
Latent -> Diffusion Denoise
Latent -> VAE Decoder -> Image

潜变量是压缩特征,不是普通 RGBA 纹理。它的通道和数值语义由 VAE 训练决定。

更换 VAE 可能改变颜色、对比、细节和伪影。使用与基础模型不兼容的 VAE,结果即使能解码也可能异常。

U-Net 与其他去噪网络

经典 Stable Diffusion 使用 U-Net:下采样提取多尺度语义,中间处理全局特征,上采样恢复空间细节,并通过跳跃连接保留局部信息。

文本/图像条件常通过交叉注意力注入。时间嵌入告诉网络当前噪声级别。

现代模型也可能使用 Diffusion Transformer 等架构。U-Net 是常见实现,不是扩散模型定义本身。工作流节点和 LoRA 必须匹配具体架构。

文本条件与 CLIP

文本编码器把词元序列编码为嵌入。CLIP 系列常用于文本-图像语义对齐,但不同模型使用的编码器、分词器和最大长度可能不同。

提示词不会按自然语言逐条执行。词是否有效取决于训练语料、分词器、位置、权重和条件注入方式。

长提示词可能被截断或分段。堆叠同义词不一定加强控制,反而会稀释关键条件。先用结构化短提示词建基线,再逐项增加条件更容易定位影响。

Classifier-Free Guidance

Classifier-Free Guidance(CFG)组合有条件与无条件预测:

ϵcfg=ϵuncond+s(ϵcond−ϵuncond)\epsilon_{cfg}=\epsilon_{uncond}+s(\epsilon_{cond}-\epsilon_{uncond})

ss 是 CFG Scale。值升高会加强条件方向,但不是质量滑杆。过高可能产生过饱和、硬边、纹理破碎和构图僵化。

负面提示词通常进入 Unconditional/Negative 条件。它改变去噪方向,不能保证逻辑上的“禁止”。过长负面词也可能压制正常细节。

合适 CFG 与模型、采样器、步数、提示词和 LoRA 共同相关。

种子与可复现性

种子初始化随机噪声。固定种子有助于比较单变量,但不保证跨环境逐像素相同:

  • 模型/VAE/LoRA 哈希;
  • 采样器/调度器实现;
  • 框架/CUDA/计算核;
  • 精度、优化和硬件;
  • 自定义节点版本;
  • 批量顺序。

生产记录应保存完整工作流和依赖哈希,不只保存种子。

文生图、图生图与局部重绘

文生图从纯噪声生成,构图自由度最大。

图生图先把输入图编码为潜变量,在相应时间点加噪后继续去噪。去噪强度越高,原图结构保留通常越少,但映射并非所有采样器都完全一致。

局部重绘用遮罩指定重绘区域。质量取决于:

  • 遮罩语义与是否反转;
  • 羽化与留白;
  • 重绘区域是否包含足够上下文;
  • 原图/潜变量噪声;
  • 去噪强度;
  • 模型是否专门训练局部重绘。

遮罩太贴边会让新旧内容无法融合;范围过大则改变不应修改的区域。

推理精度与显存

显存主要由模型权重、激活与注意力、潜变量、控制分支和批量占用。提高分辨率会放大空间特征,注意力计算的成本还可能增长更快。

常见手段:

  • FP16/BF16 权重与计算;
  • 注意力分片与分块;
  • VAE Tiled Encode/Decode;
  • 模型/层 CPU卸载;
  • 量化;
  • 降低批量或分段处理;
  • 缓存重复文本/图像编码。

这些方法可能改变速度、精度和确定性。量化/低精度对颜色、细节或特定硬件计算核的影响要用同一验证集检查。CPU卸载节省 VRAM,却增加 PCIe 传输和延迟。

OOM 不应自动把分辨率不断降低后仍标记为同一结果。任何参数或精度降级都要进入任务清单,并使用新的变体ID。

去噪循环

伪代码输入匹配架构的模型、噪声计划与条件,输出潜变量再由对应VAE解码。随机项是否存在由采样器决定。

text
latent = InitializeNoise(seed, shape)
for t in schedule:
    prediction = model(latent, t, condition)
    latent = sampler.Step(prediction, t, latent)
image = matchingVae.Decode(latent)

噪声预测与单步更新

先固定DDPM的噪声预测参数化。记每一步噪声方差为 βt\beta_t,αt=1−βt\alpha_t=1-\beta_t,αˉt=∏s=1tαs\bar\alpha_t=\prod_{s=1}^{t}\alpha_s。网络输出 ϵθ(xt,t,c)\epsilon_\theta(x_t,t,c) 后,可估计干净样本:

x^0=xt−1−αˉt ϵθαˉt\hat x_0=\frac{x_t-\sqrt{1-\bar\alpha_t}\,\epsilon_\theta}{\sqrt{\bar\alpha_t}}

DDPM反向一步的均值写为:

μθ=1αt(xt−βt1−αˉtϵθ),xt−1=μθ+σtz\mu_\theta=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\epsilon_\theta\right),\qquad x_{t-1}=\mu_\theta+\sigma_t z

z为标准高斯噪声,最后一步取零;方差方案由采样实现固定。这说明网络的“噪声”预测还要乘计划相关系数,不能直接从latent减掉输出。训练则从干净样本采样t和噪声,构造前向含噪输入,再最小化噪声预测与真实噪声的误差。公式限于这套离散参数化,速度预测、流匹配与其他调度器按各自模型转换。

推理诊断可以先固定一个已知干净向量与噪声,验证前向混合和上式重建互相抵消;这只检验系数与参数化。取一维干净值2、噪声1、累计信号系数0.64,前向值为0.8*2+0.6*1=2.2。网络若准确输出噪声1,重建得到(2.2-0.6)/0.8=2;直接减掉预测噪声却得到1.2。将速度预测误当噪声送入同一公式,也会因系数语义不同而重建错误。真实网络能否预测正确噪声,还需权重、训练数据和生成样本验证。

验证方法

固定依赖hash比较单变量步数、CFG与采样器。记录所有种子与失败输出,检查噪声参数化和VAE是否匹配;跨硬件逐像素确定性由环境实验确认。

实现与证据

DDPM公式按原论文第3节与Algorithm 2核读,本文循环是机制伪代码。未加载模型、生成图像或测量显存,模型效果与性能不作通过登记。

相关主题

参考资料

  • DDPM:第3.2节、公式11与Algorithm 2;2026-10-22核读。
  • Latent Diffusion:潜空间模型与条件注入的原论文入口。