使用 Diffusers 通過 DreamBooth 來訓練 Stable Diffusion
邀請參與我們的 DreamBooth 微調(diào)編程馬拉松活動[1]!
DreamBooth 是一種使用專門的微調(diào)形式來訓練 Stable Diffusion 的新概念技術(shù)。一些人用他僅僅使用很少的他們的照片訓練出了一個很棒的照片,有一些人用他去嘗試新的風格。?? Diffusers 提供一個 DreamBooth 訓練腳本[2]。這使得訓練不會花費很長時間,但是他比較難篩選正確的超參數(shù)并且容易過擬合。
我們做了許多實驗來分析不同設(shè)置下 DreamBooth 的效果。本文展示了我們的發(fā)現(xiàn)和一些小技巧來幫助你在用 DreamBooth 微調(diào) Stable Diffusion 的時候提升結(jié)果。
在開始之前,請注意該方法禁止應(yīng)用在惡意行為上,來生成一些有害的東西,或者在沒有相關(guān)背景下冒充某人。該模型的訓練參照 CreativeML Open RAIL-M 許可。
注意:該帖子的先前版本已出版為 W&B 報告
TL;DR: 推薦設(shè)置
DreamBooth 很容易快速過擬合,為了獲取高質(zhì)量圖片,我們必須找到一個 "sweet spot" 在訓練步驟和學習率之間。我們推薦使用低學習率和逐步增加步數(shù)直到達到比較滿意的狀態(tài)策略;
DreamBooth 需要更多的臉部訓練步數(shù)。在我們的實驗中,當 BS 設(shè)置為 2,學習率設(shè)置為 1e-6,800-1200 步訓練的很好;
先前提到的對于當訓練臉部時避免過擬合非常重要,但對于其他主題可能影響就沒那么大了;
如果你看到生成的圖片噪聲很大質(zhì)量很低。這通常意味著過擬合了。首先,先嘗試上述步驟去避免他,如果生成的圖片依舊充滿噪聲。使用 DDIM 調(diào)度器或者運行更多推理步驟 (對于我們的實驗大概 100 左右就很好了);
訓練文本編碼器對于 UNet 的質(zhì)量有很大影響。我們最優(yōu)的實驗配置包括使用文本編碼器微調(diào),低學習率和一個適合的步數(shù)。但是,微調(diào)文本編碼器需要更多的內(nèi)存,所以理想設(shè)置是一個至少 24G 顯存的 GPU。使用像 8bit adam、fp 16 或梯度累計技巧有可能在像 Colab 或 Kaggle 提供的 16G 的 GPU 上訓練;
EMA 對于微調(diào)不重要;
沒有必要用 sks 詞匯訓練 DreamBooth。最早的實現(xiàn)之一是因為它在詞匯中是罕見的 token ,但實際上是一種 rifle。我們的實驗或其他像 @nitrosocke 的例子都表明使用自然語言描述你的目標是沒問題的。
學習率影響
DreamBooth 很容易過擬合,為了獲得好的結(jié)果,設(shè)置針對你數(shù)據(jù)集合理的學習率和訓練步數(shù)。在我們的實驗中 (細節(jié)如下),我們微調(diào)了四種不同的數(shù)據(jù)集用不同的高或低的學習率。總的來說,我們在低學習率的情況下獲得了更好的結(jié)果。
實驗設(shè)置
所有的實驗使用 `train_deambooth.py` 腳本[3],使用 AdamW 優(yōu)化器在 2X40G 的 A00 機器上運行。我們采用相同的隨機種子和保持所有超參相同,除了學習率,訓練步驟和先前保留配置。
對于前三個例子 (不同對象),我們微調(diào)模型配置為 bs = 4 (每個 GPU 分 2 個),400 步。一個高學習率 = 5e-6,一個低學習率 = 2e-6。無先前保留配置。
最后一個實驗嘗試把人加入模型,我們使用先去保留配置同時 bs = 2 (每個 GPU 分 1 個),800-1200 步。一個高學習率 = 5e-6,一個低學習率 = 2e-6。
你可以使用 8bit adam,fp16 精度訓練,梯度累計去減少內(nèi)存的需要,并執(zhí)行相同的實驗在一個 16G 顯存的機器上。
Toy 貓
高學習率 (5e-6)

低學習率 (2e-6)

土豆先生的頭
高學習率 (5e-6) 請注意,顏色偽像是噪聲殘余物 - 運行更多的推理步驟可以幫助解決其中一些細節(jié)

低學習率 (2e-6)

