參考系列文章:https://zhuanlan.zhihu.com/p/635152813
github鏈接:https://github.com/liguodongiot/llm-action
1 訓(xùn)練范式
下面這種instructive learning,在模型參數(shù)達(dá)到80億后,會發(fā)生質(zhì)的提升:
類似的還有手寫prompt
然后可以推廣到綠色的新任務(wù)上:
2 全量微調(diào):fine-tuning
fine-tuning指的是預(yù)訓(xùn)練模型下游接新的MLP,然后全量參數(shù)微調(diào)。
例如2018年谷歌發(fā)布的BERT,只需要拋棄BERT原來的MLM,接上新的全連接層進(jìn)行訓(xùn)練即可:
舉個例子,使用如下數(shù)據(jù):
from datasets import load_dataset
dataset = load_dataset("yelp_review_full")
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))
加載訓(xùn)練參數(shù)類TrainingArguments,指定num_labels(自動添加MLP),并且要添加metrics
from transformers import TrainingArguments, Trainer
import numpy as np
from datasets import load_metric
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)
training_args = TrainingArguments(output_dir="test_trainer")
metric = load_metric("accuracy")
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=small_train_dataset,
eval_dataset=small_eval_dataset,
compute_metrics=compute_metrics,
)
trainer.train()
對于GPT,也是在后面直接加一個MLP進(jìn)行微調(diào):
3 改變結(jié)構(gòu):prompt-learning
3.1 基本概念
現(xiàn)在比較流行的方法是prompt-learning,通過seq2seq的語言預(yù)測模型去完成任務(wù),這樣新的任務(wù)和原先Bert的任務(wù)一致(預(yù)測mask位置的詞表分布 ),因此可以很有效的進(jìn)行tuning。其范式如下,需要設(shè)計輸入模版和標(biāo)簽映射:
我們使用Langchain等工具時,會用到template,用來制作prompt:
選模型的話,auto-regressive適用于mask在最后,而masked LM可以在任意位置設(shè)置mask。Encoder-decoder則兩者皆可。
另外還要關(guān)注預(yù)訓(xùn)練模型的語料,比如Ernie等知識圖譜類的預(yù)訓(xùn)練模型適用于做實體抽取等任務(wù),使用金融/醫(yī)學(xué)材料訓(xùn)練的大模型,更適用于各自相關(guān)領(lǐng)域的下游任務(wù)。
多模態(tài)也可以使用prompt-learning。例如圖像編碼后,可以跟文字使用同樣的方式進(jìn)行prompt learning。
3.2 zero-shot/few-shot
不用訓(xùn)練,直接給出任務(wù)描述(并且可以添加一些樣例),然后使用prompt直接給出結(jié)果。
這種方式為何有效,至今仍是個迷。
3.3 template構(gòu)造
3.4 Verbalizer構(gòu)造
3.5 OpenPrompt工具包
4. 部分微調(diào):delta-tuning
4.1 介紹
固定大部分參數(shù),僅訓(xùn)練少量的參數(shù)來驅(qū)動大模型。下圖是delta-tuning和fine-tuning的區(qū)別。
左邊的fine-tuning中,每個任務(wù)都全量微調(diào),得到一個新的模型,如果有100個任務(wù),那么最終會給出100個數(shù)十G的大模型;但是在delta-tuning中,PLM參數(shù)大部分是固定的,每個任務(wù)只需要訓(xùn)練和記錄有修改部分的參數(shù)(delta-object)即可。
delta-tuning分為以下三大類:增加額外參數(shù)(A)、選取一部分參數(shù)更新(S)、引入重參數(shù)化(R)。而在增加額外參數(shù)這類方法中,又主要分為類適配器(Adapter-like)方法和軟提示(Soft prompts)兩個小類。
4.2 OpenDelta工具包
可以使用枚舉和正則表達(dá)式等方式指定要修改哪些模塊:
使用時,只需要線attach,然后再detach即可。
5. Addition-based
5.1 Adapter Tuning:Transfomer中添加adapter模塊
Adapter Tuning(論文:Parameter-Efficient Transfer Learning for NLP,2019 ),該方法設(shè)計了Adapter結(jié)構(gòu),并將其嵌入Transformer的結(jié)構(gòu)里面,針對每一個Transformer層,增加了兩個Adapter結(jié)構(gòu)(分別是多頭注意力的投影之后和第二個feed-forward層之后,Adapter本質(zhì)就是一個雙層MLP),在訓(xùn)練時,固定住原來預(yù)訓(xùn)練模型的參數(shù)不變,只對新增的 Adapter 結(jié)構(gòu)和 Layer Norm 層進(jìn)行微調(diào),從而保證了訓(xùn)練的高效性。每當(dāng)出現(xiàn)新的下游任務(wù),通過添加Adapter模塊來產(chǎn)生一個易于擴(kuò)展的下游模型,從而避免全量微調(diào)與災(zāi)難性遺忘的問題。
下圖左面是Adapter在transformer中的位置,右邊的圖是adapter內(nèi)部的結(jié)構(gòu)。Adapter通過引入0.5%~5%的模型參數(shù)可以達(dá)到不落后全量微調(diào)模型1%的性能:
還有一種結(jié)構(gòu),把a(bǔ)dapter從主干網(wǎng)絡(luò)降維后遷移到分支網(wǎng)絡(luò)上,這樣可以顯著降低計算量:
5.2 Model/Prompt Tuning:添加前綴提示詞
Prompt Tuning(論文:The Power of Scale for Parameter-Efficient Prompt Tuning),給每個任務(wù)定義了自己的Prompt,然后拼接到數(shù)據(jù)上作為輸入,但只在輸入層加入prompt tokens。
訓(xùn)練時凍結(jié)住pre-trained model,只訓(xùn)練prompt。Prompt token 的長度在20左右時的表現(xiàn)已經(jīng)不錯(超過20之后,提升Prompt token長度,對模型的性能提升不明顯了)
下圖表明,參數(shù)量增加時,prompt tuning接近model tuning的結(jié)果。
5.3 Prefix Tuning:prefix前添加MLP
Prefix Tuning(論文:Prefix-Tuning: Optimizing Continuous Prompts for Generation,2021)和prompt有些關(guān)系。在每一層的Prefix層前面加了MLP結(jié)構(gòu),訓(xùn)練完成后,只保留Prefix的參數(shù)。通過消融實驗證實,只調(diào)整embedding層(也就是prompt-tuning)的表現(xiàn)力不夠,將導(dǎo)致性能顯著下降,因此,在每層都加了prompt的參數(shù)
在上圖的例子中展示了不同模型添加前綴的方法:
- 針對自回歸架構(gòu)模型:在句子前面添加前綴,得到 z = [PREFIX; x; y],合適的上文能夠在固定 LM 的情況下去引導(dǎo)生成下文(比如:GPT3的上下文學(xué)習(xí))。
- 針對編碼器-解碼器架構(gòu)模型:Encoder和Decoder都增加了前綴,得到 z = [PREFIX; x; PREFIX0; y]。Encoder端增加前綴是為了引導(dǎo)輸入部分的編碼,Decoder 端增加前綴是為了引導(dǎo)后續(xù)token的生成。
此外,還有實驗對比位置對于生成效果的影響,Prefix-tuning要略優(yōu)于Infix-tuning。其中,Prefix-tuning形式為 [PREFIX; x; y],Infix-tuning形式為 [x; INFIX; y]。
5.4 P-Tuning:添加prompt embedding+MLP層
P-Tuning(論文:GPT Understands, Too),該方法將Prompt轉(zhuǎn)換為可以學(xué)習(xí)的Embedding層,并用MLP+LSTM的方式來對Prompt Embedding進(jìn)行一層處理。P-Tuning對GPT的效果比較好。
對比prompt tuning,prompt和輸入共享embedding層。
5.5 P-TuningV2:每一層都添加prompt
P-Tuning v2(論文: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks),該方法在每一層都加入了Prompts tokens作為輸入,而不是僅僅加在輸入層。
P-Tuning v2可以看作是prefix tuning的升級,和prefix tuning的區(qū)別在于P-Tuning V2每一層的prompt是獨(dú)立的,并不是由上一層計算得來。
6. Specification-based
6.1 BitFit:更新bias參數(shù)
BitFit(論文:BitFit: Simple Parameter-efficient Fine-tuning or Transformer-based Masked Language-models,2021)是一種稀疏的微調(diào)方法,它訓(xùn)練時只更新bias的參數(shù)或者部分bias參數(shù)。涉及到的bias參數(shù)有attention模塊中計算query,key,value跟合并多個attention結(jié)果時涉及到的bias,MLP層中的bias,Layernormalization層的bias參數(shù)。
在Bert-Base/Bert-Large這種模型里,bias參數(shù)僅占模型全部參數(shù)量的0.08%~0.09%。但是通過在Bert-Large模型上基于GLUE數(shù)據(jù)集進(jìn)行了 BitFit、Adapter和Diff-Pruning的效果對比發(fā)現(xiàn),BitFit在參數(shù)量遠(yuǎn)小于Adapter、Diff-Pruning的情況下,效果與Adapter、Diff-Pruning想當(dāng),甚至在某些任務(wù)上略優(yōu)于Adapter、Diff-Pruning。
另外,通過對比BitFit訓(xùn)練前后的參數(shù),發(fā)現(xiàn)很多bias參數(shù)并沒有太多變化(例如:跟計算key所涉及到的bias參數(shù))。發(fā)現(xiàn)計算query和將特征維度從N放大到4N的FFN層(intermediate)的bias參數(shù)變化最為明顯,只更新這兩類bias參數(shù)也能達(dá)到不錯的效果。文章來源:http://www.zghlxwxcb.cn/news/detail-834126.html
7. Reparameterization-based
7.1 Intrinsic prompt tuning
下圖展示了如何從fine-tuning一步步轉(zhuǎn)移到Intrinsic prompt tuning文章來源地址http://www.zghlxwxcb.cn/news/detail-834126.html
7.2 LoRA
到了這里,關(guān)于深度學(xué)習(xí)系列53:大模型微調(diào)概述的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!