我第一次用 Stable Diffusion 的时候,被一个现象整懵了:同样的提示词,每次点生成,出来的图都不一样。后来朋友告诉我,你试试把那个叫 Seed 的数字记下来。我试了试,同样的种子,同样的提示词,果然生成了一模一样的图。这让我特别好奇:一个数字,凭什么能决定一张图的全部细节?这背后到底是什么在起作用?

计算机里的随机数,其实是一个公式
你可能以为计算机能“随机”生成数字,但真相是:计算机里根本没有真正的随机。它用的是一种叫 伪随机数生成器(PRNG) 的算法,本质上是一个极其复杂的数学公式,你给它一个起始值,它就按固定规则算出一串数。这个起始值,就是种子。
打个比方:种子就像一本书的 ISBN 号。你拿着同一个 ISBN 去图书馆,每次借到的都是同一本书,一个字都不会差。PRNG 也一样——同一个种子,永远吐出同一串数。所以计算机里的“随机”其实是“看起来随机的确定性”。维基百科:伪随机数生成器
这个特性在图像生成里被玩出了花:你只要记下种子,就等于给整张图的“随机性”拍了张快照,随时能复现。
种子如何决定那张噪声图
扩散模型(Stable Diffusion 的核心)生成图片的过程,大致可以拆成三步:
- 先在潜在空间里画一张完全随机的噪声图——对,就是一片雪花点。
- 用 U-Net 神经网络,在提示词的引导下,一步步把噪声“擦掉”,逐渐变成清晰的图像。
- 把潜在空间的结果解码,输出你看到的 PNG。
关键就在第一步:那片“雪花点”不是真的随机,而是用 PRNG 生成的。你提供的种子,会直接喂给 PRNG,生成一张固定的噪声张量。之后即使第二步里有些采样器会再加入随机噪声(比如 DDPM),这些噪声也由同一个种子(或派生种子)控制,所以整个链条是完全确定的。Stable Diffusion 论文:High-Resolution Image Synthesis with Latent Diffusion Models
说人话就是:种子好比给噪声图印了个身份证号,后续所有步骤都认这个号,所以最终结果跑不掉——同样种子 + 同样提示词 = 同一张图。
采样器类型会影响种子吗?
你可能听过一个说法:“DDIM 是确定性的,改了种子图像会变;DDPM 是随机的,改了种子也不一定变。”——这其实是个误解。无论采样器是确定性还是随机性,只要种子相同,初始噪声和过程中所有随机噪声都相同,最终图像一定相同。不同采样器对种子的依赖方式确实有区别,但结果都是可复现的。
| 采样器 | 内部随机性 | 种子影响 | 相同种子+提示词结果 |
|---|---|---|---|
| DDIM (eta=0) | 无 | 仅控制初始噪声 | 完全相同 |
| DDPM | 每步加噪声 | 控制初始噪声+每步噪声 | 完全相同 |
| Euler Ancestral | 每步加噪声 | 控制初始噪声+每步噪声 | 完全相同 |
| UniPC 等确定性调度器 | 无 | 仅控制初始噪声 | 完全相同 |
所以,完全不用担心采样器会破坏可复现性。真正让你遇到“改了种子图没变”的,往往是另外两个坑:一是你用了外部保存的固定噪声文件(社区脚本常见操作),二是你只改了种子但忘了改generator对象的其他部分(比如 PyTorch 的全局随机状态)。
种子锁定了什么?构图 vs 细节
这里有一个我自己测试后觉得特别有意思的发现:种子主要决定全局构图,提示词负责填充细节。
我做过一个实验:固定种子为 42,然后不断换提示词。结果出来的图,人物姿势、物体位置、光影方向几乎一模一样,但衣服颜色、面部特征、背景细节随提示词变化。这就像你拿着一张透写台,底稿的轮廓线不变,但你可以给上面涂不同的颜色。这个特性在创作中极为有用——你可以先用一个种子跑出满意的构图,再微调提示词去打磨画面内容,而不用担心构图跑偏。
实用技巧:用种子迭代作品
知道种子能锁构图之后,你就可以玩出很多花样:
- 找最佳种子:用同一个提示词,随机生成几十张,选出构图最顺眼的,记住它的种子。
- 稳定构图,微调提示词:锁定种子,然后加减修饰词(比如“cinematic lighting”改成“soft lighting”),观察画面变化。
- 种子微调:把种子加 1 或减 1,生成微妙不同的构图,这是寻找变体的高效方法,尤其适合做角色设计或系列插图。
- 批量可控生成:写一个循环,固定种子,遍历不同的提示词,输出一套风格统一的素材。
在代码里咋设种子?用 Diffusers 库的话,就是这样:
import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
generator = torch.Generator(device="cuda").manual_seed(42)
image = pipe("a cat wearing a hat", generator=generator).images[0]
只要 generator 的种子是 42,这行代码跑一万次,猫和帽子长一个样。Hugging Face Diffusers 可复现性文档
常见误解,一次说清
同一个种子,换台电脑生成图一样吗?
不一定。要完全复现,除了种子,还需要固定模型权重、软件版本、硬件细节。浮点运算的微小差异(比如 GPU 架构不同、CUDA 版本不同)可能导致像素级差别。如果你需要绝对的可复现,得用enable_full_determinism()(见文末进阶阅读),但通常代价是速度变慢。
种子相同,提示词不同,图完全不一样,种子不是没用了吗?
种子控制的是“随机性骨架”,提示词是“内容指令”。它们俩是乘法关系,不是加法关系。种子决定噪声图的初始形态,这个形态会与提示词交叉注意力,最终影响生成的布局。所以种子仍然有用,它锁定了构图的结构。
为什么有些平台(如 Midjourney)的种子作用好像不一样?
不同产品对种子的实现有差异,有的可能只控制部分随机源,或者叠加了额外的随机变换。本文讨论的是 Stable Diffusion 等开源扩散模型的标准行为,其他平台需要看具体文档。
进阶阅读:如何实现像素级完全复现?
如果你在做学术对比或产品级批处理,需要完全消除随机性,可以在 Diffusers 脚本开头加上:
from diffusers.utils import enable_full_determinism
enable_full_determinism()
这会固定 Python、NumPy、PyTorch、CUDA 等所有随机源,并强制使用确定性算法。注意,这可能降低性能,且仍需确保所有环境一致。PyTorch 可复现性文档
最后说一句:种子不神秘,它就是一个固定随机数的开关。但就是这一个小小的开关,让 AI 绘画从“碰运气”变成了“可控制”。理解它,你就不再是点按钮祈祷,而是真正在创作。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/114.html