擴散模型課程文件
單元 2:微調、引導和條件化
並獲得增強的文件體驗
開始使用
單元 2:微調、引導和條件化
歡迎來到 Hugging Face 擴散模型課程的第二單元!在本單元中,你將學習如何以新的方式使用和調整預訓練的擴散模型。你還將瞭解我們如何建立能夠接受額外輸入作為 條件 來控制生成過程的擴散模型。
開始本單元 :rocket:
以下是本單元的步驟:
- 請確保你已註冊本課程,以便在新材料釋出時收到通知。
- 通讀以下材料,瞭解本單元的關鍵思想。
- 檢視 微調與引導 筆記本來學習如何使用 🤗 Diffusers 庫在新資料集上微調現有的擴散模型,以及如何使用引導來修改取樣過程。
- 按照筆記本中的示例,為你的自定義模型分享一個 Gradio 演示。
- (可選) 檢視 類別條件化擴散模型示例 筆記本來了解我們如何為生成過程新增額外的控制。
- (可選) 檢視 此影片,以非正式的方式瞭解本單元的材料。
:loudspeaker: 別忘了加入 Discord,你可以在 #diffusion-models-class 頻道中討論材料並分享你的作品。
微調
正如你在第一單元中所見,從零開始訓練擴散模型可能非常耗時!特別是當我們將解析度提高時,從零開始訓練模型所需的時間和資料可能會變得不切實際。幸運的是,有一個解決方案:從一個已經訓練好的模型開始!這樣,我們從一個已經學會對某種影像進行去噪的模型出發,希望這能提供一個比從隨機初始化的模型開始更好的起點。

如果新資料與基礎模型的原始訓練資料有些相似,微調通常效果最好(例如,如果你想生成卡通人臉,從一個在人臉上訓練過的模型開始可能是個好主意),但令人驚訝的是,即使領域變化很大,這種好處仍然存在。上圖是由一個在 LSUN 臥室資料集上訓練的模型,在 WikiArt 資料集上微調了 500 步生成的。 訓練指令碼 與本單元的筆記本一起提供以供參考。
引導
無條件模型對生成的內容沒有太多控制。我們可以訓練一個條件模型(下一節會詳細介紹),它接受額外的輸入來幫助引導生成過程,但如果我們已經有一個訓練好的無條件模型想要使用怎麼辦?這時就需要引導,這是一個在生成過程的每一步,根據某個引導函式評估模型預測並進行修改的過程,從而使最終生成的影像更符合我們的喜好。

這個引導函式幾乎可以是任何東西,這使它成為一個強大的技術!在筆記本中,我們從一個簡單的例子(控制顏色,如上圖示例輸出所示)開始,逐步構建到一個利用名為 CLIP 的強大預訓練模型的例子,它讓我們能夠根據文字描述來引導生成。
條件化
引導是從無條件擴散模型中獲得額外功能的好方法,但如果在訓練期間我們有額外的資訊(如類別標籤或影像標題),我們也可以將這些資訊提供給模型,供其在進行預測時使用。透過這樣做,我們建立了一個 條件化 模型,在推理時,我們可以透過控制輸入作為條件的內容來控制模型。筆記本展示了一個類別條件化模型的例子,該模型學習根據類別標籤生成影像。

有多種方法可以傳入這些條件化資訊,例如:
- 將其作為額外通道輸入到 UNet 中。當條件化資訊與影像形狀相同時,通常使用這種方法,例如分割掩碼、深度圖或影像的模糊版本(在修復/超解析度模型的情況下)。它也適用於其他型別的條件化。例如,在筆記本中,類別標籤被對映到一個嵌入,然後擴充套件到與輸入影像相同的寬度和高度,以便可以作為額外通道輸入。
- 建立一個嵌入,然後將其投影到一個大小,該大小與 UNet 一個或多個內部層輸出的通道數相匹配,然後將其新增到這些輸出中。例如,時間步條件化就是這樣處理的。每個 Resnet 塊的輸出都會新增一個投影的時間步嵌入。當你的條件化資訊是一個向量,例如 CLIP 影像嵌入時,這種方法很有用。一個著名的例子是 Stable Diffusion 的“影像變體”版本,它正是這樣做的。
- 新增交叉注意力層,這些層可以“關注”作為條件傳入的序列。當條件化是以文字形式存在時,這種方法最有用——文字透過 Transformer 模型對映到嵌入序列,然後 UNet 中的交叉注意力層用於將這些資訊整合到去噪路徑中。我們將在第三單元中看到這一點,屆時我們將研究 Stable Diffusion 如何處理文字條件化。
動手實踐筆記本
| 章節 | Colab | Kaggle | Gradient | Studio Lab |
|---|---|---|---|---|
| 微調與引導 | ||||
| 類別條件化擴散模型示例 |
至此,你已經具備了開始使用附帶筆記本的足夠知識!使用上面的連結在你選擇的平臺上開啟它們。微調的計算量相當大,所以如果你使用 Kaggle 或 Google Colab,請確保將執行時型別設定為“GPU”以獲得最佳效果。
大部分材料都在 微調與引導 中,我們透過例項探討這兩個主題。該筆記本展示瞭如何在新資料上微調現有模型、新增引導,並將結果分享為 Gradio 演示。有一個附帶的指令碼(finetune_model.py),可以方便地嘗試不同的微調設定,還有一個示例 Space,你可以用作在 🤗 Spaces 上分享自己演示的模板。
在 類別條件化擴散模型示例 中,我們展示了一個簡短的例項,說明如何使用 MNIST 資料集建立一個以類別標籤為條件的擴散模型。重點是儘可能簡單地演示核心思想:透過向模型提供關於它應該去噪的內容的額外資訊,我們可以在推理時控制生成何種型別的影像。
專案時間
按照 微調與引導 筆記本中的示例,微調你自己的模型或選擇一個現有模型,並建立一個 Gradio 演示來展示你的新引導技能。別忘了在 Discord、Twitter 等社交媒體上分享你的演示,以便我們欣賞你的作品!
一些額外資源
去噪擴散隱式模型 (Denoising Diffusion Implicit Models) - 介紹了 DDIM 取樣方法(DDIMScheduler 使用的方法)
GLIDE: 用文字引導的擴散模型實現逼真的影像生成與編輯 (GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models) - 介紹了在文字上對擴散模型進行條件化的方法
eDiffi:具有專家去噪器整合的文字到影像擴散模型 (eDiffi: Text-to-Image Diffusion Models with an Ensemble of Expert Denoisers) - 展示瞭如何將多種不同型別的條件化結合使用,以對生成的樣本種類進行更精細的控制
發現了更多優質資源?告訴我們,我們會將它們新增到此列表中。
< > 在 GitHub 上更新