back to index
【生成式AI】Stable Diffusion、DALL-E、Imagen 背後共同的套路

link |
好,那我們來講一下今天鼎鼎大名的Stable Diffusion吧!
link |
那其實今天比較好的影像生成的模型,就算它不是Stable Diffusion
link |
它的套路其實也跟Stable Diffusion差不多
link |
今天最好的State-of-the-art的影像生成模型
link |
今天最好的影像生成模型呢,基本上它內部就是有三個元件
link |
第一個元件是一個text的encoder,是一個好的文字的encoder
link |
會把一段文字的敘述,把它變成一個一個的向量
link |
然後接下來呢,你會有一個generation的model
link |
那今天大家都用Diffusion model,但用別的也是可以的
link |
這個generation的model就是吃一個雜訊
link |
我這邊用這個粉紅色的向量,帶粉紅色的矩陣代表輸入的雜訊
link |
輸入雜訊跟文字的encoder產生一個中間產物
link |
它可以是一個人看得懂的,只是比較小的比較模糊的圖片
link |
那這個中間產物是一個圖片被壓縮以後的結果
link |
所以這是第二個模組,從文字encoder的輸出產生一個中間產物
link |
然後接下來呢,直接套一個decoder
link |
這個decoder的作用是從壓縮後的版本還原回原始的
link |
一個文字的encoder,一個生成的模型
link |
那今天用diffusion model,還有一個decoder
link |
那通常三個模組是分開訓練,然後再把它組合起來的
link |
那今天你看到的比較好的文字生影像的模型
link |
比如說這是Stable Diffusion論文裡面的一張圖
link |
你就看到它先有一個encoder可以處理輸入的東西
link |
但它輸入不是只有文字啦,它還有別的可能的輸入
link |
但是反正輸入文字,你需要一個encoder來處理它
link |
那這邊Stable Diffusion內部,當然用的就是diffusion的model
link |
那你需要有一個decoder,把diffusion model生出來的中間產物
link |
一個圖片壓縮後的版本,還原回原來的圖片
link |
所以就是我剛才講的三招,三個component
link |
那DALI系列其實從一開始,就也是用同樣的套路
link |
你需要有一個文字的encoder,先對文字進行理解
link |
那其實在DALI裡面,它設了兩個生成的模型
link |
你可以用auto-regressive的model
link |
如果你要生成完整的圖片的話,auto-regressive的model運算量太大了
link |
但是如果生成的只是一個圖片的壓縮的版本
link |
也許用auto-regressive的方法還可以
link |
所以可以用auto-regressive,也可以用diffusion model
link |
生成圖片壓縮的版本,用個decoder,還原回原來的圖片
link |
Google也有一個影像生成的模型叫Imagine
link |
就是吃文字,吃一段文字的敘述,產生一張圖片
link |
那在Imagine裡面,它生出來的東西就是人看得懂的東西
link |
它生成出來的東西就是一張比較小的圖片
link |
最終目標是要生1024x1024的大圖
link |
但是diffusion model只幫我們先生64x64的小圖
link |
不過它的decoder也是一個diffusion model
link |
現在我們就來介紹整個framework裡面的三個component吧
link |
第一個要介紹的是文字的encoder
link |
文字的encoder其實也不用再多做介紹
link |
比如說你可以拿GPT當作你的encoder
link |
更古早時代你也可以拿BERT當作你的encoder
link |
這個文字的encoder其實對結果的影響是非常大的
link |
這個結果是來自於Google的Imagine那篇paper
link |
在Google他們用的encoder是一個叫做T5的encoder
link |
總之就是一個文字的encoder就對了
link |
在這個圖上它用兩個不同的measure來衡量圖片的好壞
link |
一個是FID 等下下一頁投影片我會跟大家講FID是什麼
link |
總之FID的值越小代表你的圖片生出來越好
link |
還有另外一個東西叫做click score
link |
這個click score它是值越大越好
link |
在下一頁投影片也會告訴你click score是什麼東西
link |
你可以很明顯的看到說隨著用的encoder越來越大
link |
所以我們知道說文字的encoder對結果其實是非常重要的
link |
如果你今天沒有用額外的文字的encoder
link |
他讀過的文字就是那50億張圖片所帶有的caption
link |
所以你有一個好的文字的encoder
link |
可以幫助他去process去處理那些
link |
所以這個文字的encoder對結果的影響其實是很大
link |
那相對而言這個diffusion model的大小
link |
這邊unit size其實指的是那個diffusion model
link |
裡面的那個noise predictor的大小
link |
那在Imagine這篇paper裡面
link |
就嘗試了用了不同大小的diffusion model
link |
發現真大diffusion model對結果的幫助是比較有限
link |
其實對於今天這些模型可以有這麼好的表現
link |
你得先有一個pre-trained好的CNN model
link |
你得先有一個pre-trained好的影像分類的model
link |
得到CNN的Latent Representation
link |
拿出來的那個Representation
link |
不是說拿一個Representation嗎
link |
你拿出一個Representation以後呢
link |
你把真實的影像的Representation
link |
跟生成的影像的Representation畫出來
link |
所產生的Representation
link |
那如果這兩個Representation
link |
它這兩組Representation
link |
那怎麼算兩組Representation之間的距離呢
link |
假設這兩組Representation
link |
都是Gaussian Distribution
link |
它們是Gaussian Distribution
link |
然後算這兩個Gaussian Distribution的Distance
link |
那這邊算的是一個叫做Fragile Distance
link |
兩組Distribution之間的距離啊
link |
你需要Sample出很多的Image
link |
你不能只Sample幾張Image就量FID
link |
你要Sample大量的Image才能量FID
link |
10K就是Sample了10K張Image
link |
是Contrastive Language Image Retraining的縮寫
link |
是用400個Million的Image跟Text Pair的Data
link |
它裡面有一個Image的Encoder
link |
那Text的Encoder讀一張文字作為輸入
link |
Image的Encoder讀一張圖片作為輸入
link |
好那剛才講的是Text Encoder
link |
那這個Decoder做的事情是什麼呢
link |
比如說Diffusion的Model
link |
就自動把這一個Decoder訓練出來
link |
而是某種Latent Representation呢
link |
它可以把Latent Representation
link |
把這些Latent Representation
link |
那你就要訓練一個Autoencoder
link |
變成一個Latent Representation
link |
然後把Latent Representation
link |
就可以吃一個Latent Representation
link |
是Latent Representation的case
link |
那像Stable Diffusion
link |
把Latent Representation
link |
那通常你的這個Latent Representation
link |
就來進入Generation Model的部分
link |
那Generation Model的作用
link |
就是要吃文字的Representation
link |
Diffusion Model的概念了
link |
剛才在做Diffusion Model的時候
link |
在做Diffusion Process的時候
link |
Diffusion Model產生出來的東西
link |
或加在Latent Representation上
link |
Latent Representation
link |
然後產生Latent Representation
link |
是加在這個Latent Representation上的
link |
跟這個Latent Representation的Dimension
link |
加到Latent Representation上
link |
然後你的Latent Representation
link |
你就是Train一個Noise Predictor
link |
這跟一般的Diffusion Model
link |
加入雜訊以後的Representation
link |
是用這個Latent Representation
link |
加入Noise以後的Latent Representation
link |
Understanding這段文字以後的結果
link |
丟到Noise Predictor裡面
link |
希望它就可以把Noise Predictor出來
link |
你有一個純粹從Normal Distribution裡面
link |
Latent Representation
link |
Normal Distribution裡面Sample出來的
link |
丟給一個Denoise的Module
link |
然後Denoise的Module就去掉一些Noise
link |
再通過Denoise的Module再去掉一些Noise
link |
直到你通過一定次數的Denoise之後
link |
你在用那個MeJourney的時候啊
link |
它背後是Diffusion Model啦
link |
那如果是Diffusion Model的話
link |
但是其實你用那個MeJourney的時候
link |
這些Latent Representation
link |
從Gaussian Distribution Sample出來的東西
link |
有Gaussian Distribution加在上面
link |
Latent Representation
link |
StaleDR的文字生影像的Framework
link |
一個Image的Generation的Model