人臉
我們試圖將 Seinfeld 的 Kramer 角色納入 Stable Diffusion 中。如前所述,我們培訓了更小的批量尺寸的更多步驟。即使這樣,結(jié)果也不是出色的。為了簡潔起見,我們省略了這些示例圖像,并將讀者推遲到下一部分,在這里,面部訓練成為我們努力的重點。
初始化結(jié)果總結(jié)
為了用 DreamBooth 獲取更好的 Stable Diffusion 結(jié)果,針對你的數(shù)據(jù)集調(diào)整你的學習率和訓練步數(shù)非常重要。
高學習率多訓練步數(shù)會導(dǎo)致過擬合。無論使用什么提示,該模型將主要從訓練數(shù)據(jù)中生成圖像
低學習率少訓練步驟會導(dǎo)致欠擬合。該模型將無法生成我們試圖組合的概念
臉部訓練非常困難,在我們的實驗中,學習率在 2e-6 同時 400 步對于物體已經(jīng)很好了,但是臉部需要學習率在 1e-6 (或者 2e-6) 同時 1200 步才行。
如果發(fā)生以下情況,模型過度擬合,則圖像質(zhì)量會降低很多:
學習率過高
訓練步數(shù)過多
對于面部的情況,如下一部分所示,當不使用事先保存時
訓練臉部使用先前配置
先前的保存是一種使用我們試圖訓練的同一類的其他圖像作為微調(diào)過程的一部分。例如,如果我們嘗試將新人納入模型,我們要保留的類可能是人。事先保存試圖通過使用新人的照片與其他人的照片相結(jié)合來減少過度擬合。好處是,我們可以使用 Stable Diffusion 模型本身生成這些其他類圖像!訓練腳本如果需要的話會自動處理這一點,但是你還可以為文件夾提供自己的先前保存圖像
先前配置,1200 步數(shù),學習率 = 2e-6

無先前配置,1200 步數(shù),學習率 = 2e-6

如你所見,當使用先前配置時,結(jié)果會更好,但是仍然有嘈雜的斑點。是時候做一些其他技巧了
調(diào)度程序的效果
在前面的示例中,我們使用 PNDM 調(diào)度程序在推理過程中示例圖像。我們觀察到,當模型過度時,DDIM 通常比 PNDM 和 LMSDISCRETE 好得多。此外,通過推斷更多步驟可以提高質(zhì)量:100 似乎是一個不錯的選擇。附加步驟有助于將一些噪聲貼在圖像詳細信息中。
PNDM, Kramer 臉

LMSDiscrete, Kramer 臉。結(jié)果很糟糕

DDIM, Kramer 臉。效果好多了

對于其他主題,可以觀察到類似的行為,盡管程度較小。
PNDM, 土豆頭

LMSDiscrete, 土豆頭

DDIM, 土豆頭

微調(diào)文本編碼器
原始的 DreamBooth 論文講述了一個微調(diào) UNet 網(wǎng)絡(luò)部分但是凍結(jié)文本編碼部分的方法。然而我們觀察到微調(diào)文本編碼會獲得更好的效果。在看到其他 DreamBooth 實施中使用的方法后,我們嘗試了這種方法,結(jié)果令人驚訝!

凍結(jié)文本編碼器

微調(diào)文本編碼器
微調(diào)文本編碼器會產(chǎn)生最佳結(jié)果,尤其是臉。它生成更現(xiàn)實的圖像,不太容易過度擬合,并且還可以更好地提示解釋性,能夠處理更復(fù)雜的提示。
后記:Textual Inversion + DreamBooth
我們還進行了最后一個實驗,將 Textual Inversion[4] 與 DreamBooth 結(jié)合在一起。兩種技術(shù)都有相似的目標,但是它們的方法不同。
在本次實驗中我們首先用 Textual Inversion 跑了 2000 步。接著那個模型我們又跑了 DreamBooth 額外的 500 步,學習率為 1e-6。結(jié)果如下:

我們認為,結(jié)果比進行簡單的 DreamBooth 要好得多,但不如我們調(diào)整整個文本編碼器時那樣好。它似乎可以更多地復(fù)制訓練圖像的樣式,因此對它們可能會過度擬合。我們沒有進一步探索這種組合,但是這可能是改善 DreamBooth 適合 16GB GPU 的過程的有趣替代方法。歡迎隨時探索并告訴我們你的結(jié)果!
英文原文: Training Stable Diffusion with DreamBooth using ?? Diffusers[5]
譯者:innovation64 (李洋)
加入譯者團隊: https://bit.ly/3QGHTOz
?? 參考資料
[1] DreamBooth 微調(diào)編程馬拉松活動: https://www.bilibili.com/read/cv21138924
[2] DreamBooth 訓練腳本: https://github.com/huggingface/diffusers/tree/main/examples/DreamBooth
[3]?train_deambooth.py
腳本: https://github.com/huggingface/diffusers/tree/main/examples/DreamBooth
[5] Training Stable Diffusion with DreamBooth using ?? Diffusers: https://huggingface.co/blog/dreambooth