Stable Diffusion模型基礎(chǔ)

一、數(shù)學(xué)基礎(chǔ)

1. 正態(tài)分布標(biāo)準(zhǔn)化

對于一個(gè)服從高斯分布的隨機(jī)變量x\sim N(\mu ,\sigma ^2),計(jì)算其均值\mu和標(biāo)準(zhǔn)差\sigma。“標(biāo)準(zhǔn)正態(tài)分布”,就是取\mu=0\sigma ^2=1正態(tài)分布給出的,其概率密度函數(shù)為:

f(x)=\frac{1}{\sqrt{2 \pi}} e^{\frac{-x^{2}}{2}}

對于任意一個(gè)正太分布的概率密度函數(shù)積分:

\begin{aligned} \int f(x) \mathrmk6nvjmb x & =\int \frac{1}{\sqrt{2 \pi \sigma^{2}}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}} \mathrm{~d} x \\ & =\int \frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{2}} \mathrm{~d} x \\ & =\int \frac{1}{\sqrt{2 \pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{2}} \mathrm{~d}\left(\frac{x-\mu}{\sigma}\right) \end{aligned}

z=\frac{x-\mu }{\sigma },上邊公式就變成了:

\int \frac{1}{\sqrt{2 \pi}} e^{-\frac{z^{2}}{2}} \mathrm{~d} z

可以得到新的隨機(jī)變量z=\frac{x-\mu }{\sigma },符合標(biāo)準(zhǔn)正太分布。

所以對于一個(gè)服從高斯分布的隨機(jī)變量x\sim N(\mu ,\sigma ^2),取z=\frac{x-\mu }{\sigma }即可將其轉(zhuǎn)化為標(biāo)準(zhǔn)正態(tài)分布z\sim N(0 ,1)

2. 參數(shù)重整化

若希望從高斯分布N(\mu ,\sigma ^2)中采樣,可以先從標(biāo)準(zhǔn)分布 N(0,1)采樣出z,再得到\sigma *z+\mu,這就是我們想要采樣的結(jié)果。這樣做的好處是將隨機(jī)性轉(zhuǎn)移到了z這個(gè)常量上,而\sigma\mu則當(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ù)

  • x_0,x_1,...,x_T:每一步產(chǎn)生的圖片,其中x_0是原始圖片,x_T是純高斯噪聲

  • \epsilon \sim N(0,I):為每一步添加的高斯噪聲

  • q(x_t | x_{t-1}):指通過向圖像x_{t-1}中添加高斯噪聲,得到x_t

根據(jù)上面的流程圖,有x_t=x_{t-1}+\epsilon=x_0+\epsilon_0+\epsilon_1+...+\epsilon,根據(jù)公式,為了得到x_t,需要sample好多次噪聲,可以使用重參數(shù)進(jìn)行簡化。

2.2 重參數(shù)

在由x_{t-1}加噪至x_t的過程中,噪聲的標(biāo)準(zhǔn)差/方差是以一個(gè)在區(qū)間(0,1內(nèi)的固定值\beta_{T}來確定的,均值是以固定值\beta_{T}和當(dāng)前時(shí)刻的圖片數(shù)據(jù)x_{t-1}來確定的,加噪過程可以寫成公式:

\begin{array}{c} q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}\right)=\mathcal{N}\left(\mathbf{x}_{t} ; \sqrt{1-\beta_{t}} \mathbf{x}_{t-1}, \beta_{t} \mathbf{I}\right) \\ \\ q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_{0}\right)=\prod_{t=1}^{T} q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}\right) \end{array}

上式意思是:由x_{t-1}得到x_t的過程q(x_t | x_{t-1}),滿足分布\mathcal{N}\left(\mathbf{x}_{t} ; \sqrt{1-\beta_{t}} \mathbf{x}_{t-1}, \beta_{t} \mathbf{I}\right)。(這個(gè)分布是指以\sqrt{1-\beta_{t}} \mathbf{x}_{t-1}為均值,\beta_{t} \mathbf{I}為方差的高斯分布)。因此我們看到這個(gè)噪聲只由\beta_{t}x_{t-1}來確定,是一個(gè)固定值而不是一個(gè)可學(xué)習(xí)過程。因此,只要我們有了x_0,并且提前確定每一步的固定值\beta_{1},...,\beta_{T},我們就可以推出任意一步的加噪數(shù)據(jù)x_{1},...,x_{T}。這里加噪過程是一個(gè)馬爾科夫鏈過程。

借助參數(shù)重整化\sigma *z+\mu可以寫成:

\mathbf{x}_{t}=\sqrt{1-\beta_{t}} \mathbf{x}_{t-1}+\sqrt{\beta_{t}} \epsilon

其中\epsilon \sim \mathcal{N}(\mathbf{0}, \mathbf{I}),是從標(biāo)準(zhǔn)高斯分布中采樣的噪聲。

2.3 任意時(shí)刻數(shù)據(jù)x_t的計(jì)算

在逐步加噪的過程中,我們其實(shí)并不需要一步一步地從x_0,x_1,...去迭代得到x_t。事實(shí)上,我們可以直接從x_0和固定值\left\{\beta_{T} \in(0,1)\right\}_{t=1}^{T}序列直接計(jì)算得到。

  • \bar{\alpha}_{1},\bar{\alpha}_{2},...,\bar{\alpha}_{T}:一系列常數(shù),類似于超參數(shù),隨著T的增加越來越小

  • \beta_{1},\beta_{2},...,\beta_{T}:一系列常數(shù),是我們直接設(shè)定的超參數(shù),隨著T的增加越來越大

定義\alpha_{t}=1-\beta_{t}, \quad \bar{\alpha}_{t}=\prod_{i=1}^{T} \alpha_{i},根據(jù)上面的重參數(shù)得到的遞推公式,得到:

