lora參數,帶你從0到入門
開始
首先,需要明確一點,LoRA是向現有模型添加一個小的神經網絡。換句話說,LoRA的訓練過程涉及創(chuàng)建一個“基礎模型+α”中的“+α”部分。
由于LoRA的訓練受到基礎模型特征的很大影響,因此需要選擇與訓練圖像和圖像生成所用模型(假設的模型)兼容的基礎模型。舉例來說,如果訓練圖像是真實的,建議選擇專門用于真實圖像生成的模型。而如果訓練圖像是2D風格的,但打算生成真實圖像,則可能更適合選擇2D和3D風格混合模型。
需要注意的是,訓練后生成的LoRA文件僅包含與添加的神經網絡相關的數據,不包含基礎模型的數據。然而,有一點需要留意,如果底模不是像"stable-diffusion-v1-5"這樣的先驅類模型,那么它可能只在這個底模上效果較好。如果想使用自己準備的模型,請選擇訓練效果較好的模型,例如常用的"sd1.5"、"ac"、以及泄露的"novelai"模型。
圖像、正則化
圖像文件夾:
指定包含訓練圖像的文件夾位置,比如名為“10_girl”的文件夾。請注意,最好不要在目錄名稱中包含中文字符。數字10代表會多次讀取圖像,我認為應該控制在5-10之間。
正則化文件夾:
在LoRA學習中,訓練圖像的特征可能會過于強烈地與不相關的單詞相關聯,導致每次輸入這些單詞時,生成的圖像都非常類似于訓練圖像,即過擬合。為了解決這個問題,可以通過同時學習一些“非訓練圖像風格”的“正則化圖像”,來防止特定單詞過于強烈地影響訓練。
需要注意的是,正則化圖像的使用不是必須的,而且應該慎重使用,因為正則化對模型的影響非常大。
batch_size
指定批次大小。批次是“同時加載的圖像數”。例如,批次大小為2,則同時學習2張圖像。同時學習多張不同圖像會降低各圖像的調整精度,但可以全面捕捉多幅圖像的特征,因此最終效果可能更好。
由于同時學習多張圖像,提高批次大小會縮短學習時間,但調整精度會降低,且權重變更次數也會減少,因此有可能導致學習不充分。因此我建議真假批次大小的同時對訓練輪數以及學習率進行修改。當然這樣更加消耗你的設備。
Epoch(訓練輪數)
1個Epoch是“1組訓練”。
例如,您想要對50張圖像進行10次訓練。在這種情況下,1個Epoch將是50x10=500次訓練。如果有2個Epoch,則將重復這一過程兩次,因此為500x2=1000次訓練。
每N個Epoch保存一次
您可以在這里指定每N個Epoch保存一次中間結果作為LoRA文件。
例如,設定Epoch為10,將“每N個Epoch保存一次”設置為2,則會在每2個Epoch后(第2、4、6、8個Epoch結束時)將LoRA文件保存到指定文件夾中。
Network Rank(維度):
神經元數目越多,可以保留的學習信息就越多,但同時也增加了學習非目標信息的可能性,LoRA文件的大小也會增加。通常情況下,最大設置為約128,但也有報告稱32已經足夠。
沒有最好只有最優(yōu),或許你可以用dylora去測試。
Network Alpha(網絡Alpha):
這是為了防止在保存LoRA時將權重值舍入為零而引入的便利措施。
由于LoRA的結構特點,神經網絡的權重值容易變得很小,如果太小,可能無法區(qū)分為零(即沒有學習)。
因此,建議采用一種技巧,在實際(保存的)權重值保持較大的同時,在訓練時始終以一定比例削弱權重,以使權重值看起來較小。這個“削弱比例”就是Network Alpha。
Network Alpha值越小,保存的LoRA神經網絡的權重值越大。
在使用時,削弱程度(使用強度)通過“Network_Alpha / Network_Rank”進行計算(幾乎是0到1的值),與Network Rank數目密切相關。
如果訓練后的LoRA精度不太好,可能是由于權重數據太小而導致被壓縮為零。此時,可以嘗試降低Network Alpha值(即增加保存的權重值)。
當Network Alpha和Network Rank具有相同的值時,該功能將關閉。
※Network Alpha值不得超過Network Rank值??梢灾付ǔ^這個值,但通常會導致出現意外的LoRA。
另外,在設置Network Alpha時,需要考慮對學習率的影響。
例如,如果Alpha為16,Rank為32,則使用強度為16/32 = 0.5,這意味著學習率只有“Learning Rate”設置值的一半的效力。
如果Alpha和Rank具有相同的數字,則使用強度為1,不會對學習率產生任何影響。
學習率
將學習率都改為1
優(yōu)化器($optimizer_type)改為 DAdaptation ,訓練后看到學習曲線圖 拿到最高值1/3 就是我們loin的最優(yōu)值?如果是 AdamW8bit 直接使用。當然你也可以使用Prodigy,這個比較好用的自適應優(yōu)化器。
優(yōu)化器(Optimizer):
優(yōu)化器設置用于在訓練過程中更新神經網絡權重的方式。為了智能地進行訓練,提出了各種不同的方法。我們常用的"AdamW8bit","Lion","DAdaptation", Prodigy。其中后面兩個是自適應優(yōu)化器,Prodigy是DAdaptation的升級版。Da常用于查看最優(yōu)學習率,Prodigy可以多用試試看,我個人認為它很強大,它會隨著步數增加尋找最優(yōu)的學習率。
學習率調度器:
在訓練過程中,可以改變學習率(Learning rate)。調度器指的是"如何設置學習率的變化方式"。
adafactor:如果將優(yōu)化器(后述)設置為Adafactor,則選擇此選項??梢宰詣诱{整學習率以節(jié)省VRAM,并在學習過程中逐漸調整。
constant:學習率在整個訓練過程中保持不變。
constant_with_warmup:起初學習率為0,然后在熱身階段逐漸增加到Learning rate設置值,并在正式學習時使用Learning rate設置值。
cosine:通過繪制波(余弦曲線),將學習率逐漸減少到0。
cosine_with_restarts:重復執(zhí)行余弦曲線(請參閱LR number of cycles的解釋)。
linear:起初學習率為Learning rate設置值,然后直線減少到0。
polynomial:行為與linear相同,但減少方式稍微復雜(請參閱LR power的解釋)。
如果想將學習率固定為Learning rate設置值,請選擇constant。
這里我們一般選擇cosine_with_restarts,要想簡單了解可以看青龍有一期講解。
學習率預熱:
如果選擇了constant_with_warmup調度器,則在此處設置預熱次數。
在這里指定的數值是總步數的百分比。
例如,假設使用batch size為1的50張圖像進行10次訓練,然后再進行2個epoch,總步數為50x10x2=1000。如果將LR warmup設置為10,則在總步數為1000中,前10%,即100步將用于預熱。
如果選擇的調度器不是constant_with_warmup,則可以忽略此選項。
Keep n tokens:
指定的前n個單詞將始終保持在標題的最前面。可以通過這個去設置觸發(fā)詞。
※在這里,“單詞”指的是以逗號分隔的文本。無論分隔的文本包含多少個單詞,它都被視為“1個單詞”。例如,對于“black cat, eating, sitting”,“black cat”被視為1個單詞。
Shuffle caption(隨機調換標題順序):
隨機打亂tokens
通常情況下,標題中的單詞越靠前,其重要性越高。因此,如果單詞的順序固定,后面的單詞可能無法得到很好的學習,或者前面的單詞可能與圖像生成產生意外的關聯。通過每次加載圖像時隨機調換單詞的順序,可以修正這種偏見。
Min SNR gamma
是用于LoRA學習的一個參數,它在學習過程中將不同強度的噪聲添加到學習圖像中(省略了詳細內容)。由于不同強度的噪聲可能導致學習目標與圖像之間出現明顯偏差,學習過程可能不穩(wěn)定。為了校正這種情況,引入了Min SNR gamma。特別是當學習圖像上添加的噪聲很弱時,學習目標可能與圖像之間出現大的偏差,因此需要抑制這種跳躍。
讓學習效果更好。推薦3-5,5對原模型幾乎沒有太多影響,3會改變最終結果。
將訓練后的 LoRA 模型保存為
您可以指定以哪種文件格式保存訓練后的 LoRA 模型文件。
ckpt 曾經是 Stable Diffusion 中使用的主要格式,但由于該格式存在安全問題,出現了更安全的 safetensors 文件格式。目前 safetensors 成為主要格式。
除非有特殊原因,一般選擇 safetensors
到這里其實就差不多了,后面作為一個擴展。
?
LoRA學習類型的指定。
其實是后續(xù)一個作者做的新的Lora類型,"DyLoRA"類型可以同時學習指定Rank以下的多個Rank,因此在想要選擇最佳Rank時非常方便。也就是訓練出該模型,你可以通過設置使用network_dim的大小的lora。"LoHa"它的特點是風格化會更強,"LyCORIS"的效果比傳統的lora效果更好。
混合精度
指定訓練期間權重數據的混合精度類型。
原始情況下,權重數據以32位為單位(當選擇“no”時),但如果有必要,通過混合16位單位數據進行學習將帶來相當大的內存節(jié)省和加速。fp16是一種精度減半的數據格式,bf16是一種設計用于處理與32位數據相同的數值寬度的數據格式。
您可以獲得足夠高精度的LoRA使用fp16。這里注意當你發(fā)現你的nan值溢出并且你的設備不是很優(yōu)秀的情況下,或許你需要關閉它。
緩存潛變量
訓練圖像在被加載到VRAM中并進入U-Net之前,會被"壓縮"成潛變量的狀態(tài),從而變得更小,并在VRAM中進行訓練。通常情況下,每次加載圖像時都會進行"壓縮",但是如果勾選了"Cache latents",則可以選擇將"壓縮"后的圖像保留在主內存中。
將潛變量保留在主內存中可以節(jié)省VRAM的空間,加快處理速度,但由于無法對"壓縮"前的圖像進行處理,因此除flip_aug外的其他增強技術(后述)將無法使用。此外,也無法使用隨機裁剪(random crop)來在每次訓練時隨機截取圖像(后述)。
默認情況下,此選項處于啟用狀態(tài)。
將潛變量緩存到磁盤
其實就是把數據作為特殊的格式保留下來,如果要進行多次的訓練,可以開啟,這樣可以加快訓練速率。
啟用桶(Enable buckets):
"桶",如字面意思,是一個容器。LoRA在使用訓練圖像時,圖像的大小可以不統一,但不能同時學習不同大小的圖像。因此,在訓練之前,需要根據圖像大小將圖像分配到相應的“桶”中。相似大小的圖像放入同一個“桶”,不同大小的圖像放入不同的“桶”。
※如果訓練圖像的大小不統一并將"Enable buckets"關閉,則訓練圖像將被放大或縮小以使其大小相同。
放大或縮小時將保持圖像的縱橫比。如果縱橫比與基準大小不同,則放大縮小后的圖像的高度或寬度可能會超出基準大小。例如,基準大小為512x512(縱橫比1),而圖像大小為1536x1024(縱橫比1.5)的情況下,圖像將被縮小為768x512(保持縱橫比為1.5)。
VAE批處理大小
是在啟用“Cache latents”選項時用于指定壓縮圖像數據在主內存中保留的組大小。這個選項允許將壓縮后的圖像數據分組保持在內存中。通常,它會設置為與批處理大?。˙atch size)相同的值。
默認情況下,VAE批處理大小為0,這意味著它將與批處理大小相同。因此,如果VAE批處理大小為0,則壓縮圖像將按照批處理大小指定的數量進行分組并保留在主內存中。
這里是對該文章進行的翻譯總結
https://hoshikat.hatenablog.com/entry/2023/05/26/223229#Shuffle-caption
歡迎大家在評論區(qū)留下批評和建議,如果本文違反了轉載規(guī)定或侵犯他人勞動成果,我會立刻刪除本文!對了還要感謝文章作者的無私奉獻,最后希望大家都能練出好丹!?