ETH官方钱包

前往
大廳
主題

【Generative AI】 從實(shí)作來學(xué)Diffusion Model,學(xué)習(xí)筆記

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

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



Diffusion Model

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



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

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


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

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




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






送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

偷偷做不會被發(fā)現(xiàn)
2024-06-02 09:43:43
%%鼠 拒收病婿
不佬
2024-06-03 00:42:56
追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

相關(guān)創(chuàng)作

更多創(chuàng)作