李弘毅老師實驗室出品,非常棒的語言模型近期(2022年)進展的介紹,出自chatGPT問世前的世代
Prompt Engineering(提示工程)
PEFT(Parameter-efficient Fine-tuning,參數高效微調)
將這兩種方法對比,可以這樣理解:Prompt Engineering是一種直觀且更接近人類思維的方法,而PEFT是一種更數學化、需要計算資源進行數值優化的方法。Prompt Engineering在概念上更簡單,但可能需要更多的創造性和人工參與。相反,PEFT雖然在計算上更複雜,但它提供了一種更細膩控制模型的方式,並且可以自動化進行
以下摘錄PEFT的四種重要方法(2022年)
PLMs are gigantic
What is standard fine-tuning really doing?
Fine-tuning = modifying the hidden representation based on a PLM
def transformer_block_with_adapter(x):
residual = x
x = SelfAttention(x)
x = FFN(x) # adapter
x = LN(x + residual)
residual = x
x = FFN(x) # transformer FFN
x = FFN(x) # adapter
x = LN(x + residual)
return x
Use special submodules to modify hidden representations!
small trainable submodules inserted in transformers
在transformers模塊後面插入小型的可訓練運算模算
During fine-tuning, only update the adpaters and the classifier head
梯度更新時凍結預訓練模型的部分、只更新adpaters跟橋接下游任務的分類頭
All downstream tasks share the PLM; the adapters in each layer and the classifier heads are the task-specific modules
所有下游任務共享預訓練的語言模型(PLM,即現代所說的LLM)、針對下游特定任務則有專屬的adapters跟分類頭
def lora_linear(x):
h = x @ W # regular linear
h += x @ W_A @ W_B # low-rank update
return scale * h
在Transformer層的上採樣與下採樣計算模塊,分別搭配一組可訓練的參數
LoRA設計概念
動機: Downstream fine-tunings have low intrinsic dimension
權重更新: Weight after fine-tuning =
微調後的權重可以表示為
假設: The updates to the weight
權重的更新
微調後的權重: Fine-tuned weight =
, rank
微調後的權重
All downstream tasks share the PLM; the LoRA in each layer and the classifier heads are the task-specific modules
4-3 Prefix tuning
def transformer_block_for_prefix_tuning(x):
soft_prompt = FFN(soft_prompt)
x = concat([soft_prompt, x], dim=seq)
return transformer_block(x)
前綴微調是一種特殊的微調技術,其中只有模型的一部分參數(即前綴)是可訓練的,而模型的其餘部分保持固定
Standard Self-Attention
Insert trainable prefix
Only the prefix (key and value) are updated during finetuning
個人想法
4-4 (Soft) Prompt tuning / Soft Prompting
def soft_prompted_model(input_ids):
x = Embed(input_ids)
x = concat([soft_prompt, x], dim=seq)
return model(x)
(Hard) prompting: add words in the input sentence
Hard Prompts: words (that are originally in the vocabulary)
直接在輸入句子中添加固定的詞彙。這些詞彙是原始詞彙表中的詞彙
Soft Prompts: vectors (can be initialized from some word embeddings)
提供理論說明、實做程式碼
由於原始模型參數被凍結且不會被這兩種方法所改變,p-tuning/prompt tuning也避免了常在細微調整模型時遇到的災難性遺忘問題
p-tuning和prompt tuning不是選擇手動或自動的方式來選擇離散的文本提示,而是使用可以通過梯度下降來優化的虛擬提示嵌入。在NeMo-Megatron中,prompt tuning和p-tuning的唯一區別在於在訓練過程中用來調整軟提示token的架構
我們將使用continuous、soft和virtual token這些術語來交替指代插入到模型提示中的嵌入,這些嵌入在模型的詞彙中沒有具體映射到字符串或字符。這些虛擬token嵌入與構成模型詞彙的離散、硬或真實token形成對比。虛擬token純粹是1D向量,其維度等於每個真實token嵌入,匹配hidden_size超參數。在訓練和推理中,連續token嵌入根據您在模型的配置中提供的模板,插入到離散token嵌入中。我們將在下面展示如何做到這一點。
Prompt Tuning
- 左側:Model Tuning。每一個特定的任務創建一個獨立的模型副本,並對這些副本進行微調
- 右側:在Prompt Tuning中,只需要在原始的預訓練模型前加入少量的任務特定的prompt(提示)
- 這些prompt作為輸入的一部分,引導模型生成特定任務的輸出。這樣就不需要對模型的核心參數進行改變,從而大幅減少所需的參數量和存儲空間(T5 "XXL" Model: 11B > 20K, with 5 prompt token )
在對預訓練的GPT模型進行prompt tuning時,軟提示嵌入作為一個2D矩陣初始化,大小為total_virtual_tokens X hidden_size。每個任務都有其自己的2D嵌入矩陣與之關聯。任務在訓練或推理期間不共享任何參數。所有GPT模型參數被凍結,只有每個任務的嵌入參數在訓練期間更新(各任務間參數獨立)。
在prompt tuning中,您可以指定每個任務的嵌入如何初始化。您可以:
如果您選擇從現有的嵌入權重初始化虛擬token嵌入,您可以在模型的配置中提供您想用於初始化的單詞字符串。這個字符串將被分詞並鋪平或截斷,以匹配您希望使用的虛擬token總數(total_virtual_tokens)。詞彙嵌入被複製並用於為每個任務初始化軟提示嵌入矩陣。詞彙嵌入本身在prompt tuning過程中不更新或改變。
P-Tuning
- 圖a(Discrete Prompt Search)即所謂的以自然語言提示
- 在這個過程中,一個提示生成器(Prompt Generator)被用來為一個給定的輸入和目標創建一個或多個discrete prompts(離散提示)。
- 例如,"The capital of Britain is [MASK]",其中"[MASK]"是要模型預測的部分。
提示(橙色區域)是根據輸入(藍色區域)而生成的,而模型則根據這些提示生成對應的輸出。在這個過程中,提示是不可微分的,並且通常是通過試錯來進行優化的。- 圖b(P-Tuning)
- 在P-Tuning過程中,一個稱為prompt encoder的結構(通常是一個LSTM)被用來生成prompt的嵌入。與Prompt Search不同的是,P-Tuning中的prompt是連續的(可以微分的),這意味著prompt的嵌入和prompt encoder可以通過梯度下降(反向傳播)來優化。
- 在這個例子中,prompt encoder產生一系列的prompt嵌入(P0到Pj),它們與輸入一起進行處理,以協助模型預測出隱藏的詞("[MASK]")
- 這種方法的好處是,它允許對提示進行微調,以最大化性能,而不僅僅是依賴於固定的、離散的提示
在p-tuning中,使用一個LSTM模型來預測虛擬token嵌入。我們將這個LSTM模型稱為prompt_encoder。LSTM參數在p-tuning開始時隨機初始化。所有GPT模型參數被凍結,只有LSTM權重在每個訓練步驟中更新。LSTM參數所有任務間共享,但LSTM模型為每個任務輸出唯一的虛擬token嵌入。LSTM預測的虛擬token以與prompt-tuning完全相同的方式插入到離散token輸入中。您仍然通過設置total_virtual_tokens來指定您想使用的虛擬token數量,每個虛擬token嵌入仍然是大小為hidden_size的1D向量。
Using Both Prompt and P-Tuning
由於p-tuning在訓練期間在任務間共享參數,因此在多個相似任務上對模型進行p-tuning可能會使您的模型在任務間分享洞察力。同樣地,一次在許多非常不同的任務上進行p-tuning可能比prompt tuning表現更差,後者為每個任務調整一套獨立的參數。通常我們推薦使用p-tuning而不是prompt tuning。
Soft prompts can be trained for the input layer only (Liu et al.,2021; Lester et al., 2021) or for all layers (Li and Liang, 2021).