使用🧨 Diffusers和Dreambooth训练Stable Diffusion
Dreambooth 是一种使用专门的微调形式来教 Stable Diffusion 新概念的技术。有些人用它来将自己的照片置于奇幻场景中,而另一些人则用它来融入新的风格。🧨 Diffusers 提供了一个 Dreambooth 训练脚本。它的训练时间不长,但很难选择正确的超参数集,而且很容易过拟合。
我们进行了大量实验,分析了 Dreambooth 中不同设置的影响。本文将介绍我们的发现,以及在使用 Dreambooth 微调 Stable Diffusion 时提高结果的一些技巧。
在开始之前,请注意,此方法绝不应用于恶意目的,以任何方式造成伤害,或未经他人知情而冒充他人。使用此方法训练的模型仍受管理 Stable Diffusion 模型分发的 CreativeML Open RAIL-M 许可证约束。
注意:本文的早期版本已 作为 W&B 报告发布.
TL;DR: 推荐设置
- Dreambooth 很容易过拟合。为了获得高质量的图像,我们必须在训练步数和学习率之间找到一个“最佳点”。我们建议使用较低的学习率,并逐步增加步数,直到结果令人满意。
- Dreambooth 需要更多训练步数来处理人脸。在我们的实验中,当批大小为 2 且学习率为 1e-6 时,800-1200 步效果很好。
- 在训练人脸时,先验保留对于避免过拟合很重要。对于其他主体,它似乎没有太大区别。
- 如果您发现生成的图像有噪声或质量下降,这很可能意味着过拟合。首先,尝试上述步骤来避免它。如果生成的图像仍然有噪声,请使用 DDIM 调度器或运行更多推理步数(在我们的实验中,约 100 步效果很好)。
- 除了 UNet 之外,训练文本编码器对质量有很大影响。我们的最佳结果是通过文本编码器微调、低学习率和适当的步数组合获得的。然而,微调文本编码器需要更多的内存,因此至少具有 24 GB RAM 的 GPU 是理想的。使用 8 位 Adam、`fp16` 训练或梯度累积等技术,可以在 16 GB GPU(例如 Google Colab 或 Kaggle 提供的 GPU)上进行训练。
- 使用或不使用 EMA 进行微调产生了相似的结果。
- 无需使用 `sks` 词来训练 Dreambooth。最初的实现之一使用它是因为它是词汇表中一个罕见的词元,但它实际上是一种步枪。我们的实验以及例如 @nitrosocke 的实验表明,选择自然用于描述目标对象的术语是可以的。
学习率影响
Dreambooth 过拟合非常快。为了获得好的结果,请根据您的数据集调整学习率和训练步数。在我们的实验中(详见下文),我们对四个不同的数据集进行了高低学习率的微调。在所有情况下,我们都获得了较低学习率下的更好结果。
实验设置
我们所有的实验均使用 train_dreambooth.py
脚本和 AdamW
优化器在 2 个 40GB A100 GPU 上进行。我们使用相同的随机种子,并保持所有超参数(除了学习率、训练步数和是否使用先验保留)在所有运行中相等。
对于前 3 个示例(各种对象),我们使用批大小 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
)
猪头
高学习率(5e-6
)。请注意,颜色伪影是残留的噪声——运行更多推理步骤可能有助于解决这些细节。
土豆头先生
高学习率(5e-6
)。请注意,颜色伪影是残留的噪声——运行更多推理步骤可能有助于解决这些细节。
人脸
我们尝试将《宋飞正传》中的克莱默角色融入 Stable Diffusion。如前所述,我们以更小的批次大小训练了更多步数。即便如此,结果也并不出色。为了简洁起见,我们省略了这些样本图像,并将读者推迟到下一节,在那里人脸训练成为我们工作的重点。
初步结果总结
要使用 Dreambooth 训练 Stable Diffusion 以获得良好效果,调整学习率和训练步数以适应您的数据集非常重要。
- 高学习率和过多的训练步数会导致过拟合。模型将主要根据您的训练数据生成图像,无论使用什么提示。
- 低学习率和过少的步数会导致欠拟合:模型将无法生成我们试图融入的概念。
人脸更难训练。在我们的实验中,对于对象,学习率为 2e-6
且训练步数为 400
效果很好,但人脸需要 1e-6
(或 2e-6
)且约 1200 步。
如果模型过拟合,图像质量会严重下降,这种情况发生在:
- 学习率过高。
- 我们运行了过多的训练步数。
- 在人脸的情况下,当不使用先验保留时,如下一节所示。
训练人脸时使用先验保留
先验保留是一种技术,它在微调过程中使用与我们正在尝试训练的类相同的附加图像。例如,如果我们尝试将一个新人融入模型中,我们想要保留的*类*可能是*人*。先验保留试图通过结合新人的照片与其他人的照片来减少过拟合。好消息是我们可以使用 Stable Diffusion 模型本身生成这些额外的类图像!如果您愿意,训练脚本会自动处理,但您也可以提供一个包含您自己的先验保留图像的文件夹。
如您所见,使用先验保留时结果更好,但仍有嘈杂的斑点。是时候使用一些额外的技巧了!
调度器的影响
在之前的例子中,我们使用 PNDM
调度器在推理过程中采样图像。我们观察到,当模型过拟合时,DDIM
通常比 PNDM
和 LMSDiscrete
效果好得多。此外,通过运行更多推理步骤可以提高质量:100 步似乎是一个不错的选择。额外的步骤有助于将一些噪声块分解为图像细节。
对于其他主题,也可以观察到类似的行为,尽管程度较轻。
微调文本编码器
原始的 Dreambooth 论文描述了一种微调模型 UNet 组件的方法,但保持文本编码器冻结。然而,我们观察到微调编码器会产生更好的结果。在看到其他 Dreambooth 实现中使用这种方法后,我们进行了实验,结果令人震惊!
微调文本编码器能产生最佳结果,特别是对于人脸。它生成更逼真的图像,不易过拟合,并且能更好地解释提示,处理更复杂的提示。
尾声:文本反演 + Dreambooth
我们还进行了一项最终实验,将 文本反演 与 Dreambooth 相结合。这两种技术的目标相似,但方法不同。
在此实验中,我们首先运行文本反演 2000 步。然后,我们从该模型中,以 1e-6
的学习率额外运行 Dreambooth 500 步。这些是结果
我们认为结果比单纯使用 Dreambooth 好得多,但不如微调整个文本编码器时好。它似乎更多地复制了训练图像的风格,因此可能会过拟合。我们没有进一步探索这种组合,但它可能是改进 Dreambooth 并仍将过程适应 16GB GPU 的一个有趣替代方案。欢迎探索并告诉我们您的结果!