Stable Diffusion原理詳解
最近AI圖像生成異?;鸨?,聽說鵝廠都開始用AI圖像生成做前期設(shè)定了,小廠更是直接用AI替代了原畫師的崗位。這一張張豐富細(xì)膩、風(fēng)格各異、以假亂真的AI生成圖像,背后離不開Stable Diffusion算法。
Stable Diffusion是stability.ai開源的圖像生成模型,可以說Stable Diffusion的發(fā)布將AI圖像生成提高到了全新高度,其效果和影響不亞于Open AI發(fā)布ChatGPT。今天我們就一起學(xué)習(xí)一下Stable Diffusion的原理。

文章目錄
潛在空間(Lantent Space)
Latent Diffusion
整體架構(gòu)
感知壓縮
語義壓縮
感知損失
擴(kuò)散損失
條件擴(kuò)散
注意力機(jī)制
文本-圖像合成
圖像-圖像合成
圖像生成的發(fā)展
擴(kuò)散模型
Transformer
Stable Diffusion
總結(jié)
圖像生成的發(fā)展
在Stable Diffusion誕生之前,計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)方面最重要的突破是 GAN(Generative Adversarial Networks 生成對抗網(wǎng)絡(luò))。GAN讓超越訓(xùn)練數(shù)據(jù)已有內(nèi)容成為可能,從而打開了一個全新領(lǐng)域——現(xiàn)在稱之為生成建模。
然而,在經(jīng)歷了一段蓬勃發(fā)展后,GAN開始暴露出一些瓶頸和弊病,大家傾注了很多心血努力解決對抗性方法所面臨的一些瓶頸,但是鮮有突破,GAN由此進(jìn)入平臺期。GAN的主要問題在于:
圖像生成缺乏多樣性
模式崩潰
多模態(tài)分布學(xué)習(xí)困難
訓(xùn)練時(shí)間長
由于問題表述的對抗性,不容易訓(xùn)練
另外,還有一條基于似然(例如,馬爾可夫隨機(jī)場)的技術(shù)路線,盡管已經(jīng)存在很久,但由于對每個問題的實(shí)施和制定都很復(fù)雜,因此未能產(chǎn)生重大影響。
近幾年,隨著算力的增長,一些過去算力無法滿足的復(fù)雜算法得以實(shí)現(xiàn),其中有一種方法叫“擴(kuò)散模型”——一種從氣體擴(kuò)散的物理過程中汲取靈感并試圖在多個科學(xué)領(lǐng)域模擬相同現(xiàn)象的方法。該模型在圖像生成領(lǐng)域展現(xiàn)了巨大的潛力,成為今天Stable Diffusion的基礎(chǔ)。
擴(kuò)散模型
擴(kuò)散模型是一種生成模型,用于生成與訓(xùn)練數(shù)據(jù)相似的數(shù)據(jù)。簡單的說,擴(kuò)散模型的工作方式是通過迭代添加高斯噪聲來“破壞”訓(xùn)練數(shù)據(jù),然后學(xué)習(xí)如何消除噪聲來恢復(fù)數(shù)據(jù)。
一個標(biāo)準(zhǔn)擴(kuò)散模型有兩個主要過程:正向擴(kuò)散和反向擴(kuò)散。
在正向擴(kuò)散階段,通過逐漸引入噪聲來破壞圖像,直到圖像變成完全隨機(jī)的噪聲。
在反向擴(kuò)散階段,使用一系列馬爾可夫鏈逐步去除預(yù)測噪聲,從高斯噪聲中恢復(fù)數(shù)據(jù)1。

對于噪聲的估計(jì)和去除,最常使用的是 U-Net。該神經(jīng)網(wǎng)絡(luò)的架構(gòu)看起來像字母 U,由此得名。U-Net 是一個全連接卷積神經(jīng)網(wǎng)絡(luò),這使得它對圖像處理非常有用。U-Net的特點(diǎn)在于它能夠?qū)D像作為入口,并通過減少采樣來找到該圖像的低維表示,這使得它更適合處理和查找重要屬性,然后通過增加采樣將圖像恢復(fù)回來。

