# 李宏毅_生成式導論 2024_第7講:大型語言模型修練史 — 第二階段: 名師指點,發揮潛力 (兼談對 ChatGPT 做逆向工程與 LLaMA 時代的開始) ###### tags: `Hung-yi Lee` `NTU` `生成式導論 2024` [課程撥放清單](https://www.youtube.com/watch?v=AVIKFXLCPY8&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI) ## 第7講:大型語言模型修練史 — 第二階段: 名師指點,發揮潛力 (兼談對 ChatGPT 做逆向工程與 LLaMA 時代的開始) [課程連結](https://www.youtube.com/watch?v=Q9cNkUPXUB8&list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI&index=8) ### 人類老師教導 ![image](https://hackmd.io/_uploads/SymlKLlGR.png) 有資料之後就要正確的教導模型正確的回覆。既然是文字接龍,就用文字接龍的方式教導。這種用人類老師教導的作法就稱為Instruction Fine-tuning。這裡面的Instruction指的就是由人類來提供正確的指令。也因為要由人類來提供正確的指令,所以就會需要耗費大量的人力來做資料標註,這種擁有標註資料的訓練即為督導式學習。 ### 人類老師教導 ![image](https://hackmd.io/_uploads/rJ10t8lzC.png) 這邊也可以發現到,給定資料中有特別強調那一句是USER說,那一句是AI回應的。原因在於,如果沒有特別提示的話,那對於模型來說,它可以有很多的回應,正確的回應,或者是自問自答,不管是那一種對於模型來說都是正確的回應。所以如果要讓它有更重確的回應的話,把這種上下文提供給模型是會比較好的。 上面簡報另外的範例,詢問GPT你是誰的情況下,GPT並不是接著你是誰的後面開始文字接龍,而是開始回應,這很有可能就是因為訓練過程之中有將這種標記符號提供給予模型。 ### 但如果只靠人類老師教的話…… ![image](https://hackmd.io/_uploads/rJJa58xzC.png) 無法單純的採用人類老師所提供的資料訓練的一個問題在於先前提過,機器學習很有可能會從中學習到錯誤的特徵,也許看到『最』字就回答玉山。就好比你的資料集都是辛普森家族,然後問模型皮卡丘是不是辛普森,大概會有87%是回答YES。 ### 關鍵是用第一階段的參數作為初始參數 ![image](https://hackmd.io/_uploads/B1bno8xGA.png) 所以,如果單純的用人類標記資料是不足的話,那關鍵就是第一階段我們用大量文本訓練而得的參數。我們就拿第一階段所得的參數來做為第二階段訓練的初始參數。 基本上第二階段得到的參數跟第一階段不會有太大的差異,所以這種作法又稱為Fine-tuning,同時第一階段又可稱為Pre-train,也就是預訓練。 ### 關鍵是用第一階段的參數作為初始參數 ![image](https://hackmd.io/_uploads/SJrr2UxM0.png) 如果說怕污染或是無法成功微調模型,那也可以採用一種技術,也就是Adapter,像是LoRA就是這技術的一種。 實務上就是原始的初始參數通通不動,在最後面再加入一些新的參數來做為調控即可,這麼做的一個優點就是可以有效降低運算量。 ### 各種Adapter ![image](https://hackmd.io/_uploads/rkFi2UezA.png) [參考文獻_Exploring Efficient-tuning Methods in Self-supervised Speech Models](https://arxiv.org/abs/2210.06175) Adapter有很多,不同的Adapter就會將參數插到不同的地方。 ### 關鍵是用第一階段的參數作為初始參數 ![image](https://hackmd.io/_uploads/rk-ZaLezR.png) 回到課程提到的範例,在成功使用第一階段預訓練的參數來做為第二階段的初始參數的情況下,因為只是微調,學習到的參數跟初始參數不會有太大的差異,就可以有效利用學習到的資料來做正確的回覆。 ### 關鍵是用第一階段的參數作為初始參數 ![image](https://hackmd.io/_uploads/HJUg0IezA.png) 也因為預訓練中可能學習到的規則是非常複雜的,或許模型也會有著舉一反三的能力,在知道台灣最高的山是玉山的情況下也能知道世界最高的山是聖母峰。 ### 『舉一反三』的能力可以有多誇張 ![image](https://hackmd.io/_uploads/HJdjRIxMC.png) 在GPT之前有個BERT,曾經有這麼一個BERT是在104種語言上做預訓練。只要教它一種語言的任務,它就能夠泛化到其它語言上。 舉例來說,教模型英文的閱讀能力測驗,在模型學會英文之後的同時它也學會中文。 ### 『舉一反三』的能力可以有多誇張 [參考文獻_Zero-shot Reading Comprehension by Cross-lingual Transfer Learning with Multi-lingual Language Representation Model](https://arxiv.org/abs/1909.09587) 上面實驗來自一篇2019年上古的論文。其中一項是以104個語言資料做為預訓練,然後以英文QA資料做微調,最終以中文QA做測試,得到的F1跟第一個QANet是差不多的。這說明著在一個好的預訓練模型情況下,只要能有一個好的微調,模型就可以有著好的舉一反三的能力。 ### Fine-tuning的路線分成了兩條 ![image](https://hackmd.io/_uploads/BJHQAqrzR.png) Fine-tuning跟溼溼一樣有兩種。 ### 路線一:打造一堆專才 ![image](https://hackmd.io/_uploads/S1HKCcHz0.png) 我們可以透過微調讓模型只做一件事,可以是翻譯,也可以是編修,總之就是給模型一個單一類型的資料集。 ### 路線一:打造一堆專才 ![image](https://hackmd.io/_uploads/SJeE1iBG0.png) [機器學習2021_BERT簡介](https://youtu.be/gh0hewYkjgo) BERT本身就是一個專才路線的模型,相關課程可見上面連結。 ### 路線一:打造一堆專才 ![image](https://hackmd.io/_uploads/SJm_JorfA.png) 上圖中,每一個符號都是一個任務,每一個垂直線都是一個預訓練模型,黑色水平線代表人類水平,藍色虛線代表機器水平的平均能力。 上圖不難發現,這幾個以BERT為基礎的模型所得到的結果都很接近於人類水平,甚至還有超過。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/HJpNxsSf0.png) 人們後來有個瘋狂的想法,就是讓模型可以跟素還真一樣的全能,期許在大量資料的餵養之下可以讓模型擁有舉一反三的能力。像是教導模型翻譯跟摘要兩個任務,然後要模型做一個合併的輸出,也就是摘要的同時翻譯。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/B1iL-jSz0.png) [參考論文_LAMOL: LAnguage MOdeling for Lifelong Language Learning](https://arxiv.org/abs/1909.03329) 論文中的想法是,如果無法同時所有任務的大量資料,那就有什麼教什麼,有翻譯教翻譯,有編修就教編修。 這種作法有一個問題,那就是學新的忘舊的,因此論文中提出一個複習的概念。有興趣的可以喵一下。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/HJB4MjHf0.png) [參考論文_Finetuned Language Models Are Zero-Shot Learners](https://arxiv.org/abs/2109.01652) [參考論文_Multitask Prompted Training Enables Zero-Shot Task Generalization](https://arxiv.org/abs/2110.08207) 這種通才模型在21年的時候開始陸續開花。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/BJItMjSG0.png) [參考論文_Finetuned Language Models Are Zero-Shot Learners](https://arxiv.org/abs/2109.01652) 參考論文中跟GPT-3做了比較,FLAN在三個任務上的效能都是超過GPT-3的。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/rJgZXjBMA.png) [參考論文_Scaling Instruction-Finetuned Language Models ](https://arxiv.org/abs/2210.11416) 2022年的時候更是用了1800個『任務』來訓練模型,所以就是用大量任務的大量資料來對模型做預訓練。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/ByOsmsSGA.png) 左圖橫軸是模型大小,蹤軸是在沒有看過的任務上的正確率。結果來看,相同大小的模型,其預訓練的任務愈多,效能愈好。 右圖橫軸是預訓練的任務數,蹤軸是在沒有看過的任務上的正確率,每一條線代表一個參數量的模型。趨勢來看,預訓練的任務愈多,在沒有看過的任務上的正確率也愈高。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/B1UbSiBfC.png) [參考論文_Training language models to follow instructions with human feedback ](https://arxiv.org/abs/2203.02155) 這是openai的一個實驗成果,蹤軸是請使用者打分數,橫軸中,GPT是原始模型,加上prompted是做了in-context學習,然後SFT就是論文中做的instruct的處理,結果來看滿意似是openai中最高的,而且論文中還發現,使用者滿意度甚至高過google的FLAN。 ### 路線二:直接打造一個通才 ![image](https://hackmd.io/_uploads/Hy2luoBMA.png) openai針對滿意度高過FLAN的這點做了一些研究。 首先是FLAN的資料生成方式是,有個前提,有個假設,有個目標,然後套入模版產生一問一答的資料集。這種作法的缺點是比較死板,而且跟現實問答狀況可能是有落差的。 而OpenAI在2022年就上線GPT-3,這個服務上所得到的資料都是真實的使用者的問題。他們只要再找人把問題的答案標記上去就可以擁有大量的實際資料。 所以關鍵在於真實使用者的資料。 ### Instruction Fine-tuning是畫龍點睛 ![image](https://hackmd.io/_uploads/Bki8ujrMA.png) 論文中還提到,Instruction Fine-tuning基本只用到上萬筆資料而以。 ### Instruction Fine-tuning是畫龍點睛 ![image](https://hackmd.io/_uploads/S1k8tjHGC.png) [參考論文_Llama 2: Open Foundation and Fine-Tuned Chat Models](https://arxiv.org/abs/2307.09288) [參考論文_LIMA: Less Is More for Alignment](https://arxiv.org/abs/2305.11206) 相同的結論在LLaMA2的論文中也提到,論文中提到他們只用27540筆資料,因為重點在於資料品質,而不是數量。 另篇論文LIMA中發現,只用1000筆資料訓練,竟然可以在43%的情況下可以跟GPT-4打平或是更好。 ### Instruction Fine-tuning是畫龍點睛 ![image](https://hackmd.io/_uploads/rJy9YirMA.png) 那我們自己可以做Instruction Fine-tuning嗎?答案是打妹~因為我們沒有那些高品質的資料。 怎麼辦?那就找ChatGPT做逆向工程。 ### Instruction Fine-tuning是畫龍點睛 ![image](https://hackmd.io/_uploads/Syf_5iBMR.png) [參考論文_Self-Instruct: Aligning Language Models with Self-Generated Instructions](https://arxiv.org/abs/2212.10560) [參考論文_The False Promise of Imitating Proprietary LLMs](https://arxiv.org/abs/2305.15717) 首先,叫ChatGPT想想可以做什麼,然後挑一個任務給它,叫它跟你說使用者在執行這類任務的時候會問些什麼問題。接著再用這些問題要求機器產生答案。 這樣你的手上就有輸入跟輸出的資料可以拿來做Instruction Fine-tuning。 但是第二個參考論文中就有特別提到,這種方式得到的資料不見的是好的,不過沒魚蝦也好,總之你什麼都沒有還要來的有效。 ### 以ChatGPT為師的風險? ![image](https://hackmd.io/_uploads/HyKoqjSGR.png) 不過企業都是自私的,自己可以爬別人的文章但就是不許別來用來加料(這我自己說的)。 ### 關鍵是用Pre-train的參數初始化 ![image](https://hackmd.io/_uploads/ryvUjiBG0.png) 原本這個世界的大型語言模型都是封閉式的,鬼才願意釋出自己花了三天三夜訓練的模型參數。 不過這個封閉的世界終究是被羊駝擊破了,祖哥跟立崑兄開源了LLaMA,一眾開發人員終於有了預訓練好的參數可以拿來做微調。 ### 關鍵是用Pre-train的參數初始化 ![image](https://hackmd.io/_uploads/HymqisHM0.png) 就在羊駝現世之後,世界的模型開始出現了,人類終被解放(誤~) ### 人人可以fine-tune大型語言模型的時代開始了 ![image](https://hackmd.io/_uploads/r1j2joSz0.png)