🧠 第七章 绘画模型训练:创意生成与视觉设计
📄 一句话概括

采样步数扫一遍:1 到 8 步 PSNR 从 8.83 冲到 24.40(涨 15.57 dB),8 到 16 只涨 1.87 dB, 32 到 64 只涨 0.61 dB。 这就是「步数收益递减」:时间线性涨,画质对数涨。

📝 本节和前面几节的关系

上一节把 LoRA 部署好了。 这一节真正出图,重点不在「怎么写提示词」,而在那几个必须自己定的参数。

一、文生图的四个参数

① 提示词(正面 + 负面)。正面写「要什么」,负面写「不要什么」。这是唯一决定内容的东西。 ② 采样步数与采样器。 步数决定「画多少遍」,采样器决定「每遍怎么走」。 常用 20 到 30 步,采样器用 DPM++ 2M Karras 这类收敛快的。 ③ 种子。 决定随机初始噪声。同一个种子加同一套参数,出图完全一样。 ④ LoRA 权重。 一般 0.6 到 1.0 起步,写法是 <lora:名字:0.8>。它决定「这个 LoRA 掺多浓」。 四个参数里,提示词是内容、LoRA 权重是风格浓度,这两个是创作; 步数和种子是工程,它们不该成为变量——调参时先把它们固定住。

二、步数:收益递减,而且是对数式的

Demo 用一个「逐步逼近目标图 + 每步加噪」的过程模拟采样,量每个步数下的 PSNR:

采样步数 与目标的 PSNR
1 8.83 dB
2 12.28 dB
4 18.46 dB
8 24.40 dB
16 26.28 dB
32 27.14 dB
64 27.75 dB
前 8 步涨了 15.57 dB,后面 56 步加起来只涨 3.35 dB。换算成倍数更直观:
8 到 16 翻一倍步数涨 1.87 dB,32 到 64 再翻一倍只涨 0.61 dB。
这就是为什么实际出图用 20 到 30 步:再往上加一倍,肉眼几乎看不出差别,时间却实打实翻倍。
注意噪声有个「地板」——Demo 里是 floor=0.03。
所以曲线不会无限涨,它会撞上一条水平线。真实采样的噪声地板来自采样器本身的离散误差,
这也是「加步数救不回来的那部分」的来源。

三、种子:可复现的前提

同种子跑两次,逐像素最大差 0.000000——完全一致。 换个种子(7 改 8),平均差 0.0548,构图会变。 这两句话是调参纪律的基础:改提示词之前先固定种子。不然你改了提示词, 出图变好——你分不清是提示词的功劳还是种子的运气。 复现别人的图需要三样: 同一个底模、同一个 LoRA(含权重哈希)、同一个种子和采样器。 缺一样都复现不出来。 反过来说, 分享参数时这三样都要给全。只给提示词和步数是没用的——别人拿同样的提示词,也出不来你那张图。

四、LoRA 权重与提示词写法

权重从 0.6 到 1.0 起步,先试 0.8。太低(低于 0.4)风格出不来; 太高(超过 1.2)会出现「过拟合味」——线条变硬、颜色发脏、细节糊成一团。 触发词放提示词最前面。 顺序在 SD 里是有权重的(越靠前越重),所以「触发词 + 主体 + 风格词 + 质量词」是常用顺序。 负面提示词别偷懒:lowres, bad anatomy, worst quality, text, watermark 这一套基本通用, 尤其 watermark(水印)——训练集里的水印会被学进去。 📋 实操清单(在文生图页里做): 第一步,提示词框写 mystyle, 1girl, portrait, <lora:my_style:0.8>。 第二步,步数填 25,采样器选 DPM++ 2M Karras。 第三步,种子填 -1(随机),先出一批八张。 第四步,挑中一张,把它的种子抄下来,再开始调权重和提示词。 最后一条经验:一次只改一个参数。同时改提示词和权重,出图变好你也不知道该记哪个。 这跟做实验是一个道理。

五、动手 Demo:出图参数:8 步到 24.4 dB,再翻倍只涨 1.9 dB

用「每步向目标靠拢一点、同时加一点噪声」的过程模拟采样,噪声带一个不随步数衰减的地板项, 量 1 到 64 步各档的 PSNR;再固定步数,比较同种子两次和换种子两次的差异。

def run(steps, seed, floor=0.03, extra=0.06):
    r = np.random.default_rng(seed)
    x = r.normal(0.5, 0.25, (n, n)).astype(np.float32)
    for i in range(steps):
        s = floor + extra * (1.0 - i / float(steps))   # 噪声有地板
        x = x + eta * (target - x) + r.normal(0, s, (n, n))
    return x

