[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力
最近拜讀
盤古alpha
的超大規模預訓練模型,(最大2000億引數),看到有關於
P-tuning
這個微調(煉丹)技巧的使用,特別好奇如何對於這樣的超大規模的模型進行“微調”。(因為GPT3直接都是zero-shot, one-shot, few-short learning為主了)。
標題就十分的,高,大,上!
GPT,也,“理解”
- 因為一般而言,NLP被分成了兩大類任務:NLU-自然語言理解-natural language understanding;以及NLG-自然語言生成-natural langauge generation。
那麼作為NLG的自迴歸方法訓練出來的GPT系列的模型,應該更側重對於“生成任務”的輸出,而本論文說的是,
GPT也可以
對“理解/分類任務”進行
瘋狂輸出
!
程式碼:
GitHub - THUDM/P-tuning: A novel method to tune language models。 Codes and datasets for paper ``GPT understands, too‘’。
第一部分,回顧GPT-3告訴了我們啥
首先,當然是:
大
大
大
其一:知識與常識的能力
,GPT3這樣的超大規模語言模型,直接作為知識圖譜或者搜尋引擎,問答模型的“潛力”;即,相比於傳統的基於key-value的方法(例如memory networks)或者三元組(哈爾濱,是,省會)的方式,
GPTx具備更強大的,更通用的知識儲存能力
。
舉例子(多輪對話,生成式回覆):
giraffe=長頸鹿。
特別是後面兩個例子,(“長頸鹿有幾隻眼睛”->“一頭長頸鹿有兩隻眼睛”;“一隻青蛙有幾條腿”->“一隻青蛙有四條腿”),都屬於“常識”了。
其二,(小樣本)自然語言理解(注意,是”理解“)
-
priming
(
初始樣本-方法一
):
A is B; C is D;
please answer: E is ——-?
-
prompt
(
提示-方法二
):A
is
B; C
is
D;
please answer:
E
is
——-?
-根本原因:GPT-3太大,幾乎無法fine-tuning,(太貴。。。)幾乎無法微調(也就是二次煉丹比較難)。打個形象的比喻,有一頭大象(GPT3),有下游任務上的幾千條(甚至上萬條)資料(螞蟻),這個時候的微調,就有點像“螞蟻撼動大象”的既視感——勇氣可嘉。。。
對於GPT3這樣的超大模型,更常用的是類似如下的few-shot學習:
例如:
上圖是關於用gpt3來做“英文翻譯到法文“的任務:
而上圖,也來自gpt3的論文,說的是few-shot學習的效果,要顯著好於zero-shot或者one-shot學習。即對於目標任務,如果有
更多
的”觀察例項“輸送給GPT3,則效果會
更好
。
至此,我們有哪些觀察?背後分別反映的問題是什麼???如何獲取解決這些問題的思路???
現象1:預訓練模型可以學習到大量的知識和常識
,問題在於,如何量化?即:
預訓練模型都學習到了哪些知識?精確度如何?覆蓋度如何?如果在應用過程中,有些知識明顯不對,或者缺失,那應該如何“補救”?更提前一步,如何“預防”出錯?
故此,如何“探測”和“利用”大模型學習到的“哪些”知識?
現象2:預訓練模型具有(小樣本)自然語言理解能力
,問題在於,GPT這樣的
生成式預訓練語言模型能否用於(分類式)NLU任務
並取得sota或者接近sota的效果?另外,小樣本語言理解的“邊界”在哪裡?即,我們對於“小樣本”本身的取樣是否有“公平性”要求?有“數量”、“質量”上的要求?
現象3:大規模預訓練模型到下游任務的遷移能力問題
,fine-tune是唯一的選擇嗎?效果如何?除了fine-tune,其他我們還有什麼樣的方法來更好地利用大規模預訓練模型?
上面的若干問題的回答,對於gpt及類似流派的生成式預訓練語言模型,具有重要的實際意義。
小結一下“重點”,可以簡化問題,預訓練模型和知識之間具有某種”雞生蛋,蛋生雞“的邏輯關係。
第二部分:預訓練模型與知識:兩篇文章的簡介
這裡需要提到一篇文章-EMNLP2019:
(LAMA
:) langauge models as knowledge base? (patroni, 2019) 來自facebook的工作。
喇馬???希望這個文章不要被這個敏感詞遮蔽才好。。。
LAMA =
LA
nguage
M
odel
A
nalysis
這篇文章
首次提出語言模型可以作為知識庫
的構想;透過
人工構建的模板(cloze templates)
,不fine-tune語言模型,在T-REx(T-Rex : A Large Scale Alignment of Natural Language with Knowledge Base Triples - the Datahub)上取得了相對好的效果:
上圖是”應用“的示例,上半部分是使用傳統知識圖譜的時候,構建sql型別的查詢query,然後系統返回結果;(Dante=但丁)
而下半部分,則是使用自然語言句子作為輸入,然後有個[mask],代表等待被填充的結果。“Florence”,這是透過對bert等模型的一次forword推理得到的(即,讓BERT這樣的預訓練模型去預測[MASK]的部分應該填充什麼樣的詞)。
可以看到bert等大規模預訓練模型的優勢。而構建這些超大規模語言模型,需要的人工干預,相對於KB的構建,要輕量的多。
另外一篇文章,
How Much Knowledge Can You Pack Into the Parameters of a Language Model?
是將百億T5 fine-tune用於
閉卷的”開放領域問答“
(open domain
QA
);即,“without access to any external context or knowledge“(不訪問任何外部的上下文或者知識)。
其效果
超過
幾乎全部過往開卷問答系統。
上半部分是T5的自己的seq2seq的預訓練任務,該預訓練任務綜合了bert和gpt的思想:一個Phrase被mask掉,然後預測的時候,對於phrase,不是一次output,而是採用auto-regressive的方式從左到右逐詞預測。
即,其損失函式可以寫成:
Seq2Seq MLM,序列到序列遮掩語言模型(前一個序列雙向,後一個序列單向),被遮掩的是一個phrase,即一個word span。例如,I live in New York。 這個句子,假設
New York被遮掩(masked)
,則要計算的是:
p(
New
|I live in [mask] [mask]) * p(York| I live in
New
[mask])。
可以看到剩餘的序列I live in都參與了,而當預測New的時候,輸入條件是I live in [mask] [mask],繼續當預測York的時候,輸入就變成了I live in New [mask]。
這和MLM不同,MLM是類似p(New|I live in [mask] [mask] * p(York|I live in [mask] [mask])[其隔斷了New York之間的依賴關係。。。]。
詳細的總結可以參考我的另外一篇總結文章:
下半部分則是來自開放領域問答的training data,直接扔過去pairs,然後讓系統回答。從而實現fine-tuning。
可以看到,在三個open domain資料集,Nautral questions, webquestions, 以及triviaQA上都取得了很好的效果。
第三部分:預訓練模型與知識:極限在哪裡?
對於上面提到的第一篇文章來說,當使用
人工模板
(將知識三元組轉化成一句填空題,採用人類寫的模板),其問題在於,十分脆弱,一個詞的變化會導致預測準確率的巨大改變。
例如,在P-tuning的論文中,對LAMA的效果進行了分析:
(人工構建的模板,使用的token是離散的,帶有很大的”波動性“-太脆弱了!)
再 簡單回顧另外一篇文章,
AutoPrompt: Eliciting knowledge from language models with automatically generated prompts (Shin+, 2020)
思想:
自動構建模板
,透過梯度方法搜尋離散的“自動提示”(auto prompt);用於LAMA和小樣本學習(無fine-tune)
上面的圖中,a real joy是原始輸入的句子;後邊的紅色的trigger tokens是自動搜尋出來的相關的詞彙集合;這些詞彙組成的序列,會作為x-prompt的一部分,扔給masked LM來預測下一步的情感標籤,例如positive或者negative。
下面的表格中,增加了很多具體的例子:
效果相對於LAMA有比較大的提升。
但是,這個方法,仍然是在
”離散空間“上的搜尋
(trigger words)。
動機:拋棄離散空間上的搜尋,直接在連續空間上尋找更加合適的”知識模板“。
第四部分:P-tuning的核心思想
P-tuning:
精髓一:自動化地尋找連續空間中的知識模板;
精髓二:訓練知識模板,但不fine-tune語言模型。
上圖左邊,就是傳統的
基於”離散空間“搜尋模板
的示意圖。
The capital of Britain is [MASK] 是很典型的一個LAMA的模板;藍色的Britain是上下文context,紅色的[MASK]是目標target;而橙色的the capital of 。。。 is 。。。是prompt tokens。可惜的是,
論文中並沒有就“prompt generator”的細節進行進一步的闡述
。。。
改進在哪裡?上圖右邊:
把一個個的詞,直接替換為可以被訓練的一個個的稠密向量(dense vectors),相當於在連續空間中去學習一個prompt,給定小量的訓練樣本,看其是否可以更好地預測。
這個圖裡面,有幾個疑點
:
其一,
i的大小,以及m的大小,如何確定
?i貌似決定了context - 例如Britain被塞入到prompt 的具體的位置;而m表示的則是prompt tokens中的數量(m+1,因為是從h0開始到hm);
其二,pseudo prompts,[P0], 。。。, [Pi], 。。。, [Pi+1], 。。。, [Pm]是一個個的“佔位符”嗎?目前知道的是論文中說,”prompt encoder -> 使用的是a bidirectional long-short term memory networks - LSTM),加上一個使用ReLU作為啟用函式的雙層MLP。即:
其三,“discrete rewards”-離散的獎勵,這個獎勵函式的細節,目前在論文中沒有找到。
細化描述:
給定一個預訓練語言模型:
;
一個離散的輸入序列:
,以及這個序列的經歷了嵌入層
的輸出
;
一個“處理後”的tokens序列,
,並且它會被用來“參與”下游任務的處理。例如,在BERT預訓練裡面,
代表的是未被mask的原始的輸入序列,
代表的是那些被mask掉的詞(注意,不包括沒有被mask掉的詞)。再如,在句子分類裡面,
代表的是原始的句子輸入,
代表的是[CLS];
一個prompt
的功能是組織上下文
,目標序列
,以及prompt 自己,到一個模板T。例如,在一個預測一個國家的首都的例子中(我的吐槽:一共就200多個國家和地區,直接一個表格就搞定了,為啥要“預測”呢???),一個模板T的例子為:
“The capital of Britain is [MASK]",這裡面,”The capital of ... is ...“是prompt,”Britain“是context,以及[MASK]是目標。
是預訓練語言模型
的詞表;
[Pi]是模板T中的第i個prompt token;
正式地,一個模板T被表示為:
,這裡面的每個元素都是一個”token“。
經過embedding層之後,上面的模板T可以被表示為:
。
與上面對應的是,在P-tuning裡面,不是使用的一個個
離散的
prompt tokens,而是把每個[Pi]看成一個pseudo token,並把模板T對映成:
,這裡面,
是可訓練的embedding tensors(
連續的
張量了)。這樣做的好處(把一個個離散的tokens,替換成一個個稠密表示的張量),在於,其可以促使我們找到一個個更好的連續的prompts,其可以“擺脫”/超越,原始的詞典
的表示能力範圍。
最後,基於下游的損失函式
(根據任務的不同,損失函式的具體的計算公式也會不一樣),我們可以透過微分操作來最最佳化連續的prompt
:
從實驗結果上看,P-tuning可以顯著提升在LAMA上的結果;並且認為
預訓練語言模型的確擁有比我們想象更多的知識
。
上面的表格,左右分別對應LAMA-34K和LAMA-29K,這兩個資料集合。
第五部分:預訓練模型與小樣本語言理解之間的關聯
P-tuning: 一個相當異常的現象,
P-tuning對GPT增益極高
,Fine-tuning則不然。
思考:
GPT過往在NLU任務上表現不佳,
其一,是否僅僅是因為fine-tuning並不適合GPT?
其二,是否僅僅是因為”基於嵌入“的分類方法,不適用於GPT?
類似的,有一篇文章:it‘s not just size that matters: small language models are also few-short learners (schick, 2021)
是把gpt-3的模板方法(prompt),引入小規模模型的fine-tune中。思想和LAMA很像。
上面左圖,是設定兩種“template”,然後預測”填空“。
還有一篇文章:
prefix-tuning: optimizing continuous prompts for generation (Li, 2021).
是在生成(NLG)任務上,
在文段開頭引入連續的字首向量
;
可以在眾多
生成任務上超越fine-tuning
。
拒絕fine-tune,是在文段輸入的”前面“,插入(transformer的每一層),都加入prefix。
P-tuning可以與fine-tuning“分庭抗爭”的結果如下:
上面是把P-tuning分別應用到bert和gpt上面的效果。
可以看到,
在相同引數規模下,bert的在nlu任務上的效果,超過gpt很多;但是在p-tuning下,gpt可以取得超越bert的效果。
另外,即使對於bert,在p-tuning(模板+可調引數)下,其效果也有一定的提升。
很多時候,bert在大規模語料上,表現很不穩定了。到千億級別,基本fine-tuning就不work了。
P-tuning的優勢,穩定提升現有的人工的模板。
Dev32這個小的驗證集,還是不夠。
第六部分:P-tuning與超大規模模型微調的關係
P-tuning相比fine-tuning的優勢:
其一,超大規模模型難以支援fine-tuning方法;
其二,P-tuning仍然可行;
類似的思想,有一篇文章,2021的:
The Power of Scale for Parameter-Efficient Prompt Tuning (Lester, 2021):
其在11B的google T5上探究prompt tuning相比fine-tuning的效能;
fine-tuning: 隨著模型規模的增大,提升逐漸飽和;
prompt tuning: 隨著模型規模的增大,效能提升與數量級基本呈現線性增長!!!
所以,(類似方案如)p-tuning是超大規模語言模型實用化的必然要求!
橘紅色是fine-tuning的效果,可以看到在10^8, 10^9上還好,但是後續明顯能力不足了。
對應的,prompt tuning,基本是線性的。(遺憾的是沒有看到後續的更好的效果。。。)
華為的盤古千億模型
(200B),基於p-tuning,在小樣本任務上進行下游遷移;
如何提高少樣本學習能力?
為了克服少樣本學習難題,該研究團隊進行了兩方面的努力。
一是利用遷移學習
。與 GPT-3 的少樣本學習方式不同,盤古模型的技術路線是透過元學習的方式在任務之間進行遷移,從而實現少樣本學習的目標。這種方式可以更好地利用任務之間的相似性,得到更好的少樣本學習結果。
二是將 P-tuning、priming 等最新技術融入到盤古的微調框架中
,進一步提升微調效果。
下面兩個圖展示了 CNN、中文版 GPT-3、BERT、RoBERTa 和盤古在少樣本場景下的學習能力。
複雜商用場景實測不同模型少樣本學習達到的 F1 結果(100%表示跟 full label 結果相同)
各模型複雜商用場景實測得到目標 F1 結果所需的平均樣本量
從第一幅圖可以看出,在樣本極少的情況下,盤古的少樣本學習能力遠超上述 GPT 系列和 BERT 系列。
第二幅圖則顯示,要得到相同的 F1 結果,盤古所需的資料量僅為中文 GPT-3 的 1/9,
實現了近 10 倍的生產效率提升
。「也就是說,以前可能兩個星期才能完成的一些工作,現在你用一兩天就可以做完。所以,這個模型實際上有很大機會去變革提升生產效率。」
這個領域(
不fine-tuning的前提下使用超大規模預訓練語言模型
)相對比較新,很有價值。
時間倉促,又特別想著看奧運會,有些地方寫的不詳細,期待後續結合程式碼更新一版。