19. 扩散模型:从噪声里画出一张海报
前两篇的模型都在“看”图片。这一篇反过来,看模型怎样生成图片。资料助手本身不需要画图,但同一个团队收到了一个相邻的需求:行政部每月要为内部活动做宣传海报,希望配图保持统一的公司风格,比如固定的配色、扁平插画风和公司吉祥物。这一篇以此为旁支案例,先讲扩散模型的训练目标为什么是“猜出加了什么噪声”、生成时怎样一步步去噪,再讲潜空间扩散、文本条件和无分类器引导,最后讲 DreamBooth、LoRA 等微调方法,以及训练图片的授权、生成质量的评估和“模型把训练图原样画出来”的过拟合。读完应能说清一个文生图模型由哪几部分组成、各自在训练中做什么,并判断一个风格定制需求该用哪种微调、要先解决哪些授权问题。
先看加噪:一张图怎样一步步变成噪声
直接让网络“从无到有画一张图”很难训练,因为没有一个明确的监督信号告诉它哪一笔画对了。扩散模型把问题拆开:先定义一个固定的、不需要学习的加噪过程,把一张真实图片分很多步逐渐加入高斯噪声,直到变成纯噪声;再训练一个网络学会逆过程,每次去掉一点噪声。
DDPM(2020)把这个过程定为 T = 1000 步,每一步加入的噪声比例 β 从 0.0001 线性增长到 0.02。加噪过程有一个方便的性质:不必真的一步步加 500 次,可以直接从原图一步算出第 t 步的样子:
text
x_t = √ᾱ_t × x_0 + √(1 − ᾱ_t) × ε
x_0:原图(像素值缩放到 −1 到 1)
ε: 与图片同尺寸的标准高斯噪声
ᾱ_t:前 t 步 (1 − β) 的连乘,表示原图还剩多少
按 β 从 0.0001 线性增到 0.02 逐项连乘:
t = 100:原图系数 √ᾱ ≈ 0.947,噪声系数 ≈ 0.321,图还很清楚
t = 500:原图系数 ≈ 0.280,噪声系数 ≈ 0.960,只剩大致轮廓
t = 1000:原图系数 ≈ 0.006,噪声系数 ≈ 1.000,几乎是纯噪声训练目标:猜出加了什么噪声
有了加噪公式,训练变得很简单。每一步训练:取一张图,随机选一个 t,随机生成噪声 ε,用公式算出 x_t;把 x_t 和 t 交给去噪网络,让它预测加进去的 ε;损失就是预测值和真实 ε 的均方误差。
text
损失 = ‖ε − ε_θ(x_t, t)‖²
ε_θ:去噪网络,θ 是它的参数这个目标是 DDPM 论文提出的简化形式,它让网络预测噪声,而不是直接预测原图。噪声是我们自己生成的,所以每一步都有精确的标准答案;同一张图配上不同的 t 和不同的 ε,就是无数道不同的练习题。网络在这些练习里学到的是:给定一张带噪的图和噪声强度,哪部分像“图”、哪部分像“噪声”。DDPM 用这个方法在 CIFAR-10 上取得了 3.17 的 FID(一个衡量生成质量的指标,越低越好,后文解释),当时优于大多数生成模型。
采样:从纯噪声反复去噪
生成时没有原图,从一张纯随机噪声出发。去噪网络预测其中的噪声,减掉一部分,得到噪声稍少的图;再预测、再减掉,重复下去,最后得到一张干净的图。DDPM 原始做法要走满 1000 步,每一步都是一次完整的网络前向,生成一张图很慢。后来的采样器(如 DDIM 及各种常微分方程求解器)可以把步数压到 20 到 50 步,质量损失很小。
训练和生成的不对称值得记住:训练时每张图每一步只随机做一个 t,计算量和普通的图像网络差不多;生成时要按顺序走完整条去噪链,几十次前向才出一张图。随机种子决定了起点噪声,同样的提示词换一个种子就是另一张图。
潜空间扩散:先压缩,再扩散
直接在 512×512 的像素上做几十步去噪,每一步要处理 78 万多个数,太贵。潜空间扩散(latent diffusion)先用一个变分自编码器(VAE)把图片压缩成小得多的“潜变量”,扩散和去噪都在潜变量上进行,最后再用 VAE 的解码器还原成像素。Stable Diffusion 1.x 的 VAE 把长和宽各缩小 8 倍,通道变成 4 个:
text
像素:512 × 512 × 3 = 786,432 个数
潜变量:64 × 64 × 4 = 16,384 个数,是像素的 1/48VAE 是单独预先训练好的,训练扩散模型时冻结不动。完整的训练和采样流程如下:
压缩有代价:VAE 的重建本身有损,小字和细线条在 64×64 的潜空间里很难保留。这是扩散模型画不好文字的原因之一,海报上的活动标题、时间地点应该交给排版工具后加,而不是让模型画出来。
文本条件:让去噪听提示词的
到这里模型只会生成“某张图”,还不会按“扁平插画风格的春季团建海报”来生成。文本条件的做法是:用一个文本编码器(Stable Diffusion 1.x 用冻结的 CLIP ViT-L/14 文本编码器,就是上一篇 CLIP 的文本那一半)把提示词编码成一串向量,在去噪网络内部通过交叉注意力读入。交叉注意力里,图像特征提出查询,文本向量提供键和值,于是每个图像位置都能“看”提示词里和自己相关的词。
只这样训练,生成的图往往和提示词贴得不够紧。无分类器引导(classifier-free guidance,2022)解决这个问题。训练时以一定概率把文字换成空文本(Stable Diffusion 1.x 是 10%),让同一个网络同时学会有条件和无条件两种预测。生成时每一步各算一次:
text
ε_c:用提示词预测的噪声
ε_u:用空文本预测的噪声
引导后的噪声 = ε_u + w × (ε_c − ε_u)
w = 1:就是普通的条件预测
w > 1:沿“有提示词比没提示词多出来的方向”外推,更贴提示词
Stable Diffusion 1.x 常用 w = 7.5w 越大,画面越贴提示词,但多样性下降,过大时颜色过饱和、画面生硬。每一步算两次前向,生成成本也因此翻倍。
新一代:Transformer 去噪器与流匹配
Stable Diffusion 1.x 的去噪网络是卷积 UNet。之后的模型有两个主要变化。一是把去噪网络换成 Transformer:DiT 把潜变量切成 patch 当 token 处理,和上上篇的 ViT 是同一个思路。二是改变训练目标:Stable Diffusion 3(2024)采用 rectified flow,把数据和噪声用一条直线连起来,网络学习沿这条直线的移动方向,直线路径让少步采样更容易。
Stable Diffusion 3 的去噪网络叫 MM-DiT,图像 token 和文本 token 各用一套权重,在注意力里双向交换信息,而不是只让图像单向读文本;文本侧同时用了两个 CLIP 文本编码器和一个 47 亿参数的 T5-XXL,潜变量通道从 4 增加到 16,细节和文字渲染明显改善。具体目标函数虽然不同,“加噪—学会逆过程—迭代生成”这个框架和上面一致,下文的微调和评估方法也同样适用。
微调:让模型学会公司海报风格
通用模型能画出“扁平插画风”,但画不出公司吉祥物,也很难稳定复现公司的配色和笔触。常见的三种微调方法,改动的部分和数据需求不同:
| 方法 | 训练什么 | 数据 | 产物 | 适合 |
|---|---|---|---|---|
| Textual Inversion | 只学一个新“词”的文本嵌入,模型全部冻结 | 3—5 张 | 几 KB 的嵌入向量 | 简单物体或风格,表达能力有限 |
| DreamBooth | 去噪网络整体微调,配合先验保持损失 | 3—5 张主体图 | 一整份模型权重 | 特定主体,如吉祥物 |
| LoRA | 去噪网络注意力层上的低秩增量 | 几张到几十张 | 通常几 MB 到几十 MB | 风格、主体,可多份切换 |
DreamBooth(2022)用 3 到 5 张主体照片,配上“a [V] mascot”这样的提示词训练,其中 [V] 是一个罕见的标识词,用来绑定这个特定主体。只这样训练会出两个问题:模型把“吉祥物”这个类别整体改成了自家吉祥物,再也画不出别的吉祥物(语言漂移);输出也只会重复那几张图的姿势(多样性下降)。DreamBooth 的办法是先验保持损失:训练前先用原模型按“a mascot”生成约 1000 张类别图,训练时把它们一起放进来,提醒模型“普通吉祥物应该长这样”。论文里 Stable Diffusion 微调约 1000 步,在一张 A100 上约 5 分钟。
LoRA 原理见第 10 篇:冻结原权重,只训练一对低秩矩阵。用在扩散模型上通常作用于注意力层,文件小,可以和底模分开保存,“公司风格”和“吉祥物”还能做成两个 LoRA 叠加使用。
为公司海报风格准备数据时,选 20 到 50 张过往的定稿海报(示意数量),每张写一条描述画面内容的文字,比如“三个人在草地上放风筝,远处有山”,而不是只写“公司风格”。这样模型学到的是:内容由文字决定,所有图共有、文字里没提到的东西(配色、笔触)就是风格。如果描述里什么都不写,模型会把画面内容也当成风格的一部分,每次都画放风筝。
授权:哪些图能拿来训练
风格微调的数据量小,每张训练图对结果的影响都很大,授权问题因此比预训练更直接。
- 版权:公司自己设计或买断版权的海报可以用于训练;外包插画师的作品要看合同是否允许用于训练模型;从网上收集的“同款风格”图片,不能因为能下载就拿来训练。
- 肖像:吉祥物之外,如果想让海报里出现真实员工的形象,要取得本人明确同意(建议书面),说明用途和保存期限;员工离职后能否继续使用也要约定。生成与真实人物相似的图像,还涉及冒用和深度伪造风险。
- 商标:训练图里出现其他公司的商标、产品外观,模型可能把它们画进新海报。训练前把这类元素裁掉或遮住。
- 底模许可证:底模本身有许可证条款。例如 Stable Diffusion 1.x 使用 CreativeML OpenRAIL-M,其中列有禁止的用途;新版本模型的许可证条款与商用门槛又各不相同,选型时要逐一核对。
这些是工程上的检查项,具体合规判断交给公司法务。生成的海报建议在元数据或角落里标明使用了生成工具,便于日后追溯。
评估与过拟合
生成模型没有“标准答案”,评估要从几个角度组合:
FID(Fréchet Inception Distance)把一批生成图和一批真实图都送进一个预训练的图像网络(Inception),比较两组特征的分布距离,越低说明生成图整体越像真实图。它需要数千张图才稳定,适合比较不同版本的底模,不适合评估只有几十张训练图的风格 LoRA。CLIP score 用上一篇的 CLIP 计算生成图和提示词的相似度,衡量“画的是不是要求的内容”。对公司海报来说,最终还要靠人工评审:设计同事用固定的一组提示词(不同季节、人数、场景)对比微调前后,按风格一致性、提示词遵循、手指和面部等常见缺陷打分。
最需要警惕的失败是过拟合到复制训练图。LoRA 训练步数过多或学习率过大时,输入“秋季读书会”,输出的却是某张训练海报的构图,只是换了点颜色;再往后,提示词几乎不起作用。检查方法:每个检查点用一组和训练描述完全不同的提示词生成,并把生成图和训练图做相似度检索(用 CLIP 或 DINOv2 的图像向量,方法见下一篇),相似度异常高的就是复制。
这不只是小数据微调的问题。Carlini 等人 2023 年的研究从主流扩散模型中提取出了一千多张训练图片,其中包括个人照片和商标;Stable Diffusion 1.x 的模型卡也写明,对训练集中重复出现的图片模型存在一定程度的记忆。用于训练的图片如果涉及隐私,就要假设它有可能被模型原样输出。
扩散模型把生成拆成“固定的加噪”和“学习的去噪”,训练目标是预测加入的噪声,生成时从纯噪声迭代去噪;潜空间扩散用 VAE 把计算量降到 1/48,文本经交叉注意力进入去噪网络,无分类器引导靠训练时随机丢掉文字来换取更贴合提示词的生成。定制风格时,LoRA 和 DreamBooth 只需几张到几十张图,正因如此,每张图的授权和输出是否在复制训练图都要逐一检查。下一篇回到资料助手的主线,解决检索总是找错制度条款的问题,并会用到 CLIP 那种对比学习:20. 向量与重排模型。
