透過 InstructPix2Pix 對 Stable Diffusion 進行指令調優
本文探討如何透過指令調優,教會 Stable Diffusion 模型遵循指令來轉換或處理輸入影像。透過這種方法,我們可以使用輸入影像和一條“指令”來提示 Stable Diffusion,例如,“對自然影像應用卡通濾鏡”。
![]() |
---|
圖 1:我們探索 Stable Diffusion 的指令調優能力。在此圖中,我們使用涉及不同變換和輸入影像的提示來提示一個經過指令調優的 Stable Diffusion 系統。調優後的系統似乎能夠學習輸入提示中陳述的這些變換。圖片在彩色和放大後觀看效果更佳。 |
這種教 Stable Diffusion 遵循使用者指令對輸入影像進行編輯的想法,最初是在 InstructPix2Pix: Learning to Follow Image Editing Instructions 這篇論文中提出的。我們討論瞭如何擴充套件 InstructPix2Pix 的訓練策略,使其能夠遵循更具體的指令,這些指令涉及影像轉換任務(如卡通化)和底層影像處理任務(如影像去雨)。我們將涵蓋以下內容:
我們的程式碼、預訓練模型和資料集可以在這裡找到。
引言與動機
指令調優是一種監督學習方法,用於教語言模型遵循指令來解決任務。它由谷歌在論文 Fine-tuned Language Models Are Zero-Shot Learners (FLAN) 中引入。你可能還記得近期的工作,如 Alpaca 和 FLAN V2,它們都是指令調優對各種任務帶來益處的很好例子。
下圖展示了指令調優(也稱為“指令微調”)的構想。在 FLAN V2 論文中,作者們採用了一個預訓練的語言模型(例如 T5),並在一組示例資料集上對其進行微調,如下圖所示。
透過這種方法,可以建立涵蓋許多不同任務的示例,這使得指令調優成為一個多工訓練目標。
輸入 | 標籤 | 任務 |
---|---|---|
預測以下句子的 情感:“這部電影 非常精彩。我一秒鐘 都無法移開視線。” (情感) |
積極 | 情感分析 / 序列分類 |
請回答以下 問題。 氮氣的沸點是 多少? |
320.4°F | 問答 |
將以下英文句子 翻譯成德語:“I have a cat.” |
Ich habe eine Katze. | 機器翻譯 |
... | ... | ... |
遵循類似的理念,FLAN V2 的作者們在一個包含數千個任務的混合體上進行指令調優,並實現了對未見任務的零樣本泛化能力。
我們這項工作的動機部分來自 FLAN 系列工作,部分來自 InstructPix2Pix。我們想探索是否可以透過具體的指令和輸入影像來提示 Stable Diffusion,讓其按我們的需求處理影像。
預訓練的 InstructPix2Pix 模型在遵循通用指令方面表現良好,但在遵循涉及特定轉換的指令時可能會表現不佳。
![]() |
---|
圖 4:我們觀察到,對於輸入影像(左列),我們的模型(右列)相比於預訓練的 InstructPix2Pix 模型(中列),能更忠實地執行“卡通化”任務。有趣的是,第一行的結果顯示,預訓練的 InstructPix2Pix 模型幾乎完全失敗。圖片在彩色和放大後觀看效果更佳。檢視原圖。 |
但我們仍然可以利用 InstructPix2Pix 的發現來滿足我們的定製需求。
另一方面,像 卡通化、影像去噪、影像去雨 等任務的成對資料集是公開可用的,我們可以借鑑 FLAN V2 的靈感,利用這些資料集構建帶指令提示的資料集。這樣做使我們能夠將 FLAN V2 中探索的指令模板化思想應用到這項工作中。
資料集準備
卡通化
在我們早期的實驗中,我們提示 InstructPix2Pix 執行卡通化任務,但結果未達到我們的預期。我們嘗試了各種推理時超引數組合(如影像引導縮放係數和推理步數),但結果仍然不令人滿意。這促使我們採用不同的方法來解決這個問題。
正如上一節所暗示的,我們希望從兩個方面受益:
(1) InstructPix2Pix 的訓練方法,以及 (2) 從 FLAN 借鑑的建立帶指令提示的資料集模板的靈活性。
我們首先為卡通化任務建立了一個帶指令提示的資料集。圖 5 展示了我們的資料集建立流程:
具體來說,我們
- 要求 ChatGPT 為以下指令生成 50 個同義句:“將影像卡通化。”
- 然後,我們使用了 Imagenette 資料集的一個隨機子集(5000 個樣本),並利用一個預訓練的 Whitebox CartoonGAN 模型來生成這些影像的卡通化版本。這些卡通化版本是我們希望模型學習的標籤。因此,在某種程度上,這相當於將 Whitebox CartoonGAN 模型學到的偏差遷移到我們的模型中。
- 接著,我們按以下格式建立我們的示例:
我們最終的卡通化資料集可以在這裡找到。有關資料集準備的更多細節,請參閱這個目錄。我們透過對 InstructPix2Pix 進行微調來實驗這個資料集,並獲得了有希望的結果(更多細節見“訓練實驗與結果”部分)。
然後,我們繼續探索是否可以將這種方法推廣到底層影像處理任務,如影像去雨、影像去噪和影像去模糊。
底層影像處理
我們專注於 MAXIM 中探討的常見底層影像處理任務。具體來說,我們針對以下任務進行了實驗:去雨、去噪、低光照影像增強和去模糊。
我們從以下資料集中為每個任務抽取了不同數量的樣本,並構建了一個單一的資料集,其中添加了如下提示:
任務 | 提示 | 資料集 | 樣本數量 |
---|---|---|---|
去模糊 | “deblur the blurry image” (去除模糊影像的模糊) | REDS (train_blur 和 train_sharp ) |
1200 |
去雨 | “derain the image” (去除影像中的雨) | Rain13k | 686 |
去噪 | “denoise the noisy image” (去除噪聲影像的噪聲) | SIDD | 8 |
低光照 影像增強 |
“enhance the low-light image” (增強低光照影像) | LOL | 23 |
上述資料集通常以輸入-輸出對的形式提供,因此我們不必擔心真實標籤(ground-truth)。我們的最終資料集可在此處獲取。最終的資料集如下所示:
總的來說,這種設定有助於與 FLAN 的設定進行類比,我們建立了一個包含不同任務的混合體。這也幫助我們一次性訓練一個單一模型,使其在我們混合的任務中表現良好。這與底層影像處理中通常的做法有很大不同。像 MAXIM 這樣的工作引入了一種能夠對不同底層影像處理任務進行建模的單一模型架構,但訓練是在各個資料集上獨立進行的。
訓練實驗與結果
我們的訓練實驗基於這個指令碼。我們的訓練日誌(包括驗證樣本和訓練超引數)可在 Weight and Biases 上檢視:
在訓練時,我們探索了兩種方案:
- 從現有的 InstructPix2Pix 檢查點進行微調
- 使用 InstructPix2Pix 訓練方法,從現有的 Stable Diffusion 檢查點進行微調
在我們的實驗中,我們發現第一種方案能幫助我們更快地適應我們的資料集(在生成質量方面)。
關於訓練和超引數的更多細節,我們鼓勵您檢視我們的程式碼以及 Weights and Biases 上的相應執行頁面。
卡通化結果
為了測試指令調優的卡通化模型,我們對輸出進行了如下比較:
![]() |
---|
圖 8:我們將我們的指令調優卡通化模型(最後一列)的結果與 CartoonGAN 模型(第二列)和預訓練的 InstructPix2Pix 模型(第三列)的結果進行了比較。很明顯,指令調優模型能更忠實地匹配 CartoonGAN 模型的輸出。圖片在彩色和放大後觀看效果更佳。檢視原圖。 |
為了收集這些結果,我們從 ImageNette 的 `validation` 拆分中取樣了影像。在使用我們的模型和預訓練的 InstructPix2Pix 模型時,我們使用了以下提示:“生成影像的卡通化版本”。對於這兩個模型,我們將 `image_guidance_scale` 和 `guidance_scale` 分別設定為 1.5 和 7.0,推理步數設定為 20。當然,還需要圍繞這些超引數進行更多實驗,以研究它們如何影響預訓練的 InstructPix2Pix 模型的結果。
更多比較結果可在此處檢視。我們用於比較這些模型的程式碼可在此處獲取。
然而,我們的模型未能為 ImageNette 中那些在訓練中見得不夠多的類別生成預期的輸出。這在某種程度上是預料之中的,我們相信可以透過擴大訓練資料集來緩解這個問題。
底層影像處理結果
對於底層影像處理(我們的模型),我們沿用了與上述相同的推理時超引數:
- 推理步數:20
- 影像引導縮放係數:1.5
- 引導縮放係數:7.0
對於去雨任務,與真實標籤(ground-truth)和預訓練的 InstructPix2Pix 模型輸出相比,我們的模型提供了令人信服的結果:
![]() |
---|
圖 9:去雨結果(彩色和放大後觀看效果更佳)。推理提示:“derain the image”(與訓練集相同)。檢視原圖。 |
然而,對於低光照影像增強,結果還有很多待改進之處:
![]() |
---|
圖 10:低光照影像增強結果(彩色和放大後觀看效果更佳)。推理提示:“enhance the low-light image”(與訓練集相同)。檢視原圖。 |
這種失敗或許可以歸因於我們的模型沒有見到足夠多的該任務示例,也可能需要更好的訓練。我們在去模糊任務中也觀察到了類似的結果:
![]() |
---|
圖 11:去模糊結果(彩色和放大後觀看效果更佳)。推理提示:“deblur the image”(與訓練集相同)。檢視原圖。 |
我們相信,社群有機會探索底層影像處理的任務混合在多大程度上影響最終結果。增加任務混合中更具代表性的樣本是否有助於改善最終結果? 我們將這個問題留給社群進一步探索。
您可以嘗試下面的互動式演示,讓 Stable Diffusion 遵循特定指令:
潛在應用與侷限性
在影像編輯領域,領域專家腦中的想法(要執行的任務)與在編輯工具(如 Lightroom)中需要應用的操作之間存在脫節。有一種簡單的方法可以將自然語言目標轉換為底層影像編輯基元,這將帶來無縫的使用者體驗。隨著像 InstructPix2Pix 這樣的機制的引入,可以說我們正在接近那個領域。
然而,挑戰依然存在:
- 這些系統需要能夠處理大型高解析度的原始影像。
- 擴散模型經常會創造或重新解釋指令,以在影像空間中進行修改。對於一個現實的影像編輯應用來說,這是不可接受的。
待解決的問題
我們承認我們的實驗是初步的。我們沒有深入探究實驗中的明顯影響因素。因此,我們在此列出一些在實驗過程中出現的待解決問題:
當我們擴大資料集規模時會發生什麼? 這對生成樣本的質量有何影響?我們只用少量樣本進行了實驗。相比之下,InstructPix2Pix 是在超過 30000 個樣本上訓練的。
訓練更長時間會產生什麼影響,尤其是在任務混合更廣泛的情況下? 在我們的實驗中,我們沒有進行超引數調優,更不用說對訓練步數進行消融實驗了。
這種方法如何推廣到“指令調優”世界中通常進行的更廣泛的任務混合中? 我們只涵蓋了四種底層影像處理任務:去雨、去模糊、去噪和低光照影像增強。在任務混合中新增更多工和更具代表性的樣本是否有助於模型泛化到未見過的任務,或者任務的組合(例如:“去模糊影像並去噪”)?
動態使用同一指令的不同變體是否有助於提高效能? 對於卡通化,我們在資料集建立期間從 ChatGPT 生成的同義指令集中隨機取樣了一條指令。但如果我們在訓練期間進行隨機取樣會發生什麼?
對於底層影像處理,我們使用了固定的指令。如果我們對每個任務和輸入影像都採用類似的同義指令方法會發生什麼?
當我們改用 ControlNet 訓練設定時會發生什麼? ControlNet 也允許將預訓練的文字到影像擴散模型調整為以附加影像(如語義分割圖、canny 邊緣圖等)為條件。如果您感興趣,可以使用本文中介紹的資料集,並參考這篇文章進行 ControlNet 訓練。
結論
在這篇文章中,我們介紹了我們對 Stable Diffusion 進行“指令調優”的探索。雖然預訓練的 InstructPix2Pix 模型在遵循通用影像編輯指令方面表現良好,但在面對更具體的指令時可能會失效。為了解決這個問題,我們討論瞭如何準備我們的資料集以進一步微調 InstructPix2Pix,並展示了我們的結果。如上所述,我們的結果仍然是初步的。但我們希望這項工作能為研究類似問題的研究人員提供一個基礎,並激勵他們進一步探索那些待解決的問題。
連結
- 訓練和推理程式碼: https://github.com/huggingface/instruction-tuned-sd
- 演示: https://huggingface.co/spaces/instruction-tuning-sd/instruction-tuned-sd
- InstructPix2Pix: https://huggingface.co/timbrooks/instruct-pix2pix
- 本文的資料集和模型: https://huggingface.co/instruction-tuning-sd
感謝 Alara Dirik 和 Zhengzhong Tu 提供的有益討論。感謝 Pedro Cuenca 和 Kashif Rasul 對本文的有益審閱。
引用
要引用這項工作,請使用以下引用格式:
@article{
Paul2023instruction-tuning-sd,
author = {Paul, Sayak},
title = {Instruction-tuning Stable Diffusion with InstructPix2Pix},
journal = {Hugging Face Blog},
year = {2023},
note = {https://huggingface.co/blog/instruction-tuning-sd},
}