前言
簡單學(xué)習(xí)下圖像生成模型的相關(guān)知識??
以下內(nèi)容來自于李宏毅老師的視頻講解
課程主頁:https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php
視頻鏈接:機(jī)器學(xué)習(xí)2023(生成式AI)
1. 速覽圖像生成模型
這節(jié)我們來講圖像生成模型,在開始之前呢,我們先講圖像生成有什么特別的地方,那圖像生成有什么特別的地方呢?大家都知道俗話說一張圖勝過前言萬語,所以今天假設(shè)我們圖像生成的任務(wù)是拿一段文字去生成一張圖,比如說你把 “一只奔跑的狗” 這段文本丟給 Midjourney 然后它就會生成一張圖給你
但是我們知道一張圖勝過千言萬語,如果要把一張圖描述成文字那它可以描述的語句遠(yuǎn)比 “一只在奔跑的狗” 還要多,比如說這只狗奔跑的位置是在街道上或者這只狗是一只柯基,有很多的描述是不在你做圖像生成的時候輸入的文字里面的,所以你輸入的文字只是千言萬語的部分,在做圖像生成的時候有很多部分不在人類輸入的文字里面,機(jī)器需要進(jìn)行大量腦補(bǔ)才能夠生成好的圖像。
那這就是圖像生成跟文字生成比較不一樣的地方,當(dāng)然文字生成輸入跟輸出也不是一對一的關(guān)系,但是很多文字生成的任務(wù)比如說翻譯,你一旦給定了輸入的句子你輸出的可能性其實是蠻有限的,但圖像不一樣,你給定一個句子它輸出的可能性有非常多不同的樣貌,也就是我們的輸入只是輸出的一小部分,機(jī)器需要大量的腦補(bǔ)才能夠產(chǎn)生正確的結(jié)果,那等下我們要跟大家講說這個需要進(jìn)行大量腦補(bǔ)這件事造成模型的設(shè)計上有什么特別的地方
OK,那我們知道文字生成多采用 Autoregressive 的方法,那之前跟大家講過在在文字生成的時候有兩種策略,Autoregressive 各個擊破或者是 Non-Autoregressive 一次到位的方法
那我們知道文字生成是這樣,給定一個句子,不管你是像 GPT 一樣通通都是 Decoder 還是一個 Sequence to Sequence 的 Model,給一個輸入,一個句子,然后接下來你要輸出一個機(jī)率的分布,然后根據(jù)這個機(jī)率的分布去做 sample 取出一個文字,根據(jù)取出來的文字再產(chǎn)生新的機(jī)率分布再取出新的文字,這樣就可以產(chǎn)生一個回答的結(jié)果
那對于圖像生成來說,其實直覺上你會覺得應(yīng)該也可以套用幾乎一模一樣的做法,一個圖像生成的模型應(yīng)該可以是一段文字接下來它輸出的這個 distribution 不是文字的 distribution 而是顏色的 distribution
比如綠色產(chǎn)生的機(jī)率是多少,黃色產(chǎn)生的機(jī)率是多少,通常用 Pixel 像素來表示,也就是說現(xiàn)在要畫一只奔跑的狗,那你第一個像素中放紅色像素的機(jī)率有多少,要放一個綠色像素的機(jī)率有多少
那我們知道說圖像中的一個 Pixel 它是由 RGB 三個顏色組成的,而 RGB 分別又是由一個 0 到 255 的數(shù)字所表示的,所以按理說應(yīng)該有 256x256x256 種不同的顏色,不過你實際在做圖像生成的時候其實你也用不上那么多的顏色,你可以選個比如說 256 色其實往往就蠻足夠的
那其實像這種用 Autoregressive 生成圖像的方法過去也是有的,OpenAI 其實也做過很類似的事情,它們也只選了 256 個顏色而已,那總之你決定第一個 pixel 要放每一個顏色的機(jī)率,然后根據(jù)這個機(jī)率做 sample 比如 sample 到綠色就填充一個綠色的 pixel,然后接下來根據(jù)已經(jīng)填充了綠色 pixel 這件事還有已經(jīng)輸入的文字再產(chǎn)生新的分布,然后可能就決定畫紅色的 pixel,依此類推
那如果要畫一張 256x256 分辨率的圖像,那同樣的過程就是要重復(fù) 256x256=65536 次,你就可以畫一張 256x256 的圖像就結(jié)束了
能不能這么做呢?能這么做,所以其實 OpenAI 有一個圖像版的 GPT,那圖像版的 GPT 它就是先把一張二維的圖片拉直變成一個 sequence,然后接下來就是直接當(dāng)作一個 language model 的問題,直接把它當(dāng)作文字
只是現(xiàn)在我們這個 Token 的數(shù)目因為只有 256 色所以 Token 的數(shù)目就是 256,然后用一個 Autoregressive 的 Model train 下去就結(jié)束了,這個方法其實也可以生成蠻高清的圖片,如下圖所示:
那我們之前有講過說對于圖像生成而言這種方法太耗費時間了,所以在圖像生成任務(wù)中今天你看到多數(shù)的模型采取的都是一步到位的方法,也就是說給一段文字,如果你要生成一張圖像,那在概念上你會做的事情就是我把每一個位置要放什么顏色的 distribution 都先產(chǎn)生出來,然后再根據(jù)這些 distribution 去做 sample,但是這么做會有什么問題呢?
因為我們剛才有講過說一張圖勝過千言萬語,所以當(dāng)你輸入正在奔跑的狗的時候它的正確答案不是只有一個,它有很多種不同的可能性,不同大小不同毛色不同背景等等,所以今天當(dāng)你輸入一段文字的時候正確答案不是一個,一般我們在做機(jī)器學(xué)習(xí)的時候我們通常比較習(xí)慣的是輸入一個東西有一個標(biāo)準(zhǔn)的正確答案
但是在圖像生成這個問題中并不是這樣的,圖像生成的問題是有一個輸入它的正確答案是一個分布,是一個 distribution,在這個分布內(nèi)的都可以說是正確答案,但是如果我們一個一個 pixel 分開去做 sample 會發(fā)生什么事情呢?如果一個一個 pixel 分開去做 sample,每一個 pixel 的產(chǎn)生都是各自獨立的,那就會變成有些 pixel 是想畫往左跑的狗,有些 pixel 想要畫往右跑的狗,有些 pixel 想要畫黑的狗,有些 pixel 想要畫白的狗,然后最后全部湊起來就可能是一個四不像
那在上圖中我們把四張圖片各切一塊拼在一起,那你就不知道在畫些什么東西,所以如果是一步到位的方法,你要 pixel 獨立各自去做 sample 其實是會得到非常差的結(jié)果的,所以怎么辦呢?
你會發(fā)現(xiàn)今天圖像生成的模型都有一個共同的套路,這個共同的套路是什么呢?它們都不是直接給一段文字就生成圖,它們都會有一個額外的輸入,這個額外的輸入是由一個高維的 Normal Distribution 做 sample 得到的一個高維的向量,然后把這個向量丟到圖像生成的模型里面跟這個文字合力去產(chǎn)生你最后的結(jié)果
所以你會發(fā)現(xiàn)說不管你今天是用什么圖像生成的模型,VAE、Flow-based Model、GAN 或者是熱門的 Diffusion Model 其實方法都是一樣的,你都不只是只有拿文字去生圖像,你都需要一個額外的輸入,你都需要從一個簡單的概率分布里面去 sample 出一個東西,sample 出來的這個東西有點像是噪聲。
因為你是從這個 Normal Distribution 里面 sample 出來,所以 sample 出來就是一個像是噪聲的東西,丟到圖像生成模型里面你才能夠產(chǎn)生最終的結(jié)果。那這背后所代表的含義是什么呢?我們現(xiàn)在如果把文字用 y y y 來描述,圖像用 x x x 來描述,那正確答案的分布我們可以寫成 P ( x ∣ y ) P(x|y) P(x∣y),它顯然會非常的復(fù)雜,如果我們可以知道說 P ( x ∣ y ) P(x|y) P(x∣y) 長什么樣子,我們從這個分布里面去做 sample 我們就可以把圖畫出來
但是問題是 P ( x ∣ y ) P(x|y) P(x∣y) 它非常的復(fù)雜,其實在過去早些時候比如說在 GAN 都還沒有的 2014 年以前人們還不知道用什么 deep learning 生圖的時候,多數(shù)就假設(shè)說 P ( x ∣ y ) P(x|y) P(x∣y) 可能是一個 Mixture Gaussian 由多個 Gaussian 所組成的,然后我們看這個模型能不能夠 learn 出來,那其實它生成的圖都非常模糊跟今天就是完全不在同一個量級上面,所以這個 P ( x ∣ y ) P(x|y) P(x∣y) 它顯然非常的復(fù)雜,復(fù)雜到它不是一個你用人腦可以想出來的模型,它不是一個簡單的 Gaussian Distribution,所以怎么辦呢?
這邊的策略是我們把 Normal Distribution 里面 sample 出來的 vector 都對應(yīng)到 P ( x ∣ y ) P(x|y) P(x∣y) 里面的每一個 x x x,我們知道說如果要畫一只奔跑的夠,有很多不同可能的樣子,那我們把 Normal Distribution 里面 sample 出來的 vector 一個一個對應(yīng)到可能畫的狗,這個圖像生成的模型等于就是在產(chǎn)生這種對應(yīng)關(guān)系,圖像生成的模型它做的工作就是想辦法把 Normal Distribution 里面 sample 出來的東西對應(yīng)到正確的狗在奔跑的圖片
OK,那所以接下來難的點就是怎么把這個 distribution 變成 P ( x ∣ y ) P(x|y) P(x∣y) 的樣子呢?那這個其實就是所以的圖像生成的模型都在解的問題,那所以這些圖像生成的模型和背后想攻克的問題其實是一樣的,只是解法是不一樣的
那我們下面快速的過一下常用的圖像生成的模型,以下的說明都非常簡略,很多東西就一筆帶過,那如果大家想知道這些圖像生成模型背后真正的原因可以查閱下相關(guān)資料
1.1 VAE
第一個要講的是 VAE(Variational Auto-encoder),如下圖所示:
那 VAE 它做的事情是什么呢?我們今天想要從 Normal Distribution 對應(yīng)到圖像怎么做呢?我們期待有一個 Decoder,這個 Decoder 就吃 Normal Distribution sample 出來的 vector 作為輸入,它的輸入就應(yīng)該是一張正確的圖片,那上面是把文字的輸入省略了。那怎么訓(xùn)練這樣的 Decoder 呢?怎么訓(xùn)練一個向量對應(yīng)到一張圖片這樣子的 Decoder 呢?你要知道今天訓(xùn)練一個 Network 你要有成對的數(shù)據(jù)才能訓(xùn)練 Network
如果有人告訴你說每一張圖片都應(yīng)該對應(yīng)到哪一個向量那你就可以訓(xùn)練這個 Decoder,我們并不知道 Normal Distribution sample 出來的 vector 跟這些正在奔跑的狗的圖片到底有什么樣的關(guān)系,那怎么辦呢?
那另外我們有一個東西叫 Encoder,Encoder 做的事情跟 Decoder 正好相反,把一張圖片變成一個向量,那只有 Encoder 或者只有 Decoder 都沒有辦法訓(xùn)練,所以怎么辦呢?把 Encoder 跟 Decoder 串起來,一個 Encoder 輸入一張圖片產(chǎn)生一個向量,這個向量丟給 Decoder 要還原回一樣的圖片,那 Encoder 跟 Decoder 是一起訓(xùn)練的,要讓輸入跟輸出越接近越好。
但是光有這樣的訓(xùn)練是不夠的,因為如果光有這樣的訓(xùn)練,那生成的向量的分布不一定會是一個 Normal Distribution,所以你要加一個額外的限制來強(qiáng)迫中間的向量是 Normal Distribution,這個就是 VAE 的概念
如果大家想要了解更多關(guān)于 VAE 背后的原理可以看看李宏毅老師之前的視頻:ML Lecture 18: Unsupervised Learning - Deep Generative Model (Part II)
1.2 Flow-based Model
接下來講 Flow-based Model,如下圖所示:
Flow-based Model 是怎么做的呢?它跟剛才的 VAE 反過來,我們先來想 Encoder,我們能不能訓(xùn)練一個 Encoder 吃一張圖片輸出就是一個向量,而這個向量的分布希望它是一個 Normal Distribution,如果能夠做到這件事情,一個 Encoder 輸入一張圖片輸出的向量就是 Normal Distribution,然后接下來我們再強(qiáng)迫這個 Encoder 是一個 Invertible 的 function,你就可以直接把這個 Encoder 當(dāng)作 Decoder 來用
訓(xùn)練的時候它是吃圖片輸出向量,這個向量的分布是 Normal Distribution,實際上你要畫圖的時候要把這個 Encoder 反過來用,讓它可以輸入一個向量然后就輸出一張圖片
那你第一個會問的問題是怎么強(qiáng)迫 Encoder 一定是 Invertible 的呢?我們現(xiàn)在是在訓(xùn)練 Neural Network,隨便訓(xùn)練一個 Neural Network 你怎么知道它的 Inverse 長什么樣子呢?這個就是 Flow-based Model 神奇的地方,它有刻意限制 Network 的架構(gòu),所以 Flow-based Model 不是你隨便的 Network 架構(gòu)都可以當(dāng)作 Encoder 來用的,它有刻意限制了 Network 的架構(gòu)讓你 train 完以后你馬上知道這個 Encoder 的 Inverse 長什么樣子
那這個細(xì)節(jié)大家可以看下:Flow-based Generative Model
那另外一件事情是因為這個 Encoder 它必須是 Invertible,意味著什么,意味著輸出的那個 vector 的 dimension 要跟輸入圖片一樣,如果你輸入的圖片是 256x256 的,那你 Encoder 的輸出就要是一個 256x256 的向量,為什么輸入跟輸出的大小一定是一樣呢?如果不一樣你就沒有辦法保證 Invertible 的,如果輸出的向量比輸入的圖片 dimension 小,你就沒辦法保證它是 Invertible,所以輸出的向量必須要跟輸入的圖片它們的大小是一樣的,所以這個就是 Flow-based Model 的概念
1.3 Diffusion Model
接下來我們來講 Diffusion Model,如下圖所示:
下一節(jié)我們會更詳細(xì)的跟大家講 Diffusion Model 是怎么做的,這里我們就簡單講一下 Diffusion Model 的概念,那 Diffusion Model 是什么呢?我們就是把一張圖片一直加噪聲一直加噪聲,加到原來的圖看不出來是什么,那看起來就像是從 Normal Distribution sample 出來的一個噪聲一樣。那怎么生成圖片呢?生成圖片的方法就是你 learn 一個 Denoise 的 Model,那實際上怎么做我們下一節(jié)會講到,learn 一個 Denoise 的 Model 后把 Normal Distribution sample 出來的 vector 當(dāng)作輸入然后不斷去噪去噪,你要的圖就慢慢產(chǎn)生出來了,就是這么的神奇
那可能大家心里充滿了困惑和懷疑,那也是很正常的,那我們下一節(jié)會再詳細(xì)的講這個模型
1.4 GAN
OK,那最后一個要講的就是大家都耳熟能詳?shù)?GAN,如下圖所示:
那 GAN 它是只 learn Decoder 它就沒有 learn Encoder 了,那 GAN 怎么 learn Decoder 呢?那一開始你就給它一大堆從 Normal Distribution sample 出來的向量,那一開始呢這個 Decoder 沒有經(jīng)過訓(xùn)練所以它根本不知道怎么畫一張圖,所以就輸出一些亂七八糟的東西,通常一開始的輸出的東西都是一些噪聲,你根本不知道在畫些什么
那接下來你會訓(xùn)練一個 Discriminator,這個 Discriminator 的工作就是去分辨輸入的圖片也就是 Decoder 產(chǎn)生出來的是虛假的圖片還是真正的圖片,如果我們今天把真正的圖片的分布想成 P ( x ) P(x) P(x),當(dāng)然如果你有文字的輸入那分布就是 P ( x ∣ y ) P(x|y) P(x∣y),不過這邊先把文字的 condition 省略掉,那這個真實圖片的分布是 P ( x ) P(x) P(x)
Decoder 產(chǎn)生出來的圖片分布是 P ′ ( x ) P'(x) P′(x),這個 Discriminator 實際上在做的事情是什么呢?其實這個 Discriminator 訓(xùn)練的時候的 loss 其實就代表了 P ( x ) P(x) P(x) 和 P ′ ( x ) P'(x) P′(x) 它們的相似程度,那這個在直覺上其實也是蠻容易理解的,因為當(dāng) Discriminator 沒有辦法分辨來自這兩個 Distribution 的 image 的時候,代表這兩個 distribution 的 image 非常的接近。
Decoder 要做的事情就是想辦法調(diào)整它的參數(shù)讓 Discriminator 做得越差越好,那這個就是 GAN 的概念,當(dāng) Discriminator 做得差了就代表 P ′ ( x ) P'(x) P′(x) 也就是這個 Decoder 生成的圖片的分布跟真正的圖片的分布有很大的差距,那這個就是 GAN
如果你想要知道更多關(guān)于 GAN 的內(nèi)容你可以參考下:GAN Lecture 1 (2018): Introduction
1.5 對比速覽
上圖是一次速覽 VAE、Flow-based Model 跟 Diffusion Model 的差異,那它們的共通性就是它們都有一個 Encoder 的機(jī)制一個 Decoder 的機(jī)制,在 VAE 里面 Encoder、Decoder 都是 Neural Network,都是類神經(jīng)網(wǎng)絡(luò),都很復(fù)雜;那在 Flow-based Model 里面我們其實只 learn 了 Encoder,但是我們做了一些手腳來保證 Encoder 是 Invertible 的,所以我們的 Decoder 其實就是 Encoder 的 Inverse,所以在 Flow-based Model 里面只需要 learn Encoder
那 Diffusion Model 是反過來,其實它只有 learn Decoder 這個 Model,它沒有 Encoder 這個東西,它就是把圖片一直加噪聲一直加噪聲,當(dāng)然你也可以把加噪聲這個步驟想成是一個 Encoder,只是這是一個不需要 learn 的 Encoder,它沒有參數(shù)所以不需要 train 它。那產(chǎn)生這個噪聲以后再做 Denoise,做 N 次 Denoise 把這個噪聲還原成圖片,那這個做 N 次 Denoise 的過程其實就是 Decoder,你可以想成每做一次 Denoise 就是 Decoder 通過了一層,所以 VAE、Flow-based Model 以及 Diffusion Model 其實它們有非常多的共通性
今天最強(qiáng)的那些圖像生成的模型比如說 DALL-E、Stable Diffusion、Imagen 都是用 Diffusion Model 做的,但是這些模型之所以會這么強(qiáng)也不完全是 Diffusion Model 的功勞,那我們后面會概覽一下 Stable Diffusion,那你會知道說 Stable Diffusion 里面其實是加了很多其它的東西才會讓它這么厲害
那上圖中沒有 GAN,為什么沒有 GAN 呢?因為 GAN 它其實就是另外一個角度的思考,所以它跟 VAE、Flow-based Model 以及 Diffusion Model 事實上是沒有互斥的,你永遠(yuǎn)可以在你的 Decoder 后面再接一個 Discriminator 讓你的 Decoder 的 output 跟真實的圖片的分布越接近越好,于是就有了:
- VAE+GAN:Autoencoding beyond pixels using a learned similarity metric
- Flow+GAN:Flow-GAN: Combining Maximum Likelihood and Adversarial Learning in Generative Models
- Diffusion+GAN:Diffusion-GAN: Training GANs with Diffusion
OK,以上就是圖像生成模型速覽的全部內(nèi)容了
小結(jié)
文生圖任務(wù)與其它任務(wù)不一樣,它的正確答案是一個分布,因此圖像生成模型共同需要攻克的問題是怎么把 Normal Distribution 中 sample 出來的 vector 對應(yīng)到正確的圖片上
2. Diffusion Model
這節(jié)簡略介紹下 Diffusion Model 的基本概念,那其實 Diffusion Model 有很多不同的變形,我們拿最知名的 Denoising Diffusion Probabilistic Models 也就是大家常常提到的 DDPM 來講解
那今天其實比較成功的那些圖像生成模型比如 OpenAI 的 DALL-E、Google 的 Imagen 以及 Stable Diffusion 基本都是用差不多的方法來構(gòu)建屬于他們自己的 Diffusion Model
那 Diffusion Model 是怎么運(yùn)作的呢?我們來看下圖:
Diffusion Model 運(yùn)作的方式如上圖所示,我們來看它是怎么生成一張圖片的。在生成圖片的第一步你要去 sample 出一個都是噪聲的圖片,也就是我們要從 Gaussian Distribution 里面 sample 出一個 vector,這個 vector 的維度和你要生成的圖片大小一樣。假設(shè)你要生成一張 256x256 的圖片,那你從 Gaussian Distribution 中 sample 出來的 vector 的維度也要是 256x256
那接下來需要將你 sample 出來的噪聲圖片送入到 Denoise Model,那 Denoise Model 內(nèi)部長什么樣子我們待會再講,那從 Denoise Model 的名字就可以知道說它的功能是輸入一張都是噪聲的圖,那輸出就會把噪聲濾掉一點,那你就可能看到有一個貓的形狀
然后我們繼續(xù)做 Denoise,隨著你的 Denoise 越做越多最終你就能看到一張清晰的圖片,那這個 Denoise 的次數(shù)都是事先定好的,我們通常會給每一個 Denoise 的步驟一個編號(Step ID),那產(chǎn)生最終圖片的 Denoise 的編號就比較小。一開始從完全都是噪聲的輸入開始做 Deniose,編號從 1000 一直做到 1,那這個從噪聲到圖片的步驟我們叫做 Reverse Process
OK,下面我們來講 Denoise Model
那從上面的圖上看來你可能會想說 Denoise Model 是不是同一個呢?是不是同一個 Denoise Model 反復(fù)用很多次呢?但是因為這邊每一個 Denoise Model 輸入的圖片差異非常大,比如最開始的 Denoise Model 的輸入就是一個純噪聲,而在靠后的 Denoise Model 輸入的圖片噪聲非常小,它已經(jīng)非常接近完整的圖。所以如果所有的 Denoise Model 都是同一個,它可能不一定能夠真的做得很好,所以怎么辦呢?
我們來看上圖,那我們的 Denoise Model 它除了輸入圖片外還會額外多一個輸入,這個輸入代表現(xiàn)在 Noise 嚴(yán)重的程度,1000 代表剛開始 Denoise 的時候,這個時候 Noise 的嚴(yán)重程度很大,然后 1 代表說現(xiàn)在 Denoise 的步驟快結(jié)束了,這個是最后一步 Denoise 的步驟,那顯然噪聲很小。那這個 Denoise Model 我們希望它可以根據(jù)我們現(xiàn)在輸入在第幾個 Step 做出不同的回應(yīng),這個就是 Denoise Moduel。
所以我們確實只有用一個 Denoise Model,但是這個 Denoise Model 會有一個額外的數(shù)字輸入,告訴它現(xiàn)在是在 Denoise 的哪一個 Step
OK,那 Denoise Model 實際內(nèi)部做的事情是什么呢?我們來看下圖:
在 Denoise 的模組里面它實際上有一個 Noise Predicter,這個 Noise Predicter 做的事情就是去預(yù)測圖片里面的噪聲長什么樣子,這個 Noise Predicter 的輸入是一張要被 Denoise 的圖片和描述圖片 Noise 嚴(yán)重程度的 Step ID,輸出呢就是一張噪聲的圖,它就是預(yù)測說圖片里面噪聲應(yīng)該長什么樣子,再把它輸出的噪聲去減掉要被 Denoise 的圖片就產(chǎn)生了 Denoise 后的結(jié)果。
所以這邊 Denoise Model 并不是輸入一張有 Noise 的圖片輸出就直接是 Denoise 后的圖片,它其實是產(chǎn)生了一個輸入圖片的噪聲,再把噪聲減掉輸入的圖片來達(dá)到 Denoise 的效果。那你可能會想為什么要這么麻煩呢?為什么不直接 learn 一個 End-to-End 的 model,輸入是要被 Denoise 的圖片輸出就直接是 Denoise 的結(jié)果呢?你可以這么做,也有一些 paper 是這么做的,不過現(xiàn)在多數(shù)的 paper 還是選擇 learn 一個 Noise Predicter。
因為我們可以想想看產(chǎn)生一張圖片和產(chǎn)生 Noise 它的難度是不一樣的,如果今天你的 Denoise Model 可以產(chǎn)生一只帶噪聲的貓,那它幾乎就可以說它已經(jīng)會畫一只貓了,那所以要產(chǎn)生一個帶噪聲的貓跟產(chǎn)生一張圖片里面的噪聲,這個難度是不一樣的。所以直接 learn 一個 Noise Predicter 可能是比較簡單的,learn 一個 End-to-End 的 Model 要直接產(chǎn)生 Denoise 的結(jié)果是比較困難的。
OK,那接下來的問題就是怎么訓(xùn)練這個 Noise Predicter 呢?
我們已經(jīng)知道我們 Denoise Model 輸入是一張 Noise 的圖片和現(xiàn)在在 Denoise 的 Step ID 然后產(chǎn)生 Denoise 的結(jié)果。我們上面有說其實 Denoise Model 里面是一個 Noise Predicter,它的輸入就是一張 Noise 的圖片和 Step ID 然后產(chǎn)生一個預(yù)測出來的噪聲,但是你要產(chǎn)生出一個預(yù)測出來的噪聲你得有 Ground Truth 啊
我們在訓(xùn)練 Network 的時候就是要有 pair data 才能夠訓(xùn)練呀,你需要告訴 Noise Predicter 這張圖片里面的噪聲長什么樣子它才能夠?qū)W習(xí)怎么把噪聲輸出出來啊,那這件事情怎么做呢?怎么制造出這樣的數(shù)據(jù)呢?
那這個 Noise Predicter 它的訓(xùn)練數(shù)據(jù)是我們?nèi)巳?chuàng)造出來的,怎么創(chuàng)造呢?如下圖所示:
它的創(chuàng)造方法是這樣的,你從你的 Dataset 里面拿一張圖片出來你自己加噪聲進(jìn)去,你就 Random sample 從 Gaussian Distribution 里面 sample 一組噪聲出來加上去產(chǎn)生有點 Noise 的 image,那你可能再 sample 一次再得到更 Noise 的 image,依此類推最后整張圖就看不出原來是什么東西。這個加噪聲的過程叫做 Forward Process 又叫做 Diffusion Process
那做完這個 Diffusion Process 以后你就有 Noise Predicter 的訓(xùn)練數(shù)據(jù)了,這是因為對 Noise Predicter 來說它的訓(xùn)練數(shù)據(jù)就是一張加完噪聲的圖片跟現(xiàn)在是第幾次加噪聲,這個是 Network 的 input,而加入的這個噪聲就是 Network 應(yīng)該要 predict 的輸出,就是 Network 輸出的 ground truth。所以我們才說你在做完 DIffusion Process 以后你手上就有訓(xùn)練數(shù)據(jù)了,接下來就跟訓(xùn)練一般的 Network 一樣 train 下去就結(jié)束了。
但是我們要的不只是生圖而已,剛才講的好像只是從一個噪聲里面生成圖還沒有把文字考慮進(jìn)來,那要怎么把文字考慮進(jìn)來呢?我們待會講,在講怎么把文字考慮進(jìn)來之前需要先讓大家知道的事情是如果你今天要訓(xùn)練一個圖像生成模型,它輸入文字產(chǎn)生圖片(如上圖所示),你其實還是需要成對的數(shù)據(jù),你還是需要圖片跟文字成對的數(shù)據(jù),需要多少成對的數(shù)據(jù)呢?那你今天在網(wǎng)絡(luò)上看到非常厲害的圖像生成模型像 Midjourney、Stable Diffusion 或者是 DALL-E 它們的數(shù)據(jù)往往來自于 Laion,網(wǎng)址是:https://laion.ai/projects/
Laion 有多少 image 呢,5.85 Billon 的圖片也就是 58.5 億張的圖片,所以也難怪今天的這些模型可以產(chǎn)生這么好的效果
Laion 其實有一個搜索的 Demo 平臺,鏈接是 https://rom1504.github.io/clip-retrieval/,大家可以去里面看看有什么樣的圖片,比如說上圖中的貓的圖片,它不只是只有貓的圖片跟英文文字的對應(yīng)它還有跟中文的對應(yīng)還有跟日文的對應(yīng),所以這也就解釋了為什么你今天看到的那些圖像生成模型不是只看得懂英文,中文它也能看懂,這是因為它的訓(xùn)練數(shù)據(jù)里面也有中文跟其它的語言,所以這個是你需要準(zhǔn)備的訓(xùn)練數(shù)據(jù)。
OK,那有了這個文字和圖像成對的數(shù)據(jù)以后我們先來看下 Denoise 的時候是怎么做的
Denoise 的時候做法非常簡單,把文字加到 Denoise Model 中就結(jié)束了,所以現(xiàn)在 Denoise Model 不是只看輸入的圖片做 Denoise,它是根據(jù)輸入的圖片加上一段文字的敘述去把 Noise 拿掉,所以在每一個 Step 你的 Denoise Model 都會有一個額外的輸入,這個額外的輸入就是你要根據(jù)這段文字的敘述生成什么樣的圖片
OK,那這個 Denoise Model 里面的 Noise Predicter 要怎么改呢?我們來看下圖:
那在 Noise Predicter 中你就是直接把一段文字給 Noise Predicter 就結(jié)束了,你就要讓 Noise Predictor 多一個額外的輸入也就是一段文字描述就結(jié)束了
OK,那訓(xùn)練的部分要怎么改呢?
你現(xiàn)在每一張圖片都有一段文字,所以你先把這張圖片做完 Diffusion Process 得到 pair data 的訓(xùn)練數(shù)據(jù)以后,你在訓(xùn)練的時候不只要給你的 Noise Predicter 加入噪聲后的圖片和 Step ID 還要多給一個文字的輸入,然后 Noise Predicter 會根據(jù)這三樣?xùn)|西產(chǎn)生適合的 Noise,產(chǎn)生要消掉的 Noise,也就是我們所說的 ground truth
下圖是 DDPM 完整的 Algorithm,這兩個 Algorithm 里面其實還是暗藏一些玄機(jī),這個以后再講
小結(jié)
這節(jié)簡單了解了 Diffusion Model 的工作流程,它主要是先 random sample 一張噪聲的圖片然后不斷通過 Denoise Model 去噪最終變成一張完整的圖片。而 Denoise Model 并不都是同一個,它內(nèi)部實際上有一個 Noise Predicter 噪聲預(yù)測器,這個 Noise Predicter 有兩個輸入,一個是帶有噪聲的圖片,一個是描述圖片噪聲嚴(yán)重程度的 Step ID,通過這兩個輸入 Noise Predicter 得到一個噪聲的輸出,然后與輸入的噪聲圖片相減得到 Denosie 后的圖片,這就是 Diffusion Model 圖像生成的流程。
現(xiàn)在的文生圖模型如 Midjourney、Stable Diffusion 或者是 DALL-E 它們應(yīng)該都是利用 Diffusion Model 的方式來生圖的,不過相比于 Diffusion Model 而言文生圖多了一個文字的輸入,這個需要在 Denoise 的時候加上這段文字描述
以上就是關(guān)于 Diffusion Model 的簡單介紹
3. Stable Diffusion
OK,這節(jié)我們來講大名鼎鼎的 Stable Diffusion,那其實今天比較好的圖像生成的模型就算它不是 Stable Diffusion,它的套路其實也跟 Stable Diffusion 差不多,所以我們今天就是要來介紹這個 SOTA 的圖像生成模型它背后的套路長什么樣子
今天最好的圖像生成模型基本上它內(nèi)部就是有三個元件(如上圖所示),第一個元件是一個 Text Encoder 是一個好的文字的 Encoder,它會把一段文字的敘述把它變成一個一個的向量
然后接下來你會有一個 Generation Model,那今天大家都用 Diffusion Model,但用別的也是可以的,這個 Generation Model 輸入噪聲和文字 Encoder 的向量輸出一個中間產(chǎn)物,這個中間產(chǎn)物等一下再細(xì)講,它可以是一個人看得懂的只是比較小比較模糊的圖片,它也可以甚至是人根本看不懂的東西,那這個中間產(chǎn)物是一個圖片被壓縮以后的結(jié)果,這是第二個模組
從 Generation Model 的輸出產(chǎn)生一個中間產(chǎn)物代表圖片被壓縮以后的版本,接下來直接套一個 Decoder,這個 Decode 的作用是從壓縮后的版本還原回原始圖像
我們剛才講說整個圖像生成模型的框架有三個模組,一個文字的 Encoder,一個生成的模型今天用 Diffusion Model,還有一個 Decoder 直接從生成模型輸出的圖片的壓縮版本還原回原來的圖片。通常三個模組是分開訓(xùn)練然后再把它們組合起來的,今天你看到的比較好的文生圖的模型都是差不多的套路
Stable Diffusion
上面是 Stable Diffusion 論文里面的一張圖,我們可以看到它最右邊有一個 Encoder 可以處理輸入的東西,但它的輸入不是只有文字啦,它還有別的可能的輸入,但是反正輸入文字你需要一個 Encoder 來處理它,然后你需要有一個生成的模型,那這邊 Stable Diffusion 內(nèi)部當(dāng)然用的就是 Diffusion Model,也就是中間綠色的部分,那你還需要有一個 Decoder 把 Diffusion Model 生成的中間產(chǎn)物,一個圖片壓縮后的版本還原回原來的圖片,也就是最左邊紅色的部分,其實就是我們剛才講的三個 component
DALL-E
那 DALL-E 系列其實一開始也是用的相同的套路,你需要有一個文字的 Encoder 先對文字進(jìn)行理解,接下來你要有一個生成的模型,那其實在 DALL-E 里面它是有兩個生成的模型,你可以用 Auto Regressive Model,因為今天已經(jīng)先做了一些處理以后現(xiàn)在你要產(chǎn)生的并不是一張完整的圖片,如果你要生成完整的圖片的話 Auto Regressive Model 的運(yùn)算量太大了,但是如果生成的只是一個圖片的壓縮的版本也許用 Auto Regressive 的方法還可以,所以可以用 Auto Regressive 也可以用 Diffusion Model 生成圖片的壓縮版本,最后用個 Decoder 還原回原來的圖片,這是 DALL-E 系列的做法
Imagen
Google 也有一個圖像生成的模型叫 Imagen 如上圖所示,它也是輸入一段文字產(chǎn)生一張圖片,這個套路也是一樣的,先有一個好的文字的 Encoder 然后你要有一個圖像生成的模型從文字去生成圖片壓縮后的版本,那在 Imagen 里面它生出來的東西就是人看得懂的東西,它生成出來的東西就是一張比較小的圖片,最終目標(biāo)是要生 1024x1024 的大圖,但是 Diffusion Model 只幫我們生成這個 64x64 的小圖,然后接下來再有一個 Decoder,不過它的 Decoder 也是一個 Diffusion Model,它的 Decoder 把小圖再生成大圖,這個就是 Imagen
3.1 Text Encoder
現(xiàn)在我們就來介紹整個圖像生成模型 Framework 里面的三個 component,第一個要介紹的是文字的 Encoder,文字的 Encoder 其實也不用再多做介紹,就是我們之前講的那些東西,比如說你可以拿 GPT 當(dāng)作你的 Encoder,更早時代你也可以拿 BERT 當(dāng)作你的 Encoder
那上面展示的這個實驗結(jié)果是要告訴你說這個 Encoder,這個文字的 Encoder 其實對結(jié)果的影響是非常大的,那這個結(jié)果來自于 Google 的 Imagen 這篇 paper,那在 Google 他們用的 Encoder 是一個叫做 T5 的 Encoder,總之就是一個文字的 Encoder 就對了。
他們嘗試了不同的版本由小到大,那在上圖中他們用兩個不同的指標(biāo)來衡量生成圖片的好壞,一個是 FID,F(xiàn)ID 的值越小代表你生成的圖片越好,另一個是 CLIP Score,那這個 CLIP Score 它是值越大越好,總之越往右下角越好
那從上圖中我們可以很明顯的看到說,隨著用的這個 Encoder 越來越大圖像生成的品質(zhì)是越來越高的,所以我們知道說文字的 Encoder 對結(jié)果其實是非常重要的,那這個其實也是可以理解的,因為對于這個圖像生成的模型而言,如果你今天沒有用額外的文字的 Encoder,它讀過的文字就是 Laion 中那 50 億張圖片所帶有的 caption,那它讀的文字量還是很有限的,可能有很多奇奇怪怪的東西它是不知道那是什么的,那所以你有一個好的文字的 Encoder 可以幫助它去 process 那些它在圖像跟文字成對的數(shù)據(jù)里面沒有看過的比如說新的詞匯,所以這個文字的 Encoder 對結(jié)果的影響其實是很大的
那相對而言這個 Diffusion Model 的大小似乎就沒有那么重要,圖中的 UNet Size 其實指的是那個 Diffusion Model 里面的那個 Noise Predictor 的大小,那在 Imagen 這篇 paper 里面就嘗試用了不同大小的 Diffusion Model,發(fā)現(xiàn)增大 Diffusion Model 對結(jié)果的幫助是比較有限的。
所以看起來文字的 Encoder 其實對于今天這些圖像生成模型這么好的表現(xiàn)其實是非常重要的
今天我們在做這種圖像生成任務(wù)的時候一個難題就是你怎么評估這個圖像生成的模型到底做得好還是做得不好呢?你怎么來衡量生成的一張圖片的好壞呢?你需要有一些特別的方法,那其中一個今天很常用的叫做 FID(Fréchet Inception Distance)
FID 是什么呢?FID 就是你得先有一個 Pre-trained 好的 CNN Model,你得先有一個 Pre-trained 好的圖像分類的模型,你把手上的圖片不管是機(jī)器生成的還是真實的圖片通通丟到這個 CNN 里面得到 CNN 的 Latent Representation
你把真實圖像的 Representation 和機(jī)器生成圖像的 Representation 畫出來,在上圖中藍(lán)色的點代表的是生成的圖片通過這個圖像分類的 Model 以后所產(chǎn)生的 Representation,紅色的點則代表的是真實圖片所產(chǎn)生的 Representation,如果這兩組 Representation 越接近就代表說生成的圖像跟真實的圖像越接近,如果這兩組 Representation 分得很遠(yuǎn)就代表說真實的圖像跟生成的圖像它們非常的不像
那怎么計算兩組 Representation 之間的距離呢?FID 這邊用的是一個其實很粗糙但是有用的方法。它的假設(shè)非常簡單,假設(shè)這兩組 Representation 都是 Gaussian Distribution,然后算這兩個 Gaussian Distribution 的 Distance,那這個算的是一個叫做 Fréchet 的 Distance,然后就結(jié)束了
那這個方法看起來有點粗糙,但是它的結(jié)果看起來是好的,跟人類的評估是蠻一致的,所以 FID 現(xiàn)在仍然是一個非常常用的做法,就算是今天這個 Imagen 這么新的模型還是用 FID 作為評估的基準(zhǔn)之一。那因為它算的兩組 Distribution 之間的距離所以這個分?jǐn)?shù)是越小越好,距離越小代表你的模型生成的結(jié)果越好。但 FID 有一個問題需要注意,那就是你需要 sample 處很多的 image,你不能只 sample 出幾張 image 就量 FID,你需要 sample 大量的 image 才能量 FID
那另一個指標(biāo) CLIP Score 又是什么呢?我們先講 CLIP,CLIP 是 Contrastive Language-Image Pre-Training 的縮寫,它是用 400 個 Million 的 image 和 text pair 的 data 所訓(xùn)練出來的一個模型,
這個模型做的事情就是它里面有一個 image 的 Encoder,有一個 text 的 Encoder,那 Text 的 Encoder 讀一段文字作為輸入產(chǎn)生一個向量,Image 的 Encoder 讀一張圖片作為輸入產(chǎn)生一個向量,那如果這張圖片和這段文字它們是 pair 的,它們是成對的,也就是說這段文字是在描述這個圖片,那這兩個向量就要越近越好,如果它們不是成對的那這兩個向量就要越遠(yuǎn)越好
那 CLIP Score 簡單來說把你機(jī)器產(chǎn)生出來的圖片丟進(jìn)去然后把你當(dāng)時讓機(jī)器產(chǎn)生圖片的那段文字的敘述也丟進(jìn)去,然后看看 CLIP 計算出來的向量的距離,看它們像不像,如果很像就代表 CLIP Score 高也就代表說你的模型生成的那個圖跟那段文字是有對應(yīng)的關(guān)系的,這個就是 CLIP Score
3.2 Decoder
OK,那剛才講的是 Text Encoder 接下來我們先講 Decoder,那這個 Decoder 做的事情是什么呢?這個 Decoder 它一般在訓(xùn)練的時候就不需要圖像和文本成對的數(shù)據(jù),你要訓(xùn)練中間的這個 Generation Model 比如說 Diffusion Model 讓它可以輸入文字的 Embedding 再產(chǎn)生中間產(chǎn)物這需要 pair data,需要圖像跟文字的對應(yīng)關(guān)系
那圖像跟文字對應(yīng)的數(shù)據(jù)雖然今天你說可以收集到 50 億這么多的圖像跟文字成對的數(shù)據(jù),但是沒有跟文字成對的圖像是更多的,而這個額外的 Decoder 它的好處就是它的訓(xùn)練是不需要文字?jǐn)?shù)據(jù)的
你可以單憑著大量的圖像的數(shù)據(jù)就自動把這個 Decoder 訓(xùn)練出來,那這個 Decoder 是怎么訓(xùn)練的呢?
如果你的中間產(chǎn)物是一張比較小的圖,也就是你今天的 Decoder 的輸入是小圖,那 Decoder 的訓(xùn)練非常簡單,你就把你手上可以找得到的圖像都拿出來然后把它們做 Downsampling 變成小圖你就有成對的資料,你就可以訓(xùn)練 Decoder 把小圖變成大圖就結(jié)束了
那如果我們的中間產(chǎn)物不是小圖而是某種 Latent Representation 呢?那我們怎么訓(xùn)練一個 Decoder 它可以把 Latent Representation 當(dāng)作輸入,把這些 Latent Representation 還原成一張圖片呢?那你就要訓(xùn)練一個 Auto-encoder,這個 Auto-encoder 做的事情就是有一個 Encoder 輸入一張圖片變成一個 Latent Representation 然后把 Latent Representation 通過 Decoder 還原原來的圖片,然后你要讓輸入跟輸出越接近越好,那像這樣的討論我們前面已經(jīng)講過了??傊憔陀?xùn)練這個 Encoder 跟 Decoder,訓(xùn)練完就把這個 Decoder 拿出來用,這個 Decoder 就可以輸入一個 Latent Representation 還原一張圖片。這個是中間產(chǎn)物是 Latent Representation 的情況,那像 Imagen 用的就是前面把小圖當(dāng)中間產(chǎn)物,那像 Stable Diffusion 還有 DALL-E 就是用的上圖的方法,把 Latent Representation 當(dāng)作中間產(chǎn)物
OK,那通常這個中間產(chǎn)物長什么樣子呢?如果講得更具體一點通常的做法是上圖這個樣子,假設(shè)你輸入的圖片是 HxWx3,那通常你的這個 Latent Representation 可以寫成 hxwx3,所以你要把它當(dāng)作是一張小圖也可以,只是這張小圖是人類看不懂的小圖,這個 h 跟 w 是 H 跟 W 做 downsampling 的結(jié)果,然后這個 c 就代表的是 channel,就代表說在這小圖上每一個位置是用多少個數(shù)字來表示,如果 c 等于 10 就代表每一個位置是用 10 個數(shù)字來表示
3.3 Generation Model
OK,那最后就來進(jìn)入 Generation Model 的部分
那 Generation Model 的作用就是輸入文字的 Representation 產(chǎn)生一個中間產(chǎn)物圖片壓縮的結(jié)果,那怎么做呢?那我們已經(jīng)講過 Diffusion Model 的概念了,我們現(xiàn)在唯一不一樣的地方是剛才在做 Diffusion Process 的時候你的 Noise 是直接加在圖片上,但是現(xiàn)在我們要 Diffusion Model 產(chǎn)生出來的東西已經(jīng)不是圖片了,那怎么辦呢?
我們的這個 Noise 要加在中間產(chǎn)物上或加在 Latent Representation 上,所以假設(shè)我今天是拿 Latent Representation 當(dāng)作中間產(chǎn)物,這邊的做法就是你先拿個 Encoder 出來,Encoder 吃一張圖片然后產(chǎn)生 Latent Representation,接下來你的噪聲是加載 Latent Representation 上的,你會 sample 一個噪聲,這個噪聲的 Dimension 跟這個 Latent Representation 的 Dimension 是一樣的
你 sample 一些噪聲出來加到 Latent Representation 上然后就稍微變一點,再 sample 一些噪聲又再變一點,依此類推直到最后你加了夠多的噪聲,然后你的 Latent Representation 變成純粹從噪聲里面 sample 出來的樣子
然后接下來呢你就要 train 一個 Noise Predicter,這個跟一般的 Diffusion Model 是完全一模一樣的,加入噪聲以后的 Representation 當(dāng)作輸入,那你也需要現(xiàn)在是第幾個 step 當(dāng)作輸入,然后你也需要文字當(dāng)作輸入,那現(xiàn)在文字呢就是用 Latent Representation 也就是一排向量來表示
所以你就把這個加入 Noise 以后的 Latent Representation 跟文字的 Encoder 編碼這段文字的結(jié)果跟現(xiàn)在是第幾個 step 這三個東西一起丟到 Noise Predicter 里面希望它可以把 Noise 給 predict 出來
OK,然后今天在生圖的時候你的做法就是你有一個純粹從 Normal Distribution 里面 sample 出來的 Latent Representation,它的大小像是一個小圖的樣子,但是它是從 Normal Distribution 里面 sample 出來的,然后你把這個東西加上這段文字丟給一個 Denoise 的 Model,然后 Denoise 的 Model 就去掉一些 Noise,然后這個步驟就反復(fù)繼續(xù)下去,直到你通過一定次數(shù)的 Denoise 之后產(chǎn)生出來的結(jié)果夠好了丟給 Decoder 就可以生圖了
那所以你會發(fā)現(xiàn)你在用 Midjourney 的時候它有一個生圖的過程,從模糊慢慢到清楚,那如果是 Diffusion Model 的話你應(yīng)該看到的是一開始完全 Random 的噪聲,然后噪聲慢慢越來越少越來越少,最后你的清晰的圖才生成出來
但是其實你用 Midjourney 的時候它生圖不是這個樣子,你會發(fā)現(xiàn)說它的圖是從一張模糊的圖只看得出輪廓然后接下來越來越清楚越來越清楚,它其實是把這個 process 里面每一次產(chǎn)生出來的這些 Latent Representation 通過 Decoder 以后拿出來給你看,所以雖然這個東西是一個從 Gaussian Distribution sample 出來的東西但是你通過 Decoder 以后它看起來就是一張比較模糊的圖,看起來就不像是有噪聲加在上面,這就是為什么 Midjourney 它的中間產(chǎn)物其實也是人看得出來是什么東西的圖。它就把這些中間產(chǎn)生出來的 Latent Representation 丟給 Decoder 然后再產(chǎn)生出來的結(jié)果給你看
OK,那這個就是今天 Stable Diffusion 的文字生圖像的 Framework,就是三個步驟,文字的 Encoder,一個 image 的 Generation Model 生成個中間產(chǎn)物出來 Decoder 再做最后的處理,你會發(fā)現(xiàn)最好的圖像生成模型基本上都是這樣子的套路
OK,以上就是 Stable Diffusion Framework 的全部內(nèi)容了
小結(jié)
Stable Diffusion 包括 Text Encoder、Generation Model 以及 Decoder 三個組件,其中 Text Encoder 可以用 BERT 或者 GPT 來處理文本得到向量,Decoder 則是利用 Generation Model 產(chǎn)生的中間產(chǎn)物來生成對應(yīng)的圖像,而 Generation Model 則是輸入文字的 Representation 產(chǎn)生出一個中間產(chǎn)物圖片壓縮的結(jié)果,這個中間產(chǎn)物可以是一張小圖,也可以說是 Latent Representation
總結(jié)
這里我們簡單了解了圖像生成模型,首先快速學(xué)習(xí)了一些圖像生成模型像 VAE、Flow-based Model、Diffusion Model、GAN 等等,然后介紹了 Diffusion Model 的工作流程,先 random sample 一張噪聲的圖片然后不斷通過 Denoise Model 去噪最終變成一張完整的圖片,最后我們學(xué)習(xí)了 Stable Diffusion,它由 Text Encoder、Generation Model 以及 Decoder 三個部分組成,其中 Generation Model 的中間產(chǎn)物可以是小圖或者 Latent Representation文章來源:http://www.zghlxwxcb.cn/news/detail-856854.html
OK,以上就是圖像生成模型淺析的全部內(nèi)容了??文章來源地址http://www.zghlxwxcb.cn/news/detail-856854.html
參考
- 機(jī)器學(xué)習(xí)2023(生成式AI)
- https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php
- https://openai.com/research/image-gpt
- ML Lecture 18: Unsupervised Learning - Deep Generative Model (Part II)
- Flow-based Generative Model
- GAN Lecture 1 (2018): Introduction
- Autoencoding beyond pixels using a learned similarity metric
- Flow-GAN: Combining Maximum Likelihood and Adversarial Learning in Generative Models
- Diffusion-GAN: Training GANs with Diffusion
- Denoising Diffusion Probabilistic Models
- https://laion.ai/projects/
- https://rom1504.github.io/clip-retrieval/
- High-Resolution Image Synthesis with Latent Diffusion Models
- Hierarchical Text-Conditional Image Generation with CLIP Latents
- Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding
- https://imagen.research.google/
- GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium
- Learning Transferable Visual Models From Natural Language Supervision
到了這里,關(guān)于圖像生成模型淺析(Stable Diffusion、DALL-E、Imagen)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!