扩散模型:AI画图不是画出来的,是雕出来的

扩散模型深度科普:从DDPM到Stable Diffusion到FLUX,一文讲透AI图像生成的底层原理。

标签:扩散模型FLUXStable DiffusionAI图像生成深度学习
专属插画
扩散模型:AI画图不是画出来的,是雕出来的

扩散模型:AI画图不是"画"出来的,是"雕"出来的

很多人以为AI生成图片的过程,是从空白画布上一笔一笔画出来的。错了。完全错了。

真相远比这个有意思——扩散模型生成图片的方式,更接近一个雕塑家在凿石头。它不是从零开始创作,而是从一团纯粹的噪声里,慢慢"凿"出有意义的画面。

说实话,我第一次搞懂这个原理的时候,起了鸡皮疙瘩。不是因为多复杂,而是因为它实在太优雅了。

核心思路就两步:搞乱,再还原

扩散模型的训练分两个阶段,逻辑简单到可以用一句话概括:先往好照片里加噪,再教AI把噪去掉。

第一阶段叫"前向扩散"(forward diffusion)。拿一张清晰的猫的照片,第一帧加一点点随机噪声,第二帧再加一点,第三帧继续……重复几百步之后,这张照片就变成了一团纯粹的随机噪点。你完全看不出原来是一只猫。

第二阶段叫"反向扩散"(reverse diffusion),这才是魔法所在。我们训练一个神经网络,让它学会每一步"猜"出刚才加了什么噪声,然后减掉。训练的时候,我们告诉它正确答案——因为噪声是我们自己加的,我们知道每一步加了什么。网络学了几百万张照片之后,它就具备了从纯噪声中还原出一张图片的能力。

用代码理解就是:

# 前向:好图 → 噪声(我们知道每一步的噪声)
for t in range(T):
    x_t = add_noise(x_{t-1}, noise_we_know)

# 反向:噪声 → 好图(网络要学会预测噪声)
for t in reversed(range(T)):
    predicted_noise = model(x_t, t)
    x_{t-1} = remove_noise(x_t, predicted_noise)

推理的时候更绝——你给模型一团随机噪声,它就开始"雕刻":第一步去掉一点噪,图像隐约有个轮廓了;第二步再去掉一点,轮廓清晰了;第20步的时候,细节开始出现;到了第50步,一张完整的图片就出来了。

为什么叫"扩散"?

这个名字来自物理学里的扩散过程。你想啊,一滴墨水滴进清水里,它会慢慢散开,直到整杯水都变成均匀的颜色——这个过程是不可逆的,墨水不会自己聚回来。

扩散模型就是把这个过程"反过来"。它教会AI做一件自然界里不可能发生的事:让一杯均匀颜色的墨水,重新聚成一滴墨。听起来像时光倒流对吧?这就是为什么这个思路被提出来时,整个CV圈子都炸了。

从DDPM到Stable Diffusion到FLUX:进化史

2020年,Ho等人提出了DDPM(Denoising Diffusion Probabilistic Models),证明了这套方法可行。但DDPM有个致命问题——太慢了。生成一张图要跑1000步,每张图要几分钟。这在实验室里无所谓,放生产环境没人等得起。

然后2022年,Stable Diffusion来了。它的核心突破是在潜空间(latent space)里做扩散。什么意思呢?它不直接在像素空间操作——一张1024×1024的图有一百多万个像素点,每一步都要算。它先用一个encoder把图压缩到一个小小的潜空间(比如128×128),在潜空间里做扩散,再用decoder还原。这一步直接把计算量砍掉了64倍。

再后来就是FLUX。Black Forest Labs的这帮人(很多是Stable Diffusion的原班人马)做了几个关键改动:用DiT(Diffusion Transformer)架构替换了U-Net,引入了rectified flow(整流)训练方法,还把步数压缩到了20步左右。生成速度比Stable Diffusion快了一截,质量还更高。

