前一篇提到了:從 LLM 輸入問題後,按下 Enter 「純聊天」,會發生什麼事?知道文字被送進 Server 一個叫做 LLM 的黑盒子裡,LLM 透過文字接龍接出一系列的結果。而這個文字接龍其實就是一個方程式,預測出最有可能出現的下一個文字。最終在一段段的回傳到你的話面。
回到 f(x) = ax + b 的案例,無關乎 a 與 b 如何,真實世界裡觀察到下列事實:
f(1) = 3
f(2) = 5
f(3) = 6
試圖找出一個最有機會達成上述規則的 a 與 b 的組合,像 a = 3、b = 0 最能符合的結果,這就是 Machine Learning。
再稍微複雜一點點,一樣 f(x) = ax + b 的例子,現在我們湊不出像前者永遠都可以符合的結果了,這時候只能找出一條線是最靠近這些點的結果。
f(1) = 3
f(2) = 5
f(3) = 6
如果今天現實中的點很散亂,我們再也無法用一條線來表達最接近的關係(雖然硬要畫也不是不行,但就是沒有什麼代表性)這時我們可以用各種曲線,看是要拋物線、甚至是 S 曲線去接近。
這些 Model 的架構要怎麼設定,是人為的,是模型訓練者可以選擇並設定的,可以想像如果是一個線型更扭、參數 a,
今天如果只有兩三個數據點、方程式只有 f(x) = ax + b 一元一次,可以人算算就好,如果今天有無數不只一元有上億元、還有超多數據點,這時候還讓人算嗎?有沒有可讓機器自己找怎麼樣的組合能最靠近這些點?
要讓機器可以自己找到一個他也不知道在哪裡的東西,就需要為機器定義一個能夠衡量他現在是否足夠靠近的分數,好比,今天機器先從 a=1 跟 b=1 開始找,於是:
假設 1: a = 1, b = 0 則 f(x) = x
Case 1: 原先 f(1) = 3,與假設算出的 1 差 2
Case 2: 原先 f(2) = 5,與假設算出的 2 差 3
Case 3: 原先 f(3) = 6,與假設算出的 3 差 3
我們可以說,假設 1 的表現是 3 個 case 取平均,也就是 L(a,b) = (1/3) * (|3 - f’(1)| + |5 - f’(2)| + |6 - f’(3)|)。 在 a = 1, b = 0 的情況下是 2.67 分。那知道這個 2.6 分,現在 a, b 要怎麼變?我們就要知道分數是 a 加減一點還是 b 加減一點,可以讓分數最低。那要怎麼知道這件事?
當 b 不變的時候,L(1,0) = 2.6, L(2,0) = 2 … etc 當 a 越大,L 就變得越小,所以我們希望 a 變大。我們也可以透過另外一個方式觀察 b 變化的時候怎麼變,L(0,1) = 3.33, L(0,2) = 2.6 … etc 當 b 越大,L 就變得越小,所以我們也希望 b 變大。
而上述我們都很剛好的讓 a 跟 b 都是 +1 +1 的改變來觀察,實際上這是一個我們可以決定的數字,而且更實際上,我們也不是這樣固定一邊邊逐步 +1 的計算。我們可以取 L 對 a 的導數,就可以知道 a 的斜率。但在不提到複雜數學的情況下,想知道的就是分數對 a 與 b 怎麼變,並定義好一次改變多少,來進行 a, b 改變的決策。
可想而知 a 與 b 可以有無限多種組合,我們不會讓機器無限的嘗試,通常在一定的次數中,找到一個 L 的最小,我們就不會再嘗試。但這就跟在花園裡面找一朵最美的花,我們怎麼知道這是這一角落的最好、還是全部花園裡的最好,就是一個改善機器學習機制的研究議題。
以上我們可以知道,機器學習的本質是給數據點,讓他自行長出最適合的模型、找出最好的 a, b …. 甚至上億個參數的最佳組合。過程中會涉及到,什麼樣的初始的模型架構,最能貼近數據、找出來的參數組合,是否真的最佳等等執行細節。
但發展到 LLM 階段,如今很難從最微觀的機器學習角度一路建構到宏觀角度,所以我想更乾脆就分成兩個角度來介紹模型訓練這件事。
而如今在 LLM 訓練的作法中,最經典的作法會分成以下三個階段:
從前一篇我們得知,LLM 就是一個文字接龍的模型。要學會文字接龍,就是看大量的文字前文是什麼、通常後文講什麼來學習,而第一階段的 LLM,就是一個基於大量網路資料來學習怎麼文字接龍的階段。
開發者們爬下大量的網頁資料、清理、去除重複跟有害資訊,透過極為大量的網路資料,這時的模型學習到的,可以說是語言跟世界常識。而且這個階段 LLM 學習,是可以自動的透過將網頁上的內容挖空來學習下一個字應該要出現什麼,並不需要人為去建立新的資料來讓 LLM 學習。
在 2018 年 GPT-1 透過 7000 本書,達成了 1.1 億參數模型的學習,2019 年 GPT-2 透過 40GB 的檔案,達成了 15.4 億參數模型的學習,到了 2020 年 GPT-3 透過 580GB 的資料達成了 1750 億參數模型的學習。
那是不是我們只要有更多的資料、學出一個參數更大的模型,就可以促成更好的模型呢?並不是隨著 GPT-2 到 GPT-3 的發展,科學家們發現只是規模放大已經不夠了,模型的表現已經來到瓶頸。
畢竟網路資料有部落格、有新聞、雖然也有 Quora 跟論壇,但大量不是基於問答的網路資料,難以應付人類信手拈來的隨口一問。所以第二階段,基於第一版 pre train 的模型之上,科學家們透過提供更多高品質的問答資料來訓練模型,好讓模型可以更適應人類的問答模式。
在這之上的微調,讓模型有了飛躍性的提升,科學家們發現,基於 pre train 模型之上,只要提供少少的高品質資料就能讓模型變成特定領域的好用專武。
但模型不滿足於此,如果要讓 LLM 模型更進一步,應該怎麼精進?
現在 LLM 有什麼沒有學到呢?第一個 LLM 之前都還是專注在學文字接龍,但是今天一個好的生成答案,並不是只有文字接龍中的每一個字生成的多好,同時一個句子最終怎麼樣好也是一個值得學習的資訊。
這不代表今天模型就不是文字接龍,而是說,文字接龍是第一階段學習比較可行的作法,下一階段,可以讓模型從更全局的角度來學習生成的結果好不好了。
所以隨著 GPT 服務實際上線,現在有更多人在使用 LLM AI 服務了,有沒有可能,我們讓這些使用者來提供 AI 資料說什麼樣的生成結果好呢?
於是透過另一種學習方式 Reinforcement Learning,讓使用者去標記,不同的生成結果好壞,並鼓勵模型生成使用者覺得比較好的結果。
以前總是追求希望可以從微觀一路推導到架構,或者從架構拆解至微觀,總是弄不清楚。後來接受了在不同層級以不同的方式去理解如何運作。
在微觀中,模型是在找一個能夠預測答案的方程式,並用數學求最佳解的方式搭配大量的數據,去找出最接近的參數。而宏關中,模型是透過一而再再而三的學習,去建立更接近人類的思考方式。