具體的說,所謂去除噪聲就是從時(shí)間幀 t tt 向時(shí)間幀 t ? 1 t-1t?1 的變換,其中 t tt 是 t 0 t_0t?
0
? (沒有噪聲)到 t m a x t_{max}t?
max
?(完全噪聲)之間的任意時(shí)間幀。變換規(guī)則為:
輸入時(shí)間幀 t tt 的圖像,并且在該時(shí)間幀上圖像存在特定噪聲;
使用 U-Net 預(yù)測總噪聲量;
然后在時(shí)間幀 t tt 的圖像中去除總噪聲的“一部分”,得到噪聲較少的時(shí)間幀 t ? 1 t-1t?1 的圖像。

從數(shù)學(xué)上講,執(zhí)行此上述方法 T TT 次比嘗試消除整個噪聲更有意義。通過重復(fù)這個過程,噪聲會逐漸被去除,我們會得到一個更“干凈”的圖像。比如對于帶有噪聲的圖,我們通過在初始圖像上添加完全噪聲,然后再迭代地去除它來生成沒有噪聲的圖像,效果比直接在原圖上去除噪聲要好。
近幾年,擴(kuò)散模型在圖像生成任務(wù)中表現(xiàn)出突出的性能,并在圖像合成等多個任務(wù)中取代了GAN。由于擴(kuò)散模型能夠保持?jǐn)?shù)據(jù)的語義結(jié)構(gòu),因此不會受到模式崩潰的影響。
然而,實(shí)現(xiàn)擴(kuò)散模型存在一些困難。因?yàn)樗旭R爾可夫狀態(tài)都需要一直在內(nèi)存中進(jìn)行預(yù)測,這意味著內(nèi)存中要一直保存多個大型深度網(wǎng)絡(luò)的實(shí)例,從而導(dǎo)致擴(kuò)散模型非常吃內(nèi)存。此外,擴(kuò)散模型可能會陷入圖像數(shù)據(jù)中難以察覺的細(xì)粒度復(fù)雜性中,導(dǎo)致訓(xùn)練時(shí)間變得太長(幾天到幾個月)。矛盾的是,細(xì)粒度圖像生成是擴(kuò)散模型的主要優(yōu)勢之一,我們無法避免這個“甜蜜的煩惱”。由于擴(kuò)散模型對計(jì)算要求非常高,訓(xùn)練需要非常大的內(nèi)存和電量,這使得早前大多數(shù)研究人員無法在現(xiàn)實(shí)中實(shí)現(xiàn)該模型。
Transformer
Transformer是來自 NLP 領(lǐng)域的非常著名的模型方法。Transformer在語言建模和構(gòu)建對話式 AI 工具方面取得了巨大成功。 在視覺應(yīng)用中,Transformer 表現(xiàn)出了泛化和自適應(yīng)的優(yōu)勢,這使得它們非常適合通用學(xué)習(xí)。 它們比其他技術(shù)能夠更好地捕捉文本甚至圖像中的語義結(jié)構(gòu)。 然而,Transformers 需要大量數(shù)據(jù),并且與其他方法相比,在許多視覺領(lǐng)域的性能方面也面臨著平臺期。
Transformer可以與擴(kuò)散模型結(jié)合,通過Transformer的“詞嵌入”可以將文本插入到模型中。這意味著將詞Token化后,然后將這種文本表示添加到U-Net的輸入(圖像)中,經(jīng)過每一層U-Net神經(jīng)網(wǎng)絡(luò)與圖像一起進(jìn)行變換。從第一次迭代開始到之后的每一次迭代都加入相同的文本,從而讓文本“作為指南”生成圖像,從有完整噪聲的第一次迭代開始,然后進(jìn)一步向下應(yīng)用到整個迭代。
Stable Diffusion
擴(kuò)散模型最大的問題是它的時(shí)間成本和經(jīng)濟(jì)成本都極其“昂貴”。Stable Diffusion的出現(xiàn)就是為了解決上述問題。如果我們想要生成一張 1024 × 1024 1024 \times 10241024×1024 尺寸的圖像,U-Net 會使用 1024 × 1024 1024 \times 10241024×1024 尺寸的噪聲,然后從中生成圖像。這里做一步擴(kuò)散的計(jì)算量就很大,更別說要循環(huán)迭代多次直到100%。一個解決方法是將大圖片拆分為若干小分辨率的圖片進(jìn)行訓(xùn)練,然后再使用一個額外的神經(jīng)網(wǎng)絡(luò)來產(chǎn)生更大分辨率的圖像(超分辨率擴(kuò)散)。
2021年發(fā)布的Latent Diffusion模型給出了不一樣的方法。 Latent Diffusion模型不直接在操作圖像,而是在潛在空間中進(jìn)行操作。通過將原始數(shù)據(jù)編碼到更小的空間中,讓U-Net可以在低維表示上添加和刪除噪聲。
潛在空間(Lantent Space)
潛在空間簡單的說是對壓縮數(shù)據(jù)的表示。所謂壓縮指的是用比原始表示更小的數(shù)位來編碼信息的過程。比如我們用一個顏色通道(黑白灰)來表示原來由RGB三原色構(gòu)成的圖片,此時(shí)每個像素點(diǎn)的顏色向量由3維變成了1維度。維度降低會丟失一部分信息,然而在某些情況下,降維不是件壞事。通過降維我們可以過濾掉一些不太重要的信息你,只保留最重要的信息。
假設(shè)我們像通過全連接的卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練一個圖像分類模型。當(dāng)我們說模型在學(xué)習(xí)時(shí),我們的意思是它在學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)每一層的特定屬性,比如邊緣、角度、形狀等……每當(dāng)模型使用數(shù)據(jù)(已經(jīng)存在的圖像)學(xué)習(xí)時(shí),都會將圖像的尺寸先減小再恢復(fù)到原始尺寸。最后,模型使用解碼器從壓縮數(shù)據(jù)中重建圖像,同時(shí)學(xué)習(xí)之前的所有相關(guān)信息。因此,空間變小,以便提取和保留最重要的屬性。這就是潛在空間適用于擴(kuò)散模型的原因。


