此文為譯文,原文見:
https://stable-diffusion-art.com/how-stable-diffusion-work/
Stable Diffusion是一個深度學習模型,我們會深入解析SD的工作原理。
直白地說,SD是一個text-to-image模型,通過給定text prompt(文本提示詞),它可以返回一個匹配文本的圖片。
Stable Diffusion屬于深度學習模型里的一個類別,稱為diffusion models(擴散模型)。這類模型時生成式模型,也就是說它們用于生成新的數據,這類新數據類似于它們訓練時的數據。對于SD來說,這類新數據便是圖片。
為什么叫diffusion model?因為它的數學公式看起來非常像物理上的擴散現象。下面我們具體介紹它的原理。
假設我們訓練了一個diffusion model,訓練時只給了2類圖片:貓與狗。如下圖所示,左邊便是送入訓練的貓與狗的圖片。
前向擴散將圖片轉為噪點(圖片基于此文圖片進行修改 this article)
前向擴散的過程是給訓練圖片添加噪點的過程,并逐漸將圖片轉為一個反常的噪點圖。也就是會將任何貓或狗的圖片轉為一張噪點圖,并最終無法辨認噪點圖對應的初始圖片是貓還是狗(這點非常重要)。
這個過程就像是滴入了一滴墨水到一杯水里,墨水在水里diffuses(擴散)。在幾分鐘后,墨水會隨機分散并融入水中。且無法判斷它最初是從水杯的中心滴入,還是從邊緣滴入。
下面是一張圖經歷前向擴散的過程。貓的圖片轉為了一張隨機噪點圖。
?
然后再看反向擴散部分。我們預期的表現是:輸入一張噪點圖(毫無意義的圖),反向擴散(reverse diffusion)可以將這張噪點圖恢復為一張貓或狗的圖片。這就是反向擴散的主要思想。
從技術角度來說,每個擴散過程分為2部:
反向擴散會朝著貓或狗的圖片方向進行漂移,但絕對不會停留在中間狀態。這也是為什么結果智能是貓或狗的圖片。
從反向擴散的角度來說,我們需要知道有多少“噪點”加入到了某張圖片里?;卮鸫藛栴}的方式便是:訓練一個神經網絡來預測添加的噪點。這個在SD里稱為噪點預測器(noise predicator)。其本質是一個U-Net模型。
訓練流程為:
更詳細的原理可以參考:
https://www.bilibili.com/video/BV1bm4y1A7v7/
按順序每步都增加噪點,noise predictor預測每步增加的噪點
在訓練后,便可得到一個noise predictor,可以預測一張噪點圖中,加入到圖片的噪點信息。
現在我們有了noise predictor(噪點預測器),應該如何使用?
我們首先生成一張完全隨機的圖片,并讓noise predictor告訴我們噪點是什么。然后從原圖中移除噪點。并重復此過程多次,最終遍得到一張貓或狗的圖片。
可以看到在這個生成貓或狗的圖片的過程中,我們沒有加入任何人為控制。這個“人為控制”是我們后續會討論到的條件“conditioning”。當前來說,圖片的生成是unconditioned。
更多有關反向擴散采樣于采樣器的信息,可以參考文章:
https://stable-diffusion-art.com/samplers/
現在我們需要強調的是:上面討論的過程并非是SD工作的原理。
原因是:由于上述擴散過程是在圖片空間里完成的,所以它的計算過程是非常非常慢的。上述過程基本無法在單個GPU上運行。
圖片空間太廣闊了。試想:一張512 x 512的圖片(包含3個顏色通道:紅、綠、藍),它的空間是786,432維。也即是說我們要為一張圖片指定這么多的值。
Diffusion模型如谷歌的Imagen以及Open AI的DALL-E都是在像素空間的,他們使用了一些技巧讓模型運行更快,但是仍不夠快。
Stable Diffusion便是用于解決速度問題的,它是一個latent diffusion model(潛擴散模型)。其方式是將圖片壓縮到一個“潛空間”(latent space)中,而不是在高維的圖片空間里工作。
潛空間比圖片空間小了48倍,所以它可以節省大量計算,繼而運行速度更快。
如何將圖片壓縮到潛空間?使用的技術是variational autoencoder(變分自動編碼器),也即為VAE文件。
VAE神經網絡包含2部分:Encoder與Decoder。
Encoder將一張圖片壓縮到“潛空間”里的一個低維空間表示。Decoder從“潛空間”里的表示恢復為一張圖片。
SD模型的潛空間為4 x 64 x 64 維,比圖片的像素點空間要小48倍。前面提到的前向與反向擴散都是在潛空間里完成。
所以在訓練時,不再是生成一張噪點圖,而是在潛空間里生成一個隨機張量(tensor)。并且在給圖片每一步增加噪點時,也不再是給圖片增加噪點,而是給圖片在潛空間里的張量增加潛噪點。這么做的原因當然是由于潛空間更小,執行速度更快。
圖像分辨率會反映在潛空間里對應圖片張量的大小。對于512 x 512的圖片來說,其在潛空間里的大小為4 x 64 x 64。而對于768 x 512的人像圖來說,對應潛空間張量的維度即為4 x 96 x 64。這也是為什么需要更長的時間與資源生成分辨率更高的圖片。
由于Stable Diffusion v1是在512 x 512的圖片上進行的fine tune,所以若是生成超過512 x 512 大小的圖片時,會導致有重復的對象。例如生成的人物有“雙頭”問題。如果一定要用v1版本,則至少先保持512像素,然后在使用AI upscaler工具生成更高的分辨率。
為什么VAE可以壓縮一張圖片到非常小的一個潛空間而不損失信息呢?這是因為:自然圖片并非是隨機的,它們有很高的規律性。例如,一張臉上,鼻子、臉頰和嘴巴之間有特定的空間關系。一只狗有4只腿并且有特定的形狀。
換句話說,高維的圖片是人為的。自然圖像可以輕松地壓縮到較小的潛空間中,而不會丟失任何信息。這在機器學習中被稱為流形假設。
下面是SD模型里反向擴散在潛空間里的工作流程:
在Stable Diffusion v1里,VAE files用于提升眼睛與臉的準確度。它們實際上是我們前面提到的autoencoder中的decoder。通過進一步的fine-tune decoder,模型可以生成出更多的細節。
到目前為止,我們還沒介紹文本是如何影響圖片生成的。如果沒有文本prompt的影響,SD模型也不會是一個text-to-image模型。我們可以得到一張貓或狗的圖片,但是沒有方式來控制它。
這部分就是“條件”(conditioning)要做的事情?!皸l件”的目的便是引導noise predictor,讓其知道:在抽取預測的噪點后,我們需要的是什么。
下面展示的是:文本提示(text prompt)如何處理并輸入到noise predictor:
首先,Tokenizer(分詞器)將每個輸入的單詞轉為一個數,稱為token。每個token然后轉為一個768維的向量,稱為詞嵌入(embedding)。詞嵌入然后由Text Transformer處理,并可以被Noise predictor進行消費。
可以使用這個notebook來檢查prompt的token與embedding。
?
文本提示詞首先由一個CLIP tokenizer做分詞。CLIP是一個深度學習模型,由Open AI開發,用于為任何圖片生成文本描述。Stable Diffusion v1使用了CLIP模型的tokenizer。
Tokenization是計算機理解單詞的方式。人類可以讀懂單詞,但是計算機智能讀懂數字。所以這也是為什么文本提示詞首先要轉為單詞。
Tokenizer只能將其在訓練過程中見到過的單詞進行分詞。例如,假設CLIP模型里有“dream”與“beach”單詞,但是沒有“dreambeach”單詞。Tokenizer會將“dreambeach”分成2個單詞“dream”與“beach”。所以,1個單詞并非代表1個token,而是有可能進一步進行拆分。
另一個細節是:空格也是token的一部分。例如,短語 "dream beach" 產生了兩個token "dream" 和 "[space]beach"。這些標記與 "dreambeach" 產生的標記不同,后者是 "dream" 和 "beach"(beach 前沒有空格)。
Stable Diffusion模型限制提示詞在75個單詞。
Stable diffusion v1使用Open AI的ViT-L/14模型,詞嵌入為768維的向量。每個單詞有其特定的詞嵌入向量。詞嵌入由CLIP模型決定,是在訓練過程中得來。
為什么我們需要詞嵌入?因為有些單詞相互之間是非常相似的,我們希望利用到這些信息。例如,man、gentleman、guy的詞嵌入是非常相近的,因此它們可以相互替換。Monet、Manet以及Degas都以印象派的風格繪畫,但是方式各不相同。這些名字看起來是非常相似,但是在詞嵌入里是很不一樣的。
在另一片文章里,我們討論的使用關鍵詞來觸發不同的風格,兩者的embedding含義是一樣的。Embedding在里面起了至關重要的作用。已經證明的是,使用合適的詞嵌入可以觸發任意對象與風格,一個fine-tune的技巧稱為textual inversion。
?
詞嵌入需要進一步由文本轉換器(text transformer)進行處理,然后輸入到noise predictor中。這個轉換器就像是一個通用的條件(conditioning)適配器。在這個例子中,它的輸入是文本嵌入向量,但是它也可以是其他的東西,例如類別標簽,圖片,以及depth maps。轉換器不僅是進一步處理數據的組件,也提供了一種機制來加入不同的條件形式。
文本轉換器的輸出,會被noise predictor在U-Net中使用到多次。U-Net以一個叫做cross-attention機制的方式來使用它。這即是prompt適配圖片的地方。
這里我們使用提示詞“A man with blue eyes”作為例子。SD將單詞blue與eyes組合到一起(self-attention within the prompt),這樣便可以生成一個藍眼睛的男人,而不是穿藍襯衫的男人。然后它會使用這個信息引導反向擴散,使得最終生成的圖片包含藍色眼睛(cross-attention between 提示詞與圖片)
一個備注:Hypernetwork是一種fine-tune Stable Diffusion模型的技術,它會操縱cross-attention網絡來注入風格。LoRA模型修改cross-attention模塊的權重來修改風格??梢钥吹?單獨修改這個模塊即可fine-tune一個SD模型的風格,說明了這個模塊有多重要。
文本提示詞并非SD模型可以參考的條件。Text prompt與depth image都可以用于depth-to-image模型的條件。
ControlNet利用監測到的輪廓、人體姿勢等對noise predictor進行調節,可以實現對圖像生成的出色控制。
現在我們了解了Stable Diffusion的機制,下面我們再通過幾個例子看看底層是如何運行的。
在文本生成圖的場景下,我們給SD模型輸入一組文本提示詞,它可以返回一張圖片。
Step 1. Stable Diffusion在潛空間里生成一個隨機張量。我們通過設置隨機種子seed來控制這個張量的生成。如果我們設置這個隨機種子為一個特定的值,則會得到相同的隨機張量。這就是我們在潛空間里的圖片。但是當前還全是噪點。
?
Step 2. Noise predictor U-Net將潛噪點圖已經文本提示詞作為輸入,并預測噪點,此噪點同樣也在潛空間內(一個4 x 64 x 64的張量)
?
Step 3. 從潛圖片中抽取潛噪點,并生成了新的潛圖片
?
Step 2 與 Step 3 重復特定采樣次數,例如20次。
Step 4. 最后,VAE的decoder將潛圖片轉回像素空間,這便是我們通過SD模型最終得到的圖片。
下圖是圖片在每個采樣步生成的結果:
可以看到,整個過程是圖片是由噪點轉為干凈的的過程。大家可能會考慮到,是不是最開始幾步noise predictor的性能不夠好,所以前幾步生成的圖片仍包含噪點。這個實際上是因為我們希望在每個采樣步中得到一個預期的噪點,而不是一次性完全抹除噪點。這個稱為noise schedule。下面是一個例子:
?
Noise schedule是我們定義的一個選項。我們可以選擇在每一個step中剔除等量的噪點?;蛘呤窃谧铋_始提出更多的噪點(如上圖所示)。采樣器每次剔除足夠的噪點,以達到下一步中預期的噪點。這便是我們在step-by-step圖片中見到的樣子。
圖生圖的方法首先是在SDEdit方法中提出的。SDEdit可以應用到任何擴散模型中。所以我們也有Stable Diffusion的圖生圖模式。
圖生圖的輸入是一張輸入圖片以及一組文本提示詞。生成的圖片會由輸入圖片以及文本提示詞兩者共同調節。例如,使用下面的簡筆畫,以及提示詞“帶莖、水滴和戲劇性照明的完美綠色蘋果照片”作為輸入,圖生圖可以將其轉換成專業繪畫。
下面是圖生圖的具體流程。
Step 1. 輸入圖片編碼到潛空間
?
Step 2. 加入噪點到潛圖片。Denoising strength控制加入多少噪點。如果為0,則不會加入噪點。如果為1,則會加入最多的噪點,這樣潛圖片則轉為一張完全隨機的張量。
?
Step 3. Noise predictor U-Net使用潛噪點圖以及文本提示詞作為輸入,并預測潛空間內的噪點(一個4 x 64 x 64 的張量)
?
Step 4. 從潛圖片中剔除潛噪點,并生成新的潛圖片。?
Step 3 與 4 重復多次,直到特定采樣步數,例如20次。
Step 5. 最后,VAE的解碼器將潛圖片轉回像素空間,便得到了最終生成的圖片。
?
現在我們知道了圖生圖的原理,它所要做的便是設置一個初始的、帶噪點的潛圖片,作為輸入圖片。如果denoising strength設置為1,則等同于文本生成圖了,因為初始的潛圖片是完全隨機的噪點。
圖像修復是圖生圖里的一個特殊例子。只需將噪點加入到需要被修復的圖片。加入多少噪點同樣也由denoising strength決定。
Depth-to-image是圖生圖的一個增強。它生成的圖片時,會使用depth map作為額外的條件。
Step 1. 輸入圖片編碼到潛空間
?
Step 2. MiDaS(一個是AI深度模型)基于輸入圖片預測depth map
Step 3. 為潛圖片添加噪點。同樣,denoising strength控制加入多少噪點。
?
Step 4. Noise predictor預測潛空間的噪點,由文本提示詞與depth map共同調控
?
Step 5. 從潛圖片中剔除噪點,生成新的潛圖片
?
Step 4 與 5 重復特定次數采樣步數。
Step 6. VAE decoder解碼潛圖片,得到最終生成的depth-to-image圖片
?
?
在解釋Classifier-Free Guidance(CFG)前,這篇文章仍是不夠完整的。CFG是AI藝術家們每天都在調整的一個重要參數。為了明白這個參數是做什么,我們首先了解它的前身:classifier guidance(分類器指導)。
分類器指導是將圖片標簽融入擴散模型的一種方法。我們可以使用標簽來指導擴散的過程。例如,標簽“貓”可以引導反向擴散過程,從而生成貓的照片。
Classifier guidance系數是一個參數,用于控制擴散過程應如何遵循標簽。下面是一個從這篇論文paper中摘取的一個例子。假設有3組帶標簽的圖片分別為:“貓”、“狗”、“人”。如果擴散過程沒有被指導,則模型會從每個組的所有樣本中繪制樣本,但有時它可能會畫出一張可以適用于兩個標簽的圖片。例如一個男孩撫摸一只狗的圖片。
使用更高的classifier guidance系數,由DF模型生成的圖片將偏向于極端或是明顯的例子。如果我們讓模型生成一只貓,則它會返回明顯是一只貓的圖片而不是其他東西。
Classifier guidance 系數控制了遵循指導的程度。在上圖中,右側的采樣比中間的采用有更高的Classifier guidance系數。在實踐中,這個比值只是向帶有該標簽的數據漂移項的乘數。
盡管classifier guidance取得了創紀錄的性能,但它仍需要一個額外的模型來提供這種指導。也就在訓練過程中帶來了些困難。
在作者的術語中,Classifier-free guidance是一種實現“沒有分類器的分類器指導”的方法。不需要使用類別標簽以及額外的模型來做指導,而是提出了使用圖片說明并訓練一個帶條件的擴散模型來取代。這個方式與我們前面提到的“文本生成圖”的原理相同。
它們將分類器部分作為noise predictor U-Net的條件,從而在圖像生成中實現了稱為“classifier-free”(即沒有單獨的圖片分類器)的指導。
文本提示詞在“文本生成圖”中提供了這個指導。
現在我們知道了通過“條件”實現classifier-free的擴散過程,那該如何控制這個“指導”被follow的程度呢?
Classifier-free guidance(CFG)系數便是控制“文本提示詞”條件對擴展過程控制的程度值。在其值設置為0時,圖片生成是不附加條件的(即prompt是忽略的)。更高的值會引導擴散過程朝著提示詞方向前進。
下面對比v1與v2的區別。
SD v2使用OpenClip做文本詞嵌入。SD v1使用Open AI的CLIP ViT-L/14做文本詞嵌入。
做出此變更的原因:
Stable Diffusion v1.4 使用的訓練trained數據是:
l? 237k steps,分辨率為256 x 256,數據集為laion2B-en
l? 194k steps,分辨率為512 x 512,數據集為laion-high-resolution
l? 225k steps,分辨率為512 x 512,數據集為laion-aesthetics v2 5+,使用10%的文本條件剔除
Stable Diffusion v2使用的訓練數據為trained with:
l? 550k steps,分辨率為256 x 256,數據集為?LAION-5B的子集。過濾了明顯色情的材料,使用LAION-NSFW classifier(punsafe=0.1參數)以及aesthetic score >= 4.5
l? 850k steps,分辨率為512 x 512,在同樣的數據集上(分辨率>=512 x 512)
l? 150k steps,在同樣的數據集上使用?v-objective
l? 在 768 x 768 的圖片上繼續訓練140k steps
Stable Diffusion v2.1是基于v2.0進行fine-tune的來:
l? 額外55k steps訓練,同樣數據集(使用punsafe=0.1)
l? 另外155k steps,使用punsafe=0.98
基本上,他們在最后的訓練步驟中關閉了NSFW過濾器。
用戶發現使用Stable Diffusion v2控制風格以及生成名人通常會更難。雖然Stability AI并沒有顯式過濾藝術家以及名人的姓名,但它們在v2中的效果要弱得多。這可能是由于訓練數據的不同導致的。Open AI的專有數據可能擁有更多的藝術作品和名人照片。他們的數據可能經過了高度過濾,使得每件事和每個人都看起來非常美好。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
騰訊圖書網加入書簽后怎么看書簽加在哪?打開騰訊圖書網的收藏列表,您可以直觀地看到您最近收藏的章節名稱。每次你點擊哪個章節的“書簽”,它都會顯示你的章節名稱,但它只會記錄你上一次收集的章節名稱,其他時間不會。先安裝QQ工具欄!然后登錄QQ,就可以看到書簽了!單擊以查找上一個書簽添加書簽里刪除的怎么恢復?1. 登錄QQ賬號,同步書簽檢索原來,QQ瀏覽器保存了很多書簽,但清理完瀏覽器緩存后,就不見了。不...
手機QQ主題不能正常使用?系統提示稍后再試,肯定是重啟后手機和WIFI,再一次參與可以下載是否需要能夠使用。找不到隨機的主題文件,要新的直接下載。這個問題在下載主題時會每天都出現,要關機重啟手機如果沒有過會再試試吧就可以不上網下載了,估計是主題包暫時不全部丟失的緣故。手機qq主題怎么更換?1、解鎖碼手機剛剛進入系統后,再點【圖標按鈕】。oppo怎么換美化包?一這個可以直接進入主題商店,搜索全局,就...
北京電視臺選擇欄目主持人?王為念,1959年5月1日出生,導演、主持人。王芳,電視主持人。主持北京電視臺《快樂生活一點通》 《健康生活》、《數字生活》 《身邊》、《在選擇》等節目。雷明,男,著名心理咨詢專家、管理培訓專家,現任國家人力資源開發研究會常務理事,科學院研究生院兼職教授,浙江大學MBA導師,北京陳暉心理咨詢有限公司董事長,長期專注于管理咨詢、親子教育、家庭婚姻等領域。北京衛視健康節目女主...