快速學(xué)會(huì)Diffusion模型(不含公式推導(dǎo))


前些天看到AudioLDM的語音效果非常棒,忽然想起來之前想要寫一篇簡(jiǎn)單易懂的Diffusion教程,但一直沒想起來寫,趁著休息日趕緊寫一下w。按照慣例,這篇文章的標(biāo)題應(yīng)該叫《三歲小可愛也能學(xué)會(huì)Diffusion模型》。
之前很流行的圖片生成模型DALL-E-2,以及今天看到的音頻生成模型AudioLDM的背后都是Diffusion模型。在這之前,GAN模型幾乎統(tǒng)治了生成模型,但由于GAN模型不易訓(xùn)練,模型復(fù)現(xiàn)困難等原因大家紛紛感到擴(kuò)散模型真香(其實(shí)是GAN模型卷不動(dòng)了,但是用擴(kuò)散模型能把GAN做過的事情重新水水論文)。

擴(kuò)散模型與墨水?dāng)U散很像,但有些差別,擴(kuò)散模型是在圖像中不斷加入噪聲,加到最后一步時(shí),整個(gè)圖像都會(huì)被噪聲覆蓋。

不要將噪聲當(dāng)作環(huán)境中的讓人感到不愉快的聲音,可以簡(jiǎn)單的理解為在圖像中用隨機(jī)顏色畫了個(gè)點(diǎn)。假設(shè)上面貓貓頭圖片的橫縱都為3厘米,然后用間隔一厘米的方式劃分成一個(gè)網(wǎng)格,取網(wǎng)格中的1x1小塊,然后給這個(gè)小塊染上一個(gè)不同的顏色,這里的小塊上的不同顏色就是噪聲。
所以簡(jiǎn)單理解擴(kuò)散就是:在最開始是一張正常的貓貓頭,然后不斷的給小塊染色,最后會(huì)得到一個(gè)五顏六色的圖像。
擴(kuò)散模型分為前向和后向,前向是給貓貓頭染色的過程,后向就是將這個(gè)過程逆過來做一遍:
不斷的移除五顏六色的圖片上的噪聲,最后得到一個(gè)貓貓頭。

以上就是理論部分,下面我們來看看具體是怎么做的。
首先看一下幾個(gè)符號(hào)的讀音(以防有小伙伴不知道怎么讀):

讀作阿爾法,寫作Alpha

讀作貝塔,寫作Beta

上面的橫杠是bar,在中文環(huán)境被人習(xí)慣的讀作拔,所以這個(gè)讀作阿爾法拔(怪怪的)
Bar代表累乘,Alpha bar就是Alpha的累乘。

在DDPM論文中,beta是一個(gè)從0.0001到0.002的線性值[0.0001, 0.002]

alpha等于1- beta
T代表某一時(shí)刻,已知t0時(shí),beta為0.0001, 所以t0時(shí)alpha為1-0.0001
下面是論文中前向的最終公式:

在T時(shí)刻,圖像加噪聲的Xt就長(zhǎng)這樣
Beta越來越大,alpha越來越小,所以圖像受alpha的影響越來越小,受到噪聲的影響越來越大
逆向時(shí),Xt-1長(zhǎng)這樣:

已知Xt就可以逐漸求到X0
前向和后向公式后面都跟著一個(gè)噪聲,噪聲是沒辦法直接知道的,所以就需要借助模型的幫忙。
所以擴(kuò)散模型的訓(xùn)練可以簡(jiǎn)單的描述為:
訓(xùn)練一個(gè)模型,讓它能夠根據(jù)圖片預(yù)測(cè)出噪聲 (學(xué)習(xí)Xt與噪聲的關(guān)系)
知道噪聲后就可以逐漸預(yù)測(cè)出X0的圖片,預(yù)測(cè)過程是這樣的:
輸入Xt,預(yù)測(cè)噪聲,根據(jù)噪聲計(jì)算Xt-1
計(jì)算Xt-2
計(jì)算Xt-3
…..
得出X0
我們能看到訓(xùn)練過程是比較簡(jiǎn)單的,不需要像訓(xùn)練GAN模型一樣訓(xùn)練生成器和判別器,同時(shí)也很容易理解。
我們可以融入一些其他的特征,比如文字,將之融入到模型中,這樣就可以根據(jù)文字輸出相關(guān)的圖片。DALL-E-2大概就是這樣做的。
由于視頻有一堆圖像構(gòu)成,音頻也有頻譜圖,所以用擴(kuò)散模型生成圖片,音頻,視頻都是非常適合的。
當(dāng)然在實(shí)際應(yīng)用中不會(huì)直接用這樣原始的模型,因?yàn)橛?jì)算從Xt到X0的時(shí)間還是蠻長(zhǎng)的,所以要縮減計(jì)算步數(shù)(比如DDIM)。

給紅豆做了個(gè)網(wǎng)站用來放文章還有其他的東西(歌聲合成也會(huì)放在這里),可以在通過
https://azuki.im 訪問
本篇文章也在這里閱讀?https://azuki.im/blog/快速學(xué)會(huì)diffusion模型/
Azuki是紅豆的意思,感覺比red bean好聽許多www