天天看點

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

文章目錄

  • 前言
  • 一、Latent space
  • 二、AutoEncoder 和 VAE
    • 1.AutoEncoder:
    • 2.VAE:
  • 三、Diffusion擴散模型
    • 1.前向過程
    • 2.逆向過程
  • 四、多模态 cross attention
  • 五、Stable Diffusion原理
    • 1.訓練過程:
      • ResnetBlock
      • Spatial Transformer(Cross Attention)
      • DownSample/UpSample
    • 2.前向過程:
  • 二、使用步驟
    • 1.引入庫
    • 2.讀入資料
  • 總結

前言

Stable diffusion是一個基于 Latent Diffusion Models(潛在擴散模型,LDMs)的文圖生成(text-to-image)模型。具體來說,得益于 Stability AI 的計算資源支援和在 LAION-5B 的一個子集資料支援訓練,用于文圖生成。

Latent Diffusion Models 通過在一個潛在表示空間中疊代“去噪”資料來生成圖像,然後将表示結果解碼為完整的圖像,讓文圖生成能夠在消費級GPU上,在10秒級别時間生成圖檔。目前,Stable Diffusion釋出了v2版本。v1版是Latent Diffusion Models的一個具體實作,模型架構設定:自動編碼器下采樣因子為8,UNet大小為860M,文本編碼器為CLIP ViT-L/14。官方目前提供了以下權重:

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

提示:以下是本篇文章正文内容,下面案例可供參考

一、Latent space

隐空間是壓縮資料的一個表示。資料壓縮的目的是學習資料中較重要的資訊。以編碼器-解碼器網絡為例,首先使用全卷積神經網(FCN)絡學習圖檔特征,我們将特征提取中對資料的降維看作一種有損壓縮。由于解碼器需要重建(reconstruct)資料,模型必須學習如何儲存所有相關資訊并且忽略噪音,壓縮(降維)的好處在于可以去掉多餘的資訊進而關注于最關鍵的特征。

二、AutoEncoder 和 VAE

1.AutoEncoder:

(1)AE是一個預訓練的自編碼器,優化目标是通過 Encoder 壓縮資料,再通過decoder 還原資料,使得輸入輸出的資料盡量相同

(2)對于圖像資料,decoder 還原資料可以看做是一個生成器,由于 decoder 輸入資料z屬于R空間,輸入z的分布無法被固定住,是以大部分生成的圖檔是無意義的。

2.VAE:

(1)給定輸入解碼器的z一個分布可以解決上述問題,假設一個服從标準多元高斯分布的多元随機變量的資料集X,根據已知分布采樣得到的zi,來訓練decoder神經網絡,進而得到多元高斯分布的均值和方差,進而成功得到一個逼近真實分布p(X)的p’(X)

(2)求解p’(X|z)的機率分布

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

(3)通過極大似然估計,最大化p’(X)的機率,但由于xi的次元很大,zi的次元也很大,需要準确找到與xi分布相關的zi,需要大量的采樣,是以需要在encoder中引入後驗分布p’(z|xi),讓xi與zi關聯起來

(4)利用encoder通過假設已知資料的分布,拟合其參數,進而逼近真實的後驗分布p’(z|xi),在這裡假設後驗分布是基于多元高斯分布,則讓encoder輸出分布的均值和方差

(5)總體流程

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

三、Diffusion擴散模型

1.前向過程

1.t 時刻的分布等于 t-1 時刻的分布+随機高斯分布的噪音,其中α是噪音的衰減值
【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結
2.任意時刻的分布 Xt ,都可以通過 X0 初始狀态,以及步數計算出來:
【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

2.逆向過程

已知 Xt,求初始狀态的 X0,這裡利用貝葉斯公式來預測 X0:

首先求已知 Xt 的分布求 **Xt-1**時刻的分布 (詳細推導見上篇部落格) :

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

四、多模态 cross attention

在 Unet 中間層引入cross attention,加入多模态的條件(文本,類别,layout,mask),實作如下:其中Q來自latent space,K,V來自文本等另一序列:

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結
【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

五、Stable Diffusion原理

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

1.訓練過程:

(1)使用預訓練的CLIP模型,對需要訓練的圖像資料生成對應的描述詞語。

(2)使用預訓練的通用VAE,先用Encoder,将輸入圖檔降維到 latent space(通常降采樣倍數4-16)

(3) 将latent space輸入diffusion model,進行擴散(正向采樣),一步步生成噪聲(在這個過程中,通過權重 β 控制每步生成噪聲的強度,直到生成純噪聲,并記錄每步生成噪聲的資料,作為GT

(4)利用cross attention 将 latent space的特征與另一模态序列的特征融合,并添加到diffusion model的逆向過程,通過Unet逆向預測每一步需要減少的噪音,通過GT噪音與預測噪音的損失函數計算梯度。

(5)其中Denoising Unet的結構如下:

【生成模型】Stable Diffusion原理+代碼前言一、Latent space二、AutoEncoder 和 VAE三、Diffusion擴散模型四、多模态 cross attention五、Stable Diffusion原理二、使用步驟總結

ResnetBlock

左下角小圖所示, ResnetBlock 接受兩個輸入:latent 向量經過卷積變換後和經過全連接配接投影的 timestep_embedding 做加和,再和經過 skip connection 的原始 latent 向量做加和,送入另一個卷積層,得到經 Resnet 編碼變換後的 latent 輸出。

注意左側的 ResnetBlock 和右側的 ResnetBlock 的細微不同。左側的 Resnet Block 接受的 latent 向量從 UNET 的上一層傳入,而右側的 ResnetBlock 除了接受 UNET 上一層的結果 latent 外,還需要接受左側對應的 UNET 層的輸出,兩個 latent concat 起來作為 輸入。是以,如果右側的 ResnetBlock 上層的輸出結果 shape 為 (64, 64, 320),左側對應 UNET 層的輸出結果為 (64, 64, 640),那麼這個 ResnetBlock 得到的輸入 latent 的 shape 為 (64, 64, 960)。

Spatial Transformer(Cross Attention)

右下角小圖所示,Spatial Transformer 同樣接受兩個輸入:經過上一個網絡子產品(一般為 ResnetBlock)處理和變換後的 latent 向量(對應的是是圖檔 token),及對應的 context embedding(文本 prompt 經過 CLIP 編碼後的輸出), cross attention 之後,得到變換後的 latent 向量(通過注意力機制,将 token 對應的語義資訊注入到模型認為應該影響的圖檔 patch 中)。 Spatial Transformer 輸出的 shape 和輸入一緻,但在對應的位置上融合了語義資訊。

DownSample/UpSample

DownSample 将 latent 向量的前兩個軸的大小縮減 50%,而 UpSample 将 latent 向量的前兩個軸的大小增大一倍。DownSample 使用一個步長為 2 的二維卷積來實作,同時将輸入 latent 向量的 channel 數變化成輸出 latent 向量的 channel 數;而 UpSample 使用插值算法來實作,在插值之後進行一個步長為 1 的卷積,同時通過一個步長為 1 的二維卷積來将輸入 latent 向量的 channel 數變化成輸出 latent 向量的 channel 數。

需要注意的是,在整個 UNET 執行一次的過程中,timestep_embedding 和 content embedding 始終保持不變。而在 UNET 反複執行多次的過程中,timestep_embedding 每次都會發生變化,而 content embedding 始終保持不變。在疊代過程中,每次 UNET 輸出的 noise_slice 都與原來 latent 向量相減,作為下次疊代時,UNET 的 Latent 輸入。

2.前向過程:

一個 Image Auto Encoder-Decoder,用于将 Image 編碼成隐含向量

,或者從隐含向量

中還原出圖檔;

一個 UNET 結構,使用 UNET 進行疊代降噪,在文本引導下進行多輪預測,将随機高斯噪聲

轉化成圖檔隐含向量

1.用文本編碼器( CLIP 的 ViT-L/14 ),将使用者輸入的 Prompt 文本轉化成 text embedding;

2.根據假定分布(一般是多元高斯分布),生成一張純噪音圖像;

3.利用VAE encoder 壓縮到latent space;

4.執行Denoising Unet,利用cross attention融合多模态資訊,并預測每一步需要減去的噪音:

5.利用VAE decoder還原到同一分布下的原圖大小

二、使用步驟

1.引入庫

代碼如下(示例):

2.讀入資料

總結

提示:這裡對文章進行總結:

例如:以上就是今天要講的内容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理資料的函數和方法。

繼續閱讀