原來Stable Diffusion是這樣工作的

flydean發表於2024-06-06

stable diffusion是一種潛在擴散模型,可以從文字生成人工智慧影像。為什麼叫做潛在擴散模型呢?這是因為與在高維影像空間中操作不同,它首先將影像壓縮到潛在空間中,然後再進行操作。

在這篇文章中,我們將深入瞭解它到底是如何工作的,還能夠知道文生圖的工作方式與圖生圖的的工作方式有何不同?CFG scale是什麼?去噪強度是什麼?

瞭解stable diffusion工作原理的好處: 可以更加正確的使用這個工具,從而實現更加可控的結果。

stable diffusion有什麼用處?

簡單來說,穩定擴散是一種文字到影像的模型。給它一個文字提示,它會返回一個與文字匹配的AI影像。

image-20240422121545313

stable diffusion模型

穩定擴散屬於一類稱為擴散模型的深度學習模型。它們是生成模型,意味著它們被設計用來生成類似於訓練資料的新資料。而在stable diffusion中下,這些資料就是影像。

那麼為什麼它被稱為擴散模型?

因為它的實現原理看起來非常像物理學中的擴散。接下來讓我們看看他的底層原理實現。這裡我以最常見的1girl作為例子來說明。

正向擴散

正向擴散過程中,會向訓練影像新增噪音,逐漸將其轉化為不具有特徵的噪音影像。正向過程會將任何1girl的影像轉變為噪音影像。最終,你將無法判斷它們最初到底是什麼。(這很重要)

就像一滴墨水落入了一杯水中。墨水滴在水中擴散開來。幾分鐘後,它會隨機分佈在整個水中。你再也無法判斷它最初是落在中心還是靠近邊緣。

下面是一個影像經歷正向擴散的示例。1girl的影像變成了隨機噪音。

image-20240422123002139

逆向擴散

正向擴充套件很好理解,那麼接下來就是神奇的部分,如果我們能夠逆向擴散呢?就像倒放影片一樣,倒退時間。

從一個嘈雜、毫無意義的影像開始,逆向擴散可以恢復出一張原始的1girl的影像。這就是主要的想法。

訓練過程

逆擴散的概念肯定是有創意的。但是,現在的問題是,“怎樣才能實現逆擴散呢?”

為了逆轉擴散,最根本的是我們需要知道影像新增了多少噪音。

diffusion中使用了一個神經網路模型來預測新增的噪音。這就是穩定擴散中的噪音預測器。它是一個U-Net模型。訓練過程如下。

  • 選擇一張訓練影像,比如1girl的照片。

  • 生成一個隨機的噪音影像。

  • 透過在訓練的不同步數中新增一定的噪音影像來破壞訓練影像。

  • 透過調整噪音預測器的權重,來訓練噪音預測器,從而告訴他,我們新增了多少噪音。

image-20240422154548041

訓練後,我們有了一個能夠預估影像新增的噪音的噪音預測器。

逆擴散

現在我們有了噪聲預測器。如何使用它呢?

首先,我們生成一個完全隨機的影像,並要求噪聲預測器告訴我們噪聲。然後我們從原始影像中減去這個估計的噪聲。重複這個過程幾次。最終你會得到一張1girl的影像。

image-20240422160214496

當然現在我們還無法控制生成的影像,現在這個過程完全是隨機的。

穩定擴散模型Stable Diffusion model

上面講了那麼多原理,但是其實那並不是stable diffusion的工作原理!

原因是上述擴散過程是在影像空間進行的。因為影像空間非常的大,所以計算速度非常的慢。

舉個例子:一個512×512畫素的影像有三個顏色通道(紅色、綠色和藍色),就是一個786,432維的空間!(你需要為一個影像指定那麼多數值。)這是一個非常大的數字,在現有的GPU硬體條件下,很難快速的生成需要的圖片。

所以很多公司對這個畫素空間的擴散模型做了最佳化,比如谷歌的Imagen和Open AI的DALL-E,它們使用了一些技巧來加快模型速度,但這樣還是不夠的。

潛在擴散模型Latent diffusion model

Stable diffuion中引入了一個叫做潛在擴散空間的概念,從而解決在畫素空間的擴散模型計算速度慢的問題。下面是它的工作原理。

穩定擴散是一種潛在擴散模型。它不是在高維影像空間中執行,而是首先將影像壓縮到潛在空間中。

以上面的512×512畫素的影像為例,穩定擴散模型的潛在空間是4x64x64,這個潛在空間是原影像畫素空間的1/48。

