淺談stable diffusion (一)

潛在擴(kuò)散模型結(jié)構(gòu)
迄今為止,已經(jīng)發(fā)現(xiàn)擴(kuò)散模型在廣泛的領(lǐng)域中是有用的,從生成建模任務(wù)(如圖像生成、圖像超分辨率、圖像修復(fù))到辨別任務(wù)(如,圖像分割、分類和異常檢測)
文生圖”模塊,也就是txt2img
部分。下圖是一個(gè)基本的文生圖展示,輸入是“天堂(paradise)、廣袤的(cosmic)、海灘(beach)、海盜船(Pirate ship)”,可以看到最右邊的生成圖片很好的符合了輸入的要求,圖中不僅有藍(lán)天白云,廣闊的海灘也一望無際

### 文生圖測試1 -- “天堂(paradise)、廣袤的(cosmic)、海灘(beach)”

穩(wěn)定擴(kuò)散的組成部分
Stable Diffusion其實(shí)是個(gè)比較雜合的系統(tǒng),里面有著各種各樣的模型模塊。那首先映入眼簾的問題是,怎么把人類理解的文字轉(zhuǎn)換為機(jī)器理解的數(shù)學(xué)語言
text understander
下圖中藍(lán)色的text understander將文字轉(zhuǎn)換成某種計(jì)算機(jī)能理解的數(shù)學(xué)表示

藍(lán)色的text understander(也就是一個(gè)文字的encoder編碼器)把人類語言轉(zhuǎn)換成計(jì)算機(jī)能理解的語義內(nèi)容
text understander是個(gè)特別的Transformer語言模型(例如clip)
text understander的輸入是人類語言,輸出是一系列的向量,這些向量的語義對應(yīng)著我們輸入的文字
text understander將輸出傳遞給圖像生成器(Image Generator)

代表語義的向量(就比如上面的藍(lán)色3*5方格)
Image Generator
粉色的圖片生成器(Image Generator)可以分解成兩個(gè)子模塊
圖片信息生成器
粉色的模塊是Stable Diffusion的核心,也是Stable Diffusion和其他diffusion模型最大的區(qū)別,很多性能上的提升就來源于此。
首先,最需要明確的一點(diǎn):圖片信息生成器不直接生成圖片,而是生成的較低維度的圖片信息,也就是所謂的隱空間信息(information of latent space)。這個(gè)隱空間信息在下面的流程圖中表現(xiàn)為那個(gè)粉色的4*3的方格,后續(xù)再將下圖中這個(gè)隱空間信息輸入到下圖中黃色的解碼器(Decoder)里,就可以成功生成圖片了。Stable Diffusion主要引用的論文“latent diffusion”中的latent也是來源于隱變量中的“隱”(latent)。

一般的diffusion模型都是直接生成圖片,并不會有先生成隱變量的過程,所以普通的diffusion在這一步上需要生成的信息更多,負(fù)荷也更大。因而之前的diffusion模型在速度上和資源利用上都比不過Stable Diffusion。
圖像解碼器
圖片解碼器也就是我們上面說的decoder,它從圖片信息生成器(Image Information Creator)中接過圖片信息的隱變量,將其升維放大(upscale),還原成一張完整的圖片。

圖片解碼器只在最后的階段起作用,也是我們真正能獲得一張圖片的最終過程。
有了以上的了解,我們可以看到構(gòu)成穩(wěn)定擴(kuò)散的三個(gè)主要組件(每個(gè)都有自己的神經(jīng)網(wǎng)絡(luò)):

Text Encoder (藍(lán)色模塊)
功能:將人類語言轉(zhuǎn)換成機(jī)器能理解的數(shù)學(xué)向量 ? ? ? ? ? ? ?輸入:人類語言 ? ? ? ? ? ? ?輸出:語義向量(77,768)
Image Information Creator (粉色模塊)
功能:結(jié)合語義向量,從純噪聲開始逐步去除噪聲,生成圖片信息隱變量 ? ? ? ? ?輸入:噪聲隱變量(4,64,64)+語義向量(77,768) ? ? ? ? ? 輸出:去噪的隱變量(4,64,64)
Image Decoder (黃色模塊)
功能:將圖片信息隱變量轉(zhuǎn)換為一張真正的圖片。 輸入:去噪的隱變量(4,64,64) ? ? ?輸出:一張真正的圖片(3,512,512)
什么是擴(kuò)散
擴(kuò)散模型(diffusion model)
擴(kuò)散模型包括兩個(gè)過程:前向過程(forward process)和反向過程(reverse process)如下圖所示。無論是前向過程還是反向過程都是一個(gè)參數(shù)化的馬爾可夫鏈(Markov chain)**。

