前言
之後會用到,先學(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的。