因為潛在空間只有之前的1/48,因此它能夠在計算更少的數字的情況下獲得結果。這就是為什麼它更快的原因。

變分自動編碼器VAE

從畫素空間到潛在空間的變化,是透過一種稱為變分自動編碼器(variational autoencoder)的技術來實現的。是的,這就是我們經常看到的VAE。

變分自動編碼器(VAE)是由兩部分組成:(1)編碼器和(2)解碼器。編碼器將影像壓縮到潛在空間,解碼器從潛在空間恢復影像。

image-20240422172146404

我們所說的所有前向和反向擴散實際上都是在潛在空間中進行的。因此,在訓練過程中,它不是生成一個嘈雜的影像,而是在潛在空間中生成一個隨機張量(潛在噪聲)。它不是用噪音損壞影像,而是用潛在噪聲損壞影像在潛在空間中的表示。這樣做的原因是潛在空間較小,因此速度更快。

影像解析度

影像解析度反映在潛在影像張量的大小上。對於僅有512×512畫素的影像,潛在影像的大小為4x64x64。對於768×512畫素的肖像影像,潛在影像的大小為4x96x64。

這就是為什麼生成更大的影像需要更長的時間和更多的VRAM。

這裡想解釋一下為什麼我們在使用stable diffusion的時候,如果生成大於512×512畫素的影像,有時候會出現雙頭的問題。

這是因為Stable Diffusion v1是在512×512畫素影像上進行訓練的。

影像放大

那麼我們怎麼才能生成解析度更大的圖片呢?最好的辦法是保證影像至少有一邊達到512畫素,然後使用AI放大器或img2img的功能進行影像放大。

另外,可以使用SDXL模型。它具有更大的預設尺寸,為1024 x 1024畫素。

為什麼潛在空間可以工作?

你可能會想知道為什麼變分自動編碼器(VAE)可以將影像壓縮成一個更小的潛在空間而不丟失資訊。

原因是,自然影像並不是隨機的,它們具有很高的規律性:一張臉遵循著眼睛、鼻子、臉頰和嘴巴之間特定的空間關係。一隻狗有四條腿並且具有特定的形狀。

換句話說,影像的高維度是人為的。自然影像可以很容易地壓縮到更小的潛在空間而不丟失任何資訊。這在機器學習中被稱為流形假設。

潛在空間中的反向擴散

以下是stable diffusion中潛在空間反向擴散的工作原理。

  1. 生成一個隨機潛在空間矩陣。

  2. 噪聲預測器預測潛在矩陣的噪聲。

  3. 然後從潛在矩陣中減去預測的噪聲。

  4. 根據特定的取樣步數,重複2,3這兩步。

  5. VAE的解碼器將潛在矩陣轉換為最終影像。

什麼是VAE檔案?

VAE檔案是在Stable Diffusion v1中用於改進眼睛和臉部的生成效果。它們是我們剛剛談到的自動編碼器的解碼器。透過進一步微調解碼器,模型可以繪製出更精細的細節。

之前提到自然影像並不是隨機的,它們具有很高的規律性,雖然是這樣,但是將影像壓縮到潛在空間確實會丟失資訊,因為原始的VAE沒有恢復細節。而這個VAE檔案或者VAE解碼器的作用就是負責繪製細節。

條件控制

到這裡基本上執行流程已經差不多了,但是我們還缺了一部分:我們寫的文字prompt是在哪裡發揮作用的呢?

這些prompt實際上就是條件控制。條件控制的目的是引導噪聲預測器,使得預測的噪聲在從影像中減去後能夠給我們想要的結果

txt2img(文字到影像)

以下是對txt2img如何被處理並輸入到噪聲預測器的說明。

首先,分詞器(Tokenizer)將提示中的每個單詞轉換為一個稱為標記的數字。然後,每個標記被轉換為一個名為嵌入embedding的768值向量。這些嵌入然後被文字變換器(text transformer)處理,並準備好被噪聲預測器使用。

image-20240422203502407

接下來,讓我們詳細介紹每一部分的含義。

分詞器Tokenizer

image-20240422184029011

首先,文字提示被 CLIP 分詞器進行分詞。CLIP 是由 Open AI 開發的深度學習模型,用於生成任何影像的文字描述。Stable Diffusion v1 使用了 CLIP 的分詞器。

