约请参加咱们的 DreamBooth 微调编程马拉松活动!

DreamBooth 是一种运用专门的微调形式来练习 Stable Diffusion 的新概念技能。一些人用他只是运用很少的他们的相片练习出了一个很棒的相片,有一些人用他去测验新的风格。 Diffusers 供给一个 DreamBooth 练习脚本。这使得练习不会花费很长时刻,可是他比较难挑选正确的超参数而且简单过拟合。

咱们做了许多试验来分析不同设置下 DreamBooth 的作用。本文展现了咱们的发现和一些小技巧来协助你在用 DreamBooth 微调 Stable Diffusion 的时分提升成果。

在开端之前,请留意该办法制止应用在歹意行为上,来生成一些有害的东西,或许在没有相关背景下冒充某人。该模型的练习参照 CreativeML Open RAIL-M 答应。

留意:该帖子的从前版本已出版为 W&B 陈述

TL;DR: 推荐设置

  • DreamBooth 很简单快速过拟合,为了获取高质量图片,咱们有必要找到一个 “sweet spot” 在练习过程和学习率之间。咱们推荐运用低学习率和逐步增加步数直到达到比较满意的状况策略;

  • DreamBooth 需求更多的脸部练习步数。在咱们的试验中,当 BS 设置为 2,学习率设置为 1e-6,800-1200 步练习的很好;

  • 从前提到的关于当练习脸部时防止过拟合非常重要,但关于其他主题可能影响就没那么大了;

  • 假如你看到生成的图片噪声很大质量很低。这一般意味着过拟合了。首要,先测验上述过程去防止他,假如生成的图片仍旧充溢噪声。运用 DDIM 调度器或许运转更多推理过程 (关于咱们的试验大约 100 左右就很好了);

  • 练习文本编码器关于 UNet 的质量有很大影响。咱们最优的试验装备包含运用文本编码器微调,低学习率和一个合适的步数。可是,微调文本编码器需求更多的内存,所以理想设置是一个至少 24G 显存的 GPU。运用像 8bit adam、fp 16 或梯度累计技巧有可能在像 Colab 或 Kaggle 供给的 16G 的 GPU 上练习;

  • EMA 关于微调不重要;

  • 没有必要用 sks 词汇练习 DreamBooth。最早的实现之一是因为它在词汇中是罕见的 token ,但实际上是一种 rifle。咱们的试验或其他像 @nitrosocke 的例子都表明运用自然语言描绘你的方针是没问题的。

学习率影响

DreamBooth 很简单过拟合,为了获得好的成果,设置针对你数据集合理的学习率和练习步数。在咱们的试验中 (细节如下),咱们微调了四种不同的数据集用不同的高或低的学习率。总的来说,咱们在低学习率的情况下获得了更好的成果。

试验设置

一切的试验运用 train_deambooth.py 脚本,运用 AdamW 优化器在 2X40G 的 A00 机器上运转。咱们采用相同的随机种子和坚持一切超参相同,除了学习率,练习过程和从前保存装备。

关于前三个例子 (不同目标),咱们微调模型装备为 bs = 4 (每个 GPU 分 2 个),400 步。一个高学习率 = 5e-6,一个低学习率 = 2e-6。无从前保存装备。

最后一个试验测验把人加入模型,咱们运用先去保存装备一起 bs = 2 (每个 GPU 分 1 个),800-1200 步。一个高学习率 = 5e-6,一个低学习率 = 2e-6。

你能够运用 8bit adam,fp16 精度练习,梯度累计去减少内存的需求,并执行相同的试验在一个 16G 显存的机器上。

Toy 猫

高学习率 (5e-6)

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

低学习率 (2e-6)

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

马铃薯先生的头

高学习率 (5e-6) 请留意,颜色伪像是噪声残余物 – 运转更多的推理过程能够协助处理其间一些细节

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

低学习率 (2e-6)

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

人脸

