ETH官方钱包

前往
大廳
主題

【Generative AI】 從實作來學Diffusion Model,學習筆記

%%鼠 拒收病婿 | 2024-06-02 00:12:56 | 巴幣 3270 | 人氣 481

前言
之後會用到,先學一下。
主要內容來自HuggingFace教學,加上一些自己的筆記。由於我也剛學不久,若有錯誤的地方還請勘誤。



Diffusion Model

Diffusion model主要由三個部分組成:前向過程、反向過程和取樣程序。Diffusion model的目標是學習一個添加/移除Noise的過程,Training的階段會逐步添加Noise,直到圖片變成完全的Noise;Inferencing的時候會逐步移除Noise,直到還原出原圖(未添加Noise的時候的圖片)。



Forward階段:  
給定x_t,我們可以算出x_{t-1}時候的圖片(多加上一層Noise)。  由於已知Noise是從一高斯分布採樣的,我們可以用一個係數控制每個timestep時Noise的強度,也就是說,在Forward階段我們可以得到任意timestep的圖片,且越接近時間點T的step越多Noise,還原難度越高。

訓練的主要步驟:
  • 隨機sample noise
    noise = torch.randn(clean_images.shape)….
  • 隨機抽幾個時間點(timestep)
    timesteps = torch.randint(…)
  • 依據各timestep加上noise
    noisy_images = noise_scheduler.add_noise(clean_images, noise, timesteps)
  • 用模型(這裡用U-Net) 預測 noise
    noise_pred = model(noisy_images, timesteps, return_dict=False)[0]
  • 預測的noise應該跟添加的noise越接近越好
    loss = F.mse_loss(noise_pred, noise)


Reverse階段:  
Reverse階段負責移除Noise,從一張完全的Noise還原出想要的圖片。

Inference程式:
做t次noise移除,最後的那一次就會得到0 noise的圖片。




從上面的training/inferencing程式來看,可以發現inference時是一步步走完整個timesteps,而training可以跳著sample,兩者的差異主要在於DDPM的Forward 是stochastic ,Reverse是deterministic。意及Training階段包含了Random function的使用,具有一定的隨機性,而Inference階段我們用模型取代了noise sampling,而Model參數已是固定的,所以結果是deterministic的。






送禮物贊助創作者 !
0
留言

創作回應

偷偷做不會被發現
2024-06-02 09:43:43
%%鼠 拒收病婿
不佬
2024-06-03 00:42:56
追蹤 創作集

作者相關創作

相關創作

更多創作