Hugging Face SDXL Dreambooth LoRA 進階訓練指南
Hugging Face 發佈了一個用於 Stable Diffusion XL (SDXL) Dreambooth LoRA 的進階訓練腳本,結合了 Replicate 的 Cog trainer 所提出的關鍵微調技術與 Kohya trainer 的 Prodigy 優化器。此整合旨在以最少的圖像達成高品質的概念捕捉,同時保留基礎 SDXL 模型的美學品質。
概念表徵的關鍵微調
關鍵微調將 Textual Inversion 與標準的 diffusion 微調結合,以防止現有 token 產生語義干擾。它不會重複使用稀有 token(例如「sks」),因為該 token 可能在模型的嵌入空間中已有既定關聯;相反地,關鍵微調會在文字編碼器中插入全新的 token。
這些新 token 會被優化以代表新概念。訓練流程通常在前半段訓練週期內執行 Textual Inversion(由 --train_text_encoder_ti_frac 控制),之後再進行 UNet 的優化。此做法確保模型在微調權重之前,先學習到概念的乾淨表徵。
自適應優化器與 Prodigy
為了減少手動調整學習率與權重衰減等超參數的需求,Hugging Face 推薦使用自適應優化器。雖然 Adafactor 也是一個選項,但本指南特別強調 Prodigy 在 Dreambooth LoRA 訓練中的優勢。
Prodigy 會根據過去的梯度動態調整每個參數的學習率。使用 Prodigy 時,建議的設定如下:
- Learning Rate:設定為
1.0。 - 其他設定:啟用
--prodigy_safeguard_warmup與--prodigy_use_bias_correction,並將adam_beta2設為0.99、adam_weight_decay設為0.01。
進階訓練實踐
diffusers 訓練腳本中納入了多項額外技術,以提升 LoRA 的品質:
獨立學習率
將文字編碼器的學習率設定得比 UNet 更低,可防止文字編碼器過快過擬合。然而,若使用像 Prodigy 這樣的自適應優化器,優化器會自動從相同的初始學習率開始管理這些調整。
自訂說明文字
對所有圖像使用單一的實例提示往往不是最佳做法。腳本支援透過 datasets 函式庫進行自訂說明文字,讓使用者能為每張圖像提供獨特的提示。這可以透過使用 Hugging Face Hub 上的資料集,或自行建立帶有中繼資料的本機 ImageFolder 來實現。
最小 SNR Gamma 加權
最小 SNR gamma 加權透過根據限制的訊噪比調整損失權重,平衡訓練過程中不同時間步的衝突。此方法對較大型資料集特別有效;建議的數值為 --snr_gamma=5.0。
訓練集策劃
高品質且多樣化的資料對 LoRA 的效能至關重要。主要建議如下:
- 臉部:使用高解析度影像,避免訓練集中出現其他臉部,並混合特寫與全身照,同時避免遠距離拍攝。
- 多樣性:確保光線、姿勢、背景與表情的多樣化,以提升模型的泛化能力。
- 先驗保留損失:使用真實肖像圖像作為正則化(而非模型生成的圖像),可減少語言漂移並維持寫實感。
實驗結果與基準測試
Hugging Face 在三個類別中進行了實驗,以驗證這些技術的有效性:
- 風格與角色(Huggy LoRA):關鍵微調的表現與完整文字編碼器訓練相當,甚至更佳。使用
snr_gamma=5.0以及 Prodigy 優化器的結果優於 AdamW。 - 風格(Y2K Webpage LoRA):此實驗顯示風格 LoRA 相較於角色 LoRA 更容易過擬合。必須調整
max_train_steps、repeats與train_batch_size,才能在概念捕捉與彈性之間取得平衡。 - 臉部(Face LoRA):實驗顯示 rank 為 32 為最佳;較高的 rank(例如 64)常會產生「空氣刷」般的外觀,皮膚質感較不真實。對於多樣化資料集,使用 120 倍影像數量的訓練倍率被證實有效。
推論與相容性
使用關鍵微調訓練的模型需要同時提供 LoRA 權重(*.safetensors)與訓練好的文字嵌入(*.safetensors)。
Diffusers 推論
在 diffusers 中,使用者必須先使用 pipe.load_textual_inversion 將嵌入載入至兩個文字編碼器(CLIP ViT-L/14 與 CLIP ViT-G/14),再以 pipe.load_lora_weights 載入 LoRA 權重。
ComfyUI 與 AUTOMATIC1111
訓練腳本會產生相容於 WebUI 的 LoRA 與嵌入。於 AUTOMATIC1111 中,使用者可透過嵌入 token 以及 LoRA 標籤來提示(例如 a y2k_emb webpage <lora:y2k:0.9>)。在 ComfyUI 中,LoRA 透過 LoRALoader 節點載入,嵌入則放置於 models/embeddings 目錄下。