# 李宏毅_生成式導論 2024_第18講:有關影像的生成式AI (下) — 快速導讀經典影像生成方法 (VAE, Flow, Diffusion, GAN) 以及與生成的影片互動 ###### tags: `Hung-yi Lee` `NTU` `生成式導論 2024` [課程撥放清單](https://www.youtube.com/watch?v=AVIKFXLCPY8&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI) ## 第18講:有關影像的生成式AI (下) — 快速導讀經典影像生成方法 (VAE, Flow, Diffusion, GAN) 以及與生成的影片互動 [課程連結](https://www.youtube.com/watch?v=OYN_GvAqv-A&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI&index=19) ### 經典影像生成方法介紹 ![image](https://hackmd.io/_uploads/BykbvYq4A.png) 課程準備介紹一些經典的影像生成方法。 ### 文字生成影像的挑戰 ![image](https://hackmd.io/_uploads/BkbeOt9EC.png) 簡報為例,一隻奔跑的狗,我們利用Transformer得到的encoder是一樣的,但是也許給定的影像是不一樣的,有時候給的是二哈,有時候是紫犬,這對模型來說根本是無所適從。 ### 如何處理腦補問題 ![image](https://hackmd.io/_uploads/HJObFY5ER.png) 有些時候人類所給定的描述是不夠完整的,我們也許可以利用另一個模型來做資訊抽取,將描述中沒有的部份再補齊。一樣的範例,我們也許可以補齊地點或是狗的種類,然後再搭配原本的命令,也就是一隻在奔跑的狗,一起給圖片生成模型來做影像生成。 這個解方的問題就是,應該怎麼訓練這個資訊抽取的模型。 ### 如何處理腦補問題 ![image](https://hackmd.io/_uploads/B1_QcFqN0.png) 一種作法就是,輸入就是一張照片跟給定的文字描述,然後經過資訊抽取模型之後得到一個表示,然後再經過圖片生成模型將輸入照片還原。 這種作法很直觀,我們也不需要知道中間到底抽取到什麼,但不管抽取到什麼,這個資訊都會含有給定的文字描述跟原始的輸入照片。最終我們希望圖片生成模型可以成功的將輸入照片再還原。 這樣的框架又稱為Auto-Encoder,其中資訊抽取的部份即為Encoder,而圖片生成模型即為Decoder。Encoder與Decoder一起訓練,我們希望輸入跟輸出愈接近愈好。 ### 訓練與測試的差異 ![image](https://hackmd.io/_uploads/B1-lsF9VA.png) 剛剛已經說明,訓練過程中我們就是希望輸入跟輸出愈接近愈好。 但測試階段的時候,我們也許只會有文字描述,並沒有實際的照片輸入,這意謂著不會有資訊抽取,也就是沒有腦補資訊。這時候的作法就是利用採樣,從latent space中隨機取一個點。 ### VAE vs Flow-based ![image](https://hackmd.io/_uploads/B1mA6YqEA.png) 剛剛所說明的作法又稱為VAE。 另一種作法,Flow-based,的想法是,VAE的作法中,Encoder跟Decoder的作法是明顯相反的,一個是從照片抽取資訊,一個是從資訊還原圖片,既然如此為什麼要訓練兩個模型? 如果可以只訓練一個Decoder,然後強迫讓這個Decoder是invertible(可逆的),也就是Decoder一定有一個反函數,直接拿這個反函數來做為Encoder。 文獻上通常將抽取出來的資訊,也就是要腦補的資訊稱為noise。 ### 有資訊的雜訊(noise) ![image](https://hackmd.io/_uploads/S1eQ0t5ER.png) 雖然名稱是noise,但並非無效資訊。 舉例來說,我們如果將一堆臭臉的丟進去Encoder,然後將得到的向量平均起來,那就是一個臭臉向量。 ### 有資訊的雜訊(noise) ![image](https://hackmd.io/_uploads/S1-sAt54C.png) 抽出來的向量有什麼用途呢?以上圖為例,照片中的教授神秘的微笑,我們可以抽出這個資訊之後減去臭臉向量再加上笑臉向量,這樣就可以讓教授笑的更神秘。 ### Diffusion Model ![image](https://hackmd.io/_uploads/rkRNlccEC.png) [參考課程](https://www.youtube.com/watch?v=azBugJzmz-o&list=PLJV_el3uVTsNi7PgekEUFsyVIIAJXRsp-) Diffusion Model一個簡單的說明就是,它會從雜訊(noise)開始,然後每次迭代就會做一個denoise,然後讓照片慢慢清晰,通常這會做個五百到一千次左右,這也是這個作法的痛點。 很明顯的,denoise model做的就是學習怎麼去除雜訊。 ### Diffusion Model ![image](https://hackmd.io/_uploads/ry1VZ9qN0.png) denoise model學怎麼去除雜訊,可是我們的輸入照片都是沒雜訊的照片,沒關係,那就自己慢慢加入雜訊,加個一千次讓整張照片就這樣充滿雜訊。 現在denoise model就可以利用給定的文字還有雜訊,慢慢迭代還原它的原始狀況。 一個重點就是,這個denoise model裡面也是transformer。 ### Diffusion Transformer ![image](https://hackmd.io/_uploads/ry058CiER.png) [參考論文_Scalable Diffusion Models with Transformers](https://arxiv.org/abs/2212.09748) 目前的sora也是結合diffusion與transformer。 簡單的說明就是,讓transformer來做denoise的工作。不過這是太過簡單的說明,終究還是要怒看一發論文才行。 ### 文字生影片的模型 ![image](https://hackmd.io/_uploads/B1vAICoNA.png) 目前火熱的影片生成也是相同的邏輯。 ### 三種生成模型的比較 ![image](https://hackmd.io/_uploads/HkTbdRoVR.png) 目前已經說完三種生成模型,相對其它兩種方法,Diffusion同樣也有一個Decoder,這個Decoder做的事情就是Denoise。 至於把輸入照片變成雜訊的這部份,在Diffusion並沒有特別再擁有一個模型來處理,就是不斷的加入雜訊就是,這部份對應的就是其它兩個方法中的Encoder,不過在Diffusion中稱為Forward Process。 ### Generative Adversarial Network(GAN) ![image](https://hackmd.io/_uploads/Hk1IjAoNR.png) 在GAN的話,我們的作法是這樣的,讓discriminator看文字描述跟真實照片的配對,讓它知道這是好的。同時也讓discrminator看圖片生成的配對,讓它知道這是不好的。 同時讓它看過正、反面的範例。 ### Generative Adversarial Network(GAN) ![image](https://hackmd.io/_uploads/BydAi0oN0.png) 搞定discriminator就換圖片生成,也就是generator,generator以discriminator為目標,希望騙過discriminator,讓discriminator誤以為自己所生成的照片也是好棒棒的。 這跟VAN、Flow-based不一樣的地方在於,這兩種方法的困擾在於一段文字描述對應不同的照片,一樣是一隻在奔跑的狗,對應不同的狗,這讓模型不知道該生出什麼狗,所以必需加點東西給它腦補。 但GAN並沒有這個困擾,GAN的生成器的目標是騙過discriminator,讓discriminator認為自己所生成的照片是好棒棒的。 這方法跟課程中提到的RLFH有類似之處,不同的是Reward Model是評價有多好,而discriminator的話則是,只要是generator產生的都是不好的。 教授的個人經驗來看,使用GAN的情況下是不需要再另外給予雜訊。 ### GAN是個外掛 ![image](https://hackmd.io/_uploads/S1NEhAoV0.png) [參考論文_Diffusion-GAN: Training GANs with Diffusion](https://arxiv.org/abs/2206.02262) GAN跟其它三種方法最大的不同在於,GAN可以自己來,也可以是其它三種方法的外掛。 ### 工商時間 ![image](https://hackmd.io/_uploads/HJJHnCjV0.png) 這邊很多課程,有空就來喵喵看。 ### Genie: Generative Interactive Environmanets ![image](https://hackmd.io/_uploads/ry2Rb73N0.png) ![image](https://hackmd.io/_uploads/BkkJG72EC.png) [參考論文_Genie: Generative Interactive Environments](https://arxiv.org/abs/2402.15391) 參考論文中所探討的就是希望可以控制生成影片中的環境,所做的是2D橫向的動態生成。 大致作法就是,它所讀入的輸入除了一個frame之外,還有一個action,而這個action會影響模型的輸出。 ### Genie: Generative Interactive Environmanets ![image](https://hackmd.io/_uploads/rJ9pG73ER.png) ![image](https://hackmd.io/_uploads/ByEkmmhE0.png) 論文指出,這個模型中最困難的部份在於資料蒐集,雖然網路中有大量打電動的影片,但是也只是影片,並沒有玩家按了什麼按鍵的對應資訊。 為了克服這點,作者訓練一個模型來反推玩家可能是按了什麼按鈕,大致就是Auto-Encoder的作法。 ### Genie: Generative Interactive Environmanets ![image](https://hackmd.io/_uploads/B1slQ72VC.png) 有這個genie的模型之後,你只需要給它一張小小的照片,就可以開啟你的橫向卷軸遊戲之路了。 在下個人覺得的重點是,不需要遊戲引擎就能有一個橫向遊戲了。