使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion.md
邀请参与我们的 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)

低学习率 (2e-6)

土豆先生的头
高学习率 (5e-6) 请注意,颜色伪像是噪声残余物 - 运行更多的推理步骤可以帮助解决其中一些细节

低学习率 (2e-6)

人脸
我们试图将 Seinfeld 的 Kramer 角色纳入 Stable Diffusion 中。如前所述,我们培训了更小的批量尺寸的更多步骤。即使这样,结果也不是出色的。为了简洁起见,我们省略了这些示例图像,并将读者推迟到下一部分,在这里,面部训练成为我们努力的重点。
初始化结果总结
为了用 DreamBooth 获取更好的 Stable Diffusion 结果,针对你的数据集调整你的学习率和训练步数非常重要。
- 高学习率多训练步数会导致过拟合。无论使用什么提示,该模型将主要从训练数据中生成图像
- 低学习率少训练步骤会导致欠拟合。该模型将无法生成我们试图组合的概念
脸部训练非常困难,在我们的实验中,学习率在 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 脸。效果好多了

对于其他主题,可以观察到类似的行为,尽管程度较小。
PNDM, 土豆头

LMSDiscrete, 土豆头

DDIM, 土豆头

微调文本编码器
原始的 DreamBooth 论文讲述了一个微调 UNet 网络部分但是冻结文本编码部分的方法。然而我们观察到微调文本编码会获得更好的效果。在看到其他 DreamBooth 实施中使用的方法后,我们尝试了这种方法,结果令人惊讶!

冻结文本编码器

微调文本编码器
微调文本编码器会产生最佳结果,尤其是脸。它生成更现实的图像,不太容易过度拟合,并且还可以更好地提示解释性,能够处理更复杂的提示。
后记:Textual Inversion + DreamBooth
我们还进行了最后一个实验,将 Textual Inversion 与 DreamBooth 结合在一起。两种技术都有相似的目标,但是它们的方法不同。
在本次实验中我们首先用 Textual Inversion 跑了 2000 步。接着那个模型我们又跑了 DreamBooth 额外的 500 步,学习率为 1e-6。结果如下:

