# 【生成式AI導論 2024】第15講:為什麼語言模型用文字接龍,圖片生成不用像素接龍呢?— 淺談生成式人工智慧的生成策略 * 到目前為止我們只有在講文字生成。但我們在第一節課定義過生成式人工智慧,就是能夠產生有結構且複雜無法窮舉的物件。 * 因此除了文字外,聲音、圖片也是這種結構物件。 * 而這些物件都是用有限的基本單位構成的 * 文字: 組成基本單位是token。包含所有token的目錄就叫做Vocabulary。![image](https://hackmd.io/_uploads/B16Il1HTke.png) * 影像: pixel。![image](https://hackmd.io/_uploads/Bye0xkHp1x.png) * 聲音: 取樣點。一秒的聲音由多少個點構成就是取樣率。例如16KHz就是每秒有16000點。每個點可以有多少數值可以選就是取樣解析度(Bit Resolution) ## Autoregressive Generation * 生成式AI的本質就是把基本的單位用正確的排序組合起來![image](https://hackmd.io/_uploads/SkfXfkSaJx.png) * 文字生成的策略:Autoregressive Generation ![image](https://hackmd.io/_uploads/ryPXmJHayl.png) * [影像](https://youtu.be/YNUek8ioAJk?t=537)也可以用像素接龍、[語音](https://arxiv.org/abs/1609.03499)也可用sample接龍的方式生成 * Autoregressive Generation的問題是生成時只能依照某個順序生成,在生成第二個token之前一定要生成第一個。 * 假設要生成1024\*1024的圖片就需要100萬次像素接龍才能做出來。等於產生1024\*1024的照片要產生出一部紅樓夢(90萬)的量。 * 假設要產生22K取樣綠的1分鐘,就要132萬次接龍。 * 這裡就可以看出來要花很多時間 * 所以有了Non-Autoregressive Generation,使用平行生成,一次性的平行生成![image](https://hackmd.io/_uploads/ryoavWHTkg.png)雖然NAR計算量和AR相同,但是因為可以平行運算,所以可以大幅加快。 * [文字](https://arxiv.org/pdf/2204.09269)也可以用NAG * 法1:![image](https://hackmd.io/_uploads/HJvKO-Ba1x.png) * 先決定要產生幾個token * 平行去產生每個位置的token內容 * 法2:![image](https://hackmd.io/_uploads/HJBCdbHpJe.png) * 一次性產生所有token * 丟掉[END]後的內容 * NAG的其中一個問題就是品質不穩定,AI自行腦部的內容在各個位置無法同步,產生multi-modality problem * ![image](https://hackmd.io/_uploads/ByhWKbrT1g.png) * ![image](https://hackmd.io/_uploads/HkWBY-BpJg.png) * AG因為會將上個output作為下個input,所以不會有這種問題出現 ## NAG無法同步解決方法 ### 讓所有位置都腦補一樣的內容![image](https://hackmd.io/_uploads/BJx3cZHaJl.png) * 在一開始先生成一個向量,作為腦補內容 * 使用輸入內容跟腦補向量去生成![image](https://hackmd.io/_uploads/r1_kj-BTJx.png) * VAE, GAN, Flow-based Model, Diffusion Model 都有這樣的設計 ### AG+NAG * 先用AG產生一個精簡的版本,再用NAG產生精細的版本![image](https://hackmd.io/_uploads/HkQJ6-rpkx.png)這個精簡的版本不一定要人看得懂,只要NAG模型看得懂就好 * 可以直接利用Auto-Encoder來製作Decoder。![image](https://hackmd.io/_uploads/B1XB6ZrpJx.png) * AG現在要學習的就是如何產生Encodeing的內容就好![image](https://hackmd.io/_uploads/S1M2T-BaJl.png)![image](https://hackmd.io/_uploads/HktATbBaJe.png) ### 多次使用AG生成 * 把生成拆解成多個階段![image](https://hackmd.io/_uploads/SkR4JGr61l.png) * 依序由小到大生成圖片就是一種[^1](https://arxiv.org/abs/2205.11487)[^2](https://arxiv.org/pdf/1710.10196)![image](https://hackmd.io/_uploads/BkVw1MSpye.png) * 有雜訊到沒雜訊也是,[Diffusion Model](https://arxiv.org/abs/2006.11239)就是這種![image](https://hackmd.io/_uploads/By3n1Mr6Jl.png) * 每次把生不好的地方塗掉![image](https://hackmd.io/_uploads/SJTCJzBTke.png) * Midjourney, Decoder Stable Diffusion, DALL-E都是這種方法