用設計師能理解的語言
來解釋AIGC中的技術名詞
「AIGC 屬於跨學科的產物,涉及領域眾多,包括高等數學、統計學、計算機圖形圖像學、機器學習等各個領域。AIGC 設計軟體的介面上往往會涉及到許多這些領域的技術術語。要想搞清楚它們背後的知識體系需要展開的知識樹體量十分龐大繁雜。術業有專攻,我們無法全面俱到地在每一個領域都做到精通,但又需要了解到一定的程度,以便更好地使用 AIGC 的相關軟體。所以,我們將儘量以設計行業從業者能理解的語言來解釋那些經常遇到無法繞開的技術術語。
Stable Diffusion 穩定擴散模型(下)
為了講解 Clip text 文本編碼器,我們需要先了解 Latent Space(潛空間)。我們在之前的介紹中解釋過 Latent Space(潛空間)的最基礎的概念和思維方式。在下面,我們將結合 Stable Diffusion 的工作流程來看一下 Latent Space(潛空間)是如何在其中發揮作用的。
為了找到圖片與圖片之間潛在的聯繫與規律,Stable Diffusion 的運行不是在圖像本身的像素上來進行的,而是在圖像的壓縮版本即潛空間中進行的。這種壓縮和解壓縮過程是通過 Autoencoder 自動編碼器完成的。自動編碼器中的 Encoder 編碼器將圖像壓縮到潛空間中,然後把處理過的潛空間中的信息再交給 Decoder 解碼器來重建圖像。這個 Autoencoder 其實是一個VAE,Variational Autoencoder 變分自編碼器(之前的課程中我們詳細講過VAE)。
VAE 模型架構
Stable Diffusion 的運行是在壓縮後的潛空間中進行的。讓我們再回顧一下,之前一直提到的噪點是以潛空中的噪點切片(slices)來存在的(上圖中用黃色網格來表示),這實際上就是一個噪點數據矩陣,而不是像素圖像的噪點。因此,噪點預測器 U-Net 實際是被訓練用來預測壓縮潛空間中的噪點數據矩陣的。
正向過程
前向過程是把圖片壓縮到潛空間,逐步加噪點,生成數據,來訓練噪點預測器 U-Net 。一旦它被訓練成功,我們便可以利用它通過反向過程來逐步去噪點生成圖像。
正向過程與反向過程
這兩個流程在 LDM/Stable Diffusion 論文的圖 3 中進行了更技術性的展示(論文:https://arxiv.org/abs/2112.10752):
LDM/Stable Diffusion 論文的圖 3:Stable Diffusion 模型架構
可以看到,此圖最右側還顯示了輸入「條件」(Conditioning)組件,這就是用來描述所生成的圖像的文本提示詞的轉化組件 Clip text ,讓我們解剖一下這個組件 。
Clip text 是一個 Text Encoder 文本編碼器,就是之前這個圖中深藍色模塊,它本身是一個 Transformer 自然語言模型,它把輸入的文本提示詞生成的Token embeddings。embedding 是指將高維度的數據(可以是文字、圖片、聲音等)映射到低維度空間的過程,其結果也可以稱為 embeddings。在 embedding 中,文本的數據表示成一個維度空間中連續數值的點。
早期的 Stable Diffusion 模型使用的是 OpenAI 公司發布的用於 GPT 的經過預先訓練的 ClipText 模型,在 Stable Diffusion V2 版本中則切換到了2022年發布的 CLIP 模型的改進變種,更大更好的 OpenCLIP 模型,這類模型都被統稱為 CLIP 模型。( https://laion.ai/blog/large-openclip/ ;https://stability.ai/blog/stable-diffusion-v2-release)
CLIP, 全稱是 Contrastive Language-Image Pre-Training,中文的翻譯是:通過語言與圖像比對方式進行預訓練,可以簡稱為圖文匹配模型,即通過對語言和圖像之間的一一對應關係進行比對訓練,然後產生一個預訓練的模型,能為日後有文本參與的生成過程所使用。CLIP 本身也是一個神經網絡,它將 Text Encoder 從文本中提取的語義特徵和 Image Encoder 從圖像中提取的圖像特徵進行匹配訓練。這樣的訓練方式簡單直接,且效果突出。研究人員發現在後續處理環節中,用來生成圖像的 Diffusion 與表示的文本數據的 CLIP 可以非常好地協同工作,這也是為什麼 Stable Diffusion 選擇 CLIP 作為其圖像生成方面的三大基礎模型之一的原因。( Stable Diffusion 的三大基礎模型為 CLIP、Diffusion、VAE )
CLIP模型的架構
既然是神經網絡,CLIP 也同樣有若干層,也是一種深度學習算法。我們現在已經知道神經網絡的第一層(圖中layer0)是輸入層,它把「dog」的Token數值通過閾值與權重的計算後的結果輸出給第二層(圖中layer1),然後再由第二層做類似的運算再輸入給下一層,直至最後到第十二層,即輸出層進行輸出。雖然大體上的運算方式類似,但是層與層之間的區別在於這些閾值和邊權的權重數值不同,這些不同是早先 CLIP 在預訓練階段就固化下來的特有數據,即 CLIP 模型。因此,如果數據在未跑完全部12個層時提前出來,輸出給 Diffusion 擴散模型用於生圖,則意味著用該數據生成的圖像也會有區別。
Stable Diffusion WebUI 中的被簡化顯示的 CLIP 的 12 個層結構
在 Stable Diffusion WebUI 軟體中設有 CLIP Skip 參數調節滑塊,可以在1至12的檔位之間進行調節。12個調節檔位,代表了CLIP神經網絡的12個層中我們期望CLIP運算停止在
倒數第幾層然後輸出結果給 Diffusion 擴散模型用於圖片生成運算的意思。比如滑塊設置到2,那就意味著 CLIP運算到倒數第二層(圖中為layer10,因為是layer0為起始輸入層的即第一層)直接輸出,從而放棄了傳導至第十二層再輸出的步驟。這樣導致的結果是輸出給 Diffusion 擴散模型的文本比對數據含有一些信息噪點,即儘管圖像與文本的匹配精度略微降低,但圖像的信息包容度提高了。
反觀第十二層輸出由於過於苛求圖文比對的精度,於是導致了些許的過擬合情況發生,從而導致生成的圖像反而缺失了某些信息。但,如果 CLIP 的進程過早地提前終止而輸出,則會導致圖像與文本過於不匹配,從而無法實現我們想通過 Stable Diffusion 對生圖做精準控制的訴求。
Stable Diffusion 模型實際上就是在 CLIP 處於倒數第二層時訓練出來的,所以很多時候,你會發現把 CLIP Skip 設置為2時,生成的圖像會更好,更接近於我們所希望提示詞所表達的含義,且畫面質感很 nice。當然,這也並不絕對,很多時候圖像領域的好與壞因人而異,因項目需要而異,具體的設置還需要在實際的工作中進行微調來滿足不同的需求。
那麼,這個CLIP模型是如何訓練出來的呢?
CLIP 模型是通過一張圖和圖的文字說明一起訓練出來的,這樣的訓練樣本足足有4億張!當然,這些圖片與文字說明部分,基本都來自於網絡上抓取的圖片和這些圖片在網頁上的 「alt」 標籤的內容( 「alt」 標籤是網頁上的代碼中Html圖像標籤中的一個屬性標籤,它利用文字內容描述當前的圖片,告知搜尋引擎這張圖代表什麼) 。
CLIP 訓練樣本示例
下面把 CLIP 拆解開看看細節,其內部是圖像編碼器和文本編碼器的組合。首先將一張圖片和它對應的文字說明分別輸入到 Text Encoder 文本編碼器中,分別輸出為 Image embedding 和 Text embedding,即兩組向量。
然後,通過一種叫「餘弦相似度」(cosine similarity)的向量對比方法來對比這兩個生成出來的 embedding 向量。在剛開始訓練時,即使在輸入端來看文本準確地描述了圖像,但在輸出來看相似度很低,即通過餘弦相似度(cosine similarity)對比後的結果都顯示相似度很低。
然後,我們把差值更新進入這兩個編碼器 Image Encoder 和 Text Encoder,以便在第二次再對同一組圖和文字說明進行編碼後產生的 embedding 向量之間的相似度能夠有所提高。