iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
生成式 AI

LLM 學習筆記 - 從 LLM 輸入問題,按下 Enter 後會發生什麼事?系列 第 5

Day 5. 微調模型:在下次準備從 LLM 輸入問題前,可以做什麼事?

  • 分享至 

  • xImage
  •  

前一篇提到了,微觀角度,機器在學的就是一組最能滿足現實資料的方程式;宏觀角度,讓機器先學嘗試、 學習出如今的的大語言模型。

我們可以發現,要從頭訓練模型是成本很大的一件事,我們有可沒有可能不要重新開始,可能只學習一點點,或是根本就不用重新學習,好在下次從 LLM 準備輸入問題前,做一些些微調讓 LLM 得到更好的結果?

Post Training : 在既有模型上再訓練

前一篇其實已經稍微的提到了常見的 Post Training 技術,第一個就是在有人為介入的情況下學習(Supervised Learning),有時又稱做(Instruction Fine Tuning),指得是透過人工標註的資料基於另一個基礎模型來進行微調訓練。

其實是不是人工標註的資料來源並不重要,重要的是相比於 Pre Train 所需的資料量,這時無須大量但需要「高品質」的資料來源,而這個資料來源除了人為的,也可以是模型產出的,例如:讓相同的問題透過模型來換句話說、訓練一個專門產出訓練資料的模型,來提供給另一個模型等等,都可以是一種解決方向。

不過雖說資料量遠少於 Pre Train 所需要的資料量,但涉及到「訓練」終究還是一件成本很高的事情,我們可以維持模型所有的參數還是開放的狀態,拿一批更好的資料去找出更合適的參數,卻因為一樣的參數數量,會有較高的硬體記憶體跟資料需求。有沒有可能減少訓練的參數,但又維持一樣的效果呢?現在最常見的方式,是在既有的模型上添加額外的參數來訓練(LoRA),不動原本的模型參數來試圖接近全參數微調的效果。

以上除了模型參數本身,參數的參數也很值得微調,前面曾經介紹過在微觀角度中模型的學習歷程,那這些歷程的資料怎麼切、要學幾次、Optimize 的時候每一次要變化多大來尋找最佳結果等等,這些訓練過程中的參數也都會影響到最終模型的結果。

Post Training 中的一種訓練方式:Reinforcement Learning

除了透過特殊領域、格式的高品質資料訓練,第二種常見的方式是讓模型透過獎勵的方式,來自行學習自己回答的結果好不好的強化學習(Reinforcement Learning)。在眾多的 GPT 服務中,我們現在都可以看到模型設計了一個 👍 與 👎 的選項,透過使用者的標註,模型可以更容易知道自己回答的結果好不好,並增加或抑制回答出現的機率。這類微調特別適合連人自己都不太知道答案是什麼的問題,例如:以圍棋為例,很難說下一手怎麼下就是絕對正確的答案,但除了現在已經下過的位置,其餘的位置都是可選的選項之一。

強化學習也跟一般的模型相同,在微觀上會定義一個 Model、Loss 最終進行 Optimize,主要差異在模型中的 Loss 不只是考慮下一個字的結果,而是將全局的結果也考量進來訓練。

以 Model 來說,f(x) = ax + b 的形式,會變為 f(observation) = action。observation 是一個步驟中的美一個狀態、Action 是每一個步驟中所做出的行為。以文字生成來說,輸入「還好嗎?」想要回答「我很好」的話,拆解每一個步驟的 observation 與 action 就會如下:

Observation 1: 我
Action 1: 很
Observation 2: 我很
Action 2: 好
Observation 3: 我很好

observation 可以是一串生成到一半的句子、是遊戲中其中一楨畫面,action 可以是下一個要選擇的字,遊戲中下一步要操作的動作。

接著,定義 Loss Function,有別於一般的 Learning,Reinforcement Learning 強調的是全局的最佳結果,例如,比起滿分的下一個字,Reinforcement Learning 更在乎完整的句子,總共可以得到幾分,並以此作為 Loss Function 去尋找最佳解。當然算分的方式並不只是能針對生成文字的途中、最終結果來計算分數,如果將模型生成的步驟區分成更大的段落,例如:Chain Of Thought,我們也可以對生成過程的每一個任務,去計算分數,提高模型在策略上的規劃能力。

