Tu 2023/2/14
最近在看到許多AI生成圖片後,有想深入研究有關生成模型的一些東西,因此想說直接挑戰轟動一時的SOTA model,傳說中的擴散模型(Diffusion Model),然後發現自己好像還是缺乏基礎,但是研究的過程中多多少少有一些成果和心得,所以來記錄一下。
我看了很多網路上的相關資料,因此這篇很多東西都是根據那些整理出來的,參考資料我會放在最後面。這個系列主要是註解deepfindr的作法,以及一些補充資料。
之後可能還要學習一些有關NLP的知識,看能不能學到word to image的技術是怎麼搞的。
Diffusion Model 是一種生成模型,被廣泛的應用在生成圖片的領域,也會搭配GAN這類的模型一起使用。他的原理簡單來說就是對dataset的圖片不斷加上Gaussian Noise,讓原本的圖片逐漸變成完全的雜訊。而模型的主要工作就是想辦法把雜訊修復回原圖,在訓練後就能透過輸入隨機雜訊來生成圖片。
這次使用的資料集是Kaggle上提供的Pixiv 2020的每日前百的頭部裁切圖片,總共有兩萬六千多張大頭照。
上面有提到Diffusion Model是透過不斷在影像上反覆添加雜訊(Noise)達到訓練的效果,有點類似Autoencoder。因此,我們需要先對照片進行雜訊處理。
既然這個章節是要談雜訊處理的forward process,那就要深入探討q(Xt|Xt-1)這個函數。
N()代表Normal Distribution,裡面的三個parameters分別是N(output image, mean, variance),beta是表示一個schedule,決定圖片加上雜訊的過程快慢。
beta schedule 是一個數列,在最初的論文中,他們使用的是linear schedule(下圖上列),也就是一個等差數列,而在2021年的論文 - Improved Denoising Diffusion Probabilistic Models 中提出了cosine schedule(圖中下列),改善了圖片資訊破壞過快的問題。
因為是馬可夫鏈(或馬可夫過程Markov Process,我不知道)本來把圖片加上雜訊的過程是透過iterative的方式加上去的(比如X42就要從X0用iteration加上42次的Noise),但透過一些數學的魔法我們能讓這個過程一步到位(把上方的函式轉換成tractable closed-form)。
我們先定義alpha = 1-beta,透過reparameterization將式子轉化成以X0為參數的方程式。
勘誤:最下面式子的alpha應改成cumprod_alpha、Xt-1應該改成X0。
總之,我們最後能得到
首先先準備一些圖片當作等等的實驗對象
接著就是將上面提到的數學過程轉成一個可以對圖片加上雜訊的程式,我希望這個函式可以依照我提供的X0和timestep回傳該timestep的模糊影像,因此先宣告該函式
之後來處理beta schedule的問題,因此先照論文提供的linear schedule寫出一個函式
再回頭處理forward_process (針對一張圖片的模糊)
但是,我們在訓練的時候要考慮到batch size問題,所以要針對輸入的shape來調整我們的函式。
測試:
整理&補充調整一下到目前為止的程式碼
Part.1 影像資料前處理和顯示的部分
Part.2 加入雜訊的函式以及前運算
Part.3 顯示成果
最後我想來挑戰一下對schedule的改良。
前面有提到linear schedule的缺點就是資料破壞得太快,可以看到上面的結果,其實第五張開始就和完全雜訊差不多了。而對此我試著加入cosine schedule來比較兩者的結果。
看一下兩者alpha_cumprod的差異
以下是linear和cosine schedule的比較,感覺沒有論文上的那麼誇張,也有可能是我哪個部分有出錯。
(上列是linear schedule,下列是cosine schedule,在T=300)
在huggingface還有提供另外兩種beta schedule,這邊直接放個比較,對程式碼有興趣我將連結附在相關資料
由上到下分別為linear. cosine, quadratic, sigmoid shedule
花了好長的時間才弄懂這一小部分,之後的文章應該會介紹model structure還有training process之類的東東。下一篇不出意外應該是介紹DDPM作者選用的模型架構。
https://www.youtube.com/watch?v=a4Yfz2FxXiY
https://www.youtube.com/watch?v=HoKDTa5jHvg&t=1338s
https://huggingface.co/blog/annotated-diffusion
https://arxiv.org/pdf/2102.09672.pdf
https://arxiv.org/pdf/1503.03585.pdf
https://arxiv.org/pdf/2006.11239.pdf
https://theaisummer.com/latent-variable-models/#reparameterization-trick
https://theaisummer.com/diffusion-models/
AI
Deep Learning
Diffusion Model