劉鵬飛老師認為NLP目前為止經歷了四個階段(范式):
完全監督機器學習
完全監督深度學習
預訓練模型微調: 預訓練->微調->預測
Prompt提示學習:預訓練->提示->預測
在階段①中,我認為work的本質是特征,即特征的選取、衍生、側重上的針對性工程。而在階段②中更多的是對數據集與結構的抽象化構建,無論是使用Conv還是Attention,大家總能講出來為什么work的好故事。階段③中的本質就是無監督方法了,無論是像BERT一樣構建MLM/NSP,還是各種變體(PLM,DAE)也都是在如何更好的訓練預訓練模型這一問題上下足了功夫。
在階段④中,Prompt真正的不同是把焦點放在了讓下游任務來適應語言模型,而不是上述三個階段中的魔改語言模型來適應下游任務的變化。至于為什么這么做?我想可能有以下兩點原因:
- 語言模型越大 = 微調難度越大
- 相信語言模型具有獨立解決NLP問題的能力
其實第一點沒什么好解釋的,預訓練模型越大,所需要的預訓練預料也就越大,參數也就越多。如果微調時沒有足夠的數據,也就沒有辦法達到一個好的Fine-tuning效果。第二點也很好理解,預訓練語言模型的知識相當豐富,沒有必要為了利用它而去進行重構。
1. 講講Prompt方法
我們來先看一看什么是Prompt,在正常的預訓練模型中,微調是這樣的
Cheese in French is 【MASK】
而在Prompt Tuning中,將預訓練模型直接拿過來用,將任務轉化為這樣的形式
Translate English to French: /* task description */
cheese => ___ /* prompt */
上述這個例子是一個zero-shot learning
,我們再來看看one-shot learning
:
Translate English to French: /* task description */
sea otter => loutre de mer /* example */
cheese => ___ /* prompt */
在硬件耗材和語料規模上兩者的差距是顯而易見的,而Prompt方法的性能隨著LM的增大而增強,理論上LM是可以表現出無限學習的趨勢(超大規模語料加超大規模參數),所以Prompt展現的方法提供了更強大的限定域與相關性。總結一下Prompt的范式為:
自然語言指令(task description) + 任務demo(example) + 帶__的任務
而其中,自然語言指令與任務demo都是非必要存在的,當然了,信息越少效果越差,總不能把所有的寶都壓在別人訓練的模型上。
2. Prompt Engineering構建
2.1 Prompt Shape
簡單來說,Cloze Prompt和Prefix Pompt分別對應Prompt在句中還是句末。這個一般根據預訓練模型來選擇:
- 需要用自回歸語言模型解決的生成任務,Prefix Pompt往往更好,因為它符合模型從左到右的特點
- 需要用自編碼語言模型解決的掩碼任務,Cloze Prompt往往更好,因為它和預訓練任務的形式非常匹配
2.2 Manual Template Engineering
手動編寫,懂的都懂,需要計算機實驗、語言學理論、模型邏輯等方面的專業知識作為指導
2.3 Automated Template Learning
2.3.1 硬提示/離散提示(Hard Prompt/Discrete Prompt)
如上述例子一樣,硬提示即搜索空間是離散的。一般需要算法工程師在下游任務上具備非常豐富的經驗以及了解原預訓練模型的底層概念,一般硬提示的準確率會不及Fine-tuning的SOTA,而且不同的Prompt對模型的影響非常大,像是提示的長度提示詞匯的位置等等,一點Prompt的微小差別,可能會造成效果的巨大差異。
所以我們要做的就是兩件事:
- 設計一個合適的提示模板,創造一個完形填空的題目
- 設計一個合適的填空答案,創造一個完型填空的選項
具體有以下這么幾種方式:
- Prompt Mining:從大的語料庫中進行挖掘(一般是挖掘輸入與輸出之間的高頻詞作為模板構建元素)
- Prompt Paraphrasing:參考文本數據增強方法,可以做seed Prompt的同義詞替換,跨語種翻譯等
- Gradient-based Search:從候選詞中選擇一些詞作為Prompt并參與訓練,根據梯度下降對選擇詞重新排列組合
- Prompt Generation:通過文本生成模型直接生成一個Prompt
- Prompt Scoring:根據語言模型對所有候選Prompt打分,選擇一個對高分的Prompt使用
總而言之,上述Hard Prompt方法還是會輸出一個叫能被人類理解的句子
,為了不拘泥于人類的直觀理解(機器也未必會理解),還有一些方法可以構建連續性的向量作為Prompt
2.3.2 軟提示/連續提示(Continuous prompt / Soft prompt)
因為硬提示的相對不穩定性(過多融入語言符號),軟提示概念即將Prompt的生成作為模型的一個任務來學習,也就是將上述確定性的自然語言轉化為機器進行自我搜索的過程。
-
Prefix-tuning:在輸出前加上一串連續的向量(前綴prefix),保持PLM參數不變,僅訓練該向量。從數學上講,這包括在給定可訓練前綴矩陣
和由
參數化的固定PLM的情況下,對以下對數似然目標進行優化:
是時間步長
處所有神經網絡層的串聯。如果相應的時間步長在前綴內(
是
),則直接從
復制,否則使用PLM計算
- Tuning Initialized with Discrete Prompts:即先找到一個Hard Prompt,然后再基于該模板初始化Prompt的token,最后微調這些特殊token的embedding,較為簡單
- Hard-Soft Prompt Hybrid Tuning:在手工模板中添加一些可學習的embedding,作為結合
- P-turning:在3的基礎上,通過BiLSTM的輸出來表示Promptembedding,以便讓Prompt內部產生一定程度的交互