咱们企图将 Seinfeld 的 Kramer 角色归入 Stable Diffusion 中。如前所述,咱们培训了更小的批量尺寸的更多过程。即便这样,成果也不是超卓的。为了简洁起见,咱们省掉了这些示例图画,并将读者推迟到下一部分,在这里,面部练习成为咱们努力的要点。

初始化成果总结

为了用 DreamBooth 获取更好的 Stable Diffusion 成果,针对你的数据集调整你的学习率和练习步数非常重要。

  • 高学习率多练习步数会导致过拟合。不管运用什么提示,该模型将主要从练习数据中生成图画
  • 低学习率少练习过程会导致欠拟合。该模型将无法生成咱们企图组合的概念

脸部练习非常困难,在咱们的试验中,学习率在 2e-6 一起 400 步关于物体已经很好了,可是脸部需求学习率在 1e-6 (或许 2e-6) 一起 1200 步才行。

假如发生以下情况,模型过度拟合,则图画质量会降低很多:

  • 学习率过高
  • 练习步数过多
  • 关于面部的情况,如下一部分所示,当不运用事前保存时

练习脸部运用从前装备

从前的保存是一种运用咱们企图练习的同一类的其他图画作为微调过程的一部分。例如,假如咱们测验将新人归入模型,咱们要保存的类可能是人。事前保存企图经过运用新人的相片与其他人的相片相结合来减少过度拟合。好处是,咱们能够运用 Stable Diffusion 模型本身生成这些其他类图画!练习脚本假如需求的话会自动处理这一点,可是你还能够为文件夹供给自己的从前保存图画

从前装备,1200 步数,学习率 = 2e-6

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

无从前装备,1200 步数,学习率 = 2e-6

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

如你所见,当运用从前装备时,成果会更好,可是仍然有喧闹的斑驳。是时分做一些其他技巧了

调度程序的作用

在前面的示例中,咱们运用 PNDM 调度程序在推理过程中示例图画。咱们观察到,当模型过度时,DDIM 一般比 PNDM 和 LMSDISCRETE 好得多。此外,经过揣度更多过程能够提高质量:100 似乎是一个不错的选择。附加过程有助于将一些噪声贴在图画详细信息中。

PNDM, Kramer 脸

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

LMSDiscrete, Kramer 脸。成果很糟糕

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

DDIM, Kramer 脸。作用好多了

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

关于其他主题,能够观察到类似的行为,虽然程度较小。

PNDM, 马铃薯头

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

LMSDiscrete, 马铃薯头

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

DDIM, 马铃薯头

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

微调文本编码器

原始的 DreamBooth 论文讲述了一个微调 UNet 网络部分可是冻结文本编码部分的办法。然而咱们观察到微调文本编码会获得更好的作用。在看到其他 DreamBooth 实施中运用的办法后,咱们测验了这种办法,成果令人惊奇!

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

冻结文本编码器

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

微调文本编码器

微调文本编码器会产生最佳成果,尤其是脸。它生成更实际的图画,不太简单过度拟合,而且还能够更好地提示解释性,能够处理更复杂的提示。

跋文:Textual Inversion + DreamBooth

咱们还进行了最后一个试验,将 Textual Inversion 与 DreamBooth 结合在一起。两种技能都有相似的方针,可是它们的办法不同。

在本次试验中咱们首要用 Textual Inversion 跑了 2000 步。接着那个模型咱们又跑了 DreamBooth 额外的 500 步,学习率为 1e-6。成果如下:

使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion

咱们认为,成果比进行简单的 DreamBooth 要好得多,但不如咱们调整整个文本编码器时那样好。它似乎能够更多地复制练习图画的样式,因而对它们可能会过度拟合。咱们没有进一步探究这种组合,可是这可能是改进 DreamBooth 合适 16GB GPU 的过程的风趣替代办法。欢迎随时探究并告知咱们你的成果!


英文原文: Training Stable Diffusion with DreamBooth using Diffusers
译者:innovation64 (李洋)
加入译者团队: bit.ly/3QGHTOz