AIGC名詞解釋:Stable Diffusion 穩定擴散模型 I

2023-10-09   新設技

原標題:AIGC名詞解釋:Stable Diffusion 穩定擴散模型 I

用設計師能理解的語言

來解釋AIGC中的技術名詞

AIGC 屬於跨學科的產物,涉及領域眾多,包括高等數學、統計學、計算機圖形圖像學、機器學習等各個領域。AIGC 設計軟體的介面上往往會涉及到許多這些領域的技術術語。要想搞清楚它們背後的知識體系需要展開的知識樹體量十分龐大繁雜。術業有專攻,我們無法全面俱到地在每一個領域都做到精通,但又需要了解到一定的程度,以便更好地使用 AIGC 的相關軟體。所以,我們將儘量以設計行業從業者能理解的語言來解釋那些經常遇到無法繞開的技術術語。

Stable Diffusion 穩定擴散模型(上)

Stable Diffusion 是 Diffusion 擴散模型中最先進的模式,它採用了更加穩定、可控和高效的方法來生成高質量圖像。在生成圖像的質量、速度和成本上都有顯著的進步,因此該模型可以直接在消費級顯卡上實現圖像生成,可達至少512*512像素的圖像。最新的 XL 版本可以在 1024*1024 像素的級別上生成可控的圖像,生成效率也比以往的 Diffusion 擴散模型提高了30倍。目前 Stable Diffusion 的應用已經不局限於圖像生成領域,它還被廣泛應用於自然語言處理、音頻視頻等生成領域。