簡單地說,擴(kuò)散模型的工作原理是通過連續(xù)添加高斯噪聲來破壞訓(xùn)練數(shù)據(jù),然后學(xué)習(xí)通過反轉(zhuǎn)這種噪聲過程來恢復(fù)數(shù)據(jù)。
擴(kuò)散過程,從字面上理解就是,像分子運(yùn)動一樣,一點(diǎn)點(diǎn)改變(放到圖像里就是,最開始噪聲一般的圖像,它的像素值一點(diǎn)點(diǎn)改變,或者說叫"運(yùn)動",直到最后改變成了有意義的圖像)。
輸入隨機(jī)生成了噪聲圖片如下

實(shí)際的噪聲更加隨機(jī),看不出來什么模式
擴(kuò)散模型通過對噪聲做運(yùn)動得到下面的圖片

最終獲得了較為清晰的圖片
擴(kuò)散模型由兩部分構(gòu)成:學(xué)習(xí)過程,推理過程,上面的去噪過程就是推理過程。
學(xué)習(xí)過程

首先我們拿到要學(xué)習(xí)的圖片I
然后用固定的方法添加一個(gè)噪聲 N ,并把這個(gè)噪聲 N 保存下來
把噪聲 N 扔給我們的神經(jīng)網(wǎng)絡(luò),神經(jīng)網(wǎng)絡(luò)會返回一個(gè)同尺寸的噪聲 PN
比較神經(jīng)網(wǎng)絡(luò)預(yù)測的噪聲 PN 和 N 數(shù)學(xué)尺度上的"差距" ,這個(gè)差距我們記為 D
把這個(gè)差距 D 扔給一個(gè)迭代器,它會告訴神經(jīng)網(wǎng)絡(luò)應(yīng)該怎么調(diào)整它里面眾多的神經(jīng)參數(shù)來縮小 N 和 PN的差距。
最后重復(fù)不斷這個(gè)過程,直到 D 的值足夠小
推理過程

首先我們隨機(jī)生成一個(gè)噪聲 RD
把 RD 喂給已經(jīng)學(xué)習(xí)好的 神經(jīng)網(wǎng)絡(luò)
得到神經(jīng)網(wǎng)絡(luò)給出的噪聲 PD
用原始的噪聲 RD根據(jù) PD做運(yùn)動,得到預(yù)測的圖片I。這里的運(yùn)動可以簡單理解為原始噪聲RD的數(shù)值減去預(yù)測噪聲PD。實(shí)際上是做了一些數(shù)學(xué)變化,而非簡單的加減。
判斷做完運(yùn)動得到的預(yù)測I是否符合我們的預(yù)期,如果符合,那就完成預(yù)測啦!否則繼續(xù)6
如果運(yùn)動還不夠,則剛剛得到的預(yù)測圖片I成為新的噪聲RD,進(jìn)行下一輪運(yùn)動,直到得到我們需要的圖片。
請注意,我們到目前為止描述的擴(kuò)散過程在不使用任何文本數(shù)據(jù)的情況下生成圖像。因此,如果我們部署這個(gè)模型,它將生成漂亮的圖像,但我們無法控制它是金字塔還是貓或其他任何東西的圖像。
文生圖測試2 -- 無輸入

如何控制擴(kuò)散
人類繪畫過程
要了解文生圖怎么做到的,我們先看一下人類通常的作畫流程,當(dāng)人類開始進(jìn)行藝術(shù)創(chuàng)作時(shí),拿繪畫舉例,我們通常大致可以歸類為以下幾個(gè)步驟:
確立主題:這一階段,我們會收集繪畫想表達(dá)的內(nèi)容,中心思想,或者說繪畫本身的目的,再具體的說,這一階段我們會去和繪畫的需求方確認(rèn)創(chuàng)作的這幅畫的尺寸,主題,背景,需求方的目的,應(yīng)用的場景等等。
細(xì)化需求:確立了主題,接下來就是細(xì)化需求,這一階段我們可能需要收集內(nèi)容的相關(guān)的素材,相關(guān)的文化知識,背景信息,畫風(fēng)等等來輔助我們創(chuàng)作。
繪制草稿:細(xì)化了需求,接下來可能會找一些參考圖,進(jìn)行一些草圖,線稿,素描等創(chuàng)作。
完成繪圖:最后,在草稿的基礎(chǔ)上根據(jù)需求完成整體的構(gòu)圖,繪畫,最終交付。

diffusion model在生成圖片時(shí)需要指引,我們可以通過圖片/文字進(jìn)行實(shí)現(xiàn)
我們?nèi)绾斡谜Z言來指引或控制最后生成的結(jié)果?
答案也很簡單——注意力機(jī)制。在最開始我們講到,我們用Text Encoder提取語義信息。
那這個(gè)語義信息怎么在生成圖片的過程中使用呢?我們直接使用注意力機(jī)制在Unet內(nèi)層層耦合。

