您當前的位置:首頁 > 詩詞

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

作者:由 迷途小書僮 發表于 詩詞時間:2021-07-26

最近拜讀

盤古alpha

的超大規模預訓練模型,(最大2000億引數),看到有關於

P-tuning

這個微調(煉丹)技巧的使用,特別好奇如何對於這樣的超大規模的模型進行“微調”。(因為GPT3直接都是zero-shot, one-shot, few-short learning為主了)。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

標題就十分的,高,大,上!

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具備更強大的,更通用的知識儲存能力

舉例子(多輪對話,生成式回覆):

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

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學習:

例如:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

上圖是關於用gpt3來做“英文翻譯到法文“的任務:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

而上圖,也來自gpt3的論文,說的是few-shot學習的效果,要顯著好於zero-shot或者one-shot學習。即對於目標任務,如果有

更多

的”觀察例項“輸送給GPT3,則效果會

更好

至此,我們有哪些觀察?背後分別反映的問題是什麼???如何獲取解決這些問題的思路???

現象1:預訓練模型可以學習到大量的知識和常識

,問題在於,如何量化?即:

預訓練模型都學習到了哪些知識?精確度如何?覆蓋度如何?如果在應用過程中,有些知識明顯不對,或者缺失,那應該如何“補救”?更提前一步,如何“預防”出錯?

故此,如何“探測”和“利用”大模型學習到的“哪些”知識?

現象2:預訓練模型具有(小樣本)自然語言理解能力

,問題在於,GPT這樣的

生成式預訓練語言模型能否用於(分類式)NLU任務

並取得sota或者接近sota的效果?另外,小樣本語言理解的“邊界”在哪裡?即,我們對於“小樣本”本身的取樣是否有“公平性”要求?有“數量”、“質量”上的要求?

現象3:大規模預訓練模型到下游任務的遷移能力問題

,fine-tune是唯一的選擇嗎?效果如何?除了fine-tune,其他我們還有什麼樣的方法來更好地利用大規模預訓練模型?

上面的若干問題的回答,對於gpt及類似流派的生成式預訓練語言模型,具有重要的實際意義。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

小結一下“重點”,可以簡化問題,預訓練模型和知識之間具有某種”雞生蛋,蛋生雞“的邏輯關係。

第二部分:預訓練模型與知識:兩篇文章的簡介

這裡需要提到一篇文章-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)上取得了相對好的效果:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

上圖是”應用“的示例,上半部分是使用傳統知識圖譜的時候,構建sql型別的查詢query,然後系統返回結果;(Dante=但丁)

而下半部分,則是使用自然語言句子作為輸入,然後有個[mask],代表等待被填充的結果。“Florence”,這是透過對bert等模型的一次forword推理得到的(即,讓BERT這樣的預訓練模型去預測[MASK]的部分應該填充什麼樣的詞)。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

可以看到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“(不訪問任何外部的上下文或者知識)。

其效果

超過

幾乎全部過往開卷問答系統。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

上半部分是T5的自己的seq2seq的預訓練任務,該預訓練任務綜合了bert和gpt的思想:一個Phrase被mask掉,然後預測的時候,對於phrase,不是一次output,而是採用auto-regressive的方式從左到右逐詞預測。

即,其損失函式可以寫成:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

\mathcal{L}_{S2SMLM}=-\sum_{t=i}^j\text{log}p(x_t|\textbf{x}_{ \backslash \textbf{x}_{i:j}}, \ \textbf{x}_{i:t-1})

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。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

可以看到,在三個open domain資料集,Nautral questions, webquestions, 以及triviaQA上都取得了很好的效果。

第三部分:預訓練模型與知識:極限在哪裡?

對於上面提到的第一篇文章來說,當使用

人工模板

(將知識三元組轉化成一句填空題,採用人類寫的模板),其問題在於,十分脆弱,一個詞的變化會導致預測準確率的巨大改變。

例如,在P-tuning的論文中,對LAMA的效果進行了分析:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

(人工構建的模板,使用的token是離散的,帶有很大的”波動性“-太脆弱了!)