分詞是計算機理解單詞的方法。我們人類可以讀單詞,但計算機只能讀數字。這就是為什麼文字提示中的單詞首先被轉換為數字的原因。分詞器只能分詞它在訓練過程中見過的單詞。例如,CLIP 模型中有“butter”和“fly”,但沒有“butterfly”。分詞器會將單詞“butterfly”分解為兩個標記“butter”和“fly”。所以一個單詞並不總是意味著一個標記

另一個細節是空格字元也是標記的一部分。在上面的情況中,短語“butter fly”產生了兩個標記“butter”和“[space]fly”。這些標記與“butterfly”產生的不同,“butterfly”的標記是“butter”和“fly”(在“fly”之前沒有空格)。

Stable Diffusion 模型在提示中僅限於使用75個標記。(這並不等同於75個單詞)

嵌入embedding

Stable diffusion v1採用了Open AI的ViT-L/14 Clip模型。embedding嵌入是一個768值的向量。每個標記都有自己獨特的嵌入向量。嵌入是由CLIP模型決定的,在訓練過程中學習的。

為什麼我們需要嵌入?因為一些詞是密切相關的,我們希望能夠充分利用這些資訊。例如,mangentlemanguy的嵌入幾乎相同,因為它們可以互換使用。克勞德·莫奈、皮埃爾·奧古斯特·雷諾阿和愛德華·馬奈都是印象派風格繪畫的代表,但方式各有不同。所以這些名字在embedding中具有接近但不完全相同的值。

這就是我們討論的用於透過關鍵詞觸發樣式的嵌入。找到合適的嵌入可以觸發任意物件和風格,這是一種稱為文字反演(textual inversion)的微調技術。

embedding to noise predictor

image-20240422203533236

在傳送到噪聲預測器之前,嵌入需要透過文字轉換器進行處理處理。

轉換器就像一個通用介面卡,用於條件處理。在這種情況下,它的輸入是文字嵌入向量,但它也可以是其他東西,比如標籤、影像和深度圖。

注意力機制

在Stable Diffusion AI和類似的文字到影像生成模型中,U-Net是一個關鍵的元件,它負責將文字提示轉換成影像。U-Net是一個深度學習模型,通常用於影像到影像的任務,如影像分割。在Stable Diffusion中,U-Net利用了一種稱為“注意力機制”的技術來理解和處理文字提示。

  1. 自注意力 (Self-Attention)
    • 自注意力允許模型在處理提示時識別單詞之間的關係。比如一個藍色眼睛的男人,“藍”和“眼睛”透過自注意力機制被關聯起來,這樣模型就知道使用者想要生成的是一個擁有藍色眼睛的男人,而不是一個穿著藍色襯衫的男人。
  2. 交叉注意力 (Cross-Attention)
    • 交叉注意力是文字和影像之間的橋樑。在生成影像的過程中,U-Net使用交叉注意力機制來確保生成的影像與文字提示保持一致。這意味著模型會根據文字提示中的關鍵詞生成相應的影像特徵。

超網路是一種調整穩定擴散模型的技術,它利用交叉注意力網路來插入風格。

LoRA模型修改交叉注意力模組的權重來改變風格。

僅僅修改這個模組就能調整穩定擴散模型的結果,可見這個模組是多麼重要。

還有其他控制條件嗎?

穩定擴散模型可以被修改和設定的方式不止文字提示一種。

除了文字提示,深度影像也可以被用來設定影像模型。

比如ControlNet就可以使用檢測到的輪廓、人體姿勢等來設定噪聲預測器,並實現對影像生成的出色控制。

Stable difussion逐步解析

現在你已經瞭解了穩定擴散的所有內部機制,讓我們透過一些例子來看看它在幕後到底發生了什麼。

文字轉影像

在文字轉影像中,你輸入文字,模型會返回一個生成好的AI圖片。

步驟1。穩定擴散在潛在空間中生成一個隨機張量。你可以透過設定隨機數生成器的種子來控制這個張量。

如果你把種子設定為固定的值,那麼你將始終得到相同的隨機張量。

最開始的影像只是一片噪音。

步驟2。噪聲預測器 U-Net 將潛在的嘈雜影像和文字提示作為輸入,並在潛在空間中預測噪音。

image-20240422204010632

步驟3。從潛在影像中減去潛在噪聲。這就成為了您的新潛在影像

image-20240422204531142

步驟2和步驟3會重複一定數量的取樣步驟,這個步驟就是你設定的sample steps。

步驟4。最後,VAE 的解碼器將潛在影像轉換回畫素空間。這就是在執行穩定擴散後得到的影像。

image-20240422204647493

噪聲排程(Noise schedule)

