模型为什么不在像素上干活
一张 1024×1024 的 RGB 图约等于三百万个数字。直接在这个尺度上跑几十步去噪不是不行,而是太浪费:这些数字高度冗余,相邻像素彼此雷同,细小纹理承载的语义也很少。
所以潜扩散模型在前面加了一个自编码器。VAE 编码器把图每边压缩八倍,变成一个潜变量张量,大概一万六千个数字而不是三百万。模型全程在这里工作,最后由解码器还原成像素。视频模型是三维版本,时间轴也一起压,所以一段视频的潜变量是一小叠,不是一串互不相干的帧。
这个交换有两点值得记住。第一,编码和解码本身有损,皮肤发蜡、小字发糊往往就是在这一步产生的,跟采样器还没关系。第二,潜变量是有空间结构的,它是这张图的一份粗略地图,不是打乱后的哈希值,所以蒙版和控制图才可能直接作用在潜空间里。
种子究竟是什么
采样从一片随机噪声开始,种子就是让这片噪声可复现的那把钥匙。固定它,配同一条提示词和同一个模型版本,每次都能拿到同一个结果。
这也解释了整套工具里最常见的一个误解:很多人把种子当旋钮微调。它不是有序的,相邻种子对应的是毫不相关的噪声,4001 不能告诉你任何关于 4000 的信息。想在一张喜欢的图上做小改动,真正有效的动作是:
- 保持种子不动,只改提示词里的一小段
- 保持种子和提示词,把引导强度稍微调低
- 把这张图以很低的重绘幅度再喂回去
- 如果工具直接暴露潜变量,就和第二个潜变量做混合
把参数翻译成「路径」
扩散界面上的每个参数,其实都在描述潜空间里这条路径的某个属性。
| 参数 | 对路径做了什么 |
|---|---|
| 种子 | 决定起点 |
| 步数 | 这条路径被切成多少段 |
| 引导强度 CFG | 提示词把路径从无条件方向上拽开多狠 |
| 重绘幅度 | 路径从离你的输入图多远的地方起步 |
| 调度器 | 每一步步长的分布形状 |
这样读,一些熟悉的翻车就变得显然了。引导强度拉太高会出现焦掉、过饱和的结果,因为你把路径拽到了「解码出来还像自然图像」的区域之外。步数太少,路径还没走到收敛点,画面就显得糊或者半成品。图生图把重绘幅度开到 0.9,等于起点几乎就是纯噪声,输入图当然被无视。
在实际工作里怎么用
要变体,就走短距离。 低幅度图生图(0.2 到 0.35)是在原地邻域里挪一小步,这是拿到「十张同款近亲」最稳的办法。
要转场,就要预期到变形。 两个潜变量之间插值给出的是平滑中间态,用在抽象和纹理转场上很好,用在两个不同角色之间就很糟,你会得到一张谁也不是的混合脸。两端语义差得远,就直接切。
概念存在于方向里,不在位置里。 提示词里的某个词往往把潜变量往一个固定方向推,所以同一个风格短语套在不同主体上会有可辨认的一致效果。这也是两个强风格词会打架的原因:它们把同一条路径往不同方向拽,谁赢是随机的。
画幅比例不是随便挑的。 潜变量的尺寸必须是压缩倍数的整数倍,而模型训练时见过的形状有限。冷门比例会把潜变量推到它见得少的区域,这是主体重复、构图跑偏的一个常见根因。