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