圖片從嘈雜變得清晰。是因為每一步我們都從原始latent space中減去了預測到的噪聲。

每步減少多少噪聲,這個減去噪聲的排程過程,就叫做noise schedule。

下面是一個噪聲排程的例子。

noise schedule是透過我們使用的取樣器和取樣步數來決定的,我們可以在每一步中減去相同量的噪聲,也可以在開始階段減去更多的噪聲,就像上面的例子。

取樣器在每一步中減去恰好足夠的噪聲,以便在下一步達到期望的噪聲。

影像到影像

影像到影像的意思是使用穩定擴散將一幅影像轉換成另一幅影像。

SDEdit是一種影像到影像的編輯方法,它允許使用者透過結合輸入影像和文字提示來控制影像生成過程。這種方法首次提出時,旨在提高對生成影像的控制能力,使得使用者可以更精確地實現他們的創意願景。SDEdit可以應用於任何擴散模型,包括Stable Diffusion。

影像到影像的輸入是一幅影像和一個文字提示。生成的影像將同時受到輸入影像和文字提示的影響。

比如我透過這左邊的素描圖加上提示詞:

"photo of young woman,no suit,no shirt,no bar,on the street,
rim lighting,studio lighting,looking at the camera,dslr,ultra quality,sharp focus,tack sharp,dof,film grain,Fujifilm XT3,crystal clear,8K UHD,highly detailed glossy eyes,high detailed skin,skin pores,"

就可以把它轉換成一張真實的圖片:

image-20240422232635503

現在讓我們來看看具體的步驟。

步驟1. 將輸入影像編碼為潛在空間。

image-20240422232959011

步驟2. 將噪聲新增到潛在影像。去噪強度控制新增的噪聲量。

如果為0,則不新增噪聲。如果為1,則新增最大量的噪聲,使潛在影像變成完全隨機的張量。

image-20240422233409529

步驟3. 噪聲預測器U-Net將潛在帶噪聲影像和文字提示作為輸入,並預測潛在空間中的噪聲。

image-20240422233517705

步驟4. 從潛在影像中減去潛在噪聲。這就成為了你的新潛在影像

image-20240422204531142

步驟3和步驟4會重複一定數量的取樣步驟,這個步驟就是你設定的sample steps。

步驟5. 最後,VAE的解碼器將潛在影像轉換回畫素空間。這就是你透過執行影像到影像得到的影像。

image-20240422233755177

所以現在你知道影像到影像是什麼了:它只是在初始潛在影像上加入一點噪聲和輸入影像。

將去噪強度設定為1等同於文字到影像,因為初始潛在影像完全是隨機的。

影像修復

影像修復實際上只是影像到影像的特例。在需要修復的影像部分新增了噪音。噪音的數量同樣由去噪強度控制。

什麼是CFG值?

我們在使用stable diffusion的時候,有一個非常重要的引數叫做CFG。

在理解CFG之前,我們首先需要了解它的前身,分類器指導Classifier guidance

分類器指導Classifier guidance

分類器指導是在擴散模型中影像標籤的一種整合方式。你可以使用標籤來指導擴散過程。例如,標籤“1girl”可以引導逆擴散過程生成女性的照片。

分類器指導比例(classifier guidance scale)是一個引數,用於控制擴散過程在多大程度上遵守這個分類標籤。

假設我們有三組影像,分別帶有“貓”、“狗”和“人類”的標籤。如果擴散過程不受任何指導,模型可能會從每個類別中隨機抽取樣本。這可能導致生成的影像同時符合兩個標籤的特徵,比如一個男孩正在撫摸一隻狗的場景。

classifier guidance scale指導的條件下,擴散模型產出的影像往往會傾向於典型或明確的樣本。比如,當你要求模型生成一隻貓的圖片時,它將提供一張清晰無疑的貓的影像,而非其他任何生物。

分類器指導比例classifier guidance scale)調節著模型遵循標籤指導的嚴格程度,更高的值,意味著在生成影像時,模型更加嚴格地依據所給標籤進行選擇。在實際操作中,這個比例的值實際上是一個乘數,它決定了模型在生成過程中向具有特定標籤的資料集偏移的程度。

無分類器引導Classifier-free guidance(CFG)

分類器引導雖然功能強大,但它需要額外的模型來提供指導,這給訓練過程帶來了一些挑戰。

無分類器引導是一種創新的方法,它允許實現“無需分類器的分類器引導”。透過使用影像的標題來訓練一個有條件的擴散模型,將分類器的功能整合為噪聲預測器U-Net的一個條件,從而實現了一種無需單獨影像分類器的影像生成引導。

