GenAI: 如何讓你的 GPT 更聰明 (3)

在之前的文章中, 說明了如何透過 prompting 的方式訓練 LLM 模型,
事實上, 在這邊說 "訓練 (training)" 有點奇怪,
因為 LLM 模型的權重並沒有產生任何改變,
prompting 比較像是提供範例學習 (few-shot learning), 
讓 LLM 增進回答的精確度, 或者, 更貼近使用者想要的回答.

當然, 針對特定的應用領域, 例如: 法律, 通訊, 客服, 等
擁有大量語意資料, 同時, 擁有特殊的領域資訊, 
我們可以透過微調 (fine-tuning) 方式, 來調整 LLM 模型的權重,
在此架構下, LLM 模型的權重將被改變, 而可以記憶放入學習的資料,
以下是兩種方法的比較表:
 

在過往, 對 LLM 模型的微調相對複雜,
通常我們會基於開源的基礎模型 (base model), 如: LLaMa 進行調整,
主因大概有兩個: 第一、微調需要大量資料, 以及對應的資料前處理,
第二, 微調需要不少算力, 有能力建立者皆可自行訓練 LLM 模型.
同時, 微調後的 LLM 模型, 也被視為重要產出, 對應目標的應用領域.

不過, 我們還是可以從現有的 LLM 模型 API 中一窺 fine-tuning 的方法,
我們一樣以 Gemini 為範例, Gemini 提供了 fine-tuning 的 API, 如下:
https://cloud.google.com/vertex-ai/generative-ai/docs/models/gemini-use-supervised-tuning
其中, 第一個重點即是準備訓練資料與文本, 其範例如下:

  "input_text": "這是輸入文本。",
  "output_text": "這是期望的輸出文本。"
}

當然, 我們也可以結合之前 prompting 的資訊, 
給予訓練資料更多的角色定義, 例如:

{
  "systemInstruction": {
    "role": "system",
    "parts": [ { "text": "You are a helpful and harmless AI assistant." } ]
  },
  "contents": [
    { "role": "user", "parts": [ { "text": "What is the capital of France?" } ] },
    { "role": "model", "parts": [ { "text": "The capital of France is Paris." } ] }
  ]
}

上方範例就包含了角色與訊息內容,
可以讓 LLM 模型, 針對不同的角色進行微調, 
而不會混雜資訊, 以維持訓練與推論時的一致性.

在 Gemini 的建議中, 500 筆資料是一個較好的微調初始點,
同時, 為了降低計算資源需求和避免覆寫預訓練知識,
Gemini 提供兩種微調方式: 
1) 微調整個模型的權重, 或是
2) 使用 Parameter-Efficient Fine-Tuning (PEFT) 技術.
PEFT 只調整模型中的部分參數, 進而保有更多基底模型的特徵,
在 Gemini 中, 支援設定 Adapter 大小來調整可訓練參數的規模,
使用較小的 Adapter 限制可訓練參數量,
可以在較少資料情況下防止 overfitting 並縮短訓練時間.

在 Gemini 中, 訓練完後的模型和基底模型大小一致,
並可以透過得微調後模型的識別名稱以及自動部署的端點名稱來取得,
範例如下:

print(sft_job.tuned_model_name)
> projects/123456789012/locations/us-central1/models/4567890123456789@1

print(sft_job.tuned_model_endpoint_name)
> projects/123456789012/locations/us-central1/endpoints/1234567890123456789

微調完成的模型會自動上傳至模型註冊表 (Model Registry), 方便管理和部署,
但目前 Gemini 模型本身的權重無法直接導出, 只能通過 API 或 SDK 服務訪問.

留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 5G NR Measurement Events