最終在 Optimize 的過程,我們需要去找出一組參數,連著在全局中所有的 action 與 observation 作為 input,找出什麼樣一路選擇可以帶來全局的最佳解。

Model Editing : 植入特定知識

聽起來模型的微調沒什麼問題了,Post Training 似乎只有好處沒有壞處,想要一個更強大的模型,就對一個基礎模型一直 Post Training 慢慢的學會各種技能不就可以了?但 Post Training 很容易遇到顧此失彼的情境,學了一個忘了兩個,Post Training 過後的模型經常發現會失去既有能力,像是,一個已經做過安全訓練不會罵髒話的模型、訓練完新的程式技能後,再做一次安全測試卻不再通過。

這時可以通過「複習」的方式,在 Post Training 時混入一些既有資料,又或者讓模型自行回答過新問題的答案,並從中篩選更正確的回答、或換句話說人類提供的正確答案。讓模型透過「反省」的方式去 Post Training。

但有的時候,需要的不是模型的大規模改變,而是植入特定的知識,可以怎麼做?

我們可以透過 Post Training 訓練模型學習特定知識,但就像前述的 Post Training 提到,Post Training 特定的主題,很容易將模型的既有能力破壞。如果不希望這樣,有沒有除了 Post Training 之外更好的解決方案?我們可以透過找出在模型裡,與特定知識最相關的參數,並調整他的權重來改變輸出結果。

但一個上千億的參數又層層堆疊大語言模型,要找出模型哪一個參數、或是在哪一層開始,會影響到我們期待的答案,是非常困難的任務。我們可以親力親為,透過觀察原本問題在遮蔽掉模型內部部分,看什麼時候問題不再會出現原本的答案,接著再透過,Optimize 的過程找出有可能找出預期答案的參數。或更乾脆的,訓練另一個模型來幫我們找出這件事的答案。

Model Merging:合成特殊技能

繼前述的各種技巧,現在已經有各種知識專業的模型,有沒有可能就回收再利用,也不要每次都 post training 一個新的,我將已經有的做一些結合,就能組成出一個更厲害或我想要的技能樹的模型。如果今天的基礎模型不相同可能沒辦法,參數的基底差距過大,根本無法銜接,但如果今天都是相同地基礎模型呢?

可以將不同技能的模型參數相加、疊層的方式,將參數融合在一起,讓模型能不透過重新學習的方式,來微調得到新技能。也許這個合併的過程很抽象,但可以回歸到模型就是一個方程式,兩個模型的合併,就像是把前一篇兩個模型的 a 與 b 直接相加除以二一樣看待(當然詳細來說並不是如此)。又或者,如果今天在模型的架構上,我們知道模型內有層層堆疊的知識層,有沒有可能抽個幾層放在另一個模型之中?來讓模型學習到特定層數的技能。

更甚者,也不一定是要讓模型得到「新的」技能,如果今天是要讓模型忘記特定技能呢?例如,一個模型學到了不好的知識,有沒有可能透過相減或是移除層數的方式來失去這個能力

Model Merge 還是一個非常前沿的領域,而且看起來非常經濟實惠只要做一些參數的加加減減,而不用提供一個有複數據能複雜的資料集來訓練模型學會多重能力。但 Model Merge 也不一定總是會成功,如果今天兩個模型更動的參數很接近,就很容易造成模型回答出兩個都不對的答案。只能說,現在發現的是,比較大或模型涉及的參數比較少,簡言之可以避免影響同一個參數的狀況越少,Model Merging 就越容易成功。

總結

當然上述部分的 Training 方式並非只能用在 Post Training 中,而是現行 LLM 中更常用於 Post Training 裡。基於大量資料所訓練的 Pre Train 模型目前還是沒辦法直接被上述訓練方式替代。但這樣的作法打破了 Pre Train Scaling 的限制,甚至能更彈性地在不同的思考層級去訓練我們希望模型養成的能力。


上一篇
Day 4. 模型訓練:在可以從 LLM 輸入問題前,發生什麼事?
下一篇
Day 6. Prompt:在「即將」從 LLM 輸入問題前,可以做什麼事?
系列文
LLM 學習筆記 - 從 LLM 輸入問題,按下 Enter 後會發生什麼事?7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言