Skip to content

扩散模型深度解析:AI 如何从噪声中画出世界,从 DDPM 原理到 LoRA/ControlNet 完整实战 ​

你输入"a cat astronaut in space, cinematic lighting",30 次迭代后一张逼真的猫宇航员出现了。这 30 步里发生了什么?为什么从纯噪声里能"画"出图像?这篇文章讲透扩散模型的完整原理:加噪与去噪的数学直觉、latent diffusion 的降本革命、Stable Diffusion 的组件解剖、LoRA/ControlNet/IP-Adapter 的控制艺术,以及部署与提示词实战。

发布日期:2026-10-15

扩散模型:生成式 AI 的另一半版图 ​

先摆清楚技术版图。过去两年你听到的 AI 生成,底层就两种范式:

范式机制代表擅长
自回归逐 token 预测下一个GPT、Llama文本、序列
扩散从噪声逐步去噪Stable Diffusion、FLUX、Sora图像、视频、音频

自回归的世界里"生成"是预测下一个词;扩散的世界里"生成"是雕刻——从一块随机噪声的大理石里,一步步刻出图像。理解扩散,你的 AI 版图才完整:VLM 负责"看懂",LLM 负责"想清楚",扩散负责"创造视觉"。


第一性原理:为什么噪声里能画出图 ​

前向过程:把图变成噪声 ​

核心思想出人意料地简单。取一张真实的猫图,每步加一点高斯噪声,加 1000 步:

步骤:    0        250        500        750        1000
图像:  🐱猫图 → 猫(模糊) → 噪点猫 → 噪声为主 → 纯高斯噪声

数学上第 t 步的图像是原图与噪声的线性混合:

x_t = √(ᾱ_t) · x_0 + √(1-ᾱ_t) · ε        (ε ~ N(0, I))

关键性质:这个过程没有信息损失地可推导——任何 t 步的加噪结果都能一步算出(不用真跑 1000 步),这是训练效率的基础。

反向过程:学会去噪 ​

现在训练一个神经网络 U,给它看无数张"加噪到 t 步的图",让它预测加入的噪声是什么:

训练目标(惊人地简单):
  输入: 加噪图 x_t + 时间步 t
  标签: 我们加的噪声 ε(答案已知!)
  损失: || ε - U(x_t, t) ||²

这就是 DDPM(Denoising Diffusion Probabilistic Models, 2020)的全部训练逻辑——本质是噪声预测的监督学习,没有 GAN 的对抗博弈、没有 VAE 的重建约束,就是回归。

生成:雕刻循环 ​

训练好后,生成是反向走这条路:

采样 x_1000 ~ N(0, I)          # 纯噪声
  ↓ U 预测噪声 → 减去一点点 → x_999
  ↓ 再预测 → 再减 → x_998
  ↓ ...(每步还要加回一丝随机性,保证多样性)
  ↓
x_0 = 你的猫宇航员

一个直觉性的理解:噪声预测网络学到了"图像的统计规律"——在去噪的每一步,它都在回答"这里现在的像素分布,最像哪种类别图像的中间状态"。走到最后,规律收敛成一张符合训练分布的图。

文本怎么参与:条件化 ​

上面画出的是"随机的好看图像"。要控制画什么,把文本条件注入噪声预测网络:

U(x_t, t, text_embedding)
              ↑
      CLIP/T5 文本编码器 ← "a cat astronaut"

训练时把图像的描述文本一起喂进去,网络学会"在去噪时朝着文本语义收敛"。这就是 text-to-image 的全部秘密——classifier-free guidance(CFG) 进一步放大文本控制力:同时做有文本和无文本两次预测,沿"有-无"差值方向外推:

ε_final = ε_uncond + s · (ε_cond - ε_uncond)
                        ↑ s 就是采样时的 CFG scale(7~9 是甜点区)

CFG 太低图不听话,太高颜色饱和、人脸崩坏——这是提示词工程之外最重要的采样参数。


Latent Diffusion: Stable Diffusion 的降本革命 ​

DDPM 直接在 512×512×3 像素空间做扩散,一张图就是 78 万维向量——训练和推理都贵到只有大厂玩得起。

Stable Diffusion(2022)的天才改造:别在像素空间扩散,在潜空间(latent space)扩散。

原始 DDPM:  512×512 图像 ←→ 直接扩散        (786,432 维)
Latent Diffusion:
  图像 ──VAE编码器──> 64×64×4 潜向量         (16,384 维, 缩小 48 倍)
                        ↓
                   在这里做扩散训练和采样    (便宜 48 倍)
                        ↓
  图像 <──VAE解码器── 去噪完成的潜向量

