教學
Stable Diffusion 原理剖析:圖解擴散模型運作機制
摘要
本文深入淺出地解釋了 Stable Diffusion 圖像生成模型的運作原理,揭示其如何將文字描述轉化為視覺內容。文章詳細介紹了 Stable Diffusion 的核心元件,包括文字編碼器、圖像資訊建立器(UNet + 排程器)和圖像解碼器,並闡述了其在潛在空間中進行擴散過程以提升效率的關鍵技術。
標題:圖解 Stable Diffusion\n\nURL 來源: http://jalammar.github.io/illustrated-stable-diffusion/\n\nMarkdown 內容:\n翻譯:[中文](https://blog.csdn.net/yujianmin1990/article/details/129143157), [越南文](https://trituenhantao.io/kien-thuc/minh-hoa-stable-diffusion/).\n\n(**2022 年 11 月 V2 版**:更新圖片以更精確描述前向擴散過程。此版本新增了幾張圖片)\n\nAI 圖像生成是近期最令人驚嘆的 AI 能力(包括我在內)。能夠從文字描述創造出引人注目的視覺效果,這本身就帶有魔幻色彩,並明確指出人類創作藝術方式的轉變。Stable Diffusion 的發布是這項發展中的一個重要里程碑,因為它將一個高效能模型普及給大眾(其效能體現在圖像品質、速度以及相對較低的資源/記憶體需求)。\n\n在體驗過 AI 圖像生成後,你可能會開始好奇它是如何運作的。\n\n這是一篇關於 Stable Diffusion 運作原理的入門介紹。\n\nStable Diffusion 的多功能性體現在它能以多種方式使用。我們首先專注於僅從文字生成圖像(text2img)。上圖展示了一個文字輸入範例及其生成的圖像(實際完整的提示詞在此)。除了文字轉圖像,另一種主要使用方式是讓它修改圖像(因此輸入是文字 + 圖像)。\n\n現在讓我們深入探討其內部機制,這有助於解釋各個元件、它們如何互動以及圖像生成選項/參數的意義。\n\n## Stable Diffusion 的元件\n\nStable Diffusion 是一個由多個元件和模型組成的系統,它並非一個單一的巨型模型。\n\n當我們深入探討時,第一個觀察是它有一個文字理解元件,負責將文字資訊轉換為捕捉文字概念的數值表示。\n\n我們將從高層次視角開始,稍後在本文章中會深入探討更多機器學習細節。然而,我們可以說這個文字編碼器是一個特殊的 Transformer 語言模型(技術上來說:是 CLIP 模型中的文字編碼器)。它接收輸入文字並輸出一個數字列表,代表文字中的每個詞/標記(每個標記一個向量)。\n\n這些資訊隨後被傳遞給圖像生成器,而圖像生成器本身也由幾個元件組成。\n\n圖像生成器分為兩個階段:\n\n1- **圖像資訊建立器**\n\n這個元件是 Stable Diffusion 的「秘密武器」。它實現了相較於先前模型的大部分效能提升。\n\n這個元件會執行多個步驟來生成圖像資訊。這就是 Stable Diffusion 介面和函式庫中常見的 `steps` 參數,通常預設為 50 或 100。\n\n圖像資訊建立器完全在「圖像資訊空間」(或稱「潛在空間」)中運作。我們稍後會更詳細地討論這意味著什麼。這個特性使其比在像素空間中運作的先前擴散模型更快。從技術角度來看,這個元件由一個 UNet 神經網路和一個排程演算法組成。\n\n「擴散」這個詞描述了這個元件中發生的過程。它是一個逐步處理資訊的過程,最終(由下一個元件,圖像解碼器)生成高品質的圖像。\n\n2- **圖像解碼器**\n\n圖像解碼器根據從資訊建立器獲得的資訊繪製圖像。它在整個過程的最後只執行一次,以產生最終的像素圖像。\n\n至此,我們可以看到構成 Stable Diffusion 的三個主要元件(每個都有自己的神經網路):\n\n* **ClipText** 用於文字編碼。 \n 輸入:文字。 \n 輸出:77 個標記嵌入向量,每個向量為 768 維。\n\n* **UNet + 排程器** 用於在資訊(潛在)空間中逐步處理/擴散資訊。 \n 輸入:文字嵌入和一個由雜訊組成的起始多維陣列(結構化的數字列表,也稱為「張量」)。\n 輸出:一個經過處理的資訊陣列\n\n* **自動編碼器解碼器** 使用處理後的資訊陣列繪製最終圖像。\n 輸入:處理後的資訊陣列(維度:(4,64,64))。 \n 輸出:生成的圖像(維度:(3, 512, 512),分別代表紅/綠/藍、寬度、高度)。\n\n## 到底什麼是擴散?\n\n擴散是發生在粉紅色「圖像資訊建立器」元件內部的過程。有了代表輸入文字的標記嵌入,以及一個隨機的起始「圖像資訊陣列」(這些也稱為「潛在表示」),這個過程會產生一個資訊陣列,圖像解碼器會使用它來繪製最終圖像。\n\n這個過程是逐步進行的。每一步都會添加更多相關資訊。為了直觀理解這個過程,我們可以檢查隨機的潛在表示陣列,並看到它會轉換為視覺雜訊。在這種情況下,視覺檢查是將其通過圖像解碼器。\n\n擴散分多個步驟進行,每個步驟都作用於一個輸入的潛在表示陣列,並產生另一個潛在表示陣列,該陣列能更好地符合輸入文字以及模型從所有訓練圖像中學習到的所有視覺資訊。\n\n我們可以將這些潛在表示集視覺化,以觀察每個步驟中添加了哪些資訊。\n\n這個過程看起來相當令人驚嘆。\n\n您的瀏覽器不支援此影片標籤。\n\n在這種情況下,步驟 2 和步驟 4 之間發生了一些特別引人入勝的事情。輪廓彷彿從雜訊中浮現出來。\n\n您的瀏覽器不支援此影片標籤。\n\n### 擴散如何運作\n\n使用擴散模型生成圖像的核心思想在於我們擁有強大的電腦視覺模型。只要有足夠大的資料集,這些模型就能學習複雜的操作。擴散模型透過以下方式來構建圖像生成問題:\n\n假設我們有一張圖像,我們生成一些雜訊並將其添加到圖像中。\n\n這現在可以被視為一個訓練範例。我們可以使用相同的公式創建大量的訓練範例,來訓練我們圖像生成模型的核心元件。\n\n雖然這個範例展示了從圖像(雜訊量 0,無雜訊)到完全雜訊(雜訊量 4,完全雜訊)的幾個雜訊量值,但我們可以輕鬆控制要添加到圖像中的雜訊量,因此可以將其分散到數十個步驟中,為訓練資料集中的每張圖像創建數十個訓練範例。\n\n有了這個資料集,我們可以訓練雜訊預測器,最終得到一個出色的雜訊預測器,當以特定配置運行時,它實際上可以創建圖像。如果你有機器學習經驗,一個訓練步驟應該會很熟悉:\n\n現在讓我們看看這如何生成圖像。\n\n### 透過去除雜訊來繪製圖像\n\n經過訓練的雜訊預測器可以接收一張帶雜訊的圖像和去雜訊步驟的編號,並能夠預測一部分雜訊。\n\n預測出的雜訊被採樣,這樣如果我們將其從圖像中減去,我們就會得到一張更接近模型訓練圖像的圖像(不是圖像本身,而是「分佈」——一個像素排列的世界,其中天空通常是藍色的,位於地面之上,人們有兩隻眼睛,貓有特定的樣子——尖耳朵且明顯不為所動)。\n\n如果訓練資料集是由美學上令人愉悅的圖像組成(例如 Stable Diffusion 訓練所用的 LAION Aesthetics),那麼生成的圖像也傾向於美學上令人愉悅。如果我們用標誌圖像來訓練它,我們最終會得到一個標誌生成模型。\n\n至此,我們完成了對擴散模型圖像生成的描述,這主要基於《去雜訊擴散機率模型》(Denoising Diffusion Probabilistic Models)一文。現在你對擴散有了直觀的理解,你就知道了不僅是 Stable Diffusion,還有 Dall-E 2 和 Google 的 Imagen 的主要組成部分。\n\n請注意,我們目前描述的擴散過程在生成圖像時沒有使用任何文字資料。因此,如果我們部署這個模型,它會生成看起來很棒的圖像,但我們無法控制它是否是金字塔或貓或其他任何東西的圖像。在接下來的章節中,我們將描述如何將文字整合到這個過程中,以控制模型生成圖像的類型。\n\n## 速度提升:在壓縮(潛在)資料而非像素圖像上進行擴散\n\n為了加速圖像生成過程,Stable Diffusion 論文並非在像素圖像本身上運行擴散過程,而是在圖像的壓縮版本上。該論文稱之為「進入潛在空間」(Departure to Latent Space)。\n\n這種壓縮(以及之後的解壓縮/繪製)是透過自動編碼器完成的。自動編碼器使用其編碼器將圖像壓縮到潛在空間中,然後僅使用壓縮資訊透過解碼器重建圖像。\n\n現在,前向擴散過程在壓縮後的潛在表示上進行。雜訊切片是應用於這些潛在表示的雜訊,而不是像素圖像。因此,雜訊預測器實際上是訓練來預測壓縮表示(潛在空間)中的雜訊。\n\n前向過程(使用自動編碼器的編碼器)是我們生成資料來訓練雜訊預測器的方式。一旦訓練完成,我們就可以透過運行反向過程來生成圖像。
標籤
Stable DiffusionAI 圖像生成擴散模型潛在空間機器學習技術解析
以上為 AI 自動翻譯導讀。原文版權歸 Jay Alammar 所有。 建議透過上方「閱讀原文」前往原始網站,以取得最完整資訊與支持原作者。