一、背景
目前NLP主流正規化是在大量通用資料上進行預訓練語言模型訓練,然後再針對特定下游任務進行微調,達到領域適應(遷移學習)的目的。
指令微調是預訓練語言模型微調的主流正規化
其目的是儘量讓下游任務的形式儘量接近預訓練任務,從而減少下游任務和預訓練任務之間的Gap, 實現預訓練語言模型適應下游任務,而非下游任務去適應模型。
指令微調的效果要優於基於Zero/Few-shot的提示詞工程的上下文學習。
但隨著預訓練語言模型進入LLM時代,其引數量愈發龐大。全量微調模型所有引數所需的視訊記憶體早已水漲船高。
例如:
- 全參微調Qwen1.5-7B-Chat預估要2張80GB的A800,160GB視訊記憶體(需要確認一下😮)
- 全參微調Qwen1.5-72B-Chat預估要20張80GB的A800,至少1600GB視訊記憶體😱。
而且,通常不同的下游任務還需要LLM的全量引數,對於演算法服務部署來說簡直是個災難
當然,一種折衷做法就是全量微調後把增量引數進行SVD分解儲存,推理時再合併引數😓
為了尋求一個不更新全部引數的廉價微調方案,之前一些預訓練語言模型的高效微調(Parameter Efficient, PEFT)工作,要麼插入一些引數或學習外部模組來適應新的下游任務。
接下來將介紹如下4個PEFT方法(重點是主流的LoRA);
- Adatper Tuning
- Prompt Tuning
- Prefix Tuning
- LoRA
二、引數高效微調
2.1 Adapter Tuning
Adapter Tuning試圖在Transformer Layer的Self-Attetion+FFN之後插入一個先降維再升維的MLP(以及一層殘差和LayerNormalization)來學習模型微調的知識。
Adapter即插入的FF up + FF Down。
在微調時,Transformer Layer原有的所有引數凍結,反向傳播後僅更新Adapter引數。
缺點:需要修改原有模型結構,同時還會增加模型引數量。
2.2 Promot Tuning
https://arxiv.org/abs/2104.08691
Prompt Tuning設計了一種prefix prompt方法,即在模型輸入的token序列前新增字首prompt token,而這個字首prompt token的embedding是由網路學到。
Prompt Tuning可以看做token已經確定,但是embedding是可以學的。它相當於僅用prompt token的embedding去適應下游任務,相比手工設計或挑選prompt,它是一種Soft的prompt(軟提示),
給定\(n\)個token組成的輸入序列 \(\{{x}_{1} , {x}_{2}, \ldots,{x}_{T}\}\),其對應token embedding矩陣為 \(\mathbf{X}_{e} \in \mathbb{R}^{n \times d}\),\(d\)代表嵌入維度。
Soft-prompts對應引數\(\mathbf{P}_{e} \in \mathbb{R}^{p \times d}\),\(p\)代表prompt的長度。
然後,將prompt拼接到輸入前面,就能得到完整的模型輸入
\([\mathbf{P}_{e} ; \mathbf{X}_{e}] \in \mathbb{R}^{(p+n) \times d}\) 。這個新的輸入將會送入模型\(f([\mathbf{P}; \mathbf{X}]; \Theta, \Theta_{p})\),以最大化交叉熵損失來最大化條件機率 \(Pr_{\Theta, \Theta_{p}}(\mathbf{Y} | [\mathbf{P}; \mathbf{X}])\),以擬合其標籤token序列 \(\mathbf{Y}\)。
在針對下游任務微調時,Prompt Tuning將凍結原始LLM的引數,只學習獨立的prompt token引數
引數化的prompt token加上輸入的token送入模型進行前向傳播,反向傳播只更新prompt token embedding的引數
在針對不同的下游任務微調時,就可以分別學習不同的Task Specifical的Prompt Token引數。
- Soft Prompt Tuning在模型增大時可以達到接近fine-tuning的效果。
- 離散的Prompt Tuning(Prompt Design)基本不能達到fine-tuning的效果;
Promot Tuning方法的引數成本是\(ed\),其中\(de\)是提示長度,\(d\)是token嵌入維度。
提示越短,必須調整的新引數就越少,那麼調參的目標是就是找到表現仍然良好的最小prefix prompt長度。
2.3 Prefix-Tuning
為了避免人為的離散Prompt選取最佳化,Prefix-Tuning提出可學習的Prefix Prompt。
Prefix-Tuning提出可學習的Prompt,即:learns a sequence of prefixes that are prepended at every transformer layer
Prefix tuning為\(l\)層的Transformer Layer的每層多頭注意力的鍵和值都配置了可學習的prefix vectors.
Two sets of prefix vectors \(\mathbf{P}_{k}\), \(\mathbf{P}_{v} \in \mathbb{R}^{l\times d}\) are concatenated with the original key \(\mathbf{K}\) and value \(\mathbf{V}\)
看到這裡可以知道,Prefix-Tuning可以算是Promot Tuning的一個特例(Promot Tuning只在輸入側加入可學習的Prefix Prompt Token)
2.4 LoRA
為緩解該問題,LoRA(Low-Rank Adaption of LLMs),即LLMs的低秩適應,被提出用於高效引數微調。
LoRA的核心思想,是假設LLM在下游任務上微調得到的增量引數矩陣\(\Delta \mathbf{W}\)是低秩的
\(\Delta \mathbf{W}\)是存在冗餘引數的高維矩陣,但實際有效矩陣是更低維度的
。
相關論文表明訓練學到的過度引數化的模型實際上存在於一個較低的內在維度上
類似於機器學習中的降維演算法,假設高維資料實際是在低維的流形上一樣
因此,將\(\Delta \mathbf{W} = \mathbf{B} \mathbf{A}\)用兩個更引數量更小的矩陣\(\mathbf{B}\in \mathbb{R}^{r \times d}\)和\(\mathbf{A}\in \mathbb{R}^{d \times r}\)進行低秩近似。
其具體操作是,凍結了預訓練的模型權重,並將可訓練的LoRA秩分解矩陣注入到LLM的每個
Transformer Decoder層中,從而大大減少了下游任務的可訓練引數數量。
LoRA 方法的計算流程如圖對於該權重的輸入\(\mathbf{x}\)來說,輸出為下式:
其中,\(\mathbf{W}_{0} \in \mathbb{R}^{d \times d}\)為設預訓練權重。初始化時,矩陣 \(\mathbf{B}\) 透過高斯函式初始化,矩陣 \(\mathbf{A}\) 為
全零初始化,使得訓練開始之前旁路對原模型不造成影響,即引數改變數為0。
對於使用LoRA的模型來說,由於可以將原權重與訓練後權重合並,因此在推理時不存在額外的開銷。
Prefix Tuning是指在輸入序列字首新增連續可微的軟提示作為可訓練引數。
由於模型可接受的最大輸入長度有限,隨著軟提示的引數量增多,實際輸入序列的最大長度也會相應減小,影響模型效能。
三、適用範圍
近來LLM主要是指,Decoder-Only架構的大規模預訓練語言模型。
畢竟,同等引數規模和訓練資料量,Encoder-Decoder架構的T5和Bart在生成任務熵,相比Decoder-Only架構並不具備優勢。更不用說,Encoder-Only架構的BERT了。
但是,所有使用Transformer架構的演算法都可以使用上述PEFT方法。
針對主流的Decoder Only的生成式因果語言模型,其訓練正規化具體是:
圖片源自:《大規模語言模型:從理論到實踐》
- 預訓練(Pretraining):基於海量語料進行Transformer Decoder架構的自迴歸預訓練,擬合語料序列的條件機率分佈\(P(w_i |w_{i}, ..., w_{i-1})\),從而壓縮資訊,最終學到一個具備長上下文建模能力的超大規模神經語言模型,即LLM
- 有監督微調(Supervised Finetuning):基於高質量的指令資料(使用者輸入的提示詞 + 對應的理想輸出結果)微調LLM,從而得到有監督微調模型(SFT模型)。SFT模型將具備初步的指令理解能力和上下文理解能力(預訓練得到的LLM在指令微調的過程中被引導如何使用其學到的知識)
進一步基於結果有排序指令樣本, - 獎勵建模(Reward Modeling):獎勵階段試圖構建一個文字質量對比模型(相當於一個Critor)。對同一個提示詞,它將對SFT模型給出的多個不同輸出的質量做排序。獎勵模型可透過二分類模型,對輸入的兩個結果之間的優劣進行判斷。
- 強化學習(Reinforcement Learning):強化學習階段將根據給定的提示詞樣本資料,利用在前一階段訓練的獎勵模型,給出SFT模型對使用者提示詞補全結果的質量評估,並與語言模型建模目標綜合得到更好的效果。強化學習微調將在SFT模型基礎上,它將使LLM生成的結果文字能獲得更高的獎勵。
除了預訓練,增量預訓練、有監督微調、有監督微調、獎勵建模、強化學習階段都可以採用PEFT方式。
轉載需註明出處
文章首發於知乎:https://zhuanlan.zhihu.com/p/696057719
參考資料
[0] CS224N:Natural Language Processing
with Deep Learning, Sildes (Lecture 11: Prompting, Instruction Finetuning, and RLHF)
[1] PrinCETON LLM課程 Sildes(Prompt as Parameter-Efficient
Fine-Tuning)
[2] 《The Power of Scale for Parameter-Efficient Prompt Tuning》論文閱讀 https://zhuanlan.zhihu.com/p/551174711
[3] Prompt Tuning里程碑作品:The Power of Scale for Parameter-Efficient Prompt Tuning https://zhuanlan.zhihu.com/p/551014127
[4] 圖解大模型微調系列之:大模型低秩介面卡LoRA(https://zhuanlan.zhihu.com/p/646831196)
[5] Understanding Parameter-Efficient Finetuning of Large Language Models: From Prefix Tuning to LLaMA-Adapters https://lightning.ai/pages/community/article/understanding-llama-adapters/