再 簡單回顧另外一篇文章,

AutoPrompt: Eliciting knowledge from language models with automatically generated prompts (Shin+, 2020)

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

思想:

自動構建模板

,透過梯度方法搜尋離散的“自動提示”(auto prompt);用於LAMA和小樣本學習(無fine-tune)

上面的圖中,a real joy是原始輸入的句子;後邊的紅色的trigger tokens是自動搜尋出來的相關的詞彙集合;這些詞彙組成的序列,會作為x-prompt的一部分,扔給masked LM來預測下一步的情感標籤,例如positive或者negative。

下面的表格中,增加了很多具體的例子:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

效果相對於LAMA有比較大的提升。

但是,這個方法,仍然是在

”離散空間“上的搜尋

(trigger words)。

動機:拋棄離散空間上的搜尋,直接在連續空間上尋找更加合適的”知識模板“。

第四部分:P-tuning的核心思想

[細讀經典]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。即:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

其三,“discrete rewards”-離散的獎勵,這個獎勵函式的細節,目前在論文中沒有找到。

細化描述:

給定一個預訓練語言模型:

\mathcal{M}

一個離散的輸入序列:

\textbf{x}_{1:n}=\{x_0, x_1, ..., x_n\}

,以及這個序列的經歷了嵌入層

\textbf{e}\in \mathcal{M}

的輸出

\{\textbf{e}(x_0), \textbf{e}(x_1), ..., \textbf{e}(x_n)\}

一個“處理後”的tokens序列,

\textbf{y}

,並且它會被用來“參與”下游任務的處理。例如,在BERT預訓練裡面,

\textbf{x}

代表的是未被mask的原始的輸入序列,

\textbf{y}

代表的是那些被mask掉的詞(注意,不包括沒有被mask掉的詞)。再如,在句子分類裡面,

\textbf{x}

代表的是原始的句子輸入,

\textbf{y}

代表的是[CLS];

一個prompt

\textbf{p}

的功能是組織上下文

\textbf{x}

,目標序列

\textbf{y}

,以及prompt 自己,到一個模板T。例如,在一個預測一個國家的首都的例子中(我的吐槽:一共就200多個國家和地區,直接一個表格就搞定了,為啥要“預測”呢???),一個模板T的例子為:

“The capital of Britain is [MASK]",這裡面,”The capital of ... is ...“是prompt,”Britain“是context,以及[MASK]是目標。

\mathcal{V}

是預訓練語言模型

\mathcal{M}

的詞表;

[Pi]是模板T中的第i個prompt token;

正式地,一個模板T被表示為:

T=\{[P_{0:i}], \textbf{x}, [P_{i+1:m}], \textbf{y}\}

,這裡面的每個元素都是一個”token“。

經過embedding層之後,上面的模板T可以被表示為:

\{\textbf{e}([P_{0:i}]), \textbf{e}(\textbf{x}), \textbf{e}([P_{i+1:m}]), \textbf{e}(\textbf{y})\}

與上面對應的是,在P-tuning裡面,不是使用的一個個

離散的

prompt tokens,而是把每個[Pi]看成一個pseudo token,並把模板T對映成:

\{h_0, ..., h_i, \textbf{e}(\textbf{x}), h_{i+1}, ..., h_m, \textbf{e}(\textbf{y})\}

,這裡面,

h_i(0\leq i<m)

是可訓練的embedding tensors(

連續的

張量了)。這樣做的好處(把一個個離散的tokens,替換成一個個稠密表示的張量),在於,其可以促使我們找到一個個更好的連續的prompts,其可以“擺脫”/超越,原始的詞典

\mathcal{V}

的表示能力範圍。

最後,基於下游的損失函式

\mathcal{L}

(根據任務的不同,損失函式的具體的計算公式也會不一樣),我們可以透過微分操作來最最佳化連續的prompt

h_i(0\leq i<m)

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

從實驗結果上看,P-tuning可以顯著提升在LAMA上的結果;並且認為

預訓練語言模型的確擁有比我們想象更多的知識

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