Latent Diffusion
“潛在擴(kuò)散模型”(Latent Diffusion Model)將GAN的感知能力、擴(kuò)散模型的細(xì)節(jié)保存能力和Transformer的語義能力三者結(jié)合,創(chuàng)造出比上述所有模型更穩(wěn)健和高效的生成模型。與其他方法相比,Latent Diffusion不僅節(jié)省了內(nèi)存,而且生成的圖像保持了多樣性和高細(xì)節(jié)度,同時(shí)圖像還保留了數(shù)據(jù)的語義結(jié)構(gòu)。
任何生成性學(xué)習(xí)方法都有兩個主要階段:感知壓縮和語義壓縮。
感知壓縮
在感知壓縮學(xué)習(xí)階段,學(xué)習(xí)方法必須去除高頻細(xì)節(jié)將數(shù)據(jù)封裝到抽象表示中。此步驟對構(gòu)建一個穩(wěn)定、魯棒的環(huán)境表示是必要的。GAN 擅長感知壓縮,通過將高維冗余數(shù)據(jù)從像素空間投影到潛在空間的超空間來實(shí)現(xiàn)這一點(diǎn)。潛在空間中的潛在向量是原始像素圖像的壓縮形式,可以有效地代替原始圖像。
更具體地說,用自動編碼器 (Auto Encoder) 結(jié)構(gòu)捕獲感知壓縮。 自動編碼器中的編碼器將高維數(shù)據(jù)投影到潛在空間,解碼器從潛在空間恢復(fù)圖像。

