隨著ChatGPT的出圈,大型語言模型向我們展示了非凡的能力。它既可以很好的完成傳統的自然語言任務,又有著傳統小模型不具備的世界知識與推理能力,十分驚艷。盡管如此,大型語言模型巨大的參數量與訓練資源的需求讓許多研究者們望而卻步。輕量化是解決該問題的一大手段,通過一系列方法降低模型訓練時的資源要求,在可接受的性能損失范圍內對模型進行訓練與部署。在本文中,筆者將介紹一系列輕量化方法,可以將大模型的微調訓練以及應用部署的資源要求降低到一般研究者可以接受的范圍內。我們的介紹包括三個內容:模型輕量化微調,模型輕量化部署以及當前可用的模型輕量化資源。文章也同步發布在AI Box知乎專欄(知乎搜索 AI Box專欄),歡迎大家在知乎專欄的文章下方評論留言,交流探討!
1、模型輕量化微調
輕量化微調的相關研究始于Bert時代。在早期的預訓練-微調范式中,對每一個下游任務的微調適配都需要訓練所有的模型參數,帶來了相當大的硬件資源負擔。而輕量化微調則著眼于解決這一問題,通過一系列方法微調整個模型的少部分參數,并使得模型能夠在下游任務上有接近全參數微調的性能。在大模型飛速發展的今天,模型的參數量相較于Bert時代的模型多出了成百上千倍,想要在一般的硬件條件下去對大模型做個性化的微調,輕量化是幾乎唯一的選擇。在下面的部分,我們將介紹在小模型上已經被廣泛運用,同時在大模型上已初見成效的一些經典輕量化微調方法。
Adapter (Parameter-Efficient Transfer Learning for NLP Adapter - ICML 2019)
Adapter是早期的一個相當簡單且有效的輕量化微調方法,它遵循著“凍結模型的絕大部分參數,只訓練少數參數”的思想來進行輕量化微調。Adapter類方法可以通過在預訓練模型的不同層之間添加小的Adapters來實現微調,而不需要微調整個模型。在原論文中,作者采用Bert作為實驗模型,其總體結構如下:
可以看到,每個Transformer層的Attention模塊以及兩個全連接層后都被增加了一個Adapter結構。Adapter結構采用了上映射(up-project)和下映射(down-project)的結構。對于一個固定維度的特征,Adapter會先通過down-project層將其映射到較小的結構,經過一個全連接層后再通過up-project層將特征映射到原來維度,從而減少了參數量。在Bert模型上,采用Adapter方法只需要訓練原模型0.5%-8%的參數量,在不同任務上只需要保存少量Adapter結構的參數,從而節省了存儲空間。除此之外,Adapter采用了殘差連接的結構,通過設計合適的初始化參數就可以使得Adapter能夠在訓練初期表現良好。作者在GLUE測試集上對模型進行了測試,并取得了與全參數微調相近的結果。
Prefix-tuning(Optimizing Continuous Prompts for Generation - ACL 2021)
Prefix-tuning是一種基于前綴的輕量化微調方法,其思想來源于GPT-3中的prompting方法。在GPT3中,通過設計合適的前綴,就可以激發模型生成任務相關的輸出,從而不需要任何訓練即可適配到下游任務上。而在小模型上,模型不具備足夠強大的In-context learning的能力,因此需要保證前綴是”可訓練“的,來適配下游任務。即使如此,相對于全參數微調,只對前綴進行訓練也可以節省大量的參數量。在本篇文章中,作者采用連續的可訓練向量作為輸入前綴,在微調時不訓練模型參數,只訓練這些前綴向量,并提示模型生成正確的輸出:
在微調時,Prefix-tuning與全參數微調的訓練目標與訓練流程均保持一致。為了增加前綴向量在訓練時的穩定性,作者采用了重參數化的方法,通過一個若干較小的前綴向量經過單層MLP生成正常規模的前綴向量。在Table-To-Text與Summarization,Prefix-tuning方法均取得了相當不錯的效果。
LoRA(Low-Rank Adaptation of Large Language Models ICLR 2022)
LoRA是一種基于低秩的輕量化微調方法,也是目前在大模型領域應用最多的方法。相較于Adapter,LoRA不需要對模型添加額外的參數化結構。而相較于Prefix-tuning,LoRA不需要對輸入端進行修改。取而代之的是,LoRA通過對模型參數的優化量進行了低秩近似。其理論依據在于:神經網絡通常包含大量的全連接層,并通過執行矩陣乘法來完成前向傳播。這些全連接層中的參數矩陣往往是滿秩的,對模型的訓練過程其實就是在學習優化這些參數矩陣。而預訓練模型中的參數矩陣往往存在一個”本征維度“,即我們學習到的這些參數的優化量可以是低秩的,被映射到一個低維空間下也能保持很好的性能。在這樣的前提下,我們可以只對參數矩陣中低秩的部分進行優化,并將整體的訓練過程表示成一個低秩矩陣的優化過程:
前向傳播過程可以表示如下:
A、B是兩個低維的矩陣,相較于原本的參數規模,待優化的參數規模被大大減小。整體的流程如下所示:
在RoBERTa,DeBERTa,GPT-2與GPT-3上,LoRA在只訓練極少數參數的情況下取得了接近全參數微調的結果,證明了該方法的有效性。
2、模型輕量化部署
模型輕量化部署著眼于對訓練好的模型進行輕量化,優化其推理時的計算資源消耗。傳統的輕量化部署方法包含量化,蒸餾,剪枝等。目前在大模型上最好的輕量化部署方法是量化,接下來我們將介紹目前最常用的量化方法-GPTQ。
GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers - ICLR 2023
GPTQ是當前最常用的生成式大模型量化方法。它是基于Optimal Brain Quanization (OBQ) 的逐層量化方法的改進。量化的優化目標在于找到一個量化后的參數矩陣,使得與原精度矩陣的輸出誤差最小。為了對量化過程進行加速,使對大模型的量化時間優化到可容忍范圍內,GPTQ優化了此前的基于貪心的量化順序(即逐個尋找影響誤差最小的參數進行量化),而是發現了隨機的量化順序在大模型上也能有相似的效果,并取得了非常大的提升。對量化數值的精確度問題,GPTQ采用了Cholesky重構的方法進行了緩解。基于一系列的技術上的改進,GPTQ可以在4比特與3比特的量化下在一定程度上保持模型的性能,較原本的量化方法取得了很大的領先。
3、當前可用的模型輕量化資源
Bitsandbytes
https://github.com/TimDettmers/bitsandbytes
Bitandbytes是一個輕量化的CUDA封裝庫,特別針對8比特優化器、8比特矩陣乘法和量化函數來設計。它同時支持大模型的8比特訓練與量化后部署,能夠快速在大模型上部署,并有效的降低訓練與推理時的顯存占用。
PEFT
https://github.com/huggingface/peft
PEFT是專門針對各類輕量化微調方法設計的輕量化訓練庫,包含了Adapter,LoRA以及prefix-tuning等各類輕量化微調方法,并能夠有效的適配huggingface模型,可以非常輕松的部署到模型的訓練過程中,完成大模型的輕量化訓練。
Accelerate
https://github.com/huggingface/accelerate
Accelerate是一個用于深度學習加速的庫,它可以在多種硬件上自動化地并行化和優化訓練和推理過程,提供了一組簡單易用的API,可以自動對模型訓練進行并行化和優化,支持半精度部署于訓練,從而有效地提高模型的訓練和推理速度。
LLaMA-Adapters
https://github.com/AGI-Edgerunners/LLM-Adapters
LLaMA-Adapters是輕量化微調方法在開源的大型語言模型LLaMA上的實現,基于PEFT在LLaMA上實踐了多個輕量化微調方法,在若干個數學數據集上進行了測試并證明了這些方法的有效性。
Alpaca-CoT
https://github.com/PhoebusSi/Alpaca-CoT
與LLaMA-Adapters類似,但提供了更加多樣化的指令數據以及微調后的指令權重。
GPTQ-for-LLaMa
https://github.com/qwopqwop200/GPTQ-for-LLaMa
GPTQ量化算法在LLaMA模型上的應用,包含了不同量化算法在LLaMA上的實現以及在wikitext2數據集上的測試比較
參考文獻:
[1] Parameter-Efficient Transfer Learning for NLP Adapter
[2] Optimizing Continuous Prompts for Generation
[3] Low-Rank Adaptation of Large Language Models
[4] GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
[5] PEFT: State-of-the-art Parameter-Efficient Fine-Tuning methods
[6] 8-bit Optimizers via Block-wise Quantization
[7] Accelerate: Training and inference at scale made simple, efficient and adaptable.
[8] LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models