def psnr(a, b):
    mse = float(np.mean((a - b) ** 2))
    return 10.0 * np.log10(1.0 / max(mse, 1e-12))

实跑输出:

--------------------------------------------------------------------
出图参数:8 步到 24.4 dB,再翻倍只涨 1.9 dB
--------------------------------------------------------------------
  采样步数   与目标的 PSNR
  -----------------------
         1         8.83 dB
         2        12.28 dB
         4        18.46 dB
         8        24.40 dB
        16        26.28 dB
        32        27.14 dB
        64        27.75 dB

  步数从 1 加到 8,PSNR 从 8.83 冲到 24.40,八步之内涨了 15.57 dB。
  这就是「步数收益递减」,再往上每翻一倍只多这么一点:
  **8 到 16 涨 1.87 dB,16 到 32 涨 0.86 dB,32 到 64 只涨 0.61 dB。**
  真实出图也是这个形状:**20 到 30 步**是常用区间,再往上加一倍,
  肉眼几乎看不出差别,时间却翻倍。

  再看种子:同种子跑两次,逐像素最大差 **0.000000**——完全一致,这就是「可复现」。
  换个种子(7 改 8),平均差 **0.0548**——**构图会变。**
  所以调参时一定要先 **固定种子**:不然你改了提示词出图变好,分不清是提示词的功劳还是种子的运气。
  要复现别人的图,需要三样:
  **同一个底模、同一个 LoRA(含权重哈希)、同一个种子和采样器**。
  缺一样都复现不出来。

done -> _out_39k.txt

表格七行:8.83 → 12.28 → 18.46 → 24.40 → 26.28 → 27.14 → 27.75。八步之内涨了 15.57 dB, 剩下 56 步加起来只涨 3.35 dB。 原因在 s = floor + extra * (1 - i/steps) 这一行:噪声随步数线性衰减, 但永远降不到 0,它停在 floor 上。所以再怎么加步数,误差也下不去——曲线必然撞平。 这个「地板」不是我为了凑结论硬加的: 真实采样的离散误差、VAE 的重建损失、模型的容量上限,都是这种不随步数消失的项。 没有地板的话 PSNR 会一路涨到 50 dB 以上,那反而是假的(相当于假设加无限步就能完美重建)。 种子那段:同种子两次最大差 0.000000(真的一致),换种子平均差 0.0548。 前者说明可复现,后者说明种子真的是个变量。 要说明:这里用 PSNR 代替人眼判断。 PSNR 与人眼感受不是线性关系——26 dB 和 27.75 dB 的差别,人眼可能完全看不出来,但 PSNR 还在涨。 所以「多少步够」最终还是要人看,数字只用来判断趋势。

30 秒实验

  1. 把 eta 从 0.35 改到 0.2,看 8 步的 PSNR 掉到多少。 每步走得少,就要更多步才到位——这就是采样器的「收敛速度」。
  2. 把 floor 从 0.03 加到 0.15,看 64 步的上限掉到多少。地板变高,整条曲线整体下移并更早压平。
  3. 用三个种子各跑 16 步,算两两的平均差。 三个数都不为 0 且量级相近——说明种子的影响是稳定存在的,不是偶然。

常见误区

  1. 「步数越多越好」。20 到 30 步之后肉眼几乎无差别,时间却线性涨。
  2. 「调提示词不用固定种子」。不固定就分不清是提示词的功劳还是种子的运气,一次只改一个参数。
  3. 「LoRA 权重拉满最像」。超过 1.2 会出现过拟合味:线条硬、颜色脏、细节糊。
自测三问(点开对答案) 1. 常用的采样步数区间是多少?为什么? —— 20 到 30 步。步数的收益是对数式的,翻倍步数只涨不到 1 dB,时间却翻倍。 2. 复现别人一张图需要哪三样? —— 同一个底模、同一个 LoRA(含权重哈希)、同一个种子和采样器。 3. LoRA 权重怎么定? —— 0.6 到 1.0 起步(先试 0.8)。低于 0.4 风格出不来,高于 1.2 会出现线条硬、颜色脏的过拟合味。

第七章到这里结束:从低秩近似的原理,到装环境、备数据、打标签、写配置,再到部署和出图, 一条完整的图像训练链路走完了。第八章换一个模态——让模型学说话。

相关笔记