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