[Lora] 訓練與大型翻車現場

說在最前面,這裡就是一堆訓練翻車現場,不用期待有什麼美女圖之類的。每天晚上花時間查文件、紀錄、測試小型模型,然後持續翻車。畢竟設備只有一組,說實在的如果用 Amazon Segamaker 可能可以省一點時間,其實就是花錢買時間,但是如果連續買到 12 次都翻車,那其實也蠻浪費錢的。

人帶賽的時候真的不能跑訓練。


訓練環境

首先,我基本上還是使用 Kohya 的圖形介面來設定參數,

bmaltais/kohya_ss

當然我也把他包成容器了,所以我在 [Docker] Kohya_ss GUI 設定 提到的已經被我棄用,直接使用自己封裝的省去一些套件相依性的問題也是不錯。


參數記錄

首先是 第一篇記錄 提到過的訓練集與正規化圖片(REGULARIZATION IMAGES)的準備。原本我天真的以為訓練集的圖片我可以提供一大堆高品質的照片,另外正規化圖片(REGULARIZATION IMAGES)就以訓練集的相關圖片去延伸。

但是,這就是一個翻車的開始。

Train
    + 100_ai-caline girl
        - 約 40 張圖片
    + 10_ai-caline girl portrait
        - 約 200 張圖片
    + 5_ai-caline girl full body
        - 約 1000 張圖片

Reg
    + 5_girl
        - 約 500 張圖片
    + 1_portrait
        - 約 2000 張圖片
    + 1_full body
        - 約 4000 張圖片

根據民間的不成文規則,正規化圖片(REGULARIZATION IMAGES)的數量,大約可以在訓練集圖片的 100 ~ 200 倍之間。但其實我沒有準備這麼多正規化圖片(REGULARIZATION IMAGES),所以你會看到 Reg 的部分有的遠小於那個倍數數量。

接著根據 上一次訓練失敗 的紀錄,又把一些參數給約略調整一下。

最終的結果就是連續翻車 12 次以上。

這麼多次的訓練中,只有 1 次是成功的
各種翻車的 loss 紀錄

訓練集

首先,訓練集當中所謂的品質,主要是你的精細度要夠,即便我們提供的是 768x768 的圖片,但最好你的圖片來源還是比較清晰的大圖,正所謂 縮圖無爛圖,所以訓練集的重點在於圖面的精細度要夠高。

後來我調整 砍掉重練 訓練集的圖片,讓他縮減到只有約 45 張上下,每一張照片的基本規則如下:

  1. 2000x2000 以上的原始圖檔,縮小到 768x768 的尺寸。
  2. 盡量選擇單純背景,其實不需要去背或是霧化背景
  3. 訓練人臉,盡可能整張臉都出現,側面不要太多,然後 請包含完整的頭部到肩頸
  4. 可以有半身或全身,但 不要太多,最多約總圖片數量的 5% ~ 10% 左右。

提示詞的部分,需要留意的地方有,

  1. 請描述表情,或是妝容(例如假睫毛)。
  2. 臉部或耳朵有任何配件,請一定要描述它(例如耳環)。
  3. 頭髮若有髮飾,請一定要描述它(例如髮夾)。
  4. 頸部若有遮蔽物,請一定要描述它(例如圍巾)。
  5. 眼睛看哪裡可以描述,BLIP 或 deepbooru 偶爾會出現 take a cell phone 之類的,他認為你的角色在看手機(或自拍動作),如果你畫面上真的有就可以保留,沒有的話請刪除它。
  6. 背景若有人物、較為複雜,請約略描述。

接著依照你想要的步數去計算約略的重複次數(Repeats),我懶得算直接用 50

Train
    + 50_ai-caline
        - 0000-01-1.png
        - 0000-01-1.txt
        - ... 共 45 張

接著,當你準備好提示詞之後,接著我們需要準備正規化圖片(REGULARIZATION IMAGES)。


正規化圖片(REGULARIZATION IMAGES)

市面上所謂的 100 ~ 200 倍於訓練集的數量,多數是使用 Dreambooth 的某些經驗法則(?),至於是不是真的要用到那麼大的數量?我實際測試過,最高以 20 張圖片,200 倍的正規化圖片(REGULARIZATION IMAGES)來看,基本上該翻車的地方還是會翻車。這邊的圖片準備,數量上確實要有一定的量,但是還是有幾個小地方需要留意。

  1. 請準備跟「訓練集」同類但不正相關的圖片。
  2. 請準備跟「訓練集」同類但不正相關的圖片。
  3. 請準備跟「訓練集」同類但不正相關的圖片。

何謂 『同類但不正相關』?假設你今天要訓練的是新垣結衣好了,那你所準備的訓練集就會是許多新垣結衣的照片。那麼,正規化圖片(REGULARIZATION IMAGES)則需要準備:

  1. 女生 但是不可以完全都是新垣結衣 的圖片。
  2. 可以是類似的肢體服裝,但不能完全一樣。