圖中每個(gè)黃色的小方塊都代表一次注意力機(jī)制的使用,而每次使用注意力機(jī)制,就發(fā)生了一次圖片信息和語義信息的耦合
文本編碼器:A Transformer Language Model
自從2018年Bert發(fā)布以來,Transformer的語言模型就成了主流。Stable Diffusion起初的版本便是用的基于GPT的CLIP模型,而最近的2.x版本換成了更新更好的OpenCLIP,最近也有學(xué)者試圖將Chatgpt模型與Stable Diffusion進(jìn)行結(jié)合。語言模型的選擇直接決定了語義信息的優(yōu)良與否,而語義信息的好壞又會影響到最后圖片的多樣性和可控性。
Google在Imagen論文中做過實(shí)驗(yàn),可以發(fā)現(xiàn)不同語言模型對生成結(jié)果的影響是相當(dāng)大的。

更大/更好的語言模型對圖像生成模型的質(zhì)量有顯著影響。
Clip是如何訓(xùn)練
那像CLIP這樣的語言模型究竟是怎么訓(xùn)練出來的呢?它們是怎么樣做到結(jié)合人類語言和計(jì)算機(jī)視覺的呢?
首先,要訓(xùn)練一個(gè)結(jié)合人類語言和計(jì)算機(jī)視覺的模型,我們就必須有一個(gè)結(jié)合人類語言和計(jì)算機(jī)視覺的數(shù)據(jù)集。CLIP就是在像下面這樣的數(shù)據(jù)集上訓(xùn)練的,只不過圖片數(shù)據(jù)達(dá)到了4億張的量級。事實(shí)上,這些數(shù)據(jù)都是從網(wǎng)上爬取下來的,同時(shí)被爬取下來的還有它們的標(biāo)簽或者注釋。

CLIP模型包含一個(gè)圖片Encoder和一個(gè)文字Encoder。訓(xùn)練過程可以這么理解:我們先從訓(xùn)練集中隨機(jī)取出一張圖片和一段文字。注意,文字和圖片未必是匹配的,CLIP模型的任務(wù)就是預(yù)測圖文是否匹配,從而展開訓(xùn)練。

CLIP 包含一個(gè)圖像編碼器(Image Encoder)和一個(gè)文本編碼器(Image Encoder)
我們分別用倆個(gè)編碼器對圖像和文本進(jìn)行編碼,輸出結(jié)果是倆個(gè)embedding向量。
我們用余弦相似度來比較倆個(gè)embedding向量相似性,以判斷我們隨機(jī)抽取的文字和圖片是否匹配。但最開始,由于兩個(gè)編碼器剛剛初始化,計(jì)算出來的相似度往往會接近于0。
這時(shí)候假設(shè)我們模型的預(yù)測是 Not similar 而標(biāo)簽為Similar ,那么我們的模型就會根據(jù)標(biāo)簽去反向更新倆個(gè)編碼器。
不斷地重復(fù)這個(gè)反向傳播的過程,我們就能夠訓(xùn)練好兩個(gè)編碼器,來識別圖像和文本的匹配程度。
值得注意的是,就像經(jīng)典的word2vec訓(xùn)練時(shí)一樣,訓(xùn)練CLIP時(shí)不僅僅要選擇匹配的圖文來訓(xùn)練,還要適當(dāng)選擇完全不匹配的圖文給機(jī)器識別,作為負(fù)樣本來平衡正樣本的數(shù)量。
粉色的Unet中每個(gè)Resnet不再和相鄰的Resnet直接連接,而是在中間新增了Attention的模塊。CLIP Encoder得到的語義embedding就用這個(gè)Attention模塊來處理。

整個(gè)Unet是由一系列Resnet構(gòu)成的。每一層的輸入都是上一層的輸出。
在圖片信息生成器(Image Information Creator)中,有了初始的純噪聲【下圖中左下透明4X4】+語義向量【下圖左上藍(lán)色3X5】后,Unet會結(jié)合語義向量不斷的去除純噪聲隱變量中的噪聲,重復(fù)50~100次左右就完全去除了噪聲

得益于Clip的強(qiáng)大,我們可以不僅可以以類標(biāo)簽的文本生成圖像,也能通過一些英語短句來生成圖像
比如:”樹下有一個(gè)女孩身邊有一條狗(a girl with a dog under a tree)“

到這里我們就對stable diffusion 原理有了大概了解
下一章(如果有?),我們將會從各種stable diffusion模型的訓(xùn)練方法出發(fā)探尋其中的數(shù)學(xué)原理,結(jié)合數(shù)學(xué)推導(dǎo)揭示擴(kuò)散模型的更深秘密。

參考
What are Diffusion Models? | Lil'Log (lilianweng.github.io)
The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time. (jalammar.github.io)
CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models (github.com)