NLP新宠——Prompt范式
文章目錄
- 一、PET
- 1.1 PET建模
- 1.2 如何選取Prompt模板
- 1.3 預測得token如何映射label
- 1.4 實驗結果
- 二、KPT
- 2.1 主要idea
- 2.2 標簽詞的擴展
- 2.3 標簽詞去噪
- 2.4 語言表達器的使用
- 2.5 實驗結果
- 三、P-tuning
- 3.1 核心idea
- 3.2 實驗結果
- 四、總結與展望
- 五、參考資料
hi!又到每周分享的時刻了,希望大家能有收獲呀!!!!!!!!!!!
什么是Prompting ?它和Fine-tuning有什么區別?這里引用CMU劉鵬飛博士放在博客里的圖:
prompt是研究者們為下游任務設計的一種模板或者范式,這種范式能夠幫助預訓練模型回憶起自己預訓練學到的知識,其實說白了就是將下游任務和預訓練任務的統一(近似),比如說MLM。
對于輸入文本xxx,經過函數fprompt(x)f_{prompt}(x)fprompt?(x)得到x′x^{'}x′
x′=fprompt(x)x^{'}=f_{prompt}(x)x′=fprompt?(x)
該函數首先會使用一個模板,通常為自然語言(就是一句通順的話),因為預訓練模型訓練數據都是基于自然語言的,該模板一般包含兩個空位置:用于填輸入xxx的位置[x][x][x]和用于生成答案文本的zzz位置[Z][Z][Z]。
舉個🌰
假設輸入是: x = " I love this movie."
使用的模板是
" [X] Overall, it was a [Z] movie."
那么通過范式得到的x′x^{'}x′就是 “I love this movie. Overall it was a [Z] movie.”
Fine-tuning:使用預訓練模型去遷就我們的下游任務,也就是說根據具體的下游任務添加輔助loss然后反向梯度更新預訓練模型中的參數,這樣的話就不能很好的激發預訓練模型的潛能。
Prompting:讓我們的下游任務去遷就預訓練模型,其實是盡量讓下游任務和預訓練相似,充分發揮預訓練模型的潛能。
Prompt主要的幾個難點(還有很多這里挑兩個主要的):
1)如何選取模板?
2)MLM預測得token其實不可控,如何映射到label?
今天主要是想和大家分享三篇有關Prompt的論文。
一、PET
論文地址:https://arxiv.org/pdf/2001.07676.pdf
1.1 PET建模
可以看下左邊的圖這不是精調的過程嗎?確實是精調的流程作者另外加入MLM Loss去聯合訓練。
其中lll為labellabellabel,v(l)v(l)v(l)為label的映射作者稱為verbalizer,MMM為模型,P(x)P(x)P(x)就是模板,sss其實就是模型對mask位置預測的logits,然后通過softmax就可以得到最大概率的token
模型的loss,原文中說主要loss還是 LCEL_{CE}LCE?,LMLML_{MLM}LMLM?只是輔助loss,畢竟是預訓練模型。
右邊的圖其實就是說,我先通過少量樣本訓練多個不同Prompt范式模型,然后用這些模型去對未標注的數據進行標注(soft label)(多個模型加權或者平均),然后拿這些帶有soft label的數據去進行訓練。充分發揮Prompt范式在小樣本的作用。
1.2 如何選取Prompt模板
對于模板的選取,其實說實話得根據具體任務來定,誰也不曉得到底哪個模板適合我的任務,一般來說會采用多個模板最后結果進行加權或者平均,這樣的話會比較保險。PET其實就是這樣做的
PET針對不同任務手動設計了不同的Prompt,比如Yelp用戶評價星級預測(a是句子):
針對MNLI 任務(a、b都是句子):
1.3 預測得token如何映射label
PET其實是針對不同任務固定住label,預測是只需要在vocab中計算各個固定label的概率,然后選擇概率最大的label作為本次預測得結果。
在Yelp評價預測中,定義了五個映射:
也是就是模型會對mask的位置做個預測(預測結果shape一般為 [batch_size, sep_len, vocab_size]),然后手動計算上訴映射空間中計算每個單詞的概率,既:
P(lable)=max(p(terrible∣x),p(bad∣x),p(okay∣x),p(good∣x),p(great∣x)))P(lable)= max(p(terrible|x),p(bad|x),p(okay|x),p(good|x),p(great|x)))P(lable)=max(p(terrible∣x),p(bad∣x),p(okay∣x),p(good∣x),p(great∣x)))
其實在真實業務中我們的真實label可能非常的多而且長度也不一樣,針對label長度不一樣我們怎么去做mask呢,你可能會想到label長度不一樣那么我規定所以label長度一樣不就是了,這樣是可行的針對新業務來說但是如果是以前的舊業務呢,label早已經固定好了,上千個場景每個場景有幾十個label我都要一個個去重新定義label嗎?
筆者這里提供一個自己實踐的思路,其實我們可以固定mask的位數(一般取現有label集里最大的長度)對于長度達不到我設定的位數label可以進行padding。當然其實我們也可以不固定預測得label集,讓模型預測得結果不可控(可能生成的token不在label集里),這樣的話我們需要一個工具去做映射比如bm25等。
1.4 實驗結果
PE在少量樣本的情況下是完勝微調的
二、KPT
論文地址:https://arxiv.org/pdf/2108.02035.pdf
2.1 主要idea
下面給出一個例子說下本文的主要創新點,當我們要對一個句子進行分類時,可以嘗試構建下面的模板:
A [MASK] question: x
比如MLM預測出在[MASK]位置概率最高的詞是science,那該句可以被分類為science類別。
像PET其實是固定住了label集也就是說我最后預測得結果只能在我規定好的詞中選擇(其實就是做選擇題)而不是完形填空,MLM在[MASK]位置可以預測出的單詞是很多的,而不僅僅是類別數只有特定數量的,因此該問題很重要的一個部分是如何構建一個單詞表到類別標簽的映射。這個映射能讓MLM在預測到類別標簽的相關詞時,就可以被分到指定類別去(筆者自己的實踐只是將模型預測得結果使用bm25去和label集做映射,即與預測結果得分最高的label為本次預測結果)。
這樣的一個映射,通常是由人來手工編輯或使用梯度下降搜索。但顯然這樣會帶來覆蓋范圍不全導致的高偏差和高方差。知識庫的組織結構,天然的帶有范圍關系,在知識庫的圖結構中,相關聯的實體會有邊相連,不相關的實體可能要經過很多跳才能找到關聯,或無關聯。因此如果能將外部的知識庫信息融入,構建一個映射器(本文稱語言表達器),就可以一定程度上避免手工構造和梯度下降帶來的高偏差和高方差問題。
KPT旨在構建一個語言表達器,在單詞空間和分類標簽空間做一個映射。
因此KPT包含以下三個步驟:
- 標簽詞的擴展
- 擴展標簽詞的去噪
- 語言表達器的使用
2.2 標簽詞的擴展
KPT其實就是引入外部知識去擴展label集
舉個例子
對于science了類別并不是僅僅"science"這個單詞能夠代表這個類別,我們可以通過外部知識去擴展,“mathematics”, "biology"等也可以表示science這個類別。
文中給了一個情感二分類標簽詞擴展的例子
2.3 標簽詞去噪
- 對于few-shot場景
在few-shot中,因為有少量的標注數據,所以去噪更容易。
對于每個標簽詞,我們為其分配一個可學習的權重參數,然后再將其歸一化,得到:
在few-shot情況下,我們不需要進行校準,因為訓練過程中這個參數會被訓練到所需的范圍。
- 對于zero-shot場景
需要解決三個問題
對于第1個問題:
本文簡單的將詞拆分成逐token的多個部分,并用PLM逐token預測的平均概率,作為整個詞的概率。
對于第2個問題:
對于一些稀有詞,PLM預測的概率不準確(其實是不穩定),且有偏差,因此,最好在擴展單詞表中刪去這些稀有詞。然而,我們應該如何確定哪些是稀有詞呢?本文使用MLM去預測句子上下文中這個單詞的概率。
也即我們要預測的是下面這個概率的期望:
然而我們無法直接得到這個期望,只能用在上下文中預測的頻率去估計,也即,使用這樣一個近似:
最后我們刪去那些概率低于閾值的擴展詞。
針對第3個問題:
無論輸入句子的標簽如何,但有一些標簽詞天然地更不可能被預測到,這是由于標簽詞的先驗分布具有很大差異。
本文的解決方案,仍然是利用標簽詞的上下文先驗分布來校準預測的分布。
也即:
這個先驗分布仍然和2一樣,是使用少量無標注數據得到的。
2.4 語言表達器的使用
- 在zero-shot情況下
我們簡單地認為擴展詞中每個詞對于預測標簽的貢獻相同,因此我們對其進行簡單平均,并用預測分數的均值作為該標簽的預測分數,最后取出預測分數最大的類別,作為最后的結果。
- 在few-shot情況下
我們既然已經得到了一個權重參數,我們將其視作擴展詞中每個詞對于預測標簽的貢獻度,因此我們將其進行加權平均。
其中
2.5 實驗結果
三、P-tuning
論文地址:https://arxiv.org/pdf/2103.10385.pdf
代碼鏈接:https://link.zhihu.com/?target=https%3A//github.com/THUDM/P-tuning
3.1 核心idea
這篇論文和前兩篇有點不大一樣,前兩篇prompt模板是通過人工手動構建的稱為Hard-prompt 模板是固定好的不可學習的,而這篇論文模板是可以自動學習的稱為Soft-prompt。
- 左圖的做法是傳統的做法,我們事先定義好一個prompt,如這里的"The capital of Britain is 【MASK】";
- P-tuning做法是用一些偽Prompt代替這些顯式的prompt,具體的做法是可以用預訓練詞表中的【unused】token作為偽Prompt(bert的vocab里有【unused 1】 ~ 【unused99】,就是為了方便增加詞匯的),然后通過訓練去更新這些token的參數。
也就是,P-tuning的prompt Prompt不是顯式的,不是我們可以看得懂的字符,而且一些隱式的、經過訓練的、模型認為最好的prompt token。
3.2 實驗結果
四、總結與展望
P-tuning相比與PET、KPT省去了人工構建模板的過程,相對而言能減少模板對最終結果的影響(因為模板都不是固定的針對不同場景只能去嘗試)。P-tuning訓練的時候凍住了原來預訓練模型參數,訓練的時候只調整模板參數,按理說可以提高訓練速度,節省內存。
Prompt范式的提出主要是為了解決小樣本學習的問題,但是在數據量充足的情況下還是不如fine-tuning。而且在一些小模型的情況下表現得不是很work。
盡快Prompt有些缺點但是還是值得一試的,畢竟大部分情況下標注數據都是不那么充足的。
五、參考資料
[1] Liu P, Yuan W, Fu J, et al. Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing[J]. arXiv preprint arXiv:2107.13586, 2021.
[2] https://zhuanlan.zhihu.com/p/396971490
總結
以上是生活随笔為你收集整理的NLP新宠——Prompt范式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: prompt的用法详解
- 下一篇: 提示学习Prompt介绍