Stable Diffusion 背後的公司是足以與 OpenAI 抗衡的 Stability AI 公司。Stable Diffusion的模型架構是於2022年8月由 CompVis、Stability AI和 LAION 的研究人員在 Latent Diffusion Model 的基礎上創建的。其核心技術來源於 AI 視頻剪輯技術創業公司 Runway 的 Patrick Esser,以及慕尼黑大學機器視覺學習組的 Robin Romabach 這兩位開發者在計算機視覺大會 CVPR22 上合作發表的潛擴散模型(Latent Diffusion Model)的研究(論文:https://arxiv.org/abs/2112.10752 )。

Stability AI 旗下各大項目

Stability AI 公司雖然在普通大眾來看並不出名,但在業內它的地位卻十分顯赫。除了 Stable Diffusion,Stability AI 雄心勃勃的計劃下面還聚集了 EleutherAI 和 LAION 等知名開源項目,以及生物模型 OpenBioML、音頻生成 Harmonai、人類偏好學習 Carperai、多模態 DeepFloyd 等更多項目。Stability AI 的迅速崛起給因 ChatGPT 而聞名天下的 OpenAI 公司造成了不小壓力,前 Oculus CTO John Carmack 表示:「Stable Diffusion 是一個開源炸彈。OpenAI 雖然資金充裕,但從商業化以及產品化的角度很難與其匹敵。」

下面就讓我們詳細看看,這個來自於 Stability AI 公司的著名的 Stable Diffusion 到底是怎樣一種 AIGC 的技術。

Stable diffusion (穩定擴散模型)相比它的上一代版本 Latent diffusion (潛空間擴散模型)主要有以下幾點改進:

  • 訓練數據:Latent Diffusion 是採用 Laion-400M 數據訓練的,而 Stable Diffusion 是在 Laion-2B-en數據集上訓練出來的。「2B-en」是20億圖像及英文對照文本的意思,20億確切的說是包含23.2億。明顯後者用了更多的訓練數據,而且後者還採用了數據篩選來提升樣本數據質量,即採用了 Laion-Aesthetic,一個120M的訓練子集,以專門選擇美學評分較高的圖像用於文生圖任務。
  • Text Encoder:Latent Diffusion 採用一個隨機初始化的 Transformer (這個 Transformer 就是 ChatGPT 用的那個 Transformer,稍後我們會詳細介紹)來編碼 text,而 Stable Diffusion 採用一個預訓練好的 Clip text encoder 來編碼 text,預訓練的 text model 往往要優於從零開始訓練的模型。
  • 訓練尺寸:Latent Diffusion 是在256x256解析度上訓練,而 Stable Diffusion 是先在256x256解析度上預訓練,然後再在512x512解析度上微調優化的,而現在 XL 版本則採用了 Laion-High-Resolution 訓練集,一個規模為170M,圖像解析度大於 1024 的高解析度訓練子集,用於超解析度任務。

訓練尺寸:Latent Diffusion 是在256x256解析度上訓練,而 Stable Diffusion 是先在256x256解析度上預訓練,然後再在512x512解析度上微調優化的,而現在 XL 版本則採用了 Laion-High-Resolution 訓練集,一個規模為170M,圖像解析度大於 1024 的高解析度訓練子集,用於超解析度任務。

然而要想說清楚 Stable Diffusion,必須首要搞清楚 Latent Diffusion 的核心優勢。可以說 Latent Diffusion 是 Stable Diffusion 的鼻祖,因為它首次採用了淺空間的高效處理方法,解決了 Diffusion 效率低下的問題。它內部的 U-Net 網絡是在潛空間的低維度中進行運算的,這極大地降低了內存消耗和計算的複雜度。例如,一個512*512像素的照片圖像,數據表達為(3,512,512),即 RGB 三通道*512*512像素的圖像數據規模,數據體積在786432之上。而在潛空間中則會被壓縮成(4,64,64),數據體積為16384,內存消耗將會減少到原來的64分之1。這個給模型的運行帶來了極大的高效性與普及性。Stable Diffusion 自然也繼承了 Latent Diffusion 的這個核心優勢。

接下來,我們將部分參考並翻譯幾位技術大牛對 Stable Diffusion 的文章內容,尤其是 Jay Alammar 在其博客上針對 Stable Diffusion 解構所配的十分簡明扼要的拓撲圖,引用其中一些關鍵的部分進行講解。

Jay Alammar

Stable Diffusion 穩定擴散模型可以被應用在許多領域,但在 AIGC 設計領域,我們僅關注它的兩個主要方面:

第一個是文生圖(text2img)。下圖展示了一套文本和對應生成的圖像。這套文本就是 Prompt 提示詞:paradise cosmic beach。

文生圖:提示詞「paradise cosmic beach」生成了對應的圖片

第二個是改變圖片。很明顯,改變圖片需要的是輸入一張圖片,還有用來改變圖片的提示詞。對應的例子是第一次生成的圖+提示詞:Pirate ship。

提示詞修圖:修圖提示詞「Pirate ship」在原圖上進行了新元素的添加

Stable Diffusion 穩定擴散模型的組成部分

其實 Stable Diffusion 本身並不是一個模型,而是一個由多個模塊和模型組成的系統。論模型來說,Stable Diffusion 由三大核心部件組成,每個組件都是一個神經網絡系統,也稱為三大基礎模型:

1,CLIPText 用於文本編碼,使文本數字化:

  • Input:輸入文本;
  • Output:77 token embeddings vectors,每個 token 向量有 768 個維度;

Output:77 token embeddings vectors,每個 token 向量有 768 個維度;

2,U-Net + Scheduler 用於逐步處理/擴散被轉化到潛空間中的信息:

  • Input:文本嵌入和由噪點組成的起始多維矩陣(是一種結構化的數字列表,也稱為張量Tensor);
  • Output:處理後的信息矩陣;

Output:處理後的信息矩陣;

3,Auto-EncoderDecoder (主要是一個VAE:Variational AutoEncoder )使用處理後的信息矩陣解碼繪製出最終圖像,把潛空間的運算結果解碼成實際圖片維度:

  • Input:處理後的信息矩陣,維度: (4,64,64);
  • Output:生成的圖像,維度:(3, 512, 512)為(RGB三個通道、和兩個像素尺寸)。

Output:生成的圖像,維度:(3, 512, 512)為(RGB三個通道、和兩個像素尺寸)。

首先,讓我們看一下 CLIPText,它是一個文本理解與編碼組件( Text Understander 圖中藍色模塊),它將文本信息轉換為用數字表達的信息(通常為一個數據集 ),以便讓機器能夠捕捉文本的含義。

藍色模塊為文本理解組件 Text Understander

這個文本理解組件如果按照技術結構組成來說,可以理解為一個文本編碼器(Encoder),它是一個特殊的 Transformer 語言模型(技術術語: CLIPText ,或 Clip模型文本編碼器),它的輸入是文本,輸出則為數據集,即用數據集的方式來表達文本中的每個單詞/token(通常每個向量對應一個token)。

然後,這些信息輸入給由若干模塊組成的圖像生成器(Image Generator 圖中粉色黃色模塊 ) 。

藍色3*5的格子為Token轉化的數據集,粉紅色黃色模塊為圖像生成器 Image Generator

這個圖像生成器進一步拆解如下:

  • Image information creator 圖像信息創建器

這個模塊就是 Stable Diffusion 穩定擴散的核心武器,是它比以前的 Diffusion 版本能夠獲得更多性能提升的地方。此組件反覆運行多步(Steps)來生成用於產生圖像的信息。Steps 數值通常默認為 50 或 100。

圖像信息創建器完全在潛在空間中工作,這使它比以前在像素空間中工作的效率提高了64倍。從技術上講,這個組件由一個 U-Net 神經網絡和一個調度算法組成。

在這個圖像信息創建器組件中,信息的運行方式是一個逐層處理的機制,即 Diffusion 的過程。處理完畢後,將數據傳輸給下一個模塊——圖像解碼器(Image Decoder)來生成最終的圖像。

圖像生成器 Image Generator 中的結構

  • Image Decoder 圖像解碼器

Image Decoder 圖像解碼器

圖像解碼器根據從圖像信息創建器傳遞過來的信息繪製圖像。它只在之前的 Diffusion 過程完全結束後才運行一次,即把潛空間中的圖像信息解碼生成最終的像素圖像。

構成 Stable Diffusion 模型的三大組件

小結一下上面的內容,構成 Stable Diffusion 的三個主要組件 CLIPText 用於文本編碼(Text Encoder)、U-Net 用於處理潛空間中的信息(Diffusion的實際運行過程)、VAE 使用處理後的信息解碼繪製出最終圖像。

要繼續往下進一步解構,我們首先要詳細了解一下,到底「Diffusion 擴散」是怎樣運行的?

「Diffusion 擴散」的詳細運行過程

擴散的過程發生在圖中粉紅色的部分,即圖像信息創建器(Image Information Creator)組件中。這部分同時包含了兩個輸入,見下圖:從文本編碼器( CLIP Text模型)輸出過來的 Token embeddings,和隨機的初始圖像信息矩陣,即潛空間的噪點圖,然後經過圖像信息創建器(Image Information Creator)處理後輸出處理過的圖像信息矩陣,最終交給圖像解碼器來繪製圖像。

粉紅色部分:圖像信息創建器(Image Information Creator)組件

輸入 ,再輸出 ,這些步驟不是一次性完成的,而是一個反覆疊代多次的進程 ,每一次疊代都會去掉部分噪點並添加更多與目標圖片相關的信息。

不僅僅為了講述這個模型的方便,在實際模型運行過程中,都可以在每一次疊代步驟後添加一個檢查點,以查看圖像中的噪點被逐漸去除的效果。我們在使用 Stable Diffusion WebUI 軟體時能夠看到,每過一段時間預覽窗口中就會生成出一個中間步驟的圖像,這個圖像逐漸變得清晰,就是源於這些檢查點。

當擴散過程發生時,每疊代一步就引入一個 U-Net 預測噪點矩陣,並用之前一步包含噪點的圖片減去這個預測噪點矩陣,產生一個更好的、噪點更少的圖片。所謂「更好」的意思就是,這個圖片更像從預先訓練好的大模型中抽取出的所有與輸入文本語義相關的圖片在潛空間中的表達。50或100步疊代後,便最終生成了結果,一個不帶任何噪點的圖片從潛空間矩陣中被解碼出來。這樣講肯定還是讓人感覺一頭霧水,主要是這個逐步去噪點的過程很難用一兩句話就講清楚,接下來下面我們詳細地展開這部分。

這裡我們可以看出,CLIP 文本語義的潛空間矩陣和大模型中提煉出來的 U-Net 預測噪點潛空間矩陣給 Diffusion 的多次疊代過程提供了不斷校準的能力。

如果我們在某一次疊代步驟之後檢查一下潛空間矩陣,看看這個擴散過程進展到了什麼程度。比如我們在第 1、2、4、5、1

0、30、50 步後查看,就會發現,它呈現如下圖的狀態。

在第 1、2、4、5、10、30、50 步後查看噪點去除情況

這就是之前我們在 Diffusion 模型課程章節中講到的反向過程(Reverse Diffusion Process) 。而前向過程就是預訓練模型階段,通過不斷地加噪點去訓練模型對每一個階段噪點的預測能力,以便為日後反向過程中為每一次疊代去噪點階段提供噪點校準的能力。

下面我們先來看看前向(訓練)階段具體發生了什麼。如之前所述,Diffusion 擴散模型生成圖像(反向過程)的過程中最關鍵地方是我們事先擁有了一個強大的 U-Net 模型。這個模型預訓練的過程可以簡述為以下幾個步驟。

假設我們有了一張照片(下圖中1),並生成了一些隨機噪點(下圖中2),然後在若干噪點強度中選擇其中某一個強度級別(下圖中3),然後將這個特定強度級別的噪點加到圖片中(下圖中4)。這樣,我們就完成了一次典型的樣本的訓練。(注意,噪點並不是直接在像素維度加到圖片上的,而是在潛空間中加到圖片的潛空間數據矩陣中的。這裡的噪點圖只是為了方便大家理解。)

一次典型的樣本的訓練

然而,僅僅一幅圖的一次訓練是遠遠不夠,我們需要許多許多這樣的圖來進行多次訓練。下圖演示了第二次,採用另一張樣本圖片訓練的情況。與第一次訓練圖片不同的另一張照片(下圖中1),並生成了一些隨機噪點(下圖中2),然後在若干噪點強度中選擇其中某一個強度級別(下圖中3),注意第二次和第一次選擇的噪點強度級別不同。然後將這個特定強度級別的噪點加到圖片中(下圖中4)。這樣,我們就完成了第二次典型的樣本的訓練。