快轉到主要內容

白話文告訴你 - 什麼是 PEFT 效率微調

非白話文的懶人包:

  • 本篇介紹兩種微調法 – 以 transformer 起家,且要訓練的參數很少
  • Prompt tuning: 在輸入文字的(embedding)前面多加 trainable 參數;用資料訓練 prompt engineering
  • LoRA: 把原本模型做線性轉換的參數,多加一個同樣大小、但自由度較低 (low rank) 的 trainable 矩陣

名詞認識 #

模型訓練 #

假設一個外國人想學中文,但他什麼都不懂,是一張白紙

模型訓練 (model training) 是他從零開始,讀過大量教科書以後,總算把他的腦袋訓練成能夠看懂正常普通中文

微調 #

結果當他上批踢踢或 Threads,看到裡面的貼文推文:「那不就好棒棒」、「拜託電神鞭小力一點」這種次文化或流行詞,不知道是稱讚還是罵人

微調 (fine-tuning) 是給他看一些批踢踢/Threads的文章,並跟他解釋每一句是真實讚美還是明褒暗貶

「微調」也是訓練的一種,也是拿有答案的資料給他,只不過建立在「已經很不錯的模型之上」再專門學習特別的領域


假設你知道類神經網路;文內的 AI 模型特指類神經網路

比較技術一點:模型的參數一開始隨機不定,然後拿大量資料做第一批的訓練,得到 base model (基礎模型)

當有專門的目標(例如看懂推文語氣),「微調」是你拿該領域的資料:

  1. 以 base model 已經訓練好的參數為起點,繼續調整整個模型。或者
  2. 在 base model 附加簡易模型/參數,不動到原本模型參數 (freeze),只去訓練附加的參數
Model finetuning: re-train all vs. freeze some

對於後者,以前常見的用法有:找一個很厲害的模型,在他輸出後多接一個小的分類器。利用 base model 分析出資料的精華特徵,「代表」這個資料後,再來做自己的訓練,而不是直接拿原始資料來訓練


而有一些微調方法,雖然也是凍結原本模型的參數,但並不是在輸出後附加自己的,而是保留 base model 原本的架構,在內部附加。

其中一個是 Prompt tuning, 還有一個是 LoRA

Prompt tuning #

Prompt engineering 最近變成顯學?例如跟 ChatGPT 說「請幫我摘要這段文字」「如果做得好就給你小費」或「做不好我有生命危險」。但是你怎麼知道這樣提示好不好?

這種人工嘗試錯誤、以人的智慧去發想的字詞,稱作 hard prompt

不過,機器學習/人工智慧的奧義就是把「人類發想的」改成用「資料去學習」有人就想到讓模型接受輸入的文字時,前面先加一些克漏字空格當作 prompt

空格裡填什麼字才能讓機器人好好回答呢?我們不知道;我們拿微調的資料去訓練,讓模型去調整、改進空格里的內容,這叫 soft prompt

Prefix tuning: concat a trainable embedding before the input embedding

比較技術一點:他在輸入 token 變成的 embedding,往前拉長增加微調的參數。因為是 embedding,所以甚至無法對應回人看得懂的文字

LoRA #

LoRA 是在同樣的腦袋,同樣的模型上面去調整參數,乍看之下是改變全部的參數,但實際上調整的時候讓他自由度很低,不會很自由地胡思亂想

LoRA: finetune the matrix with the same size, delta matrix in lower rank

比較技術一點:模型裡面會有線性轉換的矩陣,微調的時候拿一個同樣大小的矩陣加法加上去,微調的時候只改加上去的矩陣;原來矩陣的值還是凍結不改

而這個拿來被改的矩陣,實際上是由兩個很扁,參數很少的矩陣相乘得出;調整參數是調整這兩個扁矩陣,所以調整的參數很少,但相對地能改動的自由度 (rank) 不大。不過根據實驗結果這已經足夠了

所以 LoRA 全名叫做 Low-Rank Adaptation, 這邊的 rank 是 matrix 的 rank (秩),也就是自由獨立的程度


PEFT #

PEFT 全名是 Parameter-Efficient Fine-Tuning,也就是微調很少的參數,有效率地達到不錯的效果,而不用整個模型重新訓練。

PEFT 也不只 prompt tuning 或 LoRA,有興趣的讀者可以參考 https://huggingface.co/docs/peft/index

若您覺得有趣, 請 追蹤我的Facebook 或  Linkedin, 讓你獲得更多資訊!