back to index
【生成式AI】速覽圖像生成常見模型

link |
然後我們現在要進入開始講圖像的生成。
link |
那因為我們下一個作業,作業六呢,就是圖像的生成。
link |
那在開始之前呢,我們先講圖像生成有什麼特別的地方。
link |
大家都知道俗話說啊,一張圖勝過千言萬語。
link |
所以今天假設我們圖像生成的任務,是拿一段文字去生成一張圖,
link |
比如說你把一次奔跑的狗丟給Me Journey,然後牠就會生一張圖給你。
link |
但是一張圖是勝過千言萬語的,如果要把這一張圖描述成文字,
link |
牠的資訊量是遠比一隻在奔跑的狗還要多的。
link |
比如說這隻狗奔跑的位置是在街道上,或者是這一隻狗是一隻柯基。
link |
有很多資料是不在你做影像生成的時候輸入的文字裡面的。
link |
所以你輸入的文字只是千言萬語的部分。
link |
在做圖像生成的時候,有很多部分不在人類輸入的文字裡面,
link |
機器需要進行大量的腦補才能夠生成好的圖像。
link |
這是圖像生成跟生成文字比較不一樣的地方。
link |
當然生成文字輸入跟輸出也不是一對一的關係,
link |
但是很多文字生成的任務,比如說翻譯,
link |
你一旦給定了輸入的句子,你輸出的可能性其實是蠻有限的。
link |
但圖像不一樣,你給一個句子,它輸出的可能性有非常多不同的樣貌。
link |
其實我覺得語音合成也是一樣,你給一個句子,
link |
它要合出什麼樣的聲音,男的、女的、老的、少的,
link |
還是要用什麼樣的口氣說話,生氣的還是高興的,
link |
所以我覺得語音合成跟圖像生成比較像,
link |
機器需要進行大量的腦補才能夠產生正確的結果。
link |
等一下要跟大家講說這個需要進行大量腦補這件事,
link |
好,那我們知道文字生成多採用auto-regressive的方法,
link |
兩種策略,auto-regressive各個擊破,
link |
或者是non-auto-regressive一次到位的方法。
link |
那我們知道文字生成是這樣,給一個句子,
link |
不管你是像GVT一樣通通都是decoder,
link |
還是你是一個sequence to sequence的model,
link |
大家應該已經看過sequence to sequence的model了,
link |
反正概念是一樣的,給一個輸入一個句子,
link |
然後根據這個機率的分布去做sample,取出一個文字,
link |
根據取出來的文字再產生新的機率分布,
link |
再取出新的文字,這樣就可以產生一個句子,
link |
那對於影像生成來說,其實直覺上你會覺得,
link |
一個影像生成的模型應該可以吃一段文字,
link |
接下來它輸出的distribution不是文字的distribution,
link |
而是顏色的distribution,
link |
那你第一個像素要放一個紅色像素的機率有多少,
link |
那我們知道說這個影像,一個pixel,
link |
那RGB分別又是由一個0到255的數字所表示,
link |
所以照理說應該有256x256x256,
link |
那個蠟筆如果64色,你就已經畫得很高興了對不對,
link |
你其實沒有必要有256x256x256種顏色,
link |
那其實像這種用auto-regressive sensing影像的方法,
link |
OpenAI其實也做過很類似的事情,
link |
那總之你決定第一個pixel要放每一個顏色的機率,
link |
然後接下來根據已經畫了綠色的pixel這件事,
link |
還有已經輸入的文字,再產生新的分布,
link |
那如果要畫一張256x256這樣子的解析度的影像,
link |
你就可以畫一個解析度是256x256的圖像,
link |
所以其實OpenAI有一個影像版的GPT,
link |
拉直變成一排,變成一個sequence,
link |
就是直接當作一個language model的問題,
link |
用一個autoregressive的model,
link |
要放什麼顏色的distribution,
link |
然後再根據這些distribution,
link |
所以當你輸入一隻正在奔跑的狗的時候,
link |
這邊圖都說me journey生的啦,
link |
是由一個normal distribution,
link |
或者你要用別的distribution,
link |
你知道長什麼樣子的distribution,
link |
也有人會用這個uniform distribution,
link |
反正只要你知道這個distribution,
link |
你從一個你知道怎麼做sample的,
link |
那這邊我在畫這個distribution的時候,
link |
這邊是從一個one dimensional distribution,
link |
就是說這個normal distribution,
link |
你要想成是一個高微的normal distribution,
link |
然後從一個高微的normal distribution,
link |
不管你今天是用什麼樣影像生成的模型,
link |
VAE、GaN、Full Face Model,
link |
或者是最近最熱門的Diffusion Model,
link |
你都需要從某一個簡單的機率分佈裡面,
link |
sample出來的這個東西有點像是雜訊,
link |
因為通常你是從這個normal distribution sample出來,
link |
我們可以寫成P of X given Y,
link |
那這個P of X given Y,
link |
如果我們可以成功model P of X given Y,
link |
如果我們可以知道說P of X given Y長什麼樣子,
link |
我們從這個分佈裡面去做sample,
link |
但是問題是P of X given Y,
link |
比如說在甚至game都還沒有的2014年以前,
link |
給文字生圖不是今天人們才開始做的事情,
link |
在更過去還不知道用什麼deep learning生圖的時候,
link |
比如說P of X given Y,
link |
可能是一個mixture of Gaussian,
link |
然後我們把這個模型看能不能夠認出來,
link |
然後從這個mixture of Gaussian去sample,
link |
你sample出來,那個圖都非常的模糊,
link |
所以這個P of X given Y,
link |
複雜到它不是一個你用人腦可以想出來的模型,
link |
它不是一個Gaussian distribution。
link |
我們把normal distribution裡面sample出來的vector,
link |
都對應到P of X given Y裡面的每一個X。
link |
那我們把normal distribution裡面sample出來的vector,
link |
它做的工作就是想辦法把normal distribution裡面sample出來的東西,
link |
所以接下來難的點就是,怎麼把這個distribution,
link |
把它做一些扭曲,扭成P of X given Y的樣子呢?
link |
那我們就很快地速覽一下常用的影像生成的模型。
link |
那大家如果想知道這些影像模型真正背後的原理,
link |
那VAE Variational Autoencoder,
link |
我們今天想要從normal distribution對應到影像,
link |
這個decoder就吃normal distribution sample出來的vector作為輸入,
link |
好,那但是怎麼訓練這樣的decoder呢?
link |
怎麼訓練一個像量對應到一張圖片這樣子的decoder呢?
link |
你知道你今天要訓練一個network,
link |
你就是要有成對的資料才能訓練network嘛。
link |
如果有人告訴你說這邊每一張圖片都應該對應到哪一個像量,
link |
我們並不知道normal distribution sample出來的vector
link |
跟這些狗正在奔跑的圖片到底有什麼樣的關係,
link |
encoder做的事就是decoder的相反,
link |
那可是只有encoder跟只有decoder都沒有辦法訓練,
link |
把encoder跟decoder串起來,
link |
所以一張圖片輸入encoder變成一個像量,
link |
看起來是一個unconditional的,
link |
所以如果今天是要用文字生成影像的話,
link |
我們已經有用文字限縮了我們可以生成的範圍,
link |
好,我們就一個encoder輸一張圖片,
link |
那encoder跟decoder是一起訓練的,
link |
不一定會是一個normal distribution,
link |
強迫中間的像量是normal distribution,
link |
好,那如果想要知道VAE更多背後的原理,
link |
好,接下來呢,講flow-based model,
link |
以下每一個模型都只有一頁投影片而已。
link |
flow-based model是怎麼做的呢?
link |
我們能不能夠訓練一個encoder,
link |
希望它是一個normal distribution。
link |
輸出的像量就是normal distribution,
link |
然後接下來呢,我們再強迫這個encoder,
link |
是一個invertible function,
link |
這個像量的分布是normal distribution,
link |
怎麼強迫encoder一定是invertible的呢?
link |
我們現在是在訓練neural network,
link |
隨便訓練一個neural network,
link |
你怎麼知道它的inverse長什麼樣子呢?
link |
這個就是flow-based model神奇的地方,
link |
所以flow-based model不是你隨便兜network架構,
link |
它有刻意限制了network的架構,
link |
你馬上知道這個encoder的inverse長什麼樣。
link |
好,那這個細節呢,大家就再參考資料。
link |
因為這個encoder它必須是invertible,
link |
意味著什麼?意味著輸出的那個vector啊,
link |
你的dimension要跟輸入的圖片一樣。
link |
這個encoder的輸出看起來比輸入的圖片略小啦,
link |
這個encoder的輸出跟輸入的圖片是一樣大的,
link |
如果你輸入的圖片是256x256的圖片,
link |
那你encoder的輸出就要是一個256x256微的向量,
link |
或者是你要把它排成一個256x256的圖片,
link |
如果不一樣,你就沒有辦法保證它是invertible啦。
link |
如果輸出的向量比輸入的圖片dimension小,
link |
你就沒辦法保證它是invertible啦。
link |
所以這個就是flow-based model的精神。
link |
就是這個encoder就是輸入圖片,
link |
然後這個向量的分佈是normal distribution,
link |
它的分佈是normal distribution,
link |
這邊並不是輸出一個distribution喔。
link |
它可以逆向來用,所以train完以後,
link |
給它一個向量,從normal distribution sample出來的,
link |
欸,你們問我什麼問題,要不要提出來啊?
link |
就當作它離你遠一點,所以看起來小一點的。
link |
好,所以這個圖,如果它是256x256的圖片,
link |
它也要有256x256的數字那麼多。
link |
然後,那當然就是256x256的數字,
link |
你可以把它排成一個很長的向量,這樣也可以啦。
link |
啊,這邊是把它排成256x256的一個矩陣。
link |
不這樣的話,你就沒有辦法保證這個function是invertible啦。
link |
它是invertible,代表它的這個input跟output dimension是一樣大的。
link |
就如果大家對這個floor-based model真的這麼有興趣的話,
link |
好,然後接下來我們來就講diffusion model吧。
link |
為什麼這學期一定要講diffusion model呢?
link |
因為我們的作業6,我們從game改成diffusion model,
link |
所以我們一定要來講一下diffusion model。
link |
就算是改成diffusion model,還是有sample code這樣子。
link |
會更詳細的跟大家講diffusion model是怎麼做的。
link |
所以這一頁投影片,我們就只用一頁來講一下diffusion model的概念。
link |
好,diffusion model的概念是什麼呢?
link |
我們就是把一張圖片一直加雜訊、一直加雜訊,
link |
那這個圖看起來就像是從normal distribution sample出來的一個雜訊一樣。
link |
生圖片的方法就是你認一個denoise的model,
link |
那實際上怎麼做,等一下都還會再講到。
link |
你認一個denoise的model,
link |
丟一個看起來像是從normal distribution sample出來的vector當作輸入,
link |
那它就去掉噪音、去掉噪音,你要的圖慢慢就產生出來的,
link |
那如果你現在心裡充滿了困惑跟懷疑也是很正常的,
link |
就是大家都耳熟能詳的Generative Adversarial Network,也就是GAN。
link |
那GAN呢,它是只認decoder,它就沒有認encoder了。
link |
那一開始GAN呢,你就多給它一大堆的從normal distribution sample出來的向量。
link |
那一開始呢,這個decoder沒有經過訓練,
link |
所以它根本不知道怎麼畫一張圖就輸出一些亂七八糟的東西。
link |
通常一開始的輸出是比現在這個投影片上的還要差很多啦,
link |
通常一開始輸出的東西就是一些雜訊,你根本不知道在畫些什麼。
link |
那接下來你會訓練一個discriminator,
link |
這個discriminator的工作啊,用白話來講就是,
link |
去分辨輸入的圖片是decoder產生出來的假的圖片,還是真正的圖片。
link |
如果我們今天把真正的圖片的分布想成P of X,當然如果你是有文字輸入的話,
link |
這邊就要given Y啦,given一個文字的condition,
link |
不過這邊先把文字的condition省略掉,
link |
那這個真實圖片的分布是P of X,
link |
decoder產生出來的圖片分布是P' of X。
link |
這個discriminator實際上在做的事情是什麼呢?
link |
其實這個discriminator訓練的時候的loss啊,
link |
其實就代表了P of X跟P' of X它們的相似的程度。
link |
那這個在直覺上其實也是蠻容易理解的,
link |
因為當discriminator沒有辦法分辨來自這兩個distribution的image的時候,
link |
代表這兩個distribution的image非常的接近。
link |
如果你的discriminator它的performance是很差的,
link |
它的分類的錯誤率是很高的,或是它的loss是很高的,
link |
就代表說P of X跟P' of X非常的接近。
link |
decoder要做的事情就是想辦法調整它的參數,
link |
讓discriminator做得越差越好。
link |
當discriminator做得差了,就代表P' of X,
link |
這個decoder生出來的圖片的分布跟真正的圖片的分布有很大的差距。
link |
你說為什麼要叫decoder然後不叫generator?
link |
為了要跟前面講的VAE感覺比較一致,
link |
但是這真的只是名稱而已,我們也可以把它改成叫generator。
link |
希望這樣回答到你的問題,這只是名字的不同而已。
link |
如果你想要知道game的話,過去花了很多很多時間講game,
link |
這個講的話可以大概講個十個小時左右。
link |
大家可以慢慢看,有一個game的系列的錄影。
link |
好,那這張投影片呢,是一次速覽VAE flow-based model跟diffusion model的差異。
link |
那它們的共通性就是,它們都有一個encode的機制,一個decode的機制。
link |
在VAE裡面,encoder、decoder都是neural network,都是類神經網路,都很複雜。
link |
那在flow-based model裡面,我們其實只認了encoder,
link |
但是我們做了一些手腳,保證encoder是invertible的,
link |
所以我們的decoder其實就是encoder的inverse,
link |
所以在flow-based model裡面只需要認encoder。
link |
那diffusion model是反過來,其實它只有認decoder的module,
link |
它在encode的時候就沒有encoder這個東西,
link |
它就是把圖片一直加雜訊、一直加雜訊,這個就是encoder。
link |
當然你也可以把加雜訊這個步驟想成是一個encoder,
link |
只是這是一個不需要認的encoder,它沒有參數,所以不需要train它。
link |
那產生這個雜訊以後呢,再做denoise,做n次denoise,
link |
把這個雜訊還原成圖片,那這個做n次denoise的過程,
link |
其實就是decoder,你可以想成這每一次做denoise,
link |
所以VAE flow-based model跟diffusion model,
link |
就是說今天最強的那些模型,比如說DALI啊,
link |
都是用這個stable diffusion啊,都是用diffusion model做的,
link |
但是這些模型會這麼強,也不完全是diffusion model的功勞啊,
link |
其實等一下我們會講一下,概覽一下stable diffusion,
link |
那你會知道說stable diffusion裡面其實是加了很多其他的東西,
link |
好,那這一頁投影片裡面沒有game,為什麼沒有game呢?
link |
因為我覺得game跟VAE flow-based model跟diffusion model,
link |
所以它跟VAE flow-based model跟diffusion model,
link |
你永遠可以在你的decoder後面再接一個discriminator,
link |
讓你的decoder的output跟真實的圖片的分佈越接近越好。
link |
可以就有VAE game,這個是很古早的年代,
link |
15年的paper,從這個圖上就可以明顯看出這是個VAE,
link |
然後這是個game,然後這邊這個decoder呢,
link |
在VAE裡面叫做decoder,在game裡面叫generator,
link |
所以VAE可以加上game,flow-based model可以加上game,
link |
diffusion model最近很紅,它也可以加上game。
link |
所以game算是另外一個外掛,它可以加到現有的生成模型上面。