简介:本文从原理层面拆解文本到图像生成的实现机制:为什么把扩散去噪从像素空间搬到低维潜空间就能大幅降低算力开销,文本条件如何通过交叉注意力注入去噪主干,无分类器引导如何调节提示遵循度,以及不同采样器、图像条件控制、少步蒸馏加速与参数高效微调背后的取舍。读者可据此理清完整推理链路、模块分工与技术边界。
本文解释的是潜在扩散模型(Latent Diffusion Model, LDM)驱动的文本到图像生成机制。它不是一项单一算法,而是一条完整的工程化技术路线:用一个自编码器把图像压缩到低维潜空间,在潜空间内训练一个去噪网络学习”从纯噪声逐步还原图像”的反向过程,再通过交叉注意力把文本语义注入到每一步去噪中,最终把潜变量解码回像素图。
这条路线要解决的核心问题只有一个:如何让”根据一段自然语言生成一张高保真图像”这件事,在消费级显卡的显存与算力约束下可训练、可推理、可迭代。
需要先明确三个边界:
早期生成建模(含最早的扩散类研究)直接在像素上操作。这条路径在原理上成立,但会遭遇三重约束。
第一,序列长度爆炸。 一张 512×512 的 RGB 图有 262144 个数值。若去噪网络内含自注意力,其计算与显存开销随 token 数呈平方增长;把 512×512 降到 64×64 潜表示,token 数减少到 1/64,注意力部分开销的下降幅度远大于线性比例。
第二,像素冗余极高。 相邻像素高度相关,模型把大量容量花在建模”天空的渐变是否连续”这类高频细节上,而语义、构图、物体关系等真正的生成难点被淹没在冗余中。压缩到潜空间相当于先做一次语义导向的降维,让网络容量集中在结构与语义上。
第三,采样步数多。 经典扩散采样常需数十步,每步都要跑一次完整的去噪网络。若每步成本下降一个数量级,整体迭代周期与推理成本才会进入可用区间。
值得说明的是,这套思路的演进有清晰脉络:2010 年代初扩散类生成建模开始成型,2015 年前后出现最早的扩散模型原型但采样速度缓慢;2017 年前后学术界提出”在低维潜空间执行扩散”的关键构想,由高校机器视觉研究组与外部研究机构合作完成;2022 年相关成果以开源模型形式发布并于同年 8 月全面开放权重,随后在开源社区衍生出大量工具链;此后模型沿着两条线迭代——一条是增大主干参数与文本编码容量(提升画质、文字渲染与多主体提示能力,并逐步把扩散主干与 Transformer 骨架结合),另一条是压缩采样步数(通过蒸馏把数十步降到个位数甚至一步)。
前向过程是一条固定的马尔可夫链:给定清晰样本 x₀,按噪声调度表在 t 个时间步上逐步加入高斯噪声,直到 x_T 接近各向同性纯噪声。其闭式解使得可以”一步跳到任意 t”:
x_t = sqrt(ᾱ_t) * x_0 + sqrt(1 - ᾱ_t) * ε , ε ~ N(0, I)
反向过程是训练出来的:网络输入带噪样本 xt、时间步 t 与条件 c,输出对噪声的预测 εθ。训练目标被简化为预测噪声的均方误差,本质上是让网络学会”给定当前带噪状态,指出应当减掉多少噪声方向”,等价于学习数据分布的对数梯度(score)。
用一个在大量图像上训练好的自编码器( encoder–decoder 结构)把像素图映射为潜变量 z。常见做法是空间下采样 4 或 8 倍:512×512×3 → 64×64×4 或 128×128×4。扩散全程发生在 z 上,只在最前和最后各调用一次编解码器。 编码器通常带有轻微的 KL 正则,使潜空间分布规整,便于在其上定义稳定的高斯噪声过程。
文本先经文本编码器变成嵌入序列,再通过交叉注意力注入去噪主干的若干层级:查询来自图像特征,键值来自文本嵌入。这使每一步去噪都能按当前视觉状态”重新读取”文本,而不是只在入口注入一次。
采样是从随机初始噪声出发、沿学习到的轨迹反向积分的过程。随机种子决定初始噪声,因而在权重、采样器、分辨率、提示完全一致时结果可复现;任一要素变化,结果即不同。
| 模块 | 职责 | 输入 → 输出 | 是否参与扩散训练 | 主要瓶颈 |
|---|---|---|---|---|
| 文本编码器 | 把提示映射为语义嵌入序列 | 文本 → 嵌入张量 | 通常冻结 | 上下文长度上限、语义精度 |
| 自编码器 | 像素↔潜空间转换 | 图像 ↔ 潜变量 | 通常单独预训练并冻结 | 细节保真度、显存峰值 |
| 去噪主干 | 预测每步应去除的噪声 | (zt, t, c) → εθ | 训练主体 | 参数量、显存、单步延迟 |
| 调度器/采样器 | 定义噪声表与步进规则 | εθ → 下一状态 z{t-1} | 不参与 | 步数-质量权衡 |
| 推理编排层 | 条件构造、批处理、后处理、安全过滤 | 请求 → 图片 | 不参与 | 排队、并发、内容审核 |
分工的要点在于:语义理解与视觉重建被解耦到不同模块。换文本编码器影响语义对齐,换自编码器影响细节质感,换主干影响画质上限,换采样器只影响效率与轨迹形态。任何一次替换都只需验证对应模块,而不必重训全流程——这是该架构在工程上可扩展的根本原因。
状态变化可归纳为:文本 → 条件嵌入 → 初始噪声 z_T → {z_t} 去噪轨迹 → 清晰潜变量 z₀ → 像素图。整个过程只有第 4 步是循环,成本几乎全部集中于此。
假设下采样倍数为 f,空间 token 数下降 f²。512×512 在 f=8 时为 64×64,即 4096 个 token,仅为像素序列的 1/64。对以卷积为主的部分,计算量近似按像素数线性下降;对自注意力部分,因开销随 token 数平方增长,收益更为显著。代价是:潜空间压缩比越大,高频细节(细小文字、复杂纹理、手指与肢体)越容易在编解码环节丢失或产生伪影。分辨率、压缩比、细节保真是三者互相牵制的三角关系,这也是高分辨率生成常采用分块解码或分块注意力以控制显存峰值的原因。
网络无法直接建模高维分布的密度,但学习”在每个噪声等级上指出正确的去噪方向”是一个稳定的回归任务。多个噪声等级共享同一套权重(通过时间步嵌入区分),使得单次训练覆盖整条反向轨迹;配合简化后的损失形式,去掉了权重系数带来的调参负担。这也是加噪闭式解重要的原因:任意 t 的带噪样本可以一次性构造,训练无需真的逐步模拟前向链。
设图像侧特征投影为查询 Q,文本嵌入投影为键 K、值 V,则注意力输出 softmax(QKᵀ/√d)V 让每个空间位置按需聚合文本信息。把这类层分布到主干的不同深度,浅层偏向材质与颜色等局部属性,深层偏向物体类别与布局等全局语义,形成多尺度条件控制。若主干采用 Transformer 骨架,文本 token 与图像 patch token 可以进入统一的注意力序列,长程依赖建模与多主体绑定能力通常更好,这也是”扩散主干 + Transformer”路线在文字渲染与复杂提示上表现更强的原因。
采样时同时算两次去噪,再按引导系数 w 外推:
ε̃ = ε_uncond + w * (ε_cond − ε_uncond)
之所以能”免费”获得无条件预测,是因为训练时以小概率随机把条件替换为空(条件丢弃),使同一套权重兼具两种能力。
反向过程既可视为随机微分方程,也可转为等价的确定性概率流常微分方程。前者对应经典祖先采样的马尔可夫链去噪算法,后者对应可复用中间结果、以更少步数完成积分的确定性采样族(如非马尔可夫确定性采样、一阶与高阶常微分方程求解器)。此外还有基于流匹配/直线化轨迹的调度族,轨迹更接近直线,允许更大的步长。步数与质量不是线性关系:过低步数会丢失结构与细节,过高步数收益递减。工程上通常先做少步网格搜索确定”够用”的步数,再叠加其他优化。
这些能力不需要新架构,只是改变起点与注入方式:
多步采样是推理延迟的主要来源,压缩它有几条通用路径:
蒸馏模型通常牺牲部分多样性与提示细微差异的响应,适合低延迟场景,不适合作为质量探索的主力。
针对特定风格或特定主体做适配时,全参数微调成本高、易灾难性遗忘。通用做法是低秩适配:冻结原权重,只在注意力投影矩阵旁路引入两个低秩矩阵,训练参数量可降至总量的极小比例,且多个适配模块可并存热插拔。另一种思路是构造少量样本的专用标识 token,配合文本编码器的极少量可训练部分绑定特定主体。
训练单步
img, txt = next(dataloader)z0 = vae.encode(img) # 像素 → 潜空间t = randint(1, T, size=B) # 每样本独立取噪声等级eps = randn_like(z0)zt = sqrt(abar[t]) * z0 + sqrt(1 - abar[t]) * epsc = text_encoder(txt)c_null = text_encoder(empty_prompt)drop = rand(B) < p_drop # 条件丢弃,支撑后续无分类器引导c = where(drop, c_null, c)eps_pred = denoiser(zt, t, c)loss = mse(eps_pred, eps)
推理采样
z = randn(latent_shape(width, height), generator=seed)c = text_encoder(prompt)cn = text_encoder(negative_prompt)for t in reversed(schedule(steps)):pair = stack([z, z], axis=0) # 合并为一批,只跑一次前向cond = stack([c, cn], axis=0)eps_c, eps_u = denoiser(pair, t, cond)eps = eps_u + cfg * (eps_c - eps_u) # 引导外推z = scheduler.step(z, eps, t)image = postprocess(vae.decode(z))
图生图的强度控制
z0 = vae.encode(init_image)t0 = int(strength * T) # strength ∈ (0, 1]z = add_noise(z0, t0)for t in reversed(schedule_from(t0)):...
优势来源与机制对应:
| 收益 | 来自哪个机制 |
|---|---|
| 消费级显卡可运行 | 潜空间压缩使每步计算量与显存占用大幅下降 |
| 语义可控性强 | 交叉注意力 + 无分类器引导 |
| 能力可扩展 | 模块解耦,替换文本编码器/主干/采样器互不阻塞 |
| 任务统一 | 图生图、重绘、外绘都归约为”改变起点 + 潜空间掩码约束” |
| 低延迟部署 | 蒸馏与少步采样压缩循环次数 |
| 低成本定制 | 低秩适配只训练旁路参数 |
限制与边界条件:
在实际落地时,常见做法是把推理服务部署在容器平台上做弹性扩缩,用对象存储保存模型权重与产出图像,用负载均衡分发请求,用日志与监控服务观测时延、失败率与显存水位——这些都是通用云能力类目,与模型本身解耦。
潜在扩散模型路线的全部巧思可以压缩成一句话:把生成过程搬到一个更小、更语义化的空间里去做,同时保留一个可解码回像素的出口。 由此派生出四组关键机制——自编码器提供压缩与还原,前向/反向扩散提供可训练的生成过程,交叉注意力与引导提供语义可控性,采样器与蒸馏提供效率档位。理解了这四组的因果关系,就能判断一个方案为何慢、为何糊、为何不听提示,也能在分辨率、步数、引导系数与显存预算之间做出有依据的取舍,而不是盲目试参数。