# 李宏毅_生成式導論 2024_第15講:為什麼語言模型用文字接龍,圖片生成不用像素接龍呢?— 淺談生成式人工智慧的生成策略 ###### tags: `Hung-yi Lee` `NTU` `生成式導論 2024` [課程撥放清單](https://www.youtube.com/watch?v=AVIKFXLCPY8&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI) ## 第15講:為什麼語言模型用文字接龍,圖片生成不用像素接龍呢?— 淺談生成式人工智慧的生成策略 [課程連結](https://www.youtube.com/watch?v=QbwQR9sjWbs&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI&index=16) ### 生成式人工智慧(Generative AI):機器產生複雜有結構的物件 ![image](https://hackmd.io/_uploads/HkqURLTQA.png) 目前為止課程中談到的都是文字,現在要來談談其它的。 課程中提過,生成式人工智慧就是用來生成複雜而有結構的物件,其中複雜指的就是盡乎無法窮舉,但這個複雜的背後卻是由有限的基本單位所構成。 ### 文字由Token構成 ![image](https://hackmd.io/_uploads/SkxaRLpQR.png) 文字是由token所構成的,一句話會被拆解成token為單位的輸入,而每個模型的token是不一樣的。 由token所組成的集合即為Vocabulary。 ### 影像由像素(Pixel)所構成 ![image](https://hackmd.io/_uploads/SywfkDTQC.png) 影像由像素所構成,一個像素能有多少顏色則是由BBP所決定。 ### 聲音由取樣成(Sample)所構成 ![image](https://hackmd.io/_uploads/BJM5WeEVR.png) 聲聲是由一大堆的取樣點所構成,每秒取多少點則稱為取樣率,16KHz即每秒取16000個點。每個點有多少數值取決於取樣解析度,愈高的話,當然取樣的值就愈多。 ### 生成式人工智慧的本質 ![image](https://hackmd.io/_uploads/Skgj9blVEC.png) ![image](https://hackmd.io/_uploads/BJNs-lNVR.png) 生成式人工智慧的本質就是,給定條件,然後把基本單位用正確的排序組合起來。 ### 生成的策略:Autoregressive Genration(AR) ![image](https://hackmd.io/_uploads/S16oZgEER.png) 對話式的人工智慧就是在做文字接龍,這作法的專有名詞稱為Autoregressive Genration(AR)。 簡單說就是把根據輸入產生一個token,再把自己生成的token加入輸入,再產生下一個token。 ### 生成的策略:Autoregressive Genration ![image](https://hackmd.io/_uploads/S1K3ZxNNR.png) 相同的作法當然也可以用在影像上,相關訊息在2016機器學習課程有提過。 ### 生成的策略:Autoregressive Genration ![image](https://hackmd.io/_uploads/ryGTbxVVR.png) [參考論文_WaveNet: A Generative Model for Raw Audio](https://arxiv.org/abs/1609.03499) 聲音也可以用接龍的方式來生成。2016年的時候,google即提出WavNet。 ### 生成的策略:Autoregressive Genration ![image](https://hackmd.io/_uploads/Hy2T-eVV0.png) 事實上,影像跟語音都不是用文字接龍的方式來處理的,這是這方法本質上的限制。也就是,它就只能按部就班的生成,一個token一個token的生成。 ### 生成的策略:Autoregressive Genration ![image](https://hackmd.io/_uploads/SkFR-lNER.png) 以一張1024x1024的照片來看就大約是100萬個token,也就是要做100萬次的文字接龍,這已經是一部紅樓夢的程度了。 相同的問題在語音也是一樣的,一個取樣率22K的聲音要取個1分鐘就差不多是132萬次接龍了。 ### Autoregressive Genration(AR) vs Non-autoregressive Genration(NAR) ![image](https://hackmd.io/_uploads/r1Q1MlEEC.png) 一個想法,如果不要按部就班的生成token,而是可以同時一次生成所有基本單位,那在計算效能允許的情況下就可以平行運算,有效加速生成的過程。 兩個方法也許總的運算量沒有差異,但就時間上,因為平行運算的關為,差異就很大了。 ### Non-Autoregressive Genration ![image](https://hackmd.io/_uploads/rk-LbgEER.png) [參考論文_A Survey on Non-Autoregressive Generation for Neural Machine Translation and Beyond](https://arxiv.org/abs/2204.09269) 基本上文字生成也可以用NAR的方式來生成,一個簡單的概念就是,先讓模型預估可能需要幾個token來回應問題,再讓模型一次性的生成所有的token。 影像的部份基本都是一開始就決定好大小,所以沒有預測大小的需求。 ### Non-Autoregressive Genration ![image](https://hackmd.io/_uploads/HkmBZg4VR.png) 另一種作法就是,也把文字生成的長度大小固定,一次性的生成之後再把結束符號之後的去除來做為回應。 ### Non-Autoregressive Genration的品質問題 ![image](https://hackmd.io/_uploads/HkDVbl4E0.png) NAG一樣有它的本質上的問題,最主要的還是品質上的問題。 課程中舉例說明,如果我們要模型生成一隻在奔跑的狗,同時生成的時候,也許就會一邊想的是向左,一邊想的是右向,結果兩個合在一起變成雙頭龍了。 這樣的問題稱為multi-modality problem,也就是生成過程中,嘴裡吃的是餃子,心理想的卻是嫂子。 ### Non-Autoregressive Genration ![image](https://hackmd.io/_uploads/rJxrzeVNR.png) 這邊說明用NAR做文字生成可能的問題。 範例中說明的是,李宏毅是後面如果採NAR,那位置一結果來看可能是『演』的機率比較高,位置二結果來看可能是『授』的機率比較高。 如果分開處理的話,那可能就會生成李宏毅演授XXX的結果。 ### Autoregressive Genration ![image](https://hackmd.io/_uploads/SJyXblNEA.png) 相同的問題在AG上就不會發生了,因為位置一生成『演』的時候,位置二的機率分佈就不會有授的出現,所以有很高的機率可以成功生成『演員』。 ### Non-Autoregressive Genration的品質問題 ![image](https://hackmd.io/_uploads/SkzGWlN4C.png) 不過,如剛剛所提,語音跟影像真的是不得不採用NAG的方式來處理。 影像來說,是不是我們可以在一開始就把所有的細節說明清楚,這樣就比較有機會不會產生怪怪的結果? ### Non-Autoregressive Genration的品質問題 ![image](https://hackmd.io/_uploads/SJeDzxNE0.png) 生成影像的各類模型有一個共通性,那就是生成影像之前都會先生成一個隨機向量,模型不會單純的考慮文字輸入,同時也會考慮這個隨機生成的向量。 這個向量的作用就是幫模型腦補內容就是。 ### Autoregressive + Non-autogressive ![image](https://hackmd.io/_uploads/Hy-zmeE4A.png) 天下武功最終都是會合起來用,摻在一起做牛丸就對了。 先用Autoregressive做一個精簡的生成來做為Non-autogressive的先驗條件,這樣子Non-autogressive就不會亂腦補,以此來產生細節。 通常這個精簡的版本不需要是人類看的懂的東西,只要是Non-autogressive看的懂的就好。 ### Autoregressive + Non-autogressive ![image](https://hackmd.io/_uploads/ByMaQxVE0.png) [參考論文_MaskGIT: Masked Generative Image Transformer](https://arxiv.org/abs/2202.04200) 通常的作法就是Auto-Encoder,參考論文中可以將一個16x16的照片資料壓縮為1x1來表示。 ### Autoregressive + Non-autogressive ![image](https://hackmd.io/_uploads/SyPDNlVNR.png) 對Autoregressive來說就是給定一段文字,然後讓它生成encoder,再讓Non-autogressive還原成照片。 ### Autoregressive + Non-autogressive ![image](https://hackmd.io/_uploads/HkPsBx4EA.png) ![image](https://hackmd.io/_uploads/HJbTHxN4C.png) [參考論文_暫時打不開](https://arxiv.org/abs/2402.13236) 語音也是類似的作法,用encoder、decoder來處理。 ### 多次Non-Autogressive Generation ![image](https://hackmd.io/_uploads/rJCKLx4VR.png) [參考論文_Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding](https://arxiv.org/abs/2205.11487) [參考論文_Progressive Growing of GANs for Improved Quality, Stability, and Variation](https://arxiv.org/abs/1710.10196) 相同的事情做多次一點,你就會是專家的概念。把生成階段拆成多個階段,多次執行Non-Autogressive Generation。 不同版本我們可以想像就是不同大小的照片,每個階段生成一個大小的照片,由小至大。 ### 多次Non-Autogressive Generation ![image](https://hackmd.io/_uploads/S1weveNVA.png) [參考論文_Denoising Diffusion Probabilistic Models](https://arxiv.org/abs/2006.11239) 不同版本之間也不一定一定就是要由小至大,像Diffusion Model就是從一個雜訊開始生成。 :::warning 大致的觀念就是,時間t所產生的照片是由時間t-1而來的。 ::: ### 多次Non-Autogressive Generation ![image](https://hackmd.io/_uploads/SJzFvgEVA.png) [參考論文_MaskGIT: Masked Generative Image Transformer](https://arxiv.org/abs/2202.04200) 大致的概念就是把生成不好的地方塗掉,讓模型再重新生成一次,當然這個塗掉的動作不是人作,是由機器來決定。 ### 多次Non-Autogressive Generation ![image](https://hackmd.io/_uploads/H1RIdeN4C.png) 我們雖然可以用encoder的方式讓Autogressive來減化生成,但是1024x1024即使根據論文可以降低16倍的計算量,仍然是一個很可觀的生成次數。 剛剛提過, 多次Non-Autogressive Generation可以視為是一個Autogressive Generation,所以我們就把生成encoder的步驟拆解由Non-Autogressive多次生成,那就可以有效降低計算量。 教授特別提到,Midjourney會將過程中的照片呈現給你看。 ### 小結 ![image](https://hackmd.io/_uploads/r1AdOlVVC.png) 小結,喵一下。