淺談stable diffusion (三又十分之一)

本以為本篇能夠很快出來,所以摸了幾天魚
大家可以趁著我沒寫完提出意見,或者想要側重的東西

近年來以openai為代表的AI公司一次次向我們展示了更大模型和更高參數(shù)的魅力,模型訓練規(guī)模一年年增長,效果一年年變強,讓人感覺到大就是正義,而大模型的天花板似乎還沒有被看到.......
Scale is All You Need
大模型更偏向工程領域,對于stable diffusion這種大模型,普通人以個人或者以小型實驗室為單位是很難從規(guī)模上做出突破的,這其實也是好事,說明AI領域正在一步步走向成熟。事實上,以Google為代表的大公司還是無私慷慨的,將自己訓練出的模型直接免費開源,還提供了Google Colab實驗平臺,國內的百度也對標開發(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ū)內誕生了很多Fine-tuning(微調)之類的工作,讓擴散模型的魅力進一步展現(xiàn),本文就圍繞相關工作展開淺談,順便填上前幾期的缺漏。
由于相關工作的發(fā)展速度驚人,筆者對這些方面不甚了解,若有錯漏,還望交流指正。
前篇-微調擴散模型
本篇很多東西在第二篇有過介紹,本篇將進行更深入的分析,并為下一篇的的訓練打下基礎。
Textual Inversion(Embedding)
中文名為文本反轉,該功能基于
An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion
原理
現(xiàn)有的圖像生成大模型可以很好地根據(jù)用戶的文本生成不同圖像,這種強大的生成能力能夠生成各種各樣的藝術創(chuàng)作,但是對用戶來說還是難以控制大模型的生成,用戶單單用自然語言很難傳達自己腦海中的需求。
再加上將一些原先模型沒有的新概念引入大模型是非常困難的,普通人無法承擔重新訓練的代價,而盲目的微調(Fine-tuning)可能導致大模型遺忘先驗知識(prior knowledge),所以常見的方法是將原來的模型參數(shù)進行鎖定然后添加更多層網(wǎng)絡結構來調整大模型。
本篇中只有DreamBooth的方法是在一系列措施下對原有模型調整(破壞)了權重,其余都是通過添加多層網(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維的向量
我的們的偽詞(下圖的
)也化為對應的向量(下圖的
),然后和其他普通詞匯一同進入下一流程。
我們的偽詞實際上代表我們向大模型注入的新概念,就這樣和其他詞一起被處理。

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

顯示如下

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

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


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

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

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

限制
因為優(yōu)勢因應用而異,所以這里只提限制
在高精度生成的方面可能會有限制
雖然能幫助生成相似圖片,但是是基于我們訓練出的V_*而生成,我們希望學習的東西的“本質”并沒有實際融入
學習一個新概念大概需要1-2小時
在V100上大概需要1小時,可能隨著后續(xù)發(fā)展縮短時間
在不同的模型上效果不一致,除非你們的模型是基于同一個大模型訓練的,所以很難重現(xiàn)效果
你不能在stable diffusion v1版本練出的embedding用于v2版本,因為文本編碼器使用的語言模型經(jīng)過替換。你可以通過上文的按鈕來查看你可用的embedding
Hypernetwork
TODO
DreamBooth
TODO
LoRA(Low Rank Adaption)
TODO
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)絡中的一個額外條件?!皕ero convolution”是一個1×1卷積層,權重和偏差都初始化為零。
ControlNet將神經(jīng)網(wǎng)絡權重復制到一個鎖定(locked)副本和一個可訓練(trainable)副本。
可訓練副本將會學習新加入的條件,而鎖定副本將會保留原有的模型,得益于此在進行小數(shù)據(jù)集訓練時不會破壞原有的擴散模型。
可以看到使用了零卷積(zero convolution),這樣做的好處是可以以0值初始化,卷積權重會以學習的方式從0開始增長到優(yōu)化參數(shù),所以在訓練的初始階段(訓練前)不會影響原模型,所以不是從頭開始訓練,仍然屬于微調(fine-tuning)。
這種結構也方便我們對模型/權重/塊/層進行合并/替換/偏移。
以下為ControlNet在stable diffusion中產(chǎn)生作用的過程
根據(jù)前幾篇我們對stable diffusion已經(jīng)有了初步了解,但是為了理解ControlNet我們仍需要再稍微蹭進去一點。stable diffusion的U-Net結構如下圖所示,包含12個編碼器塊(Encoder Block),12個解碼器塊(Decoder Block),還有一個中間塊(Middle),完整模型包括25個塊,其中有17個塊是主塊。文本使用clip進行編碼,時間步長采用位置編碼。
我們將上圖的簡單結構附加在stable diffusion 原來的U-Net結構上14次,就完整地對原有的結構進行了替換(控制),原有的stable diffusion 就化身為了 stable diffusion + controlnet
原諒我打字累,我下文以SD-T來指代stable diffusion + controlnet

然后SD-T就可以繼續(xù)嘗試用特定數(shù)據(jù)集來訓練學習新東西來試圖完成我們想要模型完成的新任務,比如邊緣檢測,比如人體姿勢探測,整個過程流暢,順滑。
這是SD-T的損失函數(shù),可以看出是在SD的基礎上增加了新的控制條件
等等,為什么這樣就能做到?
SD-T既能做到邊緣檢測,又能做到涂鴉檢測,而且是在一統(tǒng)的架構下進行的,多種任務只需要一種解決方式,這......也許就是大模型+優(yōu)秀結構的魅力吧。
論GPT-4是如何碾壓其他的模型
實際的生成流程中的步驟
ControlNet通過獲取額外的輸入圖像并使用Canny邊緣檢測器(Canny edge detector)來獲取輪廓圖,這一過程被稱為預處理
輪廓圖(自然是會被處理到隱空間去)將會作為額外的條件(conditioning)和文本提示被送入SD-T
由于SD-T進行擴散時參考了我們多出來的條件,所以最終出現(xià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就看你的硬盤/內存和顯存了
以下是原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對應文件下/
詳細流程
TODO
限制
TODO
T2I-Adapter
TODO
中篇-具體的微調訓練
得益于社區(qū)的飛速發(fā)展,現(xiàn)在的訓練方式可謂多種多樣。
普通用戶可以在本地通過消費級顯卡通過高度封裝的腳本快捷訓練,比如
也可以在云端如colab或者飛槳平臺通過
或者 提供的腳本在免費的專業(yè)顯卡上訓練B站上也出現(xiàn)了各式各樣的教學視頻
本篇我將會結合前篇的原理和訓練教程(以sd-scripts)為例,來拋磚引玉
在進行本篇前我希望你能盡量了解一點基礎知識
基礎知識
TODO
數(shù)據(jù)集處理
literation
batch size
learning rate
epoch
過擬合
正則化
sd-scripts(貌似github上星星最多)
TODO
embedding
dreambooth
lora
飛槳(方便國內沒有好的GPU的同學訓練)
TODO
后篇-模型熱門插件
TODO
multidiffusion
Tiled VAE
Ultimate SD Upscale
......

先給第5篇埋個坑,ComfyUI或者生成視頻, 都很想了解呢