上面的表格,左右分別對應LAMA-34K和LAMA-29K,這兩個資料集合。

第五部分:預訓練模型與小樣本語言理解之間的關聯

P-tuning: 一個相當異常的現象,

P-tuning對GPT增益極高

,Fine-tuning則不然。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

思考:

GPT過往在NLU任務上表現不佳,

其一,是否僅僅是因為fine-tuning並不適合GPT?

其二,是否僅僅是因為”基於嵌入“的分類方法,不適用於GPT?

類似的,有一篇文章:it‘s not just size that matters: small language models are also few-short learners (schick, 2021)

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

是把gpt-3的模板方法(prompt),引入小規模模型的fine-tune中。思想和LAMA很像。

上面左圖,是設定兩種“template”,然後預測”填空“。

還有一篇文章:

prefix-tuning: optimizing continuous prompts for generation (Li, 2021).

是在生成(NLG)任務上,

在文段開頭引入連續的字首向量

可以在眾多

生成任務上超越fine-tuning

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

拒絕fine-tune,是在文段輸入的”前面“,插入(transformer的每一層),都加入prefix。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

P-tuning可以與fine-tuning“分庭抗爭”的結果如下:

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

上面是把P-tuning分別應用到bert和gpt上面的效果。

可以看到,

在相同引數規模下,bert的在nlu任務上的效果,超過gpt很多;但是在p-tuning下,gpt可以取得超越bert的效果。

另外,即使對於bert,在p-tuning(模板+可調引數)下,其效果也有一定的提升。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

很多時候,bert在大規模語料上,表現很不穩定了。到千億級別,基本fine-tuning就不work了。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

P-tuning的優勢,穩定提升現有的人工的模板。

Dev32這個小的驗證集,還是不夠。

第六部分:P-tuning與超大規模模型微調的關係

P-tuning相比fine-tuning的優勢:

其一,超大規模模型難以支援fine-tuning方法;

其二,P-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是超大規模語言模型實用化的必然要求!

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

橘紅色是fine-tuning的效果,可以看到在10^8, 10^9上還好,但是後續明顯能力不足了。

對應的,prompt tuning,基本是線性的。(遺憾的是沒有看到後續的更好的效果。。。)

華為的盤古千億模型

(200B),基於p-tuning,在小樣本任務上進行下游遷移;

如何提高少樣本學習能力?

為了克服少樣本學習難題,該研究團隊進行了兩方面的努力。

一是利用遷移學習

。與 GPT-3 的少樣本學習方式不同,盤古模型的技術路線是透過元學習的方式在任務之間進行遷移,從而實現少樣本學習的目標。這種方式可以更好地利用任務之間的相似性,得到更好的少樣本學習結果。

二是將 P-tuning、priming 等最新技術融入到盤古的微調框架中

,進一步提升微調效果。

下面兩個圖展示了 CNN、中文版 GPT-3、BERT、RoBERTa 和盤古在少樣本場景下的學習能力。

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

複雜商用場景實測不同模型少樣本學習達到的 F1 結果(100%表示跟 full label 結果相同)

[細讀經典]P-tuning:用“連續提示微調”來增強“超大規模語言模型”的下游能力

各模型複雜商用場景實測得到目標 F1 結果所需的平均樣本量

從第一幅圖可以看出,在樣本極少的情況下,盤古的少樣本學習能力遠超上述 GPT 系列和 BERT 系列。

第二幅圖則顯示,要得到相同的 F1 結果,盤古所需的資料量僅為中文 GPT-3 的 1/9,

實現了近 10 倍的生產效率提升

。「也就是說,以前可能兩個星期才能完成的一些工作,現在你用一兩天就可以做完。所以,這個模型實際上有很大機會去變革提升生產效率。」

這個領域(

不fine-tuning的前提下使用超大規模預訓練語言模型

)相對比較新,很有價值。

時間倉促,又特別想著看奧運會,有些地方寫的不詳細,期待後續結合程式碼更新一版。

標簽: tuning  模型  fine  prompt  模板