Dreambooth 是一种使用特殊形式的微调来教授 Stable Diffusion 的新概念的技术。一些人已经在使用它与他们的一些照片一起将自己置于奇幻情景中,而其他人则用它来融入新的风格。🧨 Diffusers 提供了一个 Dreambooth 训练脚本。训练的时间并不长,但选择正确的超参数集合很困难,而且很容易过拟合。
我们进行了许多实验来分析 Dreambooth 中不同设置的影响。本文介绍了我们的发现和一些技巧,以在使用 Dreambooth 进行 Stable Diffusion 的微调时改善您的结果。
在开始之前,请注意,这种方法绝不能用于恶意目的,以任何方式造成伤害,或未经他们的知情而冒充他人。使用此方法训练的模型仍受 CreativeML 开放 RAIL-M 许可证的约束,该许可证管理 Stable Diffusion 模型的分发。
注意:此帖子的早期版本已发布为 W&B 报告。
TL;DR:推荐设置
- Dreambooth 很容易过拟合。为了获得高质量的图像,我们必须在训练步骤的数量和学习率之间找到一个“最佳点”。我们建议使用较低的学习率,并逐渐增加训练步骤的数量,直到结果令人满意。
- Dreambooth 对于人脸需要更多的训练步骤。在我们的实验中,当使用批量大小为 2 和学习率为 1e-6 时,800-1200 步效果良好。
- 在训练人脸时,保留先验信息非常重要,以避免过拟合。对于其他主题,似乎并没有太大的区别。
- 如果生成的图像噪声较大或质量下降,那很可能是过拟合的问题。首先,尝试上述步骤以避免过拟合。如果生成的图像仍然噪声较大,可以使用 DDIM 调度程序或运行更多推理步骤(我们的实验中大约100步效果良好)。
- 除了 UNet 外,对文本编码器进行微调对质量有很大影响。我们在使用文本编码器微调、低学习率和适当的步骤数的组合时取得了最佳结果。然而,微调文本编码器需要更多的内存,因此至少具有 24 GB RAM 的 GPU 是理想的。使用像 8 位 Adam、
fp16
训练或梯度累积等技术,可以在像 Google Colab 或 Kaggle 提供的 16 GB 内存 GPU 上进行训练。 - 使用或不使用 EMA 进行微调产生的结果相似。
- 训练 Dreambooth 不需要使用
sks
这个词。最初的实现之一使用了它,因为它是词汇表中的一个罕见标记,但实际上它是一种步枪。我们的实验以及 @nitrosocke 等人的实验表明,选择您自然用于描述目标的术语是可以的。
学习率影响
Dreambooth 很容易过拟合。为了获得良好的结果,请调整学习率和训练步骤的数量,使其对您的数据集有意义。在我们的实验中(如下所述),我们使用不同的高低学习率对四个不同的数据集进行了微调。在所有情况下,我们使用较低的学习率获得了更好的结果。
实验设置
我们的所有实验都是使用 train_dreambooth.py
脚本在 2x 40GB A100s 上使用 AdamW
优化器进行的。我们使用相同的种子,并在运行中保持所有超参数相等,除了学习率、训练步骤的数量和是否使用先验信息保留。
对于前三个示例(各种对象),我们使用批量大小为 4(每个 GPU 2 个)进行了 400 步的微调。我们使用了较高的学习率 5e-6
和较低的学习率 2e-6
。没有使用先验信息保留。
最后一个实验尝试将一个人类主体添加到模型中。在这种情况下,我们使用了先验信息保留,并使用批量大小为 2(每个 GPU 1 个),800 和 1200 步的微调。我们使用了较高的学习率 5e-6
和较低的学习率 2e-6
。
请注意,您可以使用 8 位 Adam、fp16
训练或梯度累积来减少内存需求,并在具有 16 GB 内存的 GPU 上运行类似的实验。
猫玩具
高学习率(5e-6
)
低学习率(2e-6
)
猪头
高学习率(5e-6
)。请注意,颜色伪影是噪声残留物-运行更多推理步骤可以帮助解决其中一些细节。
低学习率(2e-6
)
土豆先生
高学习率(5e-6
)。请注意,颜色伪影是噪声残留物-运行更多推理步骤可以帮助解决其中一些细节。
低学习率(2e-6
)
人脸
我们试图将Seinfeld中的Kramer角色纳入Stable Diffusion。如前所述,我们通过更多的推理步骤和更小的批量大小进行了训练。即便如此,结果并不理想。为了简洁起见,我们省略了这些样本图片,并将读者引导到接下来的章节,其中人脸训练成为我们努力的焦点。
初步结果总结
要在Dreambooth中训练稳定扩散以获得良好的结果,调整学习率和训练步骤对于您的数据集非常重要。
- 学习率过高和训练步骤过多会导致过拟合。模型将主要生成与训练数据相似的图像,无论使用何种提示。
- 学习率过低和训练步骤过少会导致欠拟合:模型将无法生成我们试图纳入的概念。
人脸的训练更加困难。在我们的实验中,学习率为2e-6
,训练步骤为400
适用于物体,但人脸需要1e-6
(或2e-6
)和约1200
步。
如果模型过拟合,图像质量会大幅下降,出现这种情况的原因可能是:
- 学习率过高。
- 运行过多的训练步骤。
- 在人脸的情况下,没有使用先前保存的图像,如下一节所示。
在训练人脸时使用先前保存
先前保存是一种在微调过程中使用相同类别的其他图像作为部分的技术。例如,如果我们试图将一个新人物纳入模型,我们想要保存的类别可以是人物。先前保存通过使用新人物的照片与其他人的照片相结合来减少过拟合。好处是我们可以使用Stable Diffusion模型自动生成这些额外的类别图像!如果需要,训练脚本会自动处理,但您也可以提供一个包含自己先前保存图像的文件夹。
先前保存,1200步,学习率=2e-6
。
没有先前保存,1200步,学习率=2e-6
。
如您所见,使用先前的保留效果更好,但仍存在噪点。现在是时候使用一些额外的技巧了!
调度器的影响
在之前的示例中,我们使用了PNDM
调度器来在推理过程中采样图像。我们观察到,当模型过拟合时,DDIM
通常比PNDM
和LMSDiscrete
更好。此外,通过运行更多步骤可以提高质量:100步似乎是一个不错的选择。额外的步骤有助于将一些噪点转换为图像细节。
PNDM
,Kramer的脸
LMSDiscrete
,Kramer的脸。结果很糟糕!
DDIM
,Kramer的脸。好多了
<p对于其他主题,也可以观察到类似的行为,尽管程度较轻。
PNDM
,土豆头
LMSDiscrete
,土豆头
DDIM
,土豆头
微调文本编码器
<p原始的Dreambooth论文描述了一种方法,可以微调模型的UNet组件,但保持文本编码器冻结。然而,我们观察到微调编码器可以产生更好的结果。在看到其他Dreambooth实现中使用这种方法后,我们进行了实验,结果令人惊讶!
<p冻结的文本编码器
<p微调的文本编码器
<p微调文本编码器产生了最佳结果,尤其是在人脸方面。它生成更加真实的图像,不容易过拟合,而且还能更好地解释提示,能够处理更复杂的提示。
结语:文本反转+Dreambooth
<p我们还进行了一项最后的实验,将文本反转与Dreambooth结合起来。这两种技术有着类似的目标,但方法不同。
<p在这个实验中,我们首先运行了2000步的文本反转。然后,我们使用学习率为1e-6
再运行了500步的Dreambooth。以下是结果:
<p我们认为这些结果比仅使用Dreambooth要好,但不如对整个文本编码器进行微调时好。它似乎更多地复制了训练图像的风格,所以可能对它们过拟合。我们没有进一步探索这种组合,但它可能是改进Dreambooth并仍适应16GB GPU的一个有趣的替代方法。欢迎您进行探索并告诉我们您的结果!