語義壓縮
在學(xué)習(xí)的第二階段,圖像生成方法必須能夠捕獲數(shù)據(jù)中存在的語義結(jié)構(gòu)。 這種概念和語義結(jié)構(gòu)提供了圖像中各種對象的上下文和相互關(guān)系的保存。 Transformer擅長捕捉文本和圖像中的語義結(jié)構(gòu)。 Transformer的泛化能力和擴(kuò)散模型的細(xì)節(jié)保存能力相結(jié)合,提供了兩全其美的方法,并提供了一種生成細(xì)粒度的高度細(xì)節(jié)圖像的方法,同時(shí)保留圖像中的語義結(jié)構(gòu)。
感知損失
潛在擴(kuò)散模型中的自動編碼器通過將數(shù)據(jù)投影到潛在空間來捕獲數(shù)據(jù)的感知結(jié)構(gòu)。論文作者使用一種特殊的損失函數(shù)來訓(xùn)練這種稱為“感知損失”的自動編碼器。該損失函數(shù)確保重建限制在圖像流形內(nèi),并減少使用像素空間損失(例如 L1/L2 損失)時(shí)出現(xiàn)的模糊。
擴(kuò)散損失
擴(kuò)散模型通過從正態(tài)分布變量中逐步去除噪聲來學(xué)習(xí)數(shù)據(jù)分布。換句話說,擴(kuò)散模型使用長度為 T TT 的反向馬爾可夫鏈。這也意味著擴(kuò)散模型可以建模為時(shí)間步長為 t = 1 , … , T t =1,\dots,Tt=1,…,T 的一系列“T”去噪自動編碼器。由下方公式中的 ? θ \epsilon_\theta??
θ
?表示:
L?
DM
?=E?
x,?~N(0,1),t
?[∣∣????
θ
?(x?
t
?,t)∣∣?
2
2
?](1)
公式(1)給出了擴(kuò)散模型的損失函數(shù)。在潛在擴(kuò)散模型中,損失函數(shù)取決于潛在向量而不是像素空間。我們將像素空間元素x xx替換成潛在向量ε ( x ) \varepsilon(x)ε(x),將t時(shí)間的狀態(tài)x t x_tx?
t
?替換為去噪U(xiǎn)-Net在時(shí)間t的潛在狀態(tài)z t z_tz?
t
?,即可得到潛在擴(kuò)散模型的損失函數(shù),見公式(2):
L L D M : = E ε ( x ) , ? ~ N ( 0 , 1 ) , t [ ∣ ∣ ? ? ? θ ( z t , t ) ∣ ∣ 2 2 ] (2) L_{LDM} := \mathbb{E}_{\varepsilon(x), \epsilon\sim \mathcal{N}(0, 1), t} \Big\lbrack||\epsilon-\epsilon_\theta(z_t, t)||_2^2\Big\rbrack \tag{2}
L?
LDM
?:=E?
ε(x),?~N(0,1),t
?[∣∣????
θ
?(z?
t
?,t)∣∣?
2
2
?](2)
將公式(2)寫成條件損失函數(shù),得到公式(3):
L L D M : = E ε ( x ) , y , ? ~ N ( 0 , 1 ) , t [ ∣ ∣ ? ? ? θ ( z t , t ) , τ θ ( y ) ∣ ∣ 2 2 ] (3) L_{LDM} := \mathbb{E}_{\varepsilon(x), y, \epsilon\sim \mathcal{N}(0, 1), t} \Big\lbrack||\epsilon-\epsilon_\theta(z_t, t),\tau_\theta(y)||_2^2 \Big\rbrack \tag{3}
L?
LDM
?:=E?
ε(x),y,?~N(0,1),t
?[∣∣????
θ
?(z?
t
?,t),τ?
θ
?(y)∣∣?
2
2
?](3)
其中τ θ ( y ) \tau_\theta(y)τ?
θ
?(y)是條件y yy下的領(lǐng)域?qū)S镁幋a器(比如Transformer)。
條件擴(kuò)散
擴(kuò)散模型是依賴于先驗(yàn)的條件模型。在圖像生成任務(wù)中,先驗(yàn)通常是文本、圖像或語義圖。為了獲得先驗(yàn)的潛在表示,需要使用轉(zhuǎn)換器(例如 CLIP)將文本/圖像嵌入到潛在向量τ \tauτ中。因此,最終的損失函數(shù)不僅取決于原始圖像的潛在空間,還取決于條件的潛在嵌入。
注意力機(jī)制
潛在擴(kuò)散模型的主干是具有稀疏連接的 U-Net 自動編碼器,提供交叉注意力機(jī)制2。Transformer 網(wǎng)絡(luò)將條件文本/圖像編碼為潛在嵌入,后者又通過交叉注意力層映射到 U-Net 的中間層。這個交叉注意力層實(shí)現(xiàn)了注意力 ( Q , K , V ) = s o f t m a x ( Q K T / d ) V (Q,K,V) = softmax(QKT/\sqrts0sssss00s) V(Q,K,V)=softmax(QKT/?
d
?)V,其中 Q、K 和 V 是可學(xué)習(xí)的投影矩陣
文本-圖像合成
在 Python 實(shí)現(xiàn)中,我們可以使用使用 LDM v4 的最新官方實(shí)現(xiàn)來生成圖像。 在文本到圖像的合成中,潛在擴(kuò)散模型使用預(yù)訓(xùn)練的 CLIP 模型3,該模型為文本和圖像等多種模態(tài)提供基于Transformer的通用嵌入。 然后將Transformer模型的輸出輸入到稱為“diffusers”的潛在擴(kuò)散模型Python API,同時(shí)還可以設(shè)置一些參數(shù)(例如,擴(kuò)散步數(shù)、隨機(jī)數(shù)種子、圖像大小等)。
圖像-圖像合成
相同的方法同樣適用于圖像到圖像的合成,不同的是需要輸入樣本圖像作為參考圖像。生成的圖像在語義和視覺上與作為參考給出的圖像相似。這個過程在概念上類似于基于樣式的 GAN 模型,但它在保留圖像的語義結(jié)構(gòu)方面做得更好。
整體架構(gòu)
上面介紹了潛在擴(kuò)散模型的各個主要技術(shù)部分,下面我們將它們合成一個整理,看一下潛在擴(kuò)散模型的完整工作流程。

