prompt你到底行不行?
文 | 馬殺雞三明治
源 | 知乎
很久之前老板下任務要試試prompt這個大風,但是玩完后發現太菜了所以連文章都沒寫,剛好今天工作比較閑就來寫寫了。
先上結論,連續prompt為運用大模型提供了一種思路,其實這種思路早就見過不少了。。。
離散prompt才是最佳的姿勢,但是存在人工設計模板帶來變數的問題。
所以prompt真的不太行。
不想看細節的可以直接看總結。
prompt三階段為:
第一階段,離散prompt
第二階段,連續prompt
第三階段,pretrain階段和下游階段統一任務類型(T5,zeroprompt)
這里的第三階段是個人看法。
為什么要prompt
prompt本意在于下游任務使用模型的時候,盡可能與預訓練模型pretrain階段的任務保持一致。
我們現在用BERT的方式大多數為finetune,這會有以下兩點弊端:
1.finetune存在上下游階段任務不一致的問題,fintune對BERT原來的結構破壞嚴重 2.下游任務通過標注數據驅動,finetune到一個位置,而finetune任務語言上的意義并沒有告知給模型。我們看這兩個弊端,本質上我們是在做出選擇,是精確的finetune還是泛化能力很強的MLM。
針對這兩點弊端做出改進,主要就是pretrain階段和下游任務階段能盡可能一致,這樣才能發揮出MLM的能力。但是這個過程必定有人為因素,這個過程也就是第一階段的離散prompt:
第一步,構造prompt。
第二步,構造MAKS token映射。
為此衍生出autoprompt,soft prompt,連續prompt等方法,
接下來我們具體聊聊這兩個劣勢。
1.finetune存在上下游階段任務不一致的問題,fintune對BERT原來的結構破壞嚴重
看第一點,pretrain階段學習最主要的任務是MLM,那么我們下游使用能否也是用MLM?這就是prompt最開始的思路。問題在于怎么讓下游變成MLM任務。
如任務情感分類,x = 我很累 y=負面
第一步,構造prompt
那么我們可以這樣加入prompt,prompt = 我感覺很[MASK]
于是可以得到給BERT的token為
[CLS]我很累,感覺很[MASK][SEP]第二步,構造MAKS token映射
即MASK預測的token應該怎么樣映射到標簽,比如負面可能的token候選有:難受,壞,煩
這樣我們就能讓上下游一致了。
2.finetune任務語言上的意義并沒有告知給模型
我們知道BERT是一個語言模型,但是finetune卻讓他數據驅動參數變化,而不是先跟他表明這個任務是干嘛。所以你會發現prompt就是在使用語言的通順,因為pretrain階段的語料也是通順的語料,所以我們構建prompt希望句子X和prompt接起來是一個通順的話,這樣上下游就更一致了。
為了讓拼起來的話通順,我們就會結合場景設計prompt比如上面那個案例使用的prompt=感覺很[MASK],當然也可以promp=心情很[MASK]。
有了上面的思路prompt按階段開始變種,第一階段是離散prompt,后來出現連續prompt。
第一階段,離散prompt
Pattern-Exploiting Training
其實就是我們最開始說的prompt方法,
第一步,構造prompt
那么我們可以這樣加入prompt,prompt = 我感覺很[MASK]
于是可以得到給BERT的token為
[CLS]我很累,感覺很[MASK][SEP]第二步,構造MAKS token映射
即MASK預測的token應該怎么樣映射到標簽,比如負面可能的token候選有:難受,壞,煩
但是這里面兩步都涉及人為因素。所以有人做出了改進,自然是圍繞如何去除人工設計,也就是“構造prompt”,“MAKS token映射”。
其實在我看來這才是prompt的優勢所在,但是這個優勢又帶來了劣勢,因為有人實驗發現prompt的幾個字都能導致模型效果的較大的變化。
AutoPrompt
為了去除人工設計帶來的變數,autoprompt針對自動“構造prompt”,自動選擇“MAKS token映射”,做出方案。
第一步,構造prompt
選擇loss下降最大的prompt token,注意到這里的loss怎么計算呢,這一步我們要先給定mask映射詞。
這兩步驟其實有沖突,先有雞還是先有蛋。。。論文的做法是先用假的prompt喂進去求出mask映射,也就是:
[CLS] {sentence} [T] [T] [T] [MASK]. [SEP]然后再用得到的mask映射用數據驅動選擇T。
第二步,構造MAKS token映射
step1,使用上下文的MASK token的output embedding作為x,與label訓練一個logistic,可以理解為logistic得分高的向量他就更能表示label
step2,使用上下文MASK token的output token的embdding給打分函數,取得分top-k
太多細節可以看論文,這個方法和finetune差距也有10個點的出入,注意到這里的roberta是large的,效果比base的BERT好,原因就是因為large的mlm能力更強,在做MRC任務也知道tiny和base的差距還有base和large的差距。模型參數量越大MLM能力越強。
第二階段,連續prompt
這個階段prompt開始變味道了,基本思路就是把之前離散的prompt token換成連續的prompt token,怎么換呢。
之前離散prompt的是以token喂給bert的,比如前面那個情感分類的prompt=“我感覺[MASK]”,是以token為單位給bert的,那連續prompt就是把這些token替換成embedding,直接把通過了bert emebdding層的prompt token的向量替換成可訓練參數,并且凍結整個BERT,只訓練3*768這個矩陣。比如我這里token emebdding維度為3*768(我感覺,三個字)那么可訓練參數就是3*768,就是這么回事,那具體還有些騷操作可以玩:
1,比如這里的3*768,那能不能20*768呢,這個也是個不可控的東西可以做實驗。
2,能不能給BERT每層encoder整上3*768呢,意味著每層的encoder通過self attention把每層的3*768的信息交互進模型。
3,可不可以不用[MASK]映射了,我直接使用CLS來分類。
以上講的3點都是P-tuning v2的做法,至于P-tuning v2之前的玩法就不多說了,花樣沒有P-tuning v2多,但是P-tuning v2的效果在large模型上是接近finetune的,而且你不需要訓練太多參數就可以撬動一些大模型了,包括Prefix-tuning也說了他們不需要訓練太多參數就可以撬動一些大模型了,但是這個玩法不是早就有了嗎,現在打著prompt的旗號又能水是吧。
此外,P-tuning v2中,prompt token長度對實驗的影響還挺大的,而且跟任務具有一定相關性,表現很不穩定。論文也沒做few-shot實驗,效果待定。沒有說base模型的效果。
其實看到這里你會發現prompt已經變味了,嚴格來說根本不是什么prompt了,這種構建可訓練向量去控制模型的方法也不稀奇,而去除 [MASK]映射換成CLS來分類就更加有fintune那感覺了。由于我沒自己去跑跑,但是可以看到都是負面評論居多,太多負面評價了,不列舉了。
第三階段,pretrain階段和下游階段統一任務類型(T5,zeroprompt)
最后一提T5和zeroprompt。
T5是google使用ender-decoder結構做的一個大模型,T5把pretrain階段任務和下游階段任務統一了,都做seq2seq任務,或者論文里說的text2text任務。
而zeroprompt,把各種場景和不同的任務類型(分類,翻譯,閱讀理解,近似句得分等)數據,以人工設計prompt的方式訓練,得到一個超級無敵prompt模型,其實本質上也是統一了pretrain階段任務和下游階段任務,都做MLM,不同的是zeroprompt為了適應新的任務場景需要一套算法來自動prompt,而T5通過固定引導詞配對任務類型,直接decode出答案。
對比兩者,T5直接重新設計pretrain階段任務,和下游階段任務保持一致,而zeroprompt本質上也是用了自動prompt的方法,但是把中文任務數據都跑了個遍,達到了中文prompt一統。
總結
prompt從最開始的人工設計模板,到自動prompt再到連續prompt,逐漸變的畸形。
最開始的人工設計模板就是為了利用好BERT的pretrain階段學習到的MLM能力然后用在下游,但是人工設計模型存在不穩定的問題,自動prompt效果又很差。
于是連續prompt開始表演,連續prompt已經沒有prompt的味道了,把prompt弄成向量,通過訓練希望模型能自己得到好的prompt向量,其實就是在finetune。
所以prompt行不行,目前來看不如finetune。但是他具有一定的few shot能力,特別是離散prompt。在一些簡單的任務是可以直接用離散prompt的方式做到few shot,這其實是利用BERT在pretrain階段學習到的能力,但是一旦任務過難,那few shot效果會很差,遠不如標幾條數據finetune一下。這里就是涉及到泛化和精準,你想要一定的泛化性,那就一定犧牲了精準。
最后zeroprompt和T5,基本是把prompt的東西都玩完了,其實就是pretrain階段和下游階段是否一致的問題。
后臺回復關鍵詞【入群】
加入賣萌屋NLP、CV與搜推廣求職討論群
后臺回復關鍵詞【頂會】
獲取ACL、CIKM等各大頂會論文集!
總結
以上是生活随笔為你收集整理的prompt你到底行不行?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 该文件夹包含名称过长且无法放入回收站的项
- 下一篇: pygame render怎么显示中文_