另外,文字提示為文字到影像的生成提供了一種引導機制,使得模型能夠根據文字描述生成相應的影像。

無分類器引導規模(CFG scale)

現在,我們有一個使用條件控制的無分類器擴散過程。我們如何控制AI生成的影像應該多大程度上遵循引導?

無分類器引導規模(CFG scale)是一個控制文字提示如何引導擴散過程的值。當CFG規模設定為0時,AI影像生成是無條件的(即忽略提示)。較高的CFG規模會將擴散引導到提示方向。

穩定擴散 v1.5 與 v2 比較

模型差異

SD v2使用OpenClip進行文字嵌入。SD v1使用Open AI的CLIP ViT-L/14進行文字嵌入。這一變化的原因是:

  • OpenClip比原先的模型大了多達五倍。更大的文字編碼器模型可以提高影像質量。

  • 雖然Open AI的CLIP模型是開源的,但這些模型是使用專有資料進行訓練的。轉換到OpenClip模型能夠讓研究人員在研究和最佳化模型時更加透明。這對於長期發展是更有利的。

v2模型有兩種版本。

  • 512版本生成512×512畫素的影像

  • 768版本生成768×768畫素的影像

訓練資料差異

SD v1.4 是在名為 laion2B-en 的資料集上,以 256×256 的解析度進行了 237,000 次訓練迭代。

接著,在 laion-high-resolution 資料集上,以 512×512 的解析度進行了 194,000 次訓練迭代。

在“laion-aesthetics v2 5+”資料集上,同樣以 512×512 的解析度,進行了 225,000 次訓練迭代,同時在文字條件中降低了 10% 的權重。

SD v2 則是在 LAION-5B 資料集的子集上,經過去除了顯式NSFW內容的篩選,並應用了 LAION-NSFW 分類器,以 punsafe=0.1 的引數和 aesthetic score >=4.5 的條件下,進行了 550,000 次訓練迭代。

此外,該模型還在相同資料集上以 256x256 的解析度進行了 850,000 次訓練迭代,但這次只包括圖片解析度大於或等於 512x512 的樣本。

之後,模型使用了 v-objective 目標函式,在相同資料集上進行了額外的 150,000 次訓練迭代。

最後,在 768x768 的圖片上繼續進行了 140,000 次訓練迭代。

SD v2.1 是在 v2.0 的基礎上進行了微調,先是以 punsafe=0.1 的引數額外訓練了 55,000 步,然後又以 punsafe=0.98 的引數額外訓練了 155,000 步。

值得注意的是,在最終的訓練階段,NSFW的過濾器被關閉了

輸出表現的差異

人們在使用SD v2 來控制風格和生成名人影像時,會更加的困難。因為雖然 Stability AI 並沒有明確排除藝術家和名人的名字,但在 v2 版本中,這些名字的效果要弱得多。這很可能是因為訓練資料的差異所致。Open AI 的專有資料可能包含更多的藝術作品和名人照片,而且這些資料很可能經過了高度篩選,以確保每件作品和每位人物都看起來都非常美觀。

因為這種原因,SD V2 和v2.1並沒有流行起來,使用者們更傾向於使用經過精細調整的 v1.5 和 SDXL 模型。

SDXL model

作為一個規模更大的模型,在人工智慧領域,人們普遍認為其效能會更為出色。SDXL 模型的引數總數達到了驚人的 66 億,而相比之下,v1.5 模型的引數總數則為 9.8 億。

SDXL model pipeline

  • 實際上,SDXL 模型由兩個模型組成:基礎模型細化模型。基礎模型負責構建整體構圖,而細化模型則在此基礎上新增更精細的細節。

    基礎模型可以獨立執行,不依賴細化模型。

    SDXL 基礎模型的改進包括:

    • 文字編碼器結合了最大的 OpenClip 模型(ViT-G/14)和 OpenAI 的專有 CLIP ViT-L。這樣的選擇讓 SDXL 更易於引導,同時保持了強大的效能,並且能夠使用 OpenClip 進行訓練。
    • 新的影像尺寸調節旨在使用小於 256×256 的訓練影像。這透過不丟棄 39% 的影像,顯著增加了訓練資料量。
    • U-Net 的規模是 v1.5 模型的三倍
    • 預設的影像尺寸為 1024×1024,是 v1.5 模型 512×512 的四倍。

點我檢視更多精彩內容:www.flydean.com

相關文章