為什麼不能一樣?這個我後面一點會提到。

另外,由於新垣結衣是名人,而你所使用的訓練模型 或許 會認識 Yui Aragaki,所以在訓練集的提示詞中,若是大量提及 Yui Aragaki 可能會受到原始模型的污染。

在絕大多數的教學或是文章裡面,會告訴你使用 SD 的 Prompt 去產生正規化圖片(REGULARIZATION IMAGES),這是一個不錯的作法。市面上也有一些 Dataset 是使用這樣的方式去產生出大量的正規化圖片(REGULARIZATION IMAGES)來當作參考資料集。所以,在你準備好「訓練集」的同時,你就可以使用訓練集當中所做好的提示詞,用 SD 幫你大量產出正規化圖片(REGULARIZATION IMAGES)。

但是!

請確保你的正規化圖片(REGULARIZATION IMAGES)的內容有達到他的目的。

我在 [AIGC] Stable Diffusion with Lora 訓練記錄 有提到正規化圖片(REGULARIZATION IMAGES)的用意,我在這邊就不贅述。


翻車的 loss/epoch

loss 也沒有說越低越好,只要有約略在震盪收縮就可以了。

loss=NaN 精度溢位

會出現這種狀況主要有幾個方向可以查,

  1. 學習率過大。
  2. 梯度過大。
  3. 無法收斂。
  4. 髒數據。

通常來說,如果你依照市面上的教學來設定,基本上不太會遇到 1, 2, 3 這幾種狀況,所以最有可能的地方就是 4,也就是說,你所提供的不管是訓練集也好,正規化圖片(REGULARIZATION IMAGES)也好,就是資料有鬼所以把 loss 搞到爆炸。

請注意,loss=nan 並不會停止你的訓練,只是你訓練出來的模型都會是壞的。

loss 梯度爆炸
loss 梯度消失(其實還是有差異但幾乎學不到東西)

如果你像我一樣實驗性質的跑了很多演算法、各種學習率,那麼你可能就會遇到上面的那些狀況。最主要的還是說,市面上的作法並沒有告訴你訓練集跟正規化圖片(REGULARIZATION IMAGES)到底準備的數量,跟適合的學習次數等等。

所以,學習成效不佳好像也是很合理的事情。


翻車的 Epoch 與 Train batch size

大家都說 Train batch size 設定成 1 可以比較節省 VRAM,是的!沒錯。但是,相對的就必需要花更多的時間來讓訓練的結果擬合。換句話說,當你的資料集很大(包含你的正規化圖片(REGULARIZATION IMAGES))的時候,你的訓練輪次(Epoch)就不是什麼 12 次或 20 次這樣的數字了。換句話說,市面上所謂的訓練次數的甜蜜點,在資料量級不同的情況下,基本上都無法一體適用。

所以當我天真的以為增加 Epoch 開到 24 總會學到一點東西,但事實上,

跟之前學習失敗的狀況很類似

所以,經過多次測試的結果,其實 Train batch size 可以的話,維持在 2 以上會是比較好的選擇。至於 Epoch 的數量大概是 8 ~ 16 之間。

而上次所提及的 Gradient accumulate steps 則可使用 12,更高的數字對學習來說並沒有太大的影響,畢竟訓練集的資料相對少很多,所以梯度累加這件事情在這邊看不出多大的幫助。

當然,若你的機器允許,在 Train batch size 可以使用 4 會更好。這個數字大一些對於後續產出的模型相對穩定度會比較高一點。


翻車的優化器 Optimizer 與學習率

首先,優化器(Optimizer)的部分最優先的還是使用 AdamW8bit,至於 DAdaptation 有人說訓練二次元效果不錯,這個我就沒有著墨。我也有嘗試拿 DAdaptation 來訓練真人模型,至於結果如何就算了這樣。

DAdaptation 我也不是沒試過

學習率的部分,市面上的通用數據還是可以使用的,大抵上可以看 這一篇文章 關於 Learning Rates 的介紹。


訓練設定參考

我這邊所實驗出來的結果列出來給大家做一個參考,

Train
    + 45 張圖片
    
Reg
    + 4200 張圖片
  • 優化器(Optimizer)使用 AdamW8bit
  • Train batch size42
  • Epoch12
  • Learning rateUnet learning rate 使用 0.0002
  • Text Encoder learning rate 使用 5e-5
  • LR Scheduler 使用 cosine_with_restarts
  • Network Rank (Dimension) 使用 128
  • Network Alpha 使用 1
  • Gradient accumulate steps 使用 1
  • Prior loss weight 使用 0.15
  • Noise offset 使用 0.06

就結果論來說,其實已經相當接近,

Eular a, Step 30, CFG Scale 9, Lora Weight 1

如果利用 Additional Network 針對 UNet/TEnc 權重調整,搭配我最初的訓練模型,其實產出的結果也是相當不錯。

Lora 權重調和

小結

人帶賽真的不要訓練模型。

Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei