一、數(shù)學(xué)基礎(chǔ)
1. 正態(tài)分布標(biāo)準(zhǔn)化
對于一個(gè)服從高斯分布的隨機(jī)變量,計(jì)算其均值
和標(biāo)準(zhǔn)差
。“標(biāo)準(zhǔn)正態(tài)分布”,就是取
、
正態(tài)分布給出的,其概率密度函數(shù)為:
對于任意一個(gè)正太分布的概率密度函數(shù)積分:
令,上邊公式就變成了:
可以得到新的隨機(jī)變量,符合標(biāo)準(zhǔn)正太分布。
所以對于一個(gè)服從高斯分布的隨機(jī)變量,取
即可將其轉(zhuǎn)化為標(biāo)準(zhǔn)正態(tài)分布
。
2. 參數(shù)重整化
若希望從高斯分布中采樣,可以先從標(biāo)準(zhǔn)分布
采樣出
,再得到
,這就是我們想要采樣的結(jié)果。這樣做的好處是將隨機(jī)性轉(zhuǎn)移到了
這個(gè)常量上,而
和
則當(dāng)作仿射變換網(wǎng)絡(luò)的一部分。
二、DDPM模型
1. 模型總覽
DDPM(Denoising Diffusion Probalistic Models)是一種用于圖片生成的擴(kuò)散模型。如下圖所示,DDPM模型主要分為兩個(gè)過程:forward加噪過程(從右往左)和reverse去噪過程(從左往右)。
加噪過程:向數(shù)據(jù)集的真實(shí)圖片中逐步加入高斯噪聲,加噪過程滿足一定的數(shù)學(xué)規(guī)律,不進(jìn)行模型學(xué)習(xí)。
去噪過程:對加了噪聲的圖片逐步去噪,從而還原出真實(shí)圖片,去噪過程則采用神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)。
2. 擴(kuò)散過程(加噪)
2.1 定義
T :總步數(shù)
:每一步產(chǎn)生的圖片,其中
是原始圖片,
是純高斯噪聲
:為每一步添加的高斯噪聲
:指通過向圖像
中添加高斯噪聲,得到
根據(jù)上面的流程圖,有,根據(jù)公式,為了得到
,需要sample好多次噪聲,可以使用重參數(shù)進(jìn)行簡化。
2.2 重參數(shù)
在由加噪至
的過程中,噪聲的標(biāo)準(zhǔn)差/方差是以一個(gè)在區(qū)間
內(nèi)的固定值
來確定的,均值是以固定值
和當(dāng)前時(shí)刻的圖片數(shù)據(jù)
來確定的,加噪過程可以寫成公式:
上式意思是:由得到
的過程
,滿足分布
。(這個(gè)分布是指以
為均值,
為方差的高斯分布)。因此我們看到這個(gè)噪聲只由
和
來確定,是一個(gè)固定值而不是一個(gè)可學(xué)習(xí)過程。因此,只要我們有了
,并且提前確定每一步的固定值
,我們就可以推出任意一步的加噪數(shù)據(jù)
。這里加噪過程是一個(gè)馬爾科夫鏈過程。
借助參數(shù)重整化可以寫成:
其中,是從標(biāo)準(zhǔn)高斯分布中采樣的噪聲。
2.3 任意時(shí)刻數(shù)據(jù)
的計(jì)算
在逐步加噪的過程中,我們其實(shí)并不需要一步一步地從去迭代得到
。事實(shí)上,我們可以直接從
和固定值
序列直接計(jì)算得到。
:一系列常數(shù),類似于超參數(shù),隨著T的增加越來越小
:一系列常數(shù),是我們直接設(shè)定的超參數(shù),隨著T的增加越來越大
定義,根據(jù)上面的重參數(shù)得到的遞推公式,得到:
現(xiàn)在,只需要sample一次噪聲,就可以直接從得到
了。
-
逆擴(kuò)散過程
由于加噪過程只是按照設(shè)定好的超參數(shù)進(jìn)行前向加噪,本身不經(jīng)過模型,但去噪過程是真正訓(xùn)練并使用模型的過程。定義表示去噪過程,其中
表示模型參數(shù)。
如上圖所示,從第T個(gè)timestep開始,模型的輸入為與當(dāng)前timestep
。模型中蘊(yùn)含一個(gè)噪聲預(yù)測器(UNet),它會根據(jù)當(dāng)前的輸入預(yù)測出噪聲。然后,將當(dāng)前圖片減去預(yù)測出來的噪聲,就可以得到去噪后的圖片。重復(fù)這個(gè)過程,直到還原出原始圖片
為止。可以看到,每一步的預(yù)測需要前一步的圖片信息和timestep,timestep的表達(dá)類似于位置編碼,需要告訴模型,現(xiàn)在進(jìn)行的是哪一步去噪。
-
訓(xùn)練與推理步驟
DDPM的訓(xùn)練流程如下圖左邊部分,推理流程如下圖右邊部分:
4.1 訓(xùn)練流程
由加噪過程可知:
在第t個(gè)時(shí)刻的輸入圖片可以表示為:
。
噪聲真值表示為:在第t個(gè)時(shí)刻sample出來的噪聲
。
預(yù)測出來的噪聲表示為:
,其中
為模型參數(shù),表示預(yù)測出的噪聲和模型相關(guān)。
loss:
,只需要最小化該loss即可。
由于不管對任何輸入數(shù)據(jù),不管對它的任何一步,模型在每一步做的都是去預(yù)測一個(gè)來自高斯分布的噪聲。因此,整個(gè)訓(xùn)練過程可以設(shè)置為:
從訓(xùn)練數(shù)據(jù)中,抽樣出一條
隨機(jī)抽樣出一個(gè)timestep。(即
)
隨機(jī)抽樣出一個(gè)噪聲。(即
)
計(jì)算:
計(jì)算梯度,更新模型,重復(fù)上面過程,直至收斂。
4.2 推理流程
推理流程需要串行執(zhí)行,我們從最后一個(gè)時(shí)刻(T)開始,傳入一個(gè)純噪聲(或者是一張加了噪聲的圖片),逐步去噪。根據(jù) ,我們可以進(jìn)一步推出
和
的關(guān)系(上圖的前半部分)。而圖中
一項(xiàng),則不是直接推導(dǎo)而來的,是我們?yōu)榱嗽黾油评碇械碾S機(jī)性,而額外增添的一項(xiàng)。可以類比于GPT中為了增加回答的多樣性,不是選擇概率最大的那個(gè)token,而是在topN中再引入方法進(jìn)行隨機(jī)選擇。
三、SD模型
SD是一個(gè)基于latent的擴(kuò)散模型 ,它在UNet中引入text condition來實(shí)現(xiàn)基于文本生成圖像。基于latent的擴(kuò)散模型的優(yōu)勢在于計(jì)算效率更高效,因?yàn)閳D像的latent空間要比圖像pixel空間要小,這也是SD的核心優(yōu)勢。
1. 結(jié)構(gòu)介紹
整體輸入輸出:
上圖中最左側(cè)的和
是模型的輸入輸出,比如
的三維張量,代表圖片的寬、高和通道數(shù)。這里的
是模型訓(xùn)練的原始圖片輸入,推理時(shí)使用的是最右側(cè)的 Images 模塊。
像素空間與隱空間:
像素空間(Pixel Space),上圖左側(cè),紅框部分。通常是人眼可以識別的圖像內(nèi)容。
隱空間(Latent Space),上圖中央,綠框部分。通常是人眼無法識別的內(nèi)容,但包含的信息量與像素空間相近。
像素 -> 隱空間:經(jīng)過Encoder,轉(zhuǎn)化為張量
,即稱為隱空間。
隱空間 -> 像素空間:經(jīng)過Decoder,轉(zhuǎn)換回像素空間。
Diffusion Process:
對隱向量添加噪聲,按照DDPM模型的流程,采樣一組高斯分布噪聲,通過公式推導(dǎo),得到 向量。
Denoising Process:
Conditioning:
對應(yīng)圖中最右邊灰白色框,輸入類型包括text、images等。在Conditioning模塊中,會執(zhí)行以下步驟:
這些“附加信息”會通過對應(yīng)的編碼器 ,轉(zhuǎn)換成向量表示
。
轉(zhuǎn)換后的向量,會輸入給U-Net,作為其中Attention模塊的K、V輸入,輔助噪聲的預(yù)測。
2. 主要部分
2.1 VAE
作用就是將原始圖片轉(zhuǎn)換到隱空間,經(jīng)過處理再轉(zhuǎn)換回來,使用的就是VAE的Encoder和Decoder。這個(gè)模塊是預(yù)訓(xùn)練好的,固定住參數(shù)。
原理:
原始張量輸入,經(jīng)過非常簡單的網(wǎng)絡(luò)結(jié)構(gòu),轉(zhuǎn)換成較小的張量
在Latent張量上,加一點(diǎn)點(diǎn)噪聲擾動(dòng)
用對稱的簡單網(wǎng)絡(luò)結(jié)構(gòu),還原回原始大小
對比輸入前后的張量是否相似
特點(diǎn):
網(wǎng)絡(luò)計(jì)算復(fù)雜度比較低
Encoder和Decoder可以分開使用
無監(jiān)督訓(xùn)練,不需要標(biāo)注輸入的label
有了噪聲擾動(dòng)之后,Latent Space的距離具有實(shí)際物理含義,可以實(shí)現(xiàn)例如“(滿杯水+空杯子)/ 2 = 半杯水”的操作
2.2 CLIP
文本信息轉(zhuǎn)化為向量,此模塊是預(yù)訓(xùn)練好的,固定住參數(shù)。
訓(xùn)練方式:
圖像以及它的描述文本,經(jīng)過各自的Encoder轉(zhuǎn)換為向量表示,希望轉(zhuǎn)換后的向量距離相近。經(jīng)過訓(xùn)練后,文本描述可以映射到向量空間的一個(gè)點(diǎn),其代表的物理含義與原始圖像相近。
2.3 U-Net
作為核心組件,U-Net是模型訓(xùn)練過程中,唯一需要參數(shù)更新的部分。在這個(gè)結(jié)構(gòu)中,輸入是帶有噪聲的隱向量、當(dāng)前的時(shí)間戳
,文本等Conditioning的張量表示
,輸出是
中的噪聲預(yù)測。
UNet是一個(gè)語義分割模型,其主要執(zhí)行過程與其它語義分割模型類似,首先利用卷積進(jìn)行下采樣,然后提取出一層又一層的特征,利用這一層又一層的特征,其再進(jìn)行上采樣,最后得出一個(gè)每個(gè)像素點(diǎn)對應(yīng)其種類的圖像。Unet中網(wǎng)絡(luò)層越深得到的特征圖,有著更大的視野域,淺層卷積關(guān)注紋理特征,深層網(wǎng)絡(luò)關(guān)注本質(zhì)的那種特征,所以深層淺層特征都是有格子的意義的;另外一點(diǎn)是通過反卷積得到的更大的尺寸的特征圖的邊緣,是缺少信息的,畢竟每一次下采樣提煉特征的同時(shí),也必然會損失一些邊緣特征,而失去的特征并不能從上采樣中找回,因此通過特征的拼接,來實(shí)現(xiàn)邊緣特征的一個(gè)找回。
模型結(jié)構(gòu):
U-Net大致上可以分為三塊:降采樣層、中間層、上采樣層。