我们认为,结果比进行简单的 DreamBooth 要好得多,但不如我们调整整个文本编码器时那样好。它似乎可以更多地复制训练图像的样式,因此对它们可能会过度拟合。我们没有进一步探索这种组合,但是这可能是改善 DreamBooth 适合 16GB GPU 的过程的有趣替代方法。欢迎随时探索并告诉我们你的结果!
英文原文: Training Stable Diffusion with DreamBooth using Diffusers
译者:innovation64 (李洋)
加入译者团队: https://bit.ly/3QGHTOz
使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion.md的更多相关文章
- 使用 LoRA 进行 Stable Diffusion 的高效参数微调
LoRA: Low-Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术,主要用于处理大模型微调的问题.目前超过数十亿以上参数的具有强能力的大 ...
- 在英特尔 CPU 上加速 Stable Diffusion 推理
前一段时间,我们向大家介绍了最新一代的 英特尔至强 CPU (代号 Sapphire Rapids),包括其用于加速深度学习的新硬件特性,以及如何使用它们来加速自然语言 transformer 模型的 ...
- Diffusers中基于Stable Diffusion的哪些图像操作
目录 辅助函数 Text-To-Image Image-To-Image In-painting Upscale Instruct-Pix2Pix 基于Stable Diffusion的哪些图像操作们 ...
- AI绘画提示词创作指南:DALL·E 2、Midjourney和 Stable Diffusion最全大比拼 ⛵
作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 自然语言处理实战系列:https://www.showmeai.tech ...
- 从 GPT2 到 Stable Diffusion:Elixir 社区迎来了 Hugging Face
上周,Elixir 社区向大家宣布,Elixir 语言社区新增从 GPT2 到 Stable Diffusion 的一系列神经网络模型.这些模型得以实现归功于刚刚发布的 Bumblebee 库.Bum ...
- Stable Diffusion魔法入门
写在前面 本文为资料整合,没有原创内容,方便自己查找和学习, 花费了一晚上把sd安装好,又花了大半天了解sd周边的知识,终于体会到为啥这些生成式AI被称为魔法了,魔法使用前要吟唱类比到AI上不就是那些 ...
- 最新版本 Stable Diffusion 开源AI绘画工具之部署篇
目录 AI绘画 本地环境要求 下载 Stable Diffusion 运行启动 AI绘画 关于 AI 绘画最近有多火,既然你有缘能看到这篇文章,那么相信也不需要我过多赘述了吧? 随着 AI 绘画技术的 ...
- 基于Docker安装的Stable Diffusion使用CPU进行AI绘画
基于Docker安装的Stable Diffusion使用CPU进行AI绘画 由于博主的电脑是为了敲代码考虑买的,所以专门买的高U低显,i9配核显,用Stable Diffusion进行AI绘画的话倒 ...
- Window10环境下,Stable Diffusion的本地部署与效果展示
Diffusion相关技术最近也是非常火爆,看看招聘信息,岗位名称都由AI算法工程师变成了AIGC算法工程师,本周跟大家分享一些Diffusion算法相关的内容. Window10环境下,Stable ...
- Stable Diffusion 关键词tag语法教程
提示词 Prompt Prompt 是输入到文生图模型的文字,不同的 Prompt 对于生成的图像质量有较大的影响 支持的语言Stable Diffusion, NovelAI等模型支持的输入语言为英 ...
随机推荐
- php开发之文件上传的实现
前言 php是网络安全学习里必不可少的一环,简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中,文件的功能是必不可少,比如我们在论坛的头像想更改时就 ...
- 车的可用捕获量(3.26leetcode每日打卡)
在一个 8 x 8 的棋盘上,有一个白色车(rook).也可能有空方块,白色的象(bishop)和黑色的卒(pawn).它们分别以字符 "R",".",&quo ...
- 字节跳动今日头条-抖音小程序序html富文本显示解决办法
我所知道的,目前很多微信小程序开发者大都使用了"wxParse"的一个小程序端富文本解析代码,但对于开发抖音.今日头条小程序的人来说,貌似官方或者第三方也没有出一个解决html富文 ...
- Element的安装与基本使用
一.什么是Element? Element是饿了么团队研发的一套为开发者与设计师等准备的基于Vue2.0的桌面端组件库,使开发人员可以快速拼凑出一套页面 组件:组成网页的部件,例如:超链接,按钮,图片 ...
- Linux笔记03: Linux常用命令_3.2目录操作命令
3.2 目录操作命令 3.2.1 ls命令 ●命令名称:ls. ●英文原意:list directory contents. ●所在路径:/usr/bin/ls. ●执行权限:所有用户. ●功能描述: ...
- Socket.D 网络应用协议,v2.1.6 发布
有用户说,"Socket.D 之于 Socket,尤如 Vue 之于 Js.Mvc 之于 Http" 与其它协议的简单对比 对比项目 socket.d http websocket ...
- [ARC122E] Increasing LCMs
Problem Statement We have a sequence of $N$ positive integers: $A_1,A_2,\cdots,A_N$. You are to rear ...
- 解决This application failed to start because cannot find or load the qt platform plugin 'xcb'
问题描述: 在使用linux系统训练自己的数据集合时,出现了上述问题,首先第一个想法就是先Google,但是在看了一些国内外的文章后依然没有将问题解决 问题原因: 这是由于这几天我在安装cuda.cu ...
- offline RL | Pessimistic Bootstrapping (PBRL):在 Q 更新中惩罚 uncertainty,拉低 OOD Q value
论文题目:Pessimistic Bootstrapping for Uncertainty-Driven Offline Reinforcement Learning,ICLR 2022,6 6 8 ...
- Python 中 key 参数的含义及用法
哈喽大家好,我是咸鱼 我们在使用 sorted() 或 map() 函数的时候,都会看到里面有一个 key 参数 其实这个 key 参数也存在于其他内置函数中(例如 min().max() 等),那么 ...