我公眾號(hào)文章目錄綜述: https://wangguisen.blog.csdn.net/article/details/127065903 往期重點(diǎn)回顧: 生成模型與極大似然簡(jiǎn)述 變分自編碼器 VAE 詳解 保姆級(jí)講解 生成對(duì)抗網(wǎng)絡(luò) GAN 往期回顧: 圖像分類篇[10]:EfficientNet V1網(wǎng)絡(luò)詳解 圖像分類篇[9]:ShuffleNet V2網(wǎng)絡(luò)詳解及復(fù)現(xiàn) 圖像分類篇[8]:ShuffleNet V1網(wǎng)絡(luò)詳解 圖像分類篇[7]:MobileNet V3網(wǎng)絡(luò)詳解及復(fù)現(xiàn) 保姆級(jí)講解BERT 保姆級(jí)講解Transformer 關(guān)于Attention的超詳細(xì)講解(Attention、Self-Attention、Multi-Head Attention) 目錄 一、引入 二、擴(kuò)散原理闡述 2.1、直觀理解 2.2、前向過(guò)程(擴(kuò)散) 2.3、反向過(guò)程(去噪) 2.4、模型訓(xùn)練 三、算法流程概述 四、數(shù)學(xué)描述 4.1、前向過(guò)程(擴(kuò)散) 4.2、反向過(guò)程(去噪) 4.3、訓(xùn)練損失 五、torch復(fù)現(xiàn) References 一、引入 近年AIGC的爆火離不開(kāi)人工智能在圖像生成、文本生成以及多模態(tài)等領(lǐng)域的不斷累積,其中生成模型的發(fā)展占據(jù)了很大功勞,如:生成對(duì)抗網(wǎng)絡(luò) GAN 及其一系列變體、變分自編碼器 VAE 及其一系列變體、自回歸模型 AR、流模型 flow ,以及近年大火的擴(kuò)散模型 Diffusion Model 等。 擴(kuò)散模型的大火并非橫空出世,早在2015年就有人提出了類似的想法,直到2020年才提出了經(jīng)典的 Denoising Diffusion Probabilistic Models(DDPM),像OpenAI、NovelAI、NVIDIA和Google成功的訓(xùn)練了大規(guī)模模型之后,它們吸引了很多人注意,后續(xù)有了很多基于擴(kuò)散模型的變體,比如有:GLIDE、DALLE-2、Imagen和年底爆火的完全開(kāi)源的穩(wěn)定擴(kuò)散模型(Stable Diffusion)。 擴(kuò)散模型與之前所有的生成方法有著本質(zhì)的區(qū)別: 直觀的說(shuō)它是將圖像生成過(guò)程(采樣)分解為許多小的去噪步驟,其實(shí) Diffusion 的含義本質(zhì)上就是一個(gè)迭代過(guò)程,實(shí)線箭頭用于擴(kuò)散步驟中添加隨機(jī)噪聲,虛線箭頭代表的是通過(guò)學(xué)習(xí)逆向擴(kuò)散過(guò)程從噪聲中重構(gòu)所需的數(shù)據(jù)樣本。引入噪聲導(dǎo)致了信息的衰減,再通過(guò)噪聲嘗試還原原始數(shù)據(jù),多次迭代最小化損失后,能夠使模型在給定噪聲輸入的情況下學(xué)習(xí)生成新圖像。 所以Diffusion模型和其它生成模型的區(qū)別是,它不是直接的圖像->潛變量、潛變量->圖像的一步到位,它是一步一步的逐漸分解、逐漸去噪的過(guò)程。 當(dāng)然有關(guān)Diffusion的理解和變體有很多,但是擴(kuò)散模型從本質(zhì)上講就是DDPM,所以本文主要對(duì)DDPM的原理進(jìn)行講解,并給出DDPM的擴(kuò)散過(guò)程、去噪過(guò)程、訓(xùn)練損失的詳細(xì)推導(dǎo),對(duì)于掌握Diffusion算法原理只需要抓住以下四點(diǎn)即可: 前向過(guò)程(擴(kuò)散); 反向過(guò)程(去噪、采樣); 如何訓(xùn)練; 如何推斷。 二、擴(kuò)散原理闡述 擴(kuò)散模型包括 前向擴(kuò)散過(guò)程 和 反向去噪過(guò)程(采樣),前向階段對(duì)圖像逐步施加噪聲,直至圖像被破壞變成完全的高斯噪聲,然后在反向階段學(xué)習(xí)從高斯噪聲還原為原始圖像的過(guò)程。 2.1、直觀理解 散模型的目的是什么? 學(xué)習(xí)從純?cè)肼暽蓤D片的方法。 擴(kuò)散模型是怎么做的? 訓(xùn)練一個(gè)UNet,接受一系列加了噪聲的圖片,學(xué)習(xí)預(yù)測(cè)所加的噪聲。 前向過(guò)程在干什么? 逐步向真實(shí)圖片添加噪聲最終得到一個(gè)純?cè)肼暎?/p> 對(duì)于訓(xùn)練集中的每張圖片,都能生成一系列的噪聲程度不同的加噪圖片; 在訓(xùn)練時(shí),這些 【不同程度的噪聲圖片 + 生成它們所用的噪聲】 是實(shí)際的訓(xùn)練樣本。 反向過(guò)程在干什么? 訓(xùn)練好模型后,采樣、生成圖片。 2.2、前向過(guò)程(擴(kuò)散) 前向過(guò)程在原始輸入圖像上逐步添加隨機(jī)噪聲,這個(gè)噪聲服從高斯分布,每一步得到的圖像只和上一步的加噪結(jié)果相關(guān),逐步添加噪聲至步,可以得到趨向于純粹噪聲的圖像,如下圖所示: 后面有詳細(xì)的推導(dǎo),公式比較多,這里先提前把主要的列一下方便闡述。 對(duì)于將一張圖片,從的逐步加噪破壞的公式為: 其中: 表示第步的圖像; 是一個(gè)滿足正態(tài)分布的隨機(jī)噪聲,; 是圖片的權(quán)重,是噪聲的權(quán)重; 定義: 隨著的增加,噪聲的占比會(huì)越來(lái)越大,所以添加的噪聲強(qiáng)度也會(huì)越來(lái)越大,也就是說(shuō)圖片的權(quán)重要越來(lái)越小,噪聲的權(quán)重要越來(lái)越大。因?yàn)殡S著擴(kuò)散過(guò)程的增加,圖像中噪聲的占比也會(huì)越來(lái)越大,我們想要進(jìn)一步破壞它的結(jié)構(gòu),就需要添加更多的噪聲。 換句話說(shuō),一開(kāi)始圖像比較清晰,這個(gè)時(shí)候添加的噪聲小一些,隨著圖像的噪聲越來(lái)越多,這個(gè)時(shí)候再加一點(diǎn)噪聲的話,對(duì)原來(lái)的圖像就沒(méi)什么影響了,因?yàn)樗旧砭陀泻枚嘣肼暳?,所以隨著圖像的噪聲越來(lái)越多,后面的步驟就要加更多的噪聲。 實(shí)際訓(xùn)練過(guò)程中會(huì)比較大(DDPM原文中為1000),所以會(huì)有從遞推到的公式: 其中: 、有一個(gè)固定的已知函數(shù),是可以直接進(jìn)行計(jì)算的; 為隨機(jī)產(chǎn)生的噪聲; 所以整個(gè)式子是已知的,式、就可以描述前向過(guò)程了,用于將一張圖片的逐步破壞,用于一步到位的破壞。 2.3、反向過(guò)程(去噪) 反向過(guò)程則是不斷去除噪聲的過(guò)程,給定一個(gè)噪聲圖片,對(duì)它一步步的去噪還原,直至最終將原始圖像給恢復(fù)出來(lái),如下圖所示: 去噪的過(guò)程,、、都是已知的,只有公式中的真實(shí)噪聲是未知的,因?yàn)樗请S機(jī)采樣的。所以需要一個(gè)神經(jīng)網(wǎng)絡(luò)把給學(xué)出來(lái),也就是說(shuō)訓(xùn)練一個(gè)由和估測(cè)噪聲的模型: 其中就是模型的參數(shù),通常使用UNet作為預(yù)估噪聲的模型。 2.4、模型訓(xùn)練 所以說(shuō)反向過(guò)程其實(shí)就是訓(xùn)練網(wǎng)絡(luò)去學(xué)習(xí)分解過(guò)程每一步的噪聲,當(dāng)網(wǎng)絡(luò)訓(xùn)練好之后,輸入一張?jiān)肼晥D片,通過(guò)網(wǎng)絡(luò)就能把加的噪聲給求出來(lái),噪聲有了代入公式,就能把步的比較清晰的圖給求出來(lái)了,一步步往前迭代就行了。 采用L2距離刻畫(huà)相近程度就可以,DDPM的關(guān)鍵是訓(xùn)練,目的就是使預(yù)測(cè)的噪聲與真實(shí)用于破壞的噪聲相近: 模型訓(xùn)練完后,只要給定隨機(jī)高斯噪聲,就可以生成一張從未見(jiàn)過(guò)的圖像。 UNet本文不做介紹,結(jié)構(gòu)圖為: 額外強(qiáng)調(diào)的是:Unet里有一個(gè)位置編碼,是關(guān)于時(shí)間步的,每個(gè)時(shí)間步是有一個(gè)線性調(diào)度器的,每個(gè)時(shí)間添加的噪聲的方差是不一樣的,所以將時(shí)間步作為編碼嵌入的話,可以將模型預(yù)測(cè)的噪聲更加的準(zhǔn)確。 三、算法流程概述 再次總結(jié),擴(kuò)散模型兩個(gè)步驟如下: 一個(gè)固定的(預(yù)先定義好的)前向擴(kuò)散過(guò)程:逐步向圖片增加噪聲直到最終得到一張純粹的噪聲圖; 一個(gè)學(xué)習(xí)得到的去噪過(guò)程:訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)去逐漸的從一張純?cè)肼曋邢肼?,直到得到一張真正的圖片。 算法1 為訓(xùn)練流程: line2:從數(shù)據(jù)中采樣,的意思是給加上噪聲; line3:隨機(jī)選取 time step ; 真實(shí)訓(xùn)練過(guò)程中我們不可能一步步的從到,因?yàn)闀?huì)很大,這就意味著每輸入一張圖片,就會(huì)產(chǎn)生張?jiān)肼晥D像,也就是一張圖像的網(wǎng)絡(luò)要訓(xùn)練個(gè)噪聲樣本,非常耗時(shí)。 所以對(duì)進(jìn)行了采樣,就是從里采集若干個(gè)的意思。 舉個(gè)例子:假設(shè)采集的分別為100、20、3,對(duì)應(yīng)的為、、,對(duì)應(yīng)噪聲為、、,對(duì)于的預(yù)測(cè)噪聲為、、,只需要將和代入MSE公式即可(相減、平方、最小化)。 line 4:生成隨機(jī)高斯噪聲; line 5:調(diào)用模型估計(jì),計(jì)算真實(shí)噪聲與估計(jì)噪聲之間的MSE Loss,反向傳播更新模型。 網(wǎng)絡(luò)的作用是預(yù)測(cè)噪聲,隨著的增加,噪聲強(qiáng)度會(huì)越來(lái)越大,因此預(yù)測(cè)的噪聲是和迭代是直接相關(guān)的,所以要把作為參數(shù)送入到網(wǎng)絡(luò)當(dāng)中。 直到收斂。 算法2 為采樣流程: line 1:從高斯分布采樣; line 2:按照的順序進(jìn)行迭代; line 3:如果令;如果,從高斯分布中采樣; line 4:利用公式求出均值和方差,進(jìn)而求得; 經(jīng)過(guò)上述迭代,恢復(fù)。 四、數(shù)學(xué)描述 4.1、前向過(guò)程(擴(kuò)散) 我們來(lái)推導(dǎo)如何從原始圖像直接到第t時(shí)刻的圖像()。 首先回顧 2.1小節(jié) 的兩個(gè)定義: ,要越大越好,論文中從0.0001到0.02; ,累乘,下面會(huì)用到; ,每一時(shí)刻添加的噪聲均獨(dú)立; 我們要求時(shí)刻的圖像,它需要一步步的加噪迭代,這樣太慢了。因?yàn)槊恳徊教砑拥脑肼暘?dú)立且服從正太分布,我們可以做如下推導(dǎo): 為了不混淆,只需要記?。合聵?biāo)越小,噪聲越小,即的噪聲是小于的。 上述用的就是重參數(shù)化技巧。 方差參數(shù)可以固定為一個(gè)常數(shù),也可以選擇作為時(shí)間段的一個(gè)時(shí)間表。事實(shí)上,人們可以定義一個(gè)方差表,它可以是線性的、二次的、余弦的等等。最初的DDPM作者利用了一個(gè)從到增加的線性時(shí)間表。Nichol等人2021年的研究表明,采用余弦時(shí)間表效果更好。 4.2、反向過(guò)程(去噪) 接下來(lái)是反向過(guò)程的推導(dǎo): 給定要預(yù)測(cè),它是一個(gè)高斯分布,和的方差是固定的,論文作者使用原始的噪聲調(diào)度器作為方差,也就是說(shuō)噪聲調(diào)度器一旦確立,方差的大小也就固定了。所以我們只需要預(yù)測(cè)這個(gè)均值就好了,下面給出具體的推導(dǎo)過(guò)程: 我們先看整個(gè)損失函數(shù),是個(gè)負(fù)對(duì)數(shù)似然: 希望神經(jīng)網(wǎng)絡(luò)的參數(shù),可以使得生成的概率越大越好。 但問(wèn)題在于的概率不好計(jì)算,因?yàn)樗蕾囉谥暗乃胁介L(zhǎng),從開(kāi)始。作為一種解決方案,我們可以計(jì)算這個(gè)目標(biāo)的變分下界,并得到一個(gè)更易于計(jì)算的公式: 其中: 指的是...整個(gè)序列。 現(xiàn)在依然無(wú)法計(jì)算,我們繼續(xù)推導(dǎo): 我們將 KL divergence 改寫(xiě)后,再利用貝葉斯公式進(jìn)行變形,即分母可以改寫(xiě)為: 將其代回原式: 所以原式可簡(jiǎn)化為: 分子,就是前向過(guò)程,它是固定的,從到的采樣,換句話說(shuō)就是從我們數(shù)據(jù)中的一些圖像開(kāi)始; 分母, ; 將提出來(lái),是因?yàn)槭侵府?dāng)前圖像,它是不依賴于網(wǎng)絡(luò)參數(shù)的。 根據(jù)貝葉斯公式可以變換如下: 具有比較高的方差,因?yàn)楦鶕?jù)這張照片,我們無(wú)法確定它來(lái)自哪里,但是引入,我們就可以容易的預(yù)測(cè)出, 因此我們使用: 替換貝葉斯重寫(xiě)后的式子,我們得到: 上述標(biāo)記的式子,也可以簡(jiǎn)化,我們假設(shè): 因此我們可以簡(jiǎn)化為: 第一項(xiàng)KL散度可以忽略,因?yàn)橹皇莻€(gè)正向過(guò)程,沒(méi)有可學(xué)習(xí)參數(shù),換句話說(shuō)就是它是固定的。 第二項(xiàng)KL散度,左邊和右邊都是正太分布,分別服從 、: 第一項(xiàng)的、就是我們要求的值,這里省略了這部分的推導(dǎo),不影響算法的理解, 凡是涉及到的,就是學(xué)習(xí)調(diào)度器的,我們不需要關(guān)注它 我們可以化簡(jiǎn),我們知道,即: 還知道:、 代入得到: 代入之后我們發(fā)現(xiàn)它就不再依賴于了,它就是和的一個(gè)關(guān)系式,式中的、、都是已知的,最后的本質(zhì)就是我們只是從中減去縮放的隨機(jī)噪聲。 這樣一來(lái),DDPM的每一步推斷可以總結(jié)為: 每個(gè)時(shí)間步通過(guò)和來(lái)預(yù)測(cè)高斯噪聲,圖中用表示,根據(jù)上述公式計(jì)算得到均值; 得到方差; 代入公式得到,利用重參數(shù)化得到。 4.3、訓(xùn)練損失 下面我們來(lái)看損失的推導(dǎo),我們來(lái)回顧第二項(xiàng): 我們需要減小KL散度,由于方差是固定的,我們無(wú)法優(yōu)化,所以需要將它們的均值之差減小,原論文中使用的是簡(jiǎn)單的均方誤差: 將表達(dá)式代入: 研究人員發(fā)現(xiàn),忽略前面的系數(shù)項(xiàng)會(huì)變得更簡(jiǎn)單,采樣質(zhì)量也會(huì)得到提高,所以前面這個(gè)系數(shù)項(xiàng)我們直接忽略,它是和噪聲調(diào)度器有關(guān)的,我們加噪的話也會(huì)使計(jì)算復(fù)雜。 我們最小化也就是最小化了KL散度,KL散度變小了也就是變分上限優(yōu)化到最小,所以那個(gè)負(fù)對(duì)數(shù)似然也會(huì)變小。 上面還剩了最后一項(xiàng),這個(gè)作者決定去掉它,即在時(shí),我們不添加噪聲。也就是下面橫線的地方,只有的時(shí)候才服從高斯分布,如果,直接讓,即噪聲設(shè)置為0。 回顧上面整個(gè)推導(dǎo)過(guò)程:我們從負(fù)對(duì)數(shù)似然 -> 優(yōu)化下界 -> 簡(jiǎn)化下界 -> 預(yù)測(cè)噪聲。 五、torch復(fù)現(xiàn) https://wangguisen.blog.csdn.net/article/details/128821008 Referenceshttps:///abs/2006.11239https:///archives/9119https://zhuanlan.zhihu.com/p/576475987https://zhuanlan.zhihu.com/p/525106459https://www.bilibili.com/video/BV1b541197HXhttps://www.bilibili.com/video/BV1WD4y1E7X5https:///blog/annotated-diffusionhttps://www./blog/1051664857725795https://lilianweng./posts/2021-07-11-diffusion-models |
|