VAE(变分自编码器)先把图像压缩成 8 倍下采样的潜表示,扩散全程在 64×64 的小空间里进行,最后解码回像素。质量几乎无损,成本降一个数量级——这是"人人本地跑图像生成"的工程起点。

Stable Diffusion 完整组件解剖 ​

"a cat astronaut, cinematic"
        │
        ▼
┌─────────────────┐
│ 文本编码器 CLIP  │  文本 → 77 个 token 的嵌入向量
└─────────────────┘
        │
        ▼
┌─────────────────┐    文本嵌入(交叉注意力注入)
│ UNet 去噪网络    │◄──────────────────────┐
│ (扩散主战场)     │                        │
└─────────────────┘                        │
        ▲  x_t (64×64×4 潜噪声)            │
        │                                  │
        │ 循环 N 步(20~50)                  │
        │                                  │
┌─────────────────┐                        │
│ 采样器调度       │ 决定每步去噪强度和路径  │
└─────────────────┘                        │
        │                                  │
        ▼                                  │
┌─────────────────┐                        │
│ VAE 解码器      │  64×64×4 → 512×512×3   │
└─────────────────┘                        │
        ▼                                  │
     最终图像 ✨                            │

四个组件,各有讲究:

  • 文本编码器:SD1.5 用 CLIP(77 token 上限,长提示词被截断);SD3/FLUX 换 T5 + CLIP 双编码器(512 token,理解复杂句子能力强得多)
  • UNet:扩散主干。SD3/FLUX 升级成了 DiT(Diffusion Transformer,与 LLM 同构的纯 Transformer 架构)——扩散模型正在"LLM 化"
  • 采样器:DDIM、Euler a、DPM++ 2M Karras…… 本质都是"怎么走这 20~50 步"的不同走法。Euler a 适合插画风,DPM++ 2M Karras 是写实通吃的高质量默认
  • VAE:解码质量决定最终清晰度(sd-vae-ft-mse 是 SD1.5 的标配升级)

控制的艺术:LoRA、ControlNet、IP-Adapter ​

裸 SD 的问题是"抽卡"——提示词一样,出图看天意。三大控制件把"抽卡"变成"创作"。

LoRA:平民微调 ​

全参数微调 UNet 要 24GB 显存起步;LoRA(呼应 Fine-tuning 篇的同一思想)只训练注入的低秩矩阵:

冻结原模型权重 W
旁路加 ΔW = A·B (A: d×r, B: r×d, r 通常 8~64)
只训练 A、B → 可训练参数 ~1%

一个 50~200MB 的 LoRA 文件就能注入一种画风/一个人物/IP 形象,社区生态(Civitai)百万级 LoRA 互换。使用时的权重是"风格浓度旋钮":<lora:ink_style:0.8>。

ControlNet:空间结构的精确锁死 ​

提示词说"站着"模型未必听话;ControlNet 直接把结构图喂给网络:

输入图 → 提取结构线索 → ControlNet 分支(UNet 副本) → 注入主 UNet

线索类型:
  Canny 边缘线稿   → 姿势、轮廓精确复刻(最常用)
  OpenPose 骨架    → 只控人物姿势,外观自由
  Depth 深度图     → 控制空间层次,适合改材质换风格
  涂鸦/Scribble    → 手绘草稿变成品

杀手级工作流:线稿锁定构图 + 提示词换风格——同一张草图出"水彩/赛博/像素"三版设计稿,设计行业的生产级用法。

IP-Adapter:图像提示词 ​

让"参考图"像文字提示词一样起作用:把参考图编码成嵌入注入,实现"照着这张图的风格/人物生成新图"。与 LoRA 的区别:LoRA 要训练、绑定一个概念;IP-Adapter 零训练、即插即用,但控制力弱一档。

组合范式 ​

生产级配方 = 底模(FLUX/SDXL)
           + LoRA ×2~3(风格 + 人物)
           + ControlNet(构图锁死)
           + IP-Adapter(参考图引导)
           + 提示词(细节补充)

这套"底模 + 控制件堆叠"的思路,和 LLM 的"底模 + adapter + system prompt"是同构的工程美学。


实战:本地部署与 API ​

本地:ComfyUI 工作流 ​

ComfyUI 是节点式工作流引擎,把上面所有组件画成连线图。最简文生图工作流:

[Load Checkpoint] ──→ [CLIP Text Encode](正向提示词)
                        ↓
[Empty Latent Image] → [KSampler] ←─ [CLIP Text Encode](负向提示词)
                        ↓
                 [VAE Decode] → [Save Image]

关键参数的选型经验:

