不久之前在 b 站青龍大的 影片 中,知道了複印法與差異法融合的概念。原有的複印法是一位 2vXpSwA7 提出,而差異法則是 Kohya-ss 作者所延伸出來的另一個作法。這兩種方法都很有趣,然後就開始實作這個部分。
複印法
複印法的來源是源自一個很熱門的 Lora,叫做 flat2。然後該作者就因為太熱門,所以就用 C 站的亂數名稱去申請了一個 Twitter 帳號(笑)。作者也在 Hugging Face 分享了大量他的測試 Lora,有興趣的人可以去看看。
複印訓練法的概念
首先,他是利用訓練 Lora 模型的特性衍生出來的一個概念。由於 Lora 本身的性質,是以基底模型與新的訓練集,比對特徵差異後,將那些特徵差異的向量壓縮保存在 Lora 裡面(這僅是簡易說明,實際上應該複雜的多)。所以,當我們在「套用」這個 Lora 後,SD 就會將這個 Lora 所帶有的「差異特徵」套用在所使用的模型上,然後做一個輸出的動作。
複印訓練法作者所寫的介紹文
那麼,根據訓練 Lora 的概念來看,假設,我們把訓練的「基底模型」,固定為某一種結果會發生什麼事情呢?這一件事情就是複印訓練法作者所做的部分。基於剛才所簡述的 Lora 保存差異特徵的概念,所以,當我們把 Lora A 融合到「基底模型」中,叫做「基底模型 A」,然後用「基底模型 A」去訓練另外一組,叫做 Lora B,會有什麼結果?
首先,請記得,根據 Lora 的特性,他是一種「差異特徵」,那麼,所謂的 複印訓練 為的就是要 提取 某一種特徵。
這就是複印訓練法的一個開始,所以,因為我們想要「複印」,所以,就得先準備一個 過擬合 Lora A ,然後將這個 過擬合 Lora A 融合到「基底模型」中,這樣我們就會獲得一個 過擬合基底模型 A,這樣一來,你若使用這個 過擬合基底模型 A 來產生圖片,他就會直接給你 過擬合 Lora A 的結果。
所以,在這個地方你就會獲得一個影印機功能的模型,他叫做 過擬合基底模型 A 。
複印訓練法的操作
根據我們剛剛所獲得的 過擬合基底模型 A,由於他已經是一個過擬合模型,所以無論你給他什麼提示詞、更換種子等等,他都會給你同樣的輸出結果。剛剛說了,他就是一台「影印機」的功能。所以基於這個「影印」的功能,我們就拿他來訓練另一個資料集,我們以下稱他為 資料集 B,他所訓練出來的就叫做 Lora B。
根據 Lora 模型特性,他會學習「基底模型」所沒有的差異特徵,那麼,在這個 過擬合基底模型 A 當中,你的 資料集 B 對於基底模型來說,所存在的差異就會保存在 Lora B 當中。所以說,當我們的 資料集 B 與 過擬合基底模型 A 訓練所保存下來的 Lora B 會是什麼呢?
首先,我們先直接看一個結果:
這只是一個很簡單的訓練,我僅使用了 5 張圖片來訓練,讓 T-shirt 上面有印上了「りしれ供さ小」的字樣。雖然文字的寫法可能略有錯誤,但因為訓練素材的關係,所以請暫時忽略這件事。這就是一個複印訓練法可以做到的事情。
首先,複印訓練需要準備的資料集,有兩組:
- 需要過擬合訓練的資料集 A。
- 需要特徵訓練的資料集 B。
由於採用的是影印機的概念,所以,我們所準備的資料集 A, B 需要完全相同,且 A 與 B 的差異僅在 你想要獲得的特徵 這件事情上面。根據我剛剛的結果,應該不難猜出我的訓練集的原始樣貌。
訓練集 A 的示意圖:
訓練集 B 的示意圖:
這樣,在根據開頭所提出的操作,你可以獲得一個特殊功能的 Lora B,這個 Lora 就可以在衣服上面寫字。
請注意,由於準備資料集與訓練過程的差異,寫字的效果並無法保證。
差異化融合
這個概念是 Kohya-ss 作者在 Twitter 提到的一個作法,
這個作法的操作方式基本上與複印訓練法的流程雷同,但第二個步驟不太一樣,
- 訓練 過渡擬合 Lora A。
- 訓練 過渡擬合 Lora B。
將這兩個過渡擬合的 Lora 利用工具將他們融合,融合工具有兩種,一種是一般的融合,另一種是 SVD 融合。這兩種工具在 Kohya-ss 作者所製作的工具中都有提供。
所以,當我們訓練好兩個 Lora 後,使用融合工具,可以達到類似複印訓練法的效果。我們直接來看結果:
這裡的操作,沒有圖形化介面可以使用,你必須在終端機中操作,
使用一般的融合方法,
python ./networks/merge_lora.py \
--save_precision bf16 \
--precision float \
--save_to /dataset/Lora_merged.safetensors \
--models "/dataset/Lora_B.safetensors" "/dataset/Lora_A.safetensors" \
--ratios 1 -1
使用 SVD 融合方法,
python ./networks/merge_lora.py \
--save_precision bf16 \
--precision float \
--save_to /dataset/Lora_svd_merged.safetensors \
--models "/dataset/Lora_B.safetensors" "/dataset/Lora_A.safetensors" \
--ratios 1 -1
--new_rank 4 \
--new_conv_rank 32 \
--device cuda
這兩種融合方式都略有差異,哪一種比較好我無法結論,效果的部分都是依照你訓練結果而定。當中的 --ratios 1 -1
的部分可以自行拿捏。
小結
複印訓練或差異融合,都可以用來製作特殊功能的 Lora,而目前最新的還有 ESD 相關的論文,與相關 Lora 訓練法被提出,我也還在研究當中,有興趣的人可以自行查閱。
LECO
LECOがやっていることを解説する
ESD Project Page
Erasing Concepts from Diffusion Models
青龍大也寫了一篇文章 完美炼丹术,差异炼丹法! 有興趣的人可以自行參閱。
我在 C 站也利用這些方法作了一些功能型 Lora: