淺談stable diffusion (四)

內(nèi)容若有缺漏和錯誤歡迎交流指正~?

近年來以openai為代表的AI公司一次次向我們展示了更大模型和更高參數(shù)的魅力,模型訓練規(guī)模一年年增長,效果一年年變強,讓人感覺到大就是正義,而大模型的天花板似乎還沒有被看到.......
Scale is All You Need
大模型更偏向工程領域,對于stable diffusion這種大模型,普通人以個人或者以小型實驗室為單位是很難從規(guī)模上做出突破的,這其實也是好事,說明AI領域正在一步步走向成熟。事實上,以Google為代表的大公司還是無私慷慨的,將自己訓練出的模型直接免費開源,還提供了Google Colab實驗平臺,國內(nèi)的百度也對標開發(fā)了AI Studio平臺,普通人可以從中獲取免費或低價的顯卡資源。尤其是最近幾年AI領域發(fā)展迅速,仿佛涌向未來的浪潮。
對于處于浪潮中的普通人,學會站在巨人的肩膀上思考才是最重要的,利用好大模型,保持對新知識的好奇和學習,掌握相關行業(yè)動態(tài),產(chǎn)生自己的靈感創(chuàng)意,大膽地去實踐。
Brain is All You need
夸夸其談就此結束,回到正題。
前三篇我們分別從整體,數(shù)學原理和實際操作淺談了stable diffusion的原理,經(jīng)過前幾篇的閱讀,我們對擴散模型已經(jīng)有了大概的認知。
stable diffusion(latent diffusion)出現(xiàn)后,得益于其開源和火爆,社區(qū)內(nèi)誕生了很多Fine-tuning(微調(diào))之類的工作,讓擴散模型的魅力進一步展現(xiàn),本文就圍繞相關工作展開淺談,順便填上前幾期的缺漏。
由于相關工作的發(fā)展速度驚人,筆者對這些方面不甚了解,若有錯漏,還望交流指正。
前篇-微調(diào)擴散模型
本篇很多東西在第二篇有過介紹,本篇將進行更深入的分析,并為下一篇的的訓練打下基礎。
Textual Inversion(Embedding)
中文名為文本反轉,該功能基于
An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion
原理
現(xiàn)有的圖像生成大模型可以很好地根據(jù)用戶的文本生成不同圖像,這種強大的生成能力能夠生成各種各樣的藝術創(chuàng)作,但是對用戶來說還是難以控制大模型的生成,用戶單單用自然語言很難傳達自己腦海中的需求。
再加上將一些原先模型沒有的新概念引入大模型是非常困難的,普通人無法承擔重新訓練的代價,而盲目的微調(diào)(Fine-tuning)可能導致大模型遺忘先驗知識(prior knowledge),所以常見的方法是將原來的模型參數(shù)進行鎖定然后添加更多層網(wǎng)絡結構來調(diào)整大模型。
本篇中只有DreamBooth的方法是在一系列措施下對原有模型調(diào)整(破壞)了權重,其余都是通過添加多層網(wǎng)絡且鎖定原有模型參數(shù)
文本反轉提出了個性化的文生圖方式(personalized text-to-image generation),可以根據(jù)文本和用戶給的幾張圖來生成新圖像。
讀過前面幾篇文章,我們已經(jīng)知道了文本經(jīng)過文本編碼器中被轉化為語義向量,那么在這一階段,我們試圖利用一個被我們創(chuàng)造出的偽詞(pseudo-words)來直接優(yōu)化這一過程。
淺談越來越深入了......保持克制
那我們就要搞清楚這一過程發(fā)生了什么
在文本編碼器中用戶輸入的字符串的每個單詞或者子詞經(jīng)過分詞器(Tokenizer)被轉換為token。
標記化(Tokenization )是計算機理解單詞的方式,人類可以讀單詞,但是計算機只能讀數(shù)字,這就是為什么下圖我們的token是數(shù)字
每個token通過一個字典(可以理解為的下圖Embedding Lookup)索引到一個對應的詞向量(embedding)。
這些詞向量是可以被訓練學習的,每個詞向量都對應著一個768維的向量(V1版本下)
我的們的偽詞(下圖的
)也化為對應的向量(下圖的
),然后和其他普通詞匯一同進入下一流程。
我們的偽詞實際上代表我們向大模型注入的新概念,就這樣和其他詞一起被處理。

文本嵌入和反轉過程的概要
那么我們?nèi)绾瓮ㄟ^學習訓練使得我們的偽詞()被轉化為的向量(
)真的能代表我們的新概念呢?
我們尋找了我們想要的概念在多種背景或者姿勢下的小組圖片(通常3-5張)
我們通過基于我們新概念構造的短語來生成新圖片,然后通過訓練使得我們通過新概念構造的短語生成的新圖片與我們找到的小組圖片盡量相符合
在這一個盡量相符合的過程中,我們模型就學習到了不同圖片的共同特征,那些不同的東西也在一定程度上被拋棄了
優(yōu)化目標為:
找到一個向量
使得我們的噪聲預測越準確越好
通過這個過程我們學習到了我們需要的向量(),而且我們并沒有影響其他詞語到對應向量的轉換,然后我們就可以利用我們新學到偽詞進行生成了。
使用
詳細流程
下載好的模型應放置于./stable-diffusion-webui/embeddings
點擊按鈕如下圖

顯示如下

這個嵌入式就是我們所說的文本反轉的選項,點擊你想要應用的模型即可自動在prompt處輸入
點擊生成

此外我們可以在生成后,對著預覽欄對應模型,點擊切換預覽圖,點擊后會在模型文件夾所在目錄生成同名的圖片


語法
我們創(chuàng)建的偽詞是和普通的文本一同遵守prompt語法的,我們在第三篇已經(jīng)有了完整詳細的介紹,我在此處只放出例子
我這里的心海和納西妲都是embedding
生成圖片,貌似心海老婆略勝一籌

我們按照AND的語法調(diào)整權重
生成圖片,納西妲老婆占據(jù)了上風

通過上文的原理,我們知道我們創(chuàng)建的embedding并沒有影響到其他詞的詞向量,所以可以被用于自然語言中
生成結果,非常成功的例子~

限制
因為優(yōu)勢因應用而異,所以這里只提限制
在高精度生成的方面可能會有限制
雖然能幫助生成相似圖片,但是是基于我們訓練出的V_*而生成,我們希望學習的東西的“本質”并沒有實際融入
學習一個新概念大概需要1-2小時
在V100上大概需要1小時,可能隨著后續(xù)發(fā)展縮短時間
在不同的模型上效果不一致,除非你們的模型是基于同一個大模型訓練的,所以很難重現(xiàn)效果
你不能在stable diffusion v1版本練出的embedding用于v2版本,因為文本編碼器使用的語言模型經(jīng)過替換。你可以通過上文的按鈕來查看你可用的embedding
Hypernetwork
中文名為超網(wǎng)絡,來自Novel AI的模型微調(diào)技術。
不要和通常的超網(wǎng)絡搞混了,我愿意稱這個為NovelAI Hypernetwork,但倆者在思路上是有共同之處的。
原理
該技術將一個小的額外神經(jīng)網(wǎng)絡附加到原來的模型上進行微調(diào),當然此時原來的模型參數(shù)是被鎖定了的。
具體附加到了我們穩(wěn)定擴散模型的噪聲預測器U-Net的注意力交叉模塊(cross-attention),具體的網(wǎng)絡通常是非常簡單的小神經(jīng)網(wǎng)絡。
通過之前的學習我們知道注意力交叉模塊正是擴散模型用條件(文本)控制圖像的地方

原始擴散模型的交叉注意力模塊
超網(wǎng)絡注入額外的神經(jīng)網(wǎng)絡參數(shù)來轉換鍵和值
由于附加的神經(jīng)網(wǎng)絡非常小所以訓練起來很快且不需要大量計算機資源。
Hypernetwork可以以LoRA的形式進行存儲,但是沒人寫腳本......因為一個東西長得像LoRA使用起來也像LoRA,那他就是LoRA
使用
詳細流程
下載好的模型應放置于./stable-diffusion-webui/hypernetworks
點擊按鈕,即可應用hypernetworks

你的超網(wǎng)絡的名稱將會被插入提示詞框,和文本反轉稍有不同,這種應用方式只是提示你開啟了這個超網(wǎng)絡,在實際生成時,這個提示詞將會被刪除再送入文本編碼器,所以你肯定是不能把prompt的語法應用在上面的。
<hypernet:vaedelicatecolcors_v10:1>
我們來生成試試
這里用到了提示詞矩陣(prompt matrix)的腳本

減弱效果試試

看著相當不錯哇~
語法
上述例子我們已經(jīng)講的很清楚了,此處再重復一遍
下面是超網(wǎng)絡的短語,
multiplier
可以影響效果強弱,置0就禁用了。
超網(wǎng)絡的短語并不是prompt,所以不適用prompt語法,自然也不適用于自然語言。
實際生成過程,超網(wǎng)絡的短語是被刪去了的,如以下例子可以很好證明,注意我此處的kokomi是文本反轉提示詞

限制
存儲體積大,相比文本反轉和LoRA系列
作用效果的控制力比較尷尬,作用范圍很難去掌控
不同模型上效果不一致
DreamBooth
中文名常被翻譯為夢幻照相館,我認為非常貼切。
It’s like a photo booth, but once the subject is captured, it can be synthesized wherever your dreams take you.
原理
以下原理主要側重于原本論文意圖

只需 3 張訓練圖像,Dreambooth 就可以將自定義主題無縫地注入擴散模型
其原理是擴展目標模型的text-image 詞典(其實就是文本編碼器部分),將新的文本標識符與特定主題或圖片進行聯(lián)系(其實就是訓了對應詞的詞向量),然后引導圖片生成
小數(shù)據(jù)集會導致過度擬合,而且茫然地擴展text-image還會導致語義漂移(language drift)
而DreamBooth則通過一些方式解決了這些問題:
為新的主題使用一個罕見的詞(是不是想到了文本反轉),避免語義漂移(可以理解為prompt撞車)
比如sks
保留同類的先驗知識,通過設計一個損失函數(shù),鼓勵擴散模型不斷生成與我們的主題相同大類別的不同實例(不要忘記之前的知識)。
看著是不是和我們之前講到的文本反轉(Textual Inversion)很像,請注意DreamBooth注入了一個罕見詞,且微調(diào)了整個模型,而文本反轉則是注入了一個新的關鍵詞,只微調(diào)了模型的文本嵌入部分。
此外在訓練時通常要給出你要訓練的提示詞+訓練集,和所在類的提示詞+所在類的訓練集,如果不給所在類的訓練集則會讓模型通過你給的類的名稱生成圖片作為所在類的訓練集。
以上說法根據(jù)最開始的dreambooth腳本,具體實現(xiàn)看你訓練腳本。
使用
一般而言,單純用DreamBooth進行訓練的模型都可以通過stable diffusion模型處進行切換。
使用過程中請使用你的模型在訓練時所用的提示詞,因為模型在訓練過程中也調(diào)整了文本嵌入層。
不排除某些訓練腳本鎖定了文本嵌入層,或者某些模型訓練畫風甚至都不需要先驗知識(所在類的訓練集)自然也不需要提示詞
限制
訓練過程相比其他方法更消耗顯存內(nèi)存。
體積大。
調(diào)整(也可以認為是破壞)了原有模型,可能會出現(xiàn)一些原模型沒有的缺點。
控制能力差(不能即插即用)
LoRA(Low Rank Adaption)
中文名也許是低秩適配,本文大概講講stable diffusion內(nèi)的LoRA。
原理
LoRA并不是擴散模型專有的技術,而是從隔壁語言模型(LLM)遷移過來的,旨在解決避免將整個模型參數(shù)拷貝下來才能對模型進行調(diào)校的問題。因為大型語言模型的參數(shù)量過于恐怖,比如最近新出的GPT-4參數(shù)量約為100 萬億。
LoRA采用的方式是向原有的模型中插入新的數(shù)據(jù)處理層,這樣就避免了去修改原有的模型參數(shù),從而避免將整個模型進行拷貝的情況,同時其也優(yōu)化了插入層的參數(shù)量,最終實現(xiàn)了一種很輕量化的模型調(diào)校方法。
和上文提到的Hypernetwork相同,LoRA在穩(wěn)定擴散模型里也將注意打在了crossattention(注意力交叉)所在模塊,LoRA將會將自己的權重添加到注意力交叉層的權重中,以此來實現(xiàn)微調(diào)。
添加權重是以矩陣的形式,如果這樣做,LoRA勢必需要存儲同樣大小的參數(shù),那么LoRA又有了個好點子,直接以矩陣相乘的形式存儲,最終文件大小就會小很多了,訓練時需要的顯存也少了。

!??!嚴格來說LoRA的名字指的是這種數(shù)據(jù)的存儲方式,實現(xiàn)方式與我們的目標有關,上文我們所說LoRA作用注意力交叉模塊的說法來自最早的LoRA訓練腳本的早期時候。
比如你以DreamBooth的方式進行微調(diào)的時候額外使用LoRA這種存儲方式,你得到的結果也是LoRA,這也是目前大部分魔法師口中的LoRA。
如果你的訓練方法中包含了正則化圖像訓練集,就可以理解為是DreamBooth的一種實現(xiàn)方式
你可以在網(wǎng)上找到
,自稱從LoRA演進的版本,貌似存儲的參數(shù)量更少,至于好不好用,不太好說。
使用
使用方法和Hypernetwork類似
我這里講的是官方用法,LoRA官方適配前還有插件提供了支持,用法稍微有點不一樣
詳細流程
點擊即可應用LoRA

我這個LoRA是訓練師口中的畫風LoRA,所以特定的prompt對LoRA作用能力雖然有但不是很強,以下仍然是例子:
雖然出現(xiàn)了大寫,但根據(jù)前面的學習我們是知道在如果我們文本編碼器使用clip那么大小寫是不影響的
首先是不帶LoRA短語,seed為3869586516

然后是帶LoRA短語,seed為3869586516

看著作用力很強啊?
但是我說指的是特定prompt作用力不是很強,可以看到這個LoRA的作用范圍詞是很廣的,比如我的a girl
即使沒有CARD和TAROT詞,也染上了塔羅牌的特色,而加上了CARD和TAROT等特定詞效果更是發(fā)揮完全,但是并沒有達到一詞質變的效果。
這個模型,一定的廣度提示詞都有特定圖集的效果,說不定這也是作者的意圖......
我們接下來找個其它的LoRA,要找到一個能在我的模型上發(fā)揮好效果的LoRA還是挺難的......

我們最終看到了上面這個,等等Trigger Words(觸發(fā)詞)是啥,之前沒有提到過這個,別急(我很急)
我們先來上個提示詞矩陣
不含LoRA版,種子520

LoRA版,種子520

可以看出不同的Trigger Words的效果差別很大,而且和無LoRA時相差很大,很好地把握住了作者想要體現(xiàn)的意圖,實現(xiàn)了所謂的Trigger(觸發(fā))的效果。
但是我們?nèi)匀豢梢钥吹?,即使是沒有Trigger Words我們的畫面仍然是被影響了,這可能是我的模型選用和作者不同的緣故。
這又是什么原理呢,我猜測這個LoRA正是我們之前提到采用DreamBooth方法進行訓練的,同時訓練了文本嵌入層和網(wǎng)絡層。文本嵌入層的實現(xiàn)使得Trigger Words的效果強烈,比如
在訓練時,將圖片分為incoming hug和imcoming kiss和倆者兼有三類,分別打上tag,即可使得Trigger words產(chǎn)生效果(原理接近文本反轉)。
但是我們注意到,這和文本反轉最大的不同是,我們只觸發(fā)了一種姿勢,而并沒有產(chǎn)生相應的原有圖片可能造成的特征,筆者認為這是在訓練過程中采用了更詳細的prompt來進行這一過程,接下來我將給出個例子
比如下圖的白毛,我們將其分到incoming hug一類,并為其打上tag

這時我們的incoming hug
就會開始學習這個白毛,但是我們是不想這個詞學習到白毛或者是這件衣服,
所以我們對打上的tag進行了修改,下面的中文只是我不想打對應英文
這樣由于在訓練過程中,其余詞對模型來說是常見的詞都能對應上,incoming hug將會學習到靠近的擁抱這一姿勢,而不是把衣服也學習到,不斷地這樣訓練,我們的incoming hug最終會成為靠近的擁抱這一姿勢的觸發(fā)詞。
不知道你理解到其中的關鍵之處沒,如果你理解到了,其實可以推出我們在構建這個修改后的tag時,需要把我們不想要觸發(fā)詞包括進去的元素(比如上圖的白毛),盡量用模型已知的詞語進行替代(比如white hair),而觸發(fā)詞要盡量罕見(比如diffusers喜歡用的sks)才能和模型以前的這個詞對應的元素進行分離(夠罕見的話,原模型的對應元素很少),當然如果你只是想加強或修改原模型對應觸發(fā)詞的元素(比如我想加強ganyu),你可以選擇原模型該元素的對應詞(直接選擇ganyu作為ganyu圖片觸發(fā)詞)。
那么一個問題的關鍵是,我們怎么知道什么樣的詞是罕見詞,什么樣的詞是模型應該已經(jīng)知道了的詞?
你是否想到了Clip和DeepBooru,我們可以輕松通過這倆知道模型已經(jīng)知道的詞
注意只有基于Novelai泄露的模型才對DeepBooru效果好

那么上圖經(jīng)過詢問DeepBooru得到
很好地概況了圖片的特征,此時我們需要把靠近的擁抱這一姿勢相關的詞刪掉,避免我們的觸發(fā)詞的效果被這些詞搶去了,我決定刪除以下的詞
得到
然后增加我們這個被稱為觸發(fā)詞的東西(incoming hug),他將會搶占被我們刪除的詞語對應的元素,最終是這個
刪詞還是挺累的,估計有美術細菌的東西能更好把握這種東西。
當然,以上只是我基于原理的純粹推理,這個作者究竟是做了怎樣的處理,我也無從知曉。
總之通過這種方式,我們其實能在文本嵌入層做出遠比文本反轉更加眼花繚亂的操作。
與此同時由于我們還訓練了網(wǎng)絡層,使得即使沒有這倆詞我們的圖片也會產(chǎn)生變化。
雖然dreambooth方法使用了設計好的損失函數(shù)盡量避免先驗知識的損失,但是是針對原模型的,我的模型和作者不同,不能很好地體現(xiàn)這一點。
限制
效果弱于DreamBooth,主流的訓練方式的網(wǎng)絡結構目前在盡量追求DreamBooth的效果,但是具體效果是很多因素影響的。
成分復雜(你不知道你的LoRA究竟是用哪種網(wǎng)絡結構訓練出來的,LoRA的方式訓練確實太好用了),用前建議鑒別來源。
控制力弱(雖然即插即拔,但是LoRA訓練方法混亂,訓練成品良莠不齊,很難有效把控)
不同模型效果不同
ControlNet
我的回合,抽卡?。?!
不好意思,走錯片場了。
作者Lvmin Zhang真的了不起,2021年才本科畢業(yè),目前博一已有多篇工作,還在空閑時間開發(fā)了熱門游戲YGOPro2,是真正的時間管理大師。
原理
ControlNet 是一種神經(jīng)網(wǎng)絡結構,通過添加額外條件來控制擴散模型。

展示了將ControlNet應用于任意神經(jīng)網(wǎng)絡塊的方法。x,y是神經(jīng)網(wǎng)絡的深層特征?!?”表示功能添加?!癱”是我們要添加到神經(jīng)網(wǎng)絡中的一個額外條件。“zero convolution”是一個1×1卷積層,權重和偏差都初始化為零。
ControlNet將神經(jīng)網(wǎng)絡權重復制到一個鎖定(locked)副本和一個可訓練(trainable)副本。
可訓練副本將會學習新加入的條件,而鎖定副本將會保留原有的模型,得益于此在進行小數(shù)據(jù)集訓練時不會破壞原有的擴散模型。
可以看到使用了零卷積(zero convolution), 這樣做的好處是可以以0值初始化,卷積權重會以學習的方式從0開始增長到優(yōu)化參數(shù),所以在訓練的初始階段(訓練前)不會影響原模型,所以不是從頭開始訓練,仍然屬于微調(diào)(fine-tuning)。
這種結構也方便我們對模型/權重/塊/層進行合并/替換/偏移。
以下為ControlNet在stable diffusion中產(chǎn)生作用的過程
根據(jù)前幾篇我們對stable diffusion已經(jīng)有了初步了解,但是為了理解ControlNet我們?nèi)孕枰偕晕⒉溥M去一點。stable diffusion的U-Net結構如下圖所示,包含12個編碼器塊(Encoder Block),12個解碼器塊(Decoder Block),還有一個中間塊(Middle),完整模型包括25個塊,其中有17個塊是主塊。文本使用clip進行編碼,時間步長采用位置編碼。
我們將上圖的簡單結構附加在stable diffusion 原來的U-Net結構上14次(相當于復制了一次編碼器塊和中間塊,然后改造成ControlNet結構),就完整地對原有的結構進行了控制(影響),原有的stable diffusion 就化身為了 stable diffusion + controlnet
實際上筆者認為不一定要復制stable diffusion的塊結構,可以是任何結構,作者選擇stable diffusion的塊結構大概是因為SD的塊已經(jīng)經(jīng)過實踐檢驗了,作者認為這些塊是深厚、堅強、強壯、有力的主干(deep, strong, robust, and powerful backbone)
好吧,要是自己弄出的塊比stable diffusion好還搞微調(diào)干什么,直接重練算了
原諒我打字累,我下文以SD-T來指代stable diffusion + controlnet

然后SD-T就可以繼續(xù)嘗試用特定數(shù)據(jù)集來訓練學習新東西來試圖完成我們想要模型完成的新任務,比如邊緣檢測,比如人體姿勢探測,整個過程流暢,順滑。
這是SD-T的損失函數(shù),可以看出是在SD的基礎上增加了新的控制條件
等等,為什么這樣就能做到?
SD-T既能做到邊緣檢測,又能做到涂鴉檢測,而且是在一統(tǒng)的架構下進行的,多種任務只需要一種解決方式,這......也許就是大模型+優(yōu)秀結構的魅力吧。
所以一句話概括就是,ControlNet是一種新型的大模型訓練微調(diào)機制,而且效果非常好
論GPT-4是如何碾壓其他的模型
實際的生成流程中的步驟
ControlNet通過獲取額外的輸入圖像并使用Canny邊緣檢測器(Canny edge detector)來獲取輪廓圖,這一過程被稱為預處理
輪廓圖(自然是會被處理到隱空間去)將會作為額外的條件(conditioning)和文本提示被送入SD-T
由于SD-T進行擴散時參考了我們多出來的條件,所以最終出現(xiàn)的圖會具有我們預處理時的特征

T2I-Adapter原理和ControlNet相似,都是為了給穩(wěn)定擴散添加額外的輸入條件,我也就不再介紹
使用
安裝
因為ControlNet基于SD1.5模型二次訓練,用于其他模型需要進行偏移(至少效果不會更差),所以建議在插件下使用。
安裝webui插件sd-webui-controlnet

此外我們還需要下載進行預處理的模型和SD-T模型,預處理的模型會在你使用時自動進行下載
SD-T模型太大需要自行下載,但是我們無需下載我們模型專用的SD-T,因為插件會在使用時自動根據(jù)你的模型進行偏移操作。
但是SD-T有點大,所以插件也提供了用SD-T 減去SD得到T (或者從SD-T 提取 T)的 修剪模型(T)。
上面這個描述不太準確,意思意思~
原SD-T

修剪后的T,5.71GB --> 723MB

所以是要下載原來的SD-T還是T就看你的硬盤/內(nèi)存和顯存了
以下是原SD-T模型地址
Pretrained Models: https://huggingface.co/lllyasviel/ControlNet/tree/main/models
以下是修剪后的模型地址(里面也有預處理模型)
Pre-extracted model: https://huggingface.co/webui/ControlNet-modules-safetensors
Pre-extracted difference model: https://huggingface.co/kohya-ss/ControlNet-diff-modules
模型下載后放在./extensions/sd-webui-controlnet/models/ControlNet/
預處理模型文件下載位置./extensions/sd-webui-controlnet/annotator/xxx對應文件下/
詳細流程
只是給一個簡單的例子
點擊ControlNet,展開了頁面

點擊上傳圖片并啟用

點擊這個可以預覽預處理結果


點擊生成

效果不錯,完美對應上了結構,就是線條太惹眼了,是什么問題造成的呢,可以看到我們預處理時分辨率太低了,對于我們生成的圖來說線條太粗(對應到隱空間也是如此)。
我們再來詳細看下設置
反色模式
用來幫助檢測器在白色背景下進行識別
RGB格式法線貼圖轉BGR
檢測器是基于opencv?這項筆者尚不清楚
低顯存優(yōu)化
無提示詞(prompt)模式(需在設置中啟用"基于CFG的引導")
看來是屏蔽掉prompt的引導,因為ControlNet添加了新的條件,所以即使是沒有prompt同樣能實現(xiàn)CFG(隱式分類器指導)。
預處理器
模型
? ? ? ?模型應該和預處理器有對應關系
預處理器分辨率
? ? ?預處理圖片的分辨率有關
強/弱邊緣判斷閾值
邊緣檢測器用來檢測邊緣的范圍條件
縮放模式
畫布高寬
那么很明顯,我們應該調(diào)整預處理器分辨率,調(diào)高一點,試試1024

效果非常棒!
限制
個人很難訓練
前篇的總結
關于stable-diffusion我上面只講了幾個最近熱門的微調(diào)方法,
但是我們其實能看出其中驚人的相似性,
普遍的做法是凍結了原模型的參數(shù)或者大部分參數(shù),然后在外部增加新的網(wǎng)絡結構,
通過額外的數(shù)據(jù)集來訓練外部網(wǎng)絡結構,最終可以利用外部網(wǎng)絡結構的參數(shù)影響原模型。
本質思想和Hypernetwork(廣義上的 超網(wǎng)絡,不是指的Novelai那個)非常接近。
我覺得這些工作還是具有啟發(fā)性的,尤其是文本反轉非常有趣
未來大模型會出現(xiàn)諸如此類的小方法,將大模型通過較低的成本個性化,專用化。
中篇-具體的微調(diào)訓練
得益于社區(qū)的飛速發(fā)展,現(xiàn)在的訓練方式可謂多種多樣。
普通用戶可以在本地通過消費級顯卡通過高度封裝的腳本快捷訓練,比如
也可以在云端如colab或者飛槳平臺通過
或者 提供的腳本在免費的專業(yè)顯卡上訓練B站上也出現(xiàn)了各式各樣的教學視頻
筆者本身也并不是模型訓練師,只是對stable diffusion感興趣的人,所以講解將不會出現(xiàn)豐富的經(jīng)驗教訓,
而是盡量結合前篇的原理和訓練教程為例,來拋磚引玉
在進行本篇前我希望你能盡量了解一點基礎知識
基礎知識
數(shù)據(jù)集處理
literation
使用一個Batch(批)的數(shù)據(jù)進行一次權重更新就是一個Ilteration
batch size
每個Batch里包括了多少個訓練集的數(shù)據(jù)個數(shù)
epoch
epoch可以理解為次數(shù),整個訓練集被完整練了一遍就叫1個epoch
learning rate
學習率,煉丹就像炒菜,學習率過高就像炒菜火開大了就會很快導致菜糊了(過擬合)然后前功盡棄,不好把握菜什么時候好。而低學習率就會導致火太小了,很久才能把菜弄熟。
所以適當?shù)膶W習率+適當?shù)拇鏅n頻率才是煉丹的訣竅。
泛化
泛化通常指模型遇到新概念或者新情況時仍能有效應對的能力。
過擬合
模型在訓練集上表現(xiàn)好,測試集上表現(xiàn)差就叫過擬合。
其原因是因為模型訓練過度,導致模型學習了我們并不需要模型學習的特征(噪聲)。
正則化(Regularization)
控制理論有個著名的詞匯----魯棒性(robustness),是一個日語音譯詞匯,用來描述一個系統(tǒng)或模型在噪聲下的穩(wěn)定性。
筆者最初見到這個詞時后面沒有跟著英文,當時可謂大眼瞪小眼,關鍵這個詞在很多領域都經(jīng)常出現(xiàn),我常常想要是魯棒性翻譯成健壯性會不會讓非相關領域或者初次見到這個詞的時候能好理解一點。
筆者最初接觸正則(regular)時也是一頭霧水,后來查了下英文是規(guī)則,規(guī)范,約束之類的含義......
regular,英文單詞,形容詞、名詞、副詞,作形容詞時意為“定期的;有規(guī)律的;合格的;整齊的;普通的”,作名詞時意為“??停徽疥爢T;中堅分子,人名;(以)雷古拉爾”,作副詞時意為“定期地;經(jīng)常地”。
為什么翻譯成正則?正則一詞出自楚辭,意為正其禮儀法則。正則這個詞對國人來說門檻不可謂不高哇。
筆者認為也許是有傳統(tǒng)文化素養(yǎng)的日本太君發(fā)揚光大了“正則”然后傳入中國。
《楚辭·離騷》篇有“皇攬揆余於初度兮,肇錫余以嘉名;名余曰正則兮,字余曰靈均”。 馬茂遠《楚辭選》注:“屈原名平,字原?!齽t’,是闡明名平之意,言其公正而有法則,合乎天道”
那么正則化(Regularization)的中文意思可等同于規(guī)則化/約束化?;诖朔N翻譯,如果我們要讓一個東西變得規(guī)則化,那么我們通常會選擇添加規(guī)則(約束),這也就是正則化的過程。
通常我們所說的正則化就是對最小化經(jīng)驗誤差函數(shù)加上約束,而這樣的約束可以被解釋為先驗知識。
正式訓練
說在前頭的話
上面所說的原理和實際的訓練流程可能有出入。
因為微調(diào)本來就是一件個性化的事,加之微調(diào)方法也沒有怎么才是好,沒有誰最好的標準。
不同的微調(diào)訓練的腳本的實現(xiàn)方式不盡相同,但具體的使用不會離開原理。
此外我更建議使用diffusers庫進行訓練
訓練提速(可選,截止2023.3)
安裝torch1.13.1+CUDA11.7+Xformers0.0.16 (推薦,懶人選擇刪掉venv文件夾重新安裝依賴)
安裝torch2.0+CUDA12.0+Xformers0.0.18 (建議有基礎的人選擇)
(webui拓展插件)
自行安裝,自行解決環(huán)境問題
這里還是提一下大部分設備可以通過這倆條命令解決環(huán)境問題,注意是在所在虛擬環(huán)境下
我看得最順眼的一個訓練GUI
而且提供了很多非常棒的功能。
提供了LoRA和LoRA Extended
提供了一系列數(shù)據(jù)集處理腳本
提供了一系列優(yōu)化器選項
同類圖像生成的精細控制
全選項講解
創(chuàng)建模型選項卡

我們通常使用的stable diffusion的模型通常是集合了很多模塊的權重到一起,包括vae,unet,text-encoder之類,DreamBooth插件會將其分開,方便我們進行更加個性化的訓練。
這個選項卡用來從已有模型創(chuàng)建你的模型。
Name/名稱 ,隨便填
Create From Hub ,如果點擊就會出現(xiàn)下列選項卡,填入HuggingFace的模型路徑和Token(如果是私有模型),就可以直接下載并應用,非常方便在云端訓練的同學

512XModel,應該是指的是你要訓練的模型分辨率,應用后就是512X512,如果你想選擇768X768就不要選中這個,如果你想訓更高分辨率我只能祝你好運~
Extract EMA Weights/提取EMA權重,針對的是非修剪版本模型,可以把EMA權重提取并替換,應用后你的非修剪版本模型等同于修剪版本模型被訓練
Unfreeze Model/不凍結模型,一個非常重要的選項,說明該插件可以凍結原模型參數(shù)(可能只是凍結了部分),代表著我們實際訓練時更新的參數(shù)更少,花費的計算機資源也更好,適合低配玩家開啟。但是這也代表著效果可能不如不凍結的情況。建議擁有高顯存的玩家考慮選擇。
選擇模型選項卡

這里可以選擇你想訓練的模型,并可以選擇從快照中恢復訓練,不得不說不愧是是專業(yè)搞訓練的涅~
還可以看模型的參數(shù),比如訓練了多少Epoch或者是是否含有EMA,和模型源。
模型/Model,選擇你要訓練的模型
Snapshot to Resume/從快照中恢復,大概就是把以前的模型撿起來繼續(xù)練,非常重要的選項,可以讓我們有更精細的訓練方案。
Settings選項卡

應該是最重要的選項卡了,在這里可以調(diào)整具體訓練參數(shù)。
老規(guī)矩一項項講
Performance Wizard (WIP),最重要選項,根據(jù)你顯存自動調(diào)整訓練參數(shù),萌新按這個就對了
Use LORA/用LORA方式訓練,使用LORA方式訓練肯定是降低了訓練消耗的,因為更新的參數(shù)量較少,也因此效果會有所下降,點擊后會出現(xiàn)Use Lora Extended,LORA的拓展版應該是增加了更多的可訓練參數(shù),所以效果也許更好,但是與此同時需要的計算機資源會增加。

Train Imagic Only,應該是一種特殊的微調(diào)方式,根據(jù)介紹可以用一張圖進行訓練,應該涉及的參數(shù)量更少。
Training Steps Per Image (Epochs)/每張圖訓練多少次(訓練多少epoch)
Pause After N Epochs/每N個epochs暫停,不是吧啊sir,真有人拿顯卡當老婆,沒拿顯卡挖礦就好了,還想停下?
Amount of time to pause between Epochs (s)/每次暫停暫停多少秒
Save Model Frequency (Epochs)/每多少個Epochs暫停一次,如果SSD足夠大就把這個值盡量減小,防止炸爐后重練,默認為25
Save Preview(s) Frequency (Epochs)/每多少個Epochs生成一張預覽圖,默認為5
Batch Size/每批數(shù)量,小顯存建議一批1張,我之前用A100訓練時是一批16張(從零開始ldm)
但是batch_size的大小會對最終模型穩(wěn)定性有影響,batch_size越大,更新的loss越平穩(wěn),batch_size大于某個臨界點后會導致模型泛化能力下降
Gradient Accumulation Steps/梯度累加步數(shù),時間換空間的選項,增加就相當于增加了Batch Size(倍數(shù)級)
大多數(shù)情況下,采用梯度累加訓練的模型效果,要比采用小batch_size訓練的模型效果要好很多。
你要注意你的訓練集數(shù)量應該需要被Gradient Accumulation Steps X Batch Size的積整除
Class Batch Size/類每批數(shù)量,類所在的圖像的處理的每批數(shù)量
Set Gradients to None When Zeroing,一個優(yōu)化顯存占用的選項,建議開啟
Gradient Checkpointing/梯度進度記錄,我記錄這么細干嘛,不開!
Learning Rate/學習率,建議按默認的來,容易過擬合就調(diào)低,事實上非常容易過擬合
如果你調(diào)高batch size之類的,可以調(diào)高學習率(倍數(shù)級),研究表明更大的學習率有利于提高泛化能力
Learning Rate Scheduler/學習率調(diào)度器,更自定義的學習率設置,建議按默認的來
Image Processing/圖像處理,這里可以限制一下最大尺寸
Apply Horizontal Flip/引用水平翻轉,常見的使訓練集翻倍的手段
如果你訓練人物或者是不具有對稱性的物體,我強烈建議你不要選
Use EMA/使用EMA算法,雖然我覺得對于diffusion沒啥用,詳見第三篇,可以開,開后需要更多顯存
Optimizer/優(yōu)化器,你可以將其稱為訓練獅,在訓練時應用各種優(yōu)化,不同訓練獅有不同的個性,這個還是比較難把控的,建議多磨合就知道它的脾氣了,萌新保持默認
Mixed Precision/混合精度訓練,B/FP16能開就開,大戶人家無所謂,保持默認
Memory Attention/內(nèi)存注意,保持模型
Cache Latents,消耗一定顯存提升訓練速度
Train UNET,貌似不開是鎖定的文本編碼器?
Step Ratio of Text Encoder Training,貌似會影響文本編碼器的訓練程度,置0能進一步降低顯存占用
數(shù)值0.7會適合人物,0.2會適合風格
Offset Noise/噪聲偏置,給給訓練出來的模型更高的色彩自由度,這個選項是新加入的,可以選0.1,保守主義者選擇低點,具體原理文末會介紹
Freeze CLIP Normalization Layers,這選項我不好說
Clip Skip,玄學選項,你想玄學就真人選1動漫選2
Weight Decay,我猜也是玄學選項
Max Token Length,這幾個選項可以看第三篇,我覺得可以保持默認
Prior Loss/先驗損失,DreamBooth特色,但是我覺得可以保持默認
高階選項,不建議動。
Concepts選項卡

最影響效果的選項卡,在這里設置你想訓練什么,訓練時是否/如何使用class image,訓練時的樣本圖像如何生成之類。
最上面的Wizard 可以快速幫你調(diào)整到最適合人物或畫風的選項,按就對了
Concept1-4,一個概念就是一個concept,可以同時訓練多種
數(shù)據(jù)集/classimg目錄
Tokens,我看了一下官方介紹,如果下面的Traning Prompt使用[filewords]時,作用更像是個查找/替換腳本,把classimg對應的提示詞的Istance Token(目標提示詞)替換成 Class Token。
Traning Prompt,中文翻譯已經(jīng)很詳細了
Sample Prompts,生成樣本的設定
class image Generation,生成所在類圖像的設定,數(shù)量設定為0則不適用類圖像,非0時先會檢測類圖像目錄是否含有目標類圖像,沒有就會使用模型自動生成對應數(shù)量的圖像。
Saving選項卡

選擇模型訓練時的保存方式
這個直接看名字就能得出其含義
理論上當你SSD足夠大,保存越頻繁越方便。
Generate選項卡

這里可以生成示例圖像,或者生成類圖像,可有可無的功能吧
Testing選項卡

非常有意思的部分。
Deterministic/確定性,我猜會固定訓練時的隨機種子
Use EMA for prediction,訓練預測時使用EMA
Calculate Split Loss/計算分割損失,目前筆者還不知道指的啥
Use TensorFloat 32,A100的用戶可選,理論上加速訓練
Noise scheduler,重點來了,我們知道stable diffusion已經(jīng)有好幾種加速采樣的方法了,其實是出現(xiàn)了對擴散過程的不同的可解析的詮釋,比如用到了電動力學的ODE之類,這里不詳講。那么訓練方法同樣可以應用改進或者更快的方式,事實也是如此,但是學術界目前始終喜歡DDPM或者DDIM,這也讓我十分不解。
畢竟DDPM或者DDIM已經(jīng)經(jīng)過了大模型的驗證
而新的方法總是伴有不確定性的,比如你前向加噪的過程縮短了,那么圖片中的低頻信息是否能保證有效破壞
Bucket Cropping,幫助數(shù)據(jù)集圖片裁剪,一般不用這個
筆者的個人訓練私貨
筆者從早期的原始dreambooth到現(xiàn)在的各種技巧混合訓練的方法
可以看出發(fā)展還是很快的,但是其核心始終沒有變動
數(shù)據(jù)集始終是最重要的!??!
數(shù)據(jù)集始終是最重要的?。。?/p>
數(shù)據(jù)集始終是最重要的?。?!
沒有夸大,學習的各種選項都可以在后面微調(diào),但是數(shù)據(jù)集直接決定了你微調(diào)的模型的上限。
過擬合就降低學習率,提高模型保存頻率和生成樣本頻率。
找到一個合適步數(shù)的范圍,直接加載附近步數(shù)的模型然后使用較低學習率去尋找最好的擬合。
不同數(shù)據(jù)集不同訓練方法不同參數(shù),需要的學習率不一樣,大膽嘗試記錄,很快就能找到適合自己的。
如果懶得找就直接按教程或者默認參數(shù)

以上的Faruzan的圖片數(shù)據(jù)集來自原神游戲截圖,不包含任何畫師作品,不用作商業(yè)用途,不用于違法用途,只做教學,不包含色情或暴力要素,若讓你感到不適或者侵犯到個人的合法權利請聯(lián)系我刪除!
對于萌新來說,練游戲角色成功率和數(shù)據(jù)集搜集速度是最高的,如果你有3D軟件導入模型或者某些不可名狀的游戲,那么搜集數(shù)據(jù)集對你來說應該不是很難。
sd-scripts(貌似github上星星最多)
日語倉庫啊......苦手
提供了embedding、dreambooth、lora等的訓練方法
但是我看了看其選項與上面的插件差不多,所以略過。
后篇-模型熱門插件

由于社區(qū)發(fā)展太快了,我建議每次使用前都檢查更新,筆者2天不檢查更新就有很多插件落后版本了。
multidiffusion
有中文說明的插件...、
功能包括:
Tiled Noise Inversion
Tiled VAE
Tiled Diffusion
看了一下,基本上算是目前最強的生成大型圖片的插件
原理上沒什么突破,官方已經(jīng)給出了中文說明,我不再贅述
https://github.com/pkuliyi2015/multidiffusion-upscaler-for-automatic1111/blob/main/README_CN.md
常見疑惑
關于LoRA與DreamBooth
LoRA的名稱更側重于訓練時參數(shù)利用低秩矩陣這種方式。
而DreamBooth的核心是使用一個經(jīng)過設計的損失函數(shù),通過訓練所在類的圖片,達到小數(shù)據(jù)集也能產(chǎn)生良好的效果的場景。
具體的實現(xiàn)方式因腳本而異,倆者結合也未嘗不可。
關于正則化圖像
貌似sd-scripts倉庫是訓練時使用正則化圖像的出處,說實話這個正則化圖像的命名是我不太能理解作者意圖的,如果是表示為引入先驗知識,那么diffusers庫的“CLASS_DIR”或者“Classification”是珠玉在前(不懂日語,也許日語把class翻譯成正則)。
但是sd-scripts中的dreambooth訓練時正則化圖像和我們上面所說的類的圖像(Class_image)作用是相同的,所以作者也許是想表達這個意思。
那么訓練dreambooth使用的類的圖像最好是模型生成的圖像,因為dreambooth原意圖是為了保留模型原有的先驗知識,比如我想要訓練“1girl,red eyes”,那么我們的類圖片就要選用”1girl“,這樣就能一定程度上避免”1 girl“被我們的訓練污染。
比如1 girl只能生成1girl,red eyes的情況,多樣性大大降低。
顯然作者在訓練的正則化圖像文件處沒有說明這一點(不會日語,機翻看的大概,還沒看代碼),然后導致了一些up主的誤解或者是中國社區(qū)一些同學的誤解。
如果正則化圖像指的是dreambooth的類的圖像概念(Class_image)且使用了同一個損失函數(shù)(prior preservation loss),當在正則化圖像使用真實圖片或不是模型生成的圖片,其實是相當于使用圖片調(diào)整了整個模型的權重,有沒有起到保留先驗知識的作用不好說,但肯定是更改了原有模型的權重。
其效果大概相當于倆種數(shù)據(jù)集都練了一遍,雖然說深度學習的訓練很玄學,但這也太玄了,筆者不建議這樣做
那么關于正則化圖像的處理方法就很自然地
如果選擇的是所在類的圖像,可以直接以類的名稱作為圖像標簽訓練,也就是說我們只是盡量不想破壞(污染)所在類的圖像的名稱對應的元素。
如果是選擇的所在類的圖像,但是其中的圖像各自之間也是有較大變化的,我們想要守護更多先驗知識,那么就給正則化圖像的每個圖片也打上tag(具體可以參照前篇的處理,只是不需要設計觸發(fā)詞),這樣我們就做到了盡量不破壞原有的模型效果。
如果使用的不是所在類的圖像而是非模型生成的圖像或是其他類的圖像,雖然我覺得這種做法非常災難,但是一些做法也能達到部分目的。首先就是要詳盡地打tag,這樣就是多個tag分擔了你行為帶來的影響,且要避免你選擇的正則化圖像影響到了你真實想要訓練的圖像的觸發(fā)詞,千萬千萬不要把觸發(fā)詞往正則化圖像打(假設你的正則化圖像和訓練集圖像是不相關的東西),但最后這樣的操作也就相當于訓練了兩遍模型。
關于觸發(fā)詞
說實話我沒在任何訓練倉庫里沒有找到我想要的Trigger Words(觸發(fā)詞?),我懷疑是訓練獅里生造的詞,請問訓練獅們有相關論文嗎?
觸發(fā)詞我猜是DreamBooth的“identifier”(標識)概念的衍化,前面原理我們講到,DreamBooth為在小數(shù)據(jù)集上訓練,為新概念設置了一個罕見詞,那這個罕見詞就是“identifier”。
原diffusiers庫喜歡
sks
這個詞,足夠罕見能作為identifier訓練時采用
sks dog
作為訓練集的提示詞,用dog
作為所在類的訓練集的提示詞訓練好了后,
sks dog
就能很好得展現(xiàn)我們的訓練效果,而dog
一詞卻不受影響
所以為什么這個“identifier”能發(fā)揮作用呢,你是不是想到了我們前面的文本反轉的原理,DreamBooth和文本反轉一樣是訓練了文本嵌入層(默認),其原理是類似的,下面我們就來分析sks dog
在文本嵌入層發(fā)生了什么。

我們目標訓練集的提示詞sks dog
首先來到了分詞器,由于sks
是一個罕見詞,分詞器將其分成了可以理解的分詞,為了方便理解我們假設只分成了一個分詞,然后分配了token,然后通過字典找到了對應的詞向量?,而我們的
dog
由于分詞器很熟悉了,輕易就分配了token并找到了對應詞向量然后看看我們做了什么,我們開始了訓練,在文本嵌入層我們的
和
通過我們的目標訓練集的圖片影響,對應的詞向量改變。
然后我們的類的訓練集的提示詞dog
來到了分詞器,和上面的dog
一樣分到了詞向量,然后
在訓練時受到了我們類的訓練集的圖片的影響,對應詞向量改變。
這樣不斷地反復,最終我們的和
掌握了我們目標訓練集的特征,而
依舊是掌握著類的圖片的特征,受到目標訓練集的影響較小。
那么我們在生成時只要包含了和
所對應的提示詞,不就能很好地把我們訓練集特征展現(xiàn)嗎
以上的例子只是發(fā)生在文本嵌入層的一個不準確的例子,旨在幫助理解,程序正義勿噴
那么此時V_x所對應的提示詞,我們這個例子里是sks
仿佛就有了“identifier”(標識)的作用,有sks
就有目標訓練集的特征,而沒有就基本不會影響原模型的多樣性,擁有了良好的特性。
從這里也其實希望能增強你dreambooth中使用類的圖片的重要性的理解
這個“identifier”(標識)一定程度上也可以理解為觸發(fā)器,生造一個所謂的觸發(fā)詞(Trigger Words),其實也不算離譜,意思到了的。
那么我們?nèi)绾巫龀鰞?yōu)秀的觸發(fā)詞其實就很容易理解了
首先一定要觸發(fā)詞一定要濃縮簡短,其次訓練時盡量用其他模型已知的prompt來分走畫面中你的觸發(fā)詞不想表達的部分,然后訓練集的共同特征要盡量少(最好共同特征少到只有你觸發(fā)詞達到的效果的本身)。
這樣,我們的觸發(fā)詞就達成了“一觸即發(fā)”的效果。
關于offsetnoise
基礎知識
非常有趣的東西,讓我想起以前做DCT(離散余弦變換)壓縮圖像,突然就想詳細講講了,誒嘿~
不如從梯度講起吧,
梯度是個向量(大學),其方向是函數(shù)某點變化最快的反向,其模是函數(shù)的函數(shù)某點的最大變化率,在單變量的實值函數(shù)中表現(xiàn)為導數(shù)(高中),在線性函數(shù)中表現(xiàn)為斜率(初中)。
無法理解建議就降維打擊
圖像梯度,如果我們把圖像看出二維離散函數(shù),圖像梯度其實就是對這個二維離散函數(shù)求導。
根據(jù)過去的視覺研究實驗表明人類視覺識別物體時對邊緣更敏感,比如人眼可以通過物體邊緣或者更抽象的邊緣(簡筆畫)來識別物體,即使該物體失去了色塊或紋理。
在圖像梯度中,·值越高的的部分越接近人類視覺中所觀察的邊緣,換句話說梯度高,變化率越快的地方往往就是圖像邊緣的地方。而值越低的地方則就代表變化率低,通常表現(xiàn)為圖像里的大色塊。通常而言我們可以直接把梯度高的地方叫做圖像高頻信息,梯度低的地方叫做低頻信息。
原理
CROSSLABS將圖像信息按照不同范圍頻率進行分解如下圖,你可以理解為右邊的圖疊加起來就是左邊的圖,且越往右圖片信息越高頻

其實這里我們也可以看出,低頻圖片信息往往是色塊或者整體的架構,比如分解后的第一張,而高頻圖片信息往往是體現(xiàn)了輪廓,比如分解后的第三張。
如果我們對圖片不斷加入高斯噪聲會怎么樣?

可以看到隨著我們的原圖(左邊的這張),隨著噪聲的加入越來越模糊,我們將這個過程分解到不同范圍頻率的圖像信息上,可看到最右邊的高頻信息的圖像幾乎是第一次添加就被破壞了,越靠近左邊破壞地越慢,最左變的低頻信息圖像幾乎沒什么變化。
我們知道我們的穩(wěn)定擴散的模型的訓練過程就是前向不斷加噪聲的過程,反向則是預測并減去噪聲,也就是說我們前向過程最后破壞的東西,在反向過程中是最先被生成的,前向過程中變化很弱的東西,反向過程變化也很弱。對應到我們實際生成圖像的過程中就是先生成的色塊隨著步數(shù)變化基本不變,而輪廓或者說細節(jié)卻變化較大。
實際使用的過程中如果你們開了實時預覽或者利用過色塊修復圖像應該已經(jīng)感受到了吧。
這也是為什么我們用同樣的種子往往會產(chǎn)生彼此構圖相關的圖像,因為種子是決定初始信息,而構圖(或者說圖像的整體的近似)是低頻信息。
這種現(xiàn)象當然不止是輪廓或色塊或細節(jié)受到影響,上面的只是例子,擴散模型的正反向過程實際影響了哪些信息,哪些對我們有用,哪些無關緊要都是不好說的。
但是CROSSLABS注意到,如果你將stable diffusion生成出來的圖進行一個像素值平均,那么你會發(fā)現(xiàn)大部分圖都接近0.5(如果純白圖為1,純黑圖為0)。 這意味著stable diffusion生成出來的圖在色彩上仿佛有了無形的約束,無法進行更真實或更具有想象力的創(chuàng)作。

CROSSLABS用的示例
通過實驗發(fā)現(xiàn)如果我們對一個圖像進行不斷地加噪,你會發(fā)現(xiàn),圖片的色彩均值變化波動非常小,可以理解為我們圖像的低頻信息。
導致的后果就是,我們實際生成時,最初的種子生成的噪聲決定了圖像的色彩均值,然后我們每次降噪時我們的色彩均值變化波動非常?。ň拖裎覀兗釉霑r的那樣)。
仿佛我們給模型加上了一個無形的規(guī)定:色彩均值變化率不要大!
這就導致如果我們進行低步數(shù)的采樣過程,我們的色彩均值和種子最初決定的差不多,表現(xiàn)在stable diffusion的某些模型上就是生成出來的圖色彩均值和0.5比較近。
這也解釋了如果你進行一個步數(shù)非常長的采樣過程,往往能得到更極端的圖像。
那么如何解決這一點呢?大體是思路在訓練時加快低頻信息的破壞過程。
而CROSSLABS選擇了offsetnoise,具體就是在給圖片添加噪聲的過程中,我們對于每個像素點額外在從高斯分布中采樣一個數(shù)值并乘以某個系數(shù)然后加回對應像素點,然后自然就對圖像的色彩均值造成了破壞。
具體到代碼上
變成了
CROSSLABS將這個系數(shù)定為了0.1,是因為0.1在他們的實驗中表現(xiàn)效果良好,在之后微調(diào)模型時使用了這個策略,然后發(fā)現(xiàn)stable diffusion能生成更亮或者更暗的圖像了。

CROSSLABS用的示例,可以看出效果還是非常明顯
總結
offset noise的出現(xiàn)能讓我們訓練出來的模型擁有更自由的對比度,光照和色彩,非常推薦訓練時采用
CROSSLABS將其系數(shù)設為0.1,是因為他們覺得挺好,訓練師根據(jù)自己的目標決定
由于增加了一個添加噪聲步驟,開啟此項對訓練性能有一定影響
關于分層融合
大概看了一下,對模型而言將U-Net各層權重按比例融合,
對于LoRA而言也是差不多,主要是作用在U-Net的17個主塊對應的LoRA權重按比例融合。
對于大模型而言,我們訓練出的模型可以認為已經(jīng)“掌握”了一些規(guī)律性上的東西,可能會被分散在U-Net的各模塊上。
低緯度的噪聲可能是高緯度的規(guī)律分布
所以調(diào)整模型組件的任何地方都有可能產(chǎn)生不同效果,如果這些效果能被總結就是是有效。
有點人類探求物理學的意思了,物理學存在嗎?
......

這就是第四篇的全部內(nèi)容了,內(nèi)容若有缺漏和錯誤歡迎交流指正~?
淺談stable diffusion目前可講內(nèi)容已經(jīng)快結束了,再深入下去就只能講代碼和邏輯了,但這確實沒啥好講的。
所以之后大概會修訂一下第一二篇,因為最初是按照我自己的學習節(jié)奏寫的,不適合大部分人看。
第五篇如果有的話就講講擴散模型在視頻上的應用,或者如何從電動力學到diffusion(當初學電動力學沒好好學,復習一下),或者ComfyUI,如果有時間的話......