\begin{aligned} \mathbf{x}_{t}=\sqrt{\alpha}_{t} \mathbf{x}_{t-1}+\sqrt{1-\alpha}_{t} \epsilon \\ =\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon \end{aligned}

現(xiàn)在,只需要sample一次噪聲,就可以直接從x_0得到x_t了。

  1. 逆擴(kuò)散過程

由于加噪過程只是按照設(shè)定好的超參數(shù)進(jìn)行前向加噪,本身不經(jīng)過模型,但去噪過程是真正訓(xùn)練并使用模型的過程。定義p_\theta (x_{t-1}|x_{t})表示去噪過程,其中\theta表示模型參數(shù)。

如上圖所示,從第T個(gè)timestep開始,模型的輸入為x_t與當(dāng)前timestept。模型中蘊(yùn)含一個(gè)噪聲預(yù)測器(UNet),它會根據(jù)當(dāng)前的輸入預(yù)測出噪聲。然后,將當(dāng)前圖片減去預(yù)測出來的噪聲,就可以得到去噪后的圖片。重復(fù)這個(gè)過程,直到還原出原始圖片x_0為止。可以看到,每一步的預(yù)測需要前一步的圖片信息和timestep,timestep的表達(dá)類似于位置編碼,需要告訴模型,現(xiàn)在進(jìn)行的是哪一步去噪。

  1. 訓(xùn)練與推理步驟

DDPM的訓(xùn)練流程如下圖左邊部分,推理流程如下圖右邊部分:

4.1 訓(xùn)練流程

由加噪過程可知:

  • 在第t個(gè)時(shí)刻的輸入圖片可以表示為:\mathbf{x}_{t}=\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon

  • 噪聲真值表示為:在第t個(gè)時(shí)刻sample出來的噪聲\epsilon \sim \mathcal{N}(\mathbf{0}, \mathbf{I})

  • 預(yù)測出來的噪聲表示為:\epsilon_\theta (\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon, t),其中\theta為模型參數(shù),表示預(yù)測出的噪聲和模型相關(guān)。

  • loss:loss = \epsilon - \epsilon_\theta (\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon, t),只需要最小化該loss即可。

由于不管對任何輸入數(shù)據(jù),不管對它的任何一步,模型在每一步做的都是去預(yù)測一個(gè)來自高斯分布的噪聲。因此,整個(gè)訓(xùn)練過程可以設(shè)置為:

  • 從訓(xùn)練數(shù)據(jù)中,抽樣出一條x_0(即x_0\sim q(x_0))

  • 隨機(jī)抽樣出一個(gè)timestep。(即t \sim Uniform(1,...,T)

  • 隨機(jī)抽樣出一個(gè)噪聲。(即\epsilon \sim \mathcal{N}(\mathbf{0}, \mathbf{I})

  • 計(jì)算:loss = \epsilon - \epsilon_\theta (\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon, t)

  • 計(jì)算梯度,更新模型,重復(fù)上面過程,直至收斂。

4.2 推理流程

推理流程需要串行執(zhí)行,我們從最后一個(gè)時(shí)刻(T)開始,傳入一個(gè)純噪聲(或者是一張加了噪聲的圖片),逐步去噪。根據(jù) \mathbf{x}_{t}=\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon,我們可以進(jìn)一步推出x_tx_{t-1}的關(guān)系(上圖的前半部分)。而圖中\sigma_t z一項(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è)的x\tilde{x}是模型的輸入輸出,比如 [W,H,C] 的三維張量,代表圖片的寬、高和通道數(shù)。這里的 x 是模型訓(xùn)練的原始圖片輸入,推理時(shí)使用的是最右側(cè)的 Images 模塊。

像素空間與隱空間:

  • 像素空間(Pixel Space),上圖左側(cè),紅框部分。通常是人眼可以識別的圖像內(nèi)容。

  • 隱空間(Latent Space),上圖中央,綠框部分。通常是人眼無法識別的內(nèi)容,但包含的信息量與像素空間相近。

  • 像素 -> 隱空間:經(jīng)過Encoder,轉(zhuǎn)化為張量z,即稱為隱空間。

  • 隱空間 -> 像素空間:經(jīng)過Decoder,轉(zhuǎn)換回像素空間。

Diffusion Process:

對隱向量添加噪聲,按照DDPM模型的流程,采樣一組高斯分布噪聲,通過公式推導(dǎo),得到 z_T 向量。

Denoising Process:

Conditioning:

對應(yīng)圖中最右邊灰白色框,輸入類型包括text、images等。在Conditioning模塊中,會執(zhí)行以下步驟:

  • 這些“附加信息”會通過對應(yīng)的編碼器 ,轉(zhuǎn)換成向量表示\tau_\theta

  • 轉(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ù)。

原理:

  1. 原始張量輸入,經(jīng)過非常簡單的網(wǎng)絡(luò)結(jié)構(gòu),轉(zhuǎn)換成較小的張量

  2. 在Latent張量上,加一點(diǎn)點(diǎn)噪聲擾動(dòng)

  3. 用對稱的簡單網(wǎng)絡(luò)結(jié)構(gòu),還原回原始大小

  4. 對比輸入前后的張量是否相似

特點(diǎn):

  1. 網(wǎng)絡(luò)計(jì)算復(fù)雜度比較低

  2. Encoder和Decoder可以分開使用

  3. 無監(jiān)督訓(xùn)練,不需要標(biāo)注輸入的label

  4. 有了噪聲擾動(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)中,輸入是帶有噪聲的隱向量z_t、當(dāng)前的時(shí)間戳t,文本等Conditioning的張量表示E,輸出是z_t中的噪聲預(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大致上可以分為三塊:降采樣層、中間層、上采樣層。

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評論 2 373