上圖中 x xx 表示輸入圖像,x ~ \tilde{x}?
x
~
? 表示生成的圖像;ε \varepsilonε 是編碼器,D \cal{D}D 是解碼器,二者共同構(gòu)成了感知壓縮;z zz 是潛在向量;z T z_Tz?
T
? 是增加噪聲后的潛在向量;τ θ \tau_\thetaτ?
θ
? 是文本/圖像的編碼器(比如Transformer或CLIP),實(shí)現(xiàn)了語義壓縮。
總結(jié)
本文向大家介紹了圖像生成領(lǐng)域最前沿的Stable Diffusion模型。本質(zhì)上Stable Diffusion屬于潛在擴(kuò)散模型(Latent Diffusion Model)。潛在擴(kuò)散模型在生成細(xì)節(jié)豐富的不同背景的高分辨率圖像方面非常穩(wěn)健,同時(shí)還保留了圖像的語義結(jié)構(gòu)。 因此,潛在擴(kuò)散模型是圖像生成即深度學(xué)習(xí)領(lǐng)域的一項(xiàng)重大進(jìn)步。 Stable Diffusion只是將潛在擴(kuò)散模型應(yīng)用于高分辨率圖像,同時(shí)使用 CLIP 作為文本編碼器。
說了這么多理論,想必大家已經(jīng)迫不及待躍躍欲試了。別著急,后面我會手把手教大家搭建Stable Diffusion本地環(huán)境,讓大家可以親手體驗(yàn)Stable Diffusion的威力。

為大家準(zhǔn)備了深度學(xué)習(xí)以及計(jì)算機(jī)視覺學(xué)習(xí)資料
可添加VX公眾號:咕泡AI,回復(fù)333免費(fèi)領(lǐng)學(xué)習(xí)資料!
【1】人工智能學(xué)習(xí)課程及配套資料
【2】超詳解人工智能學(xué)習(xí)路線圖及學(xué)習(xí)大綱
【3】學(xué)人工智能必看優(yōu)質(zhì)書籍電子書匯總
【4】人工智能面試題庫大全以及問題總結(jié)
【5】人工智能經(jīng)典論文100篇+解讀+復(fù)現(xiàn)教程
【6】計(jì)算機(jī)視覺技術(shù)教學(xué)課程+YOLO等項(xiàng)目教學(xué)
【7】人工智能最新行業(yè)報(bào)告 作者:OpenCV圖像處理?