参数推荐值说明
steps25~30DPM++ 系采样器超过 30 步收益趋零
CFG scale5~7(FLUX)/ 7~9(SD系)FLUX 用 guidance 而非 CFG,逻辑不同
samplerDPM++ 2M Karras写实通用;Euler a 动漫插画
尺寸与底模训练分辨率一致(SDXL: 1024×1024)偏离训练分辨率必出畸形(多肢体重灾区)

API:几行代码接入 ​

python
import replicate

output = replicate.run(
    "black-forest-labs/flux-schnell",
    input={
        "prompt": "a cat astronaut floating in space, cinematic lighting, 35mm film",
        "aspect_ratio": "16:9",
        "num_outputs": 1,
    },
)

自建 vs API 的账(呼应推理优化篇的决策框架):偶尔用/原型 → API;日均千张以上/隐私敏感 → 本地(一张 4090 跑 FLUX schnell 约 2s/张)。国内合规场景注意:生成图片需 AIGC 标识(《生成式人工智能服务管理暂行办法》),商用 API 都已内置,本地部署要自己加。

提示词:结构化模板 ​

[主体] + [场景] + [风格] + [光照] + [镜头] + [质量词]
a cat astronaut(主体) floating inside a space station(场景),
pixar style(风格), volumetric lighting(光照),
wide angle shot(镜头), highly detailed, 8k(质量词)

负向提示词(SD系必备): blurry, deformed hands, extra fingers, watermark

语法武器:(word:1.3) 权重强化、[a|b] 交替融合。但 FLUX/SD3 走自然语言路线——新模型越强,提示词越像"写作"而不是"咒语",堆砌权重词的玄学时代正在过去。


原理延伸:为什么是扩散而不是 GAN ​

2014~2021 图像生成的王座属于 GAN(生成对抗网络)。扩散胜出的原因值得咀嚼:

维度GAN扩散
训练稳定性对抗博弈,模式崩坏常客纯回归损失,稳定
多样性容易坍缩到安全模式噪声起点天然多样
训练-推理不对称一次前向(快)迭代采样(慢,20~50次前向)
可控性条件注入困难条件注入自然(每步都能加约束)

GAN 唯一的优势是推理快——而一致性模型(Consistency Models)、蒸馏(LCM、SDXL-Turbo)正在把扩散步数压到 1~4 步,补上最后的短板。扩散赢在"训练稳 + 可控性强",这两点恰好是工业界最在乎的。


十大坑 ​

  1. 分辨率偏离底模训练尺寸——SDXL 上画 512×512 或非标比例,多手多脚立刻出现;用底模原生分辨率,或先出图再超分
  2. 提示词超 77 token 还在写——SD1.5/SDXL 的 CLIP 编码器直接截断,重要词放前面,或换 T5 系模型(FLUX)
  3. 把 CFG 拉到 15 求听话——饱和过曝、人脸塑料化;控制力应该交给 ControlNet 而不是 CFG
  4. steps 拉到 100 求质量——30 步后纯浪费算力,质量瓶颈从来不在步数
  5. LoRA 乱叠不测权重——5 个 LoRA 全 1.0 权重互相打架,风格浑浊;逐个加、从 0.6 权重起调
  6. 负向提示词在 FLUX 上照搬 SD——FLUX 不吃传统负向词,照搬只会起反效果
  7. VAE 用默认没换——SD1.5 默认 VAE 输出灰蒙蒙,ft-mse 版本是免费画质升级
  8. 拿生成图商用不看许可证——SD1.5(MIT 随便用)和 FLUX dev(非商用!)许可差异巨大,商用先读 license
  9. 忽视 seed 的作用——调试提示词时不固定 seed,好坏全靠抽卡归因,永远不知道是提示词的功劳还是运气
  10. 生成人脸直接上线——深度伪造风险 + 各国法规(中国已明确标识要求);对外产品必须有 AIGC 水印

总结 ​

扩散模型的知识主线:

数学本质:  加噪可推导 + 去噪可学习 = 从噪声雕刻图像
工程革命:  latent diffusion 把成本砍 48 倍 → 人人可用
控制三件套: LoRA(风格) + ControlNet(结构) + IP-Adapter(参考)
架构趋势:  UNet → DiT,采样 50 步 → 4 步,提示词咒语 → 自然语言

至此,博客的 AI 版图完成了"理解 + 生成"的双闭环:理解侧(VLM 看图 + LLM 读懂 + RAG 检索)与生成侧(LLM 写文 + 扩散作画 + 语音合成)。两条侧最后在多模态原生模型(GPT-4o 们)汇合——那是这个时代最壮观的工程合流。

最后留一个认知锚点:自回归是"预测下一个",扩散是"删掉不属于的一切"——前者像写字,后者像雕塑,人类恰好也是这样创造的。


本文由小虾子 🦐 撰写

Last updated: