Diffusion
Diffusion是如何根據(jù)文字生成圖片的?詳解Diffusion的整個(gè)生成過程、訓(xùn)練過程等。
在之前的文章中,我們?cè)?jīng)介紹過Diffusion的具體原理,但是講的還是比較偏理論,為了讓大家快速了解Diffusion原理,這篇文章我們通過圖解的方式。
1. Diffusion文字生成圖片——整體結(jié)構(gòu)
1.1 整個(gè)生成過程
我們知道在使用 Diffusion 的時(shí)候,是通過文字生成圖片,但是上一篇文章中講的Diffusion模型輸入只有隨機(jī)高斯噪聲和time step。那么文字是怎么轉(zhuǎn)換成Diffusion的輸入的呢?加入文字后 Diffusion 又有哪些改變?下圖可以找到答案。文字生成圖片全過程
實(shí)際上 Diffusion 是使用Text Encoder生成文字對(duì)應(yīng)的embedding(Text Encoder使用CLIP模型),然后和隨機(jī)噪聲embedding,time step embedding一起作為Diffusion的輸入,最后生成理想的圖片。我們看一下完整的圖:?token embedding、隨機(jī)噪聲embedding、time embedding一起輸入diffusion
上圖我們看到了Diffusion的輸入為token embedding和隨機(jī)embedding,time embedding沒有畫出來。中間的Image Information Creator是由多個(gè)UNet模型組成,更詳細(xì)的圖如下:更詳細(xì)的結(jié)構(gòu)
可以看到中間的Image Information Creator是由多個(gè)UNet組合而成的,關(guān)于UNet的結(jié)構(gòu)我們放在后面來講。
現(xiàn)在我們了解了加入文字embedding后 Diffusion 的結(jié)構(gòu),那么文字的embedding是如何生成的?接下來我們介紹下如何使用CLIP模型生成文字embedding。
1.2 使用CLIP模型生成輸入文字embedding
CLIP 在圖像及其描述的數(shù)據(jù)集上進(jìn)行訓(xùn)練。想象一個(gè)看起來像這樣的數(shù)據(jù)集,包含4 億張圖片及其說明:圖像及其文字說明
實(shí)際上CLIP是根據(jù)從網(wǎng)絡(luò)上抓取的圖像及其文字說明進(jìn)行訓(xùn)練的。CLIP 是圖像編碼器和文本編碼器的組合,它的訓(xùn)練過程可以簡(jiǎn)化為給圖片加上文字說明。首先分別使用圖像和文本編碼器對(duì)它們進(jìn)行編碼。然后使用余弦相似度刻畫是否匹配。最開始訓(xùn)練時(shí),相似度會(huì)很低。?然后計(jì)算loss,更新模型參數(shù),得到新的圖片embedding和文字embedding?
通過在訓(xùn)練集上訓(xùn)練模型,最終得到文字的embedding和圖片的embedding。有關(guān)CLIP模型的細(xì)節(jié),可以參考對(duì)應(yīng)的論文(https://arxiv.org/pdf/2103.00020.pdf)。
1.3 UNet網(wǎng)絡(luò)中如何使用文字embedding
前面已經(jīng)介紹了如何生成輸入文字embedding,那么UNet網(wǎng)絡(luò)又是如何使用的?實(shí)際上是在UNet的每個(gè)ResNet之間添加一個(gè)Attention,而Attention一端的輸入便是文字embedding。如下圖所示。??whaosoft?aiot?http://143ai.com???更詳細(xì)的圖如下:??
2. 擴(kuò)散模型Diffusion
前面介紹了Diffusion是如何根據(jù)輸入文字生成圖片的,讓大家有個(gè)大概的了解,接下來會(huì)詳細(xì)介紹擴(kuò)散模型Diffusion是如何訓(xùn)練的,又是如何生成圖片的。
2.1 擴(kuò)散模型Duffison的訓(xùn)練過程擴(kuò)散模型Diffusion
Diffusion模型的訓(xùn)練可以分為兩個(gè)部分:
前向擴(kuò)散過程(Forward Diffusion Process) \rightarrow\rightarrow 圖片中添加噪聲
反向擴(kuò)散過程(Reverse Diffusion Process) \rightarrow\rightarrow 去除圖片中的噪聲
2.2 前向擴(kuò)散過程前向擴(kuò)散過程是不斷往輸入圖片中添加高斯噪聲。
2.3 反向擴(kuò)散過程反向擴(kuò)散過程是將噪聲不斷還原為原始圖片。
2.4 訓(xùn)練過程在每一輪的訓(xùn)練過程中,包含以下內(nèi)容:
每一個(gè)訓(xùn)練樣本選擇一個(gè)隨機(jī)時(shí)間步長(zhǎng) tt
將time step tt 對(duì)應(yīng)的高斯噪聲應(yīng)用到圖片中
將time step轉(zhuǎn)化為對(duì)應(yīng)embedding
下面是每一輪詳細(xì)的訓(xùn)練過程:2.5 從高斯噪聲中生成原始圖片(反向擴(kuò)散過程)上圖的Sample a Gaussian表示生成隨機(jī)高斯噪聲,Iteratively denoise the image表示反向擴(kuò)散過程,如何一步步從高斯噪聲變成輸出圖片。可以看到最終生成的Denoised image非常清晰。
補(bǔ)充1:UNet模型結(jié)構(gòu)
前面已經(jīng)介紹了Diffusion的整個(gè)過程,這里補(bǔ)充以下UNet的模型結(jié)構(gòu),如下圖所示
這里面Downsampe、Middle block、Upsample中都包含了ResNet殘差網(wǎng)絡(luò)。
補(bǔ)充2:Diffusion模型的缺點(diǎn)及改進(jìn)版——Stable Diffusion
前面我們?cè)诮榻B整個(gè)文字生成圖片的架構(gòu)中,圖里面用的都是Stable Diffusion,后面介紹又主要介紹的是Diffusion。其實(shí)Stable Diffusion是Diffusion的改進(jìn)版。
Diffusion的缺點(diǎn)是在反向擴(kuò)散過程中需要把完整尺寸的圖片輸入到U-Net,這使得當(dāng)圖片尺寸以及time step t足夠大時(shí),Diffusion會(huì)非常的慢。Stable Diffusion就是為了解決這一問題而提出的。后面有時(shí)間再介紹下Stable Diffusion是如何改進(jìn)的。
補(bǔ)充3:UNet網(wǎng)絡(luò)同時(shí)輸入文字embedding
在第2節(jié)介紹Diffusion原理的時(shí)候,為了方便,都是沒有把輸入文字embedding加進(jìn)來,只用了time embedding和隨機(jī)高斯噪聲,怎么把文字embedding也加進(jìn)來可以參考前面的1.3節(jié)。
補(bǔ)充4:DDPM為什么要引入時(shí)間步長(zhǎng)_t_
引入時(shí)間步長(zhǎng) tt 是為了模擬一個(gè)隨時(shí)間逐漸增強(qiáng)的擾動(dòng)過程。每個(gè)時(shí)間步長(zhǎng) tt 代表一個(gè)擾動(dòng)過程,從初始狀態(tài)開始,通過多次應(yīng)用噪聲來逐漸改變圖像的分布。因此,較小的 tt 代表較弱的噪聲擾動(dòng),而較大的 tt 代表更強(qiáng)的噪聲擾動(dòng)。
這里還有一個(gè)原因,DDPM 中的 UNet 都是共享參數(shù)的,那如何根據(jù)不同的輸入生成不同的輸出,最后從一個(gè)完全的一個(gè)隨機(jī)噪聲變成一個(gè)有意義的圖片,這還是一個(gè)非常難的問題。我們希望這個(gè) UNet 模型在剛開始的反向過程之中,它可以先生成一些物體的大體輪廓,隨著擴(kuò)散模型一點(diǎn)一點(diǎn)往前走,然后到最后快生成逼真圖像的時(shí)候,這時(shí)候希望它學(xué)習(xí)到高頻的一些特征信息。由于 UNet 都是共享參數(shù),這時(shí)候就需要 time embedding 去提醒這個(gè)模型,我們現(xiàn)在走到哪一步了,現(xiàn)在輸出是想要粗糙一點(diǎn)的,還是細(xì)致一點(diǎn)的。
所以加入時(shí)間步長(zhǎng) tt 對(duì)生成和采樣過程都有幫助。
補(bǔ)充5:為什么訓(xùn)練過程中每一次引入的是隨機(jī)時(shí)間步長(zhǎng)?t
我們知道模型在訓(xùn)練過程中 loss 會(huì)逐漸降低,越到后面 loss 的變化幅度越小。如果時(shí)間步長(zhǎng) tt 是遞增的,那么必然會(huì)使得模型過多的關(guān)注較早的時(shí)間步長(zhǎng)(因?yàn)樵缙?loss 大),而忽略了較晚的時(shí)間步長(zhǎng)信息。
總結(jié)
- 上一篇: Flink自定义SQL连接器
- 下一篇: x 天后的日期