1. SD能做什么
最基本的功能是:文生圖(text-to-image)

2. 擴散模型
SD屬于擴散模型。擴散模型是一類生成式模型,它們被設(shè)計用于生成與訓(xùn)練數(shù)據(jù)類似的新數(shù)據(jù)。
擴散模型為什么叫“擴散”模型呢?因為模型生成數(shù)據(jù)的過程類似物理上的擴散。下面以訓(xùn)練生成????圖片的擴散模型為例,介紹訓(xùn)練過程。
2.1 正向擴散
正向擴散(Forward Diffusion)是??/??圖片轉(zhuǎn)為無特點的噪聲圖的過程,從噪聲圖是看不出最初是??還是??的。
像一滴墨掉進一杯水,不一會兒就會慢慢擴散,將自己隨機分布到水中,就難以辨認出最初墨滴在邊緣、中心還是別的哪里了。

2.2 逆向擴散
而逆向擴散(Reverse Diffusion)則從無意義的噪聲圖中復(fù)原出??或??,是正向擴散的“倒放”。
技術(shù)上,每次擴散包括兩步:漂移(drift)和隨機運動(random motion)。逆向擴散的漂移要么朝著復(fù)原出??的方向要么朝著復(fù)原出??的方向,而不會是一個中間值。
3. 逆向擴散怎么實現(xiàn)
逆向擴散這個idea無疑是聰明優(yōu)雅的。但價值千金的難題是:它怎么實現(xiàn)?
3.1 訓(xùn)練noise predictor
為了將擴散過程逆過來,我們需要知道一張圖被添加了多少噪聲。這可以通過訓(xùn)練一個模型預(yù)測圖上的噪聲程度來實現(xiàn),noise predictor在SD中是由一個U-Net模型(一種全卷積神經(jīng)網(wǎng)絡(luò))實現(xiàn)的。訓(xùn)練過程分4步:
- 取一張訓(xùn)練圖,比如一張??圖
- 生成一張噪聲圖
- 將噪聲圖以不同強度疊加到訓(xùn)練圖上來破壞訓(xùn)練圖像。
- 教噪聲預(yù)測器告訴我們添加了多少噪聲
這是通過調(diào)整強度并顯示正確數(shù)值來實現(xiàn)的。

經(jīng)過訓(xùn)練,我們得到了能預(yù)測圖中添加噪聲量多少的noise predictor。
3.2 逆向擴散步驟
有了noise predictor,我們用它實現(xiàn)逆向擴散。
- 生成一個完全隨機的圖像,并要求noise predictor告訴我們噪聲
- 從原始圖像中減去預(yù)測的噪聲
重復(fù)1.和2.幾次,就獲得??或??的圖像。
我們暫時還不能控制復(fù)原出的圖片是??還是??,控制輸出可以通過加條件來實現(xiàn)。
4. Stable Diffusion
現(xiàn)在有一個壞消息。剛剛所說的不是SD的工作方式。擴散過程是在圖像空間進行的。這在計算上慢到難以接受,而且在任何單個的GPU上都跑不了。512*512的RGB圖在786,432維的空間。我們需要為一張圖指定的值太太太多。
Google的Imagen和Open AI的DALL-E是像素級的擴散模型,它們有一些加速的技巧但還不夠。
而Stable Diffusion正是為解決圖像擴散模型的速度難題而設(shè)計的。
4.1 表征(Latent)擴散模型
Stable Diffusion是一個表征擴散模型。它首先把圖像壓縮到表征空間,以避免在高維的圖像空間進行操作。這就快多了。
4.2 圖像表征和復(fù)原
圖像到表征和表征到圖像的轉(zhuǎn)換是通過VAE(Variational Autoencoder)來實現(xiàn)的。
VAE包括encoder和decoder兩部分。
encoder將圖片壓縮為較低維度的表征,decoder從表征中復(fù)原圖片。

- 為什么使用表征是可行的
VAE為何可以將圖像壓縮為表征而不會丟失信息?這是因為是自然圖像不是隨機的。他們的規(guī)律性很高:比如臉遵循眼睛,鼻子,臉頰和嘴巴之間的特定空間關(guān)系。狗有四條腿,有特殊的形態(tài)。
換句話說,圖像的高維度是人為的,有很多冗余信息。自然圖像可以輕松地壓縮到較小的潛在空間中,而不會丟失任何信息。這稱為機器學(xué)習(xí)中的manifold hypothesis。
4.3 SD的訓(xùn)練
Stable Diffusion中對512*512的RGB圖像的表征是4*64*64的。得到表征后,之前說的擴散過程都在表征空間進行。所以訓(xùn)練時,我們生成的噪聲不是噪聲圖而是一個表征空間的隨機tensor,這個tersor再和圖像的表征進行不同程度的疊加,以訓(xùn)練noise predictor并進行逆向擴散(逆向擴散sampling和samplers: 詳見link)。逆向擴散步驟如下:
- 生成一個隨機矩陣作為圖像表征。
- noise predictor估計這個矩陣的噪聲,從圖像表征中減去估計的噪聲。
(重復(fù)2.直到特定的采樣步驟) - VAE的解碼器將圖像表征轉(zhuǎn)換為最終圖像
4.4 圖像分辨率
圖像分辨率在圖像表征的shape上有體現(xiàn),這也是生成大圖會耗費更多顯存和時間的原因。表征的大小是圖片大小的1/48(768*512的RGB圖像的表征是4*96*64的)。
StableDiffusion v1是在512*512的圖像上微調(diào)的,因此生成比512*512的更大的圖會出現(xiàn)重復(fù)的物體(比如,兩個腦袋(with solution)))。
-
生成大圖
如果一定要生成大圖,需要至少保證寬/高中的一個是512,再用AI upscaler提高分辨率。
4.5 VAE file
VAE file用于Stable Diffusion v1中,以改善眼睛和面部。它們是經(jīng)過進一步微調(diào)的VAE decoder,該模型可以繪制更精細的細節(jié)。
(之前提到的假說并非完全正確。將圖像壓入潛在空間確實會丟失信息,因為原始VAE沒有恢復(fù)細節(jié)。取而代之的是,VAE file中的decoder負責(zé)繪制精美的細節(jié)。)
5. 條件控制(Conditioning)
上述對Stable Diffusion的理解還不完整。怎么通過文本提示來控制出圖呢?
這就需要Conditioning,其目的是引導(dǎo)noise predictor,以便預(yù)測的噪聲從圖像中減掉后能得出我們想要的東西。
5.1 文本條件(text-to-image)
下圖是文本提示(text prompt)被處理并喂給noise predictor的過程。Tokenizer先把提示中的每個詞切分出來作為token。每個token會被轉(zhuǎn)化為一個768維的embedding。隨后embedding被送入