我们实验室每天用的就是这个。MS01上跑FLUX,20步出图大概15秒。20秒前还是一团噪点,20秒后是一张完整的封面图——每次看到这个过程,我还是会觉得神奇。

C提示词为什么这么重要?

到这里你可能有个疑问:如果模型是从随机噪声开始"雕刻"的,它怎么知道要雕一只猫还是雕一条狗?

答案是条件引导(conditional guidance)。在训练的每一步,我们不仅给模型当前的噪声图像,还给一个条件——通常是文字描述。模型学的是:"在给定这个文字描述的条件下,最可能的噪声是什么?"

你输入"一只橘色的小火龙在实验室里做实验",模型在每一步去噪的时候都会参考这个条件,最终"雕刻"出来的画面就会贴合你的描述。如果你的prompt写得很模糊——比如就一个"猫"字——模型就会自己脑补细节。如果你写得足够具体,画面就会更贴近你的预期。

这也解释了为什么FLUX对prompt质量特别敏感。它的能力很强,但你得告诉它你想要什么。一个精确的prompt和一个模糊的prompt,出来的图可能天差地别。

扩散模型 vs GAN:谁赢了?

2022年之前,GAN(生成对抗网络)是图像生成的王者。GAN的思路是两个网络打架:一个造假图,一个鉴别真假。打得多了,造假技术就越来越厉害。

GAN的问题是训练不稳定。你可能训练了三天,结果生成的图全是噪声。业内有个笑话叫"GAN collapse"——训练着训练着,生成器发现了一个捷径:不管输入什么,都输出同一张图。鉴别器也傻了,分不出来真假。两个人都"赢"了,但生成的东西一文不值。

扩散模型完全没有这个问题。训练过程稳定得像钟表,loss曲线一直往下降。而且多样性天然就好——因为你从不同的随机噪声开始,每次生成的图都不一样。

现在回头看,扩散模型击败GAN几乎是必然的。GAN像是在教两个人互相骗,扩散模型则是在教一个学生做逆向工程。哪个更可控,一目了然。

实战:你在用FLUX的时候,背后发生了什么?

当你在我们的系统里提交一个封面图任务时,整个链路是这样的:

1. 提交prompt → local-image-submit创建job
2. FLUX模型接收:纯随机噪声 + 你的prompt编码 + 步数(20)
3. 第1步:模型预测噪声,去掉一部分 → 画面隐约有结构
4. 第2-10步:结构越来越清晰,主体开始出现
5. 第11-20步:细节打磨,颜色、光影、纹理逐步完善
6. 输出1200×630 PNG → 转WebP → 上传OSS → 返回URL

20步。15秒。从一团噪点到一张封面图。每次看这个流程跑完,我都会想:2020年的时候,生成一张图还要1000步、好几分钟。六年后的今天,20步就搞定。技术的加速度,是真的恐怖。

下一步:世界模型?

扩散模型在图像领域已经赢了。视频呢?Sora、可灵、Vidu用的也是扩散模型,只是从2D扩展到了时空3D。但视频生成面临一个图像没有的挑战——时序一致性。第1帧的猫和第50帧的猫必须是同一只猫,动作还得连贯。这个问题目前还在攻坚。

再远一点,世界模型(World Model)的概念正在被认真讨论。不是生成图片,不是生成视频,而是生成一个"可交互的3D世界"。你走进去,东西还在那里;你推一个杯子,它会掉下去摔碎。这才是扩散模型真正的终局。

但那是另一个故事了。今天先把扩散模型这个"凿石头"的过程搞明白,就够了。

SFD编者注:我们每天用FLUX生成封面图,但真正理解它在干什么之后,每次看20步去噪的过程,感觉完全不一样了。推荐大家在自己的环境里试一次:给一张图加噪声,再让模型还原回来。亲眼看到"凿石头"的过程,比读十篇论文都管用。