Stable Diffusion工作原理(How does Stable Diffusion work?中文版)

翻譯自How does Stable Diffusion work?

1. SD能做什么

最基本的功能是:文生圖(text-to-image)


SD以文字提示為輸入,輸出與提示相配的圖像

2. 擴散模型

SD屬于擴散模型。擴散模型是一類生成式模型,它們被設(shè)計用于生成與訓(xùn)練數(shù)據(jù)類似的新數(shù)據(jù)。

擴散模型為什么叫“擴散”模型呢?因為模型生成數(shù)據(jù)的過程類似物理上的擴散。下面以訓(xùn)練生成????圖片的擴散模型為例,介紹訓(xùn)練過程。

2.1 正向擴散

正向擴散(Forward Diffusion)是??/??圖片轉(zhuǎn)為無特點的噪聲圖的過程,從噪聲圖是看不出最初是??還是??的。
像一滴墨掉進一杯水,不一會兒就會慢慢擴散,將自己隨機分布到水中,就難以辨認出最初墨滴在邊緣、中心還是別的哪里了。

一張??圖經(jīng)過正向擴散,變成隨機噪聲

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步:

  1. 取一張訓(xùn)練圖,比如一張??圖
  2. 生成一張噪聲圖
  3. 將噪聲圖以不同強度疊加到訓(xùn)練圖上來破壞訓(xùn)練圖像。
  4. 教噪聲預(yù)測器告訴我們添加了多少噪聲
    這是通過調(diào)整強度并顯示正確數(shù)值來實現(xiàn)的。
每一步中疊加更多噪聲,讓noise predictor估計每一步圖像中的噪聲

經(jīng)過訓(xùn)練,我們得到了能預(yù)測圖中添加噪聲量多少的noise predictor。

3.2 逆向擴散步驟

有了noise predictor,我們用它實現(xiàn)逆向擴散。

  1. 生成一個完全隨機的圖像,并要求noise predictor告訴我們噪聲
  2. 從原始圖像中減去預(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實現(xiàn)圖像與表征的相互轉(zhuǎn)換

  • 為什么使用表征是可行的
    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)。逆向擴散步驟如下:

  1. 生成一個隨機矩陣作為圖像表征。
  2. noise predictor估計這個矩陣的噪聲,從圖像表征中減去估計的噪聲。
    (重復(fù)2.直到特定的采樣步驟)
  3. 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被送入

將文本提示特征化,并送入noise predictor以控制文本生成

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容