格局打开,带你解锁 prompt 的花式用法
文 | Severus
就如同《倚天屠龍記》中的主角張無忌,語言模型修煉了深厚的內功,但是遇到他的乾坤大挪移之前,他空有一身本領卻不會用。但學會之后,于所有武功又都融會貫通。光明頂上血戰六大派,他可以打出比崆峒派威力更大的七傷拳,比少林寺更加正宗的龍爪手。武當山上,他可以最快學會太極拳和太極劍法。prompt 是否又是語言模型的乾坤大挪移呢?
大家好,我是 Severus,一個在某廠做中文文本理解的程序員。今天我想要分享的是在工業實踐中使用 prompt 的一些實踐和心得體會。話不多說,我們直接開始。
初次關注到 prompt 是在去年GPT-3發布之后,我讀到了一篇論文,It' s Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners ,了解我的小伙伴都會知道,雖然我是一個預訓練語言模型的使用者,甚至生產者,但對于超大規模的語言模型,我一直持相對否定的態度,所以這篇文章的標題就相當吸引我,并且讀下來之后,隱隱感覺,將文本理解任務轉換為預訓練的任務形式,再使用預訓練語言模型,去做這個任務,這個思路簡直太無懈可擊了!利用它,我們可以更輕松地完成很多工作,又不必去面對例如樣本類別均衡之類的數據分布上的困擾。
但當時卻沒有勇氣直接應用起來。
到了今年,prompt 成為了一個相當火熱的方向,在那篇 prompt 綜述[1]出來了之后,我們知道,prompt 已經成氣候了,它已經被很多工作驗證是有用的了,也終于下定了決心,在我們的項目中嘗試使用它,并看一下它到底有多么神奇。用過之后,不得不說,真香!而且除了小樣本之外,我們也解鎖了 prompt 的一些花式用法,今天我竹筒倒豆子,分享出來。
淺談我對prompt的理解
本節是我基于我近幾年的分析經驗,嘗試去理解一下 prompt 為什么這么香,以及怎么要使用它,它才這么香,當然這一節絕大多數是我的胡亂猜想,沒有什么實驗數據支撐,一家之言,不一定對。
初見 prompt,我的第一反應就是,在下游任務上的訓練方式和預訓練的訓練方式直接同源了,那必然是可以充分利用到預訓練語言模型的“遺產”了啊,而相比之下,fine-tuning 的思路則是強行將任務轉換成了另一種形式,對于預訓練語言模型的知識是沒有充分利用到的,這么一看,簡直是越看越靠譜了。
當然,上面那些想法現在有了更加明白的解釋,那就是將語言模型看做是知識庫(Language Models as Knowledge Bases)。實際上,prompt 可以看做是對預訓練語言模型中已經記憶的知識的一種檢索方式,由于 prompt 任務形式就是預訓練任務,所以相比于 fine-tuning,當使用 prompt 形式向模型中輸入樣本時,預測時所需使用到的信息量是更多的。因為要用到更多的信息量,所以樣本的類別分布在 prompt 視角之下都是稀疏的,這應該也是 prompt 在 few-shot 上效果顯著的原因。
#?使用我們開發的預訓練語言模型直接預測的結果 input:??送元二使安西是一首[MASK][MASK]。 output:??送元二使安西是一首詩詞。我們的文本分類任務,類別標簽都是有語義的,且這個語義是自然語義,所以,我們假設,在自編碼預訓練語言模型中,樣本標簽和樣本之間天然就存在潛在的關聯,而在 prompt-tuning 上,我們只需要將這個關聯抽取出來,強化它就好。
與之不同的是,fine-tuning 形式中,對于模型來講,每個類別標簽只是一個 id,所以在訓練過程中,模型是根據樣本什么樣的分布來調整參數的對于我們來講是不可感知的,但是單從模型的表現來看,我們可以注意到,模型是很容易走捷徑的,如果某一類樣本中存在明顯的分布 bias,則對其他少量分布的樣本就是相當不友好的。而如果那個 bias 和類別本身在語義上不相關,則更加是一個災難。
總之,prompt 更加依賴先驗,而 fine-tuning 更加依賴后驗。也正因為這種特點,prompt 生效的最基本前提是預訓練語料已經覆蓋了任務語料的分布,所幸,得力于超大規模的公開語料,現在絕大多數任務都是可以做到的,做不到的也可以利用領域適配等 trick 去補足。
以上是我對 prompt 的一些個人理解,同時,我猜想 prompt 可能還存在一些特點(但我不確定):
使用 prompt 的前提是,任務中,輸入和答案之間需要存在語言的自然語義分布中的關聯,由于預訓練語言模型使用的是海量的自然語料,我們便理想化地認為預訓練語言模型中學習到的知識就是自然的語義分布;
也正因為第1點,同時也因為 prompt 所檢索出來的信息量是更多的,所以 prompt 對樣本中的噪音、混淆會很敏感,對任務的數據質量要求很高(這或許也是在大規模數據上,prompt 可能干不過 fine-tuning 的原因);
在自編碼模型上,prompt 的重點可能是關聯,而非一定要符合自然的表達習慣,但在自回歸模型上,可能就更要求 prompt 符合自然表達習慣(這點是我基于兩個模型的概率公式口胡的)。
接下來我介紹一下我們在prompt上的一些實踐。
直接使用 prompt 進行細粒度分類
我們的第一個作為 prompt 試水的項目,是一個短文本分類的任務,這個任務的輸入是一個名詞性短語,比如:劉德華、李達康、豉汁蒸排骨,預測這個名詞性短語的類別,比如:人、菜品等。起初,這個任務我們只去做粗粒度類別的分類,總共是42個類別,而決定使用 prompt 之后,我們認為,prompt 這么好的性質,不直接做細粒度分類簡直浪費了啊!所以我們根據詞語后綴(名詞性短語的類別絕大多數由后綴決定)將原本的任務轉換成了2100個類別,準備開始做。
實際上,在開始做之前,我還是有一點擔憂,畢竟,初期實驗,我們打算直接用預訓練的參數,做 token 級的分類,但是由于中文是字級別的 token,但是類別標簽都是多于一個字的,而且長度是不固定的(畢竟在此之前好像我看到的 prompt 的答案多數是一個 token 的),所以就有兩個擔心:
最終預測的結果是否會控制在類別標簽集合中,預測出來的 token 是否在類別標簽集合對應的字符集合中
模型能否學會變長的 prompt
于是我去查找文章,看到一些文章里給出的結論說 prompt 的長度可以是10~20,并且自己也打算用 padding 的方式直接去控制不定長答案學習,也不管字符集的問題,直接使用最樸素的方法去訓練,訓練過后,測試結果直接讓我震驚了:精度是88.9%!而之前42個類的分類精度,也僅僅是89%。
后續我們不斷地迭代數據,去除樣本中的噪音之后,現在測試精度已經達到了90.17%,并且還有繼續改進的空間。
這個過程中,超出了我的預期的是,首先預測結果中不在類別標簽集合中的結果占比僅僅在2%左右,且這些預測結果與已有標簽僅僅相差1~2個萊文斯坦距離(levenstein distance,將字符串 A 編輯轉換為字符串 B 最少需要經過多少次單字符增加、刪除、替換操作),這些預測結果,如果考慮到用戶體驗,我只需要使用BK樹修正即可。并且預測結果中完全沒有預測到標簽集合所對應字符集之外的 token,且我用 padding 控制長度也是生效的。而這全程,我使用的都是平常 fine-tuning 時使用的學習率(相比于預訓練小了兩個數量級)。
同時,我的訓練樣本類別分布是極其不平衡的,樣本最多的類可能有幾十萬,樣本最少的類可能僅僅有幾十個,但無論多少,模型最終預測的結果都是正確的,這又恰恰證明了 prompt 視角下,樣本的類別分布都是稀疏的,進一步給出了一個啟發:使用 prompt 可以輕松地解決不平衡分類的問題。
在做這個任務的過程中,還發生了一個小插曲,就是我把標簽列表的 offset 設置串位了,所有的標簽 token 提前了兩位,不在 mask 的位置上了,但是最終的測試精度居然仍是88.9%,原本是一個低級錯誤,但我講出來,主要還是認為它佐證了我所說的,自編碼模型的 prompt 似乎只需要考慮關聯,而不需要考慮自然表達習慣。當然這個驗證不合理,我需要在其他任務上使用不那么符合自然分布的 prompt 驗證一下效果。
在我做這個項目的同時,我的同事也嘗試了一些其他的項目,例如使用 span 結果直接去詢問NER類別,也達到了93%的F1(那份數據集本身的質量大概也就是那個數了,例如“中國人民銀行”的類別有10:7的矛盾,景點和地址的類別定義混淆不清),使用 prompt 做關系分類,也達到了96%左右的F1。
這個模型,我們也將于11月在PaddleNLP-解語項目中開源,有興趣的小伙伴們敬請期待。
以上這些實驗結果,直接堅定了我在其他任務上繼續使用 prompt 的信心,而在做這些任務的過程中,我也發現了更加有趣的事情。
使用 prompt 檢測數據噪音
前文說到了,prompt 對噪音、混淆數據是非常敏感的,那么我們就想到,可以反過來利用這個特性,去探測數據中的噪音,迭代優化數據。最直接的,就是 prompt 方式預測出的不在標簽集里面的數據。
因為模型的預測表現一定反映了訓練樣本的情況,那么,模型出現了預測結果不在標簽集里面的情況,則一定反映了訓練樣本中,某一類數據出現了類別混淆。所以使用模型預測全量的訓練樣本之后,將此類樣本找出,即可判定訓練樣本中需要做什么樣的調整。例如:某一版模型將“軟刺裸裂尻魚”預測成了“魚物”,則反映出訓練樣本中的魚類一定出現了類別標簽混淆,一部分被標注成了“魚類”,一部分被標注成了“動物”,且二者在語義上都是成立的,所以模型也無法分辨最終想要的是哪一個知識。這種現象不僅僅在這個名詞性短語分類中見到,也在上面提到的NER任務中有體現。
除根據類別混淆情況探測之外,我們同樣也可以使用訓練樣本的真實標簽與預測標簽的錯誤,找到那些根本無法區分的邊緣樣本。對于名詞性短語分類這個任務,我們知道,命名實體類樣本,如作品名、角色名、品牌名等,是極易與其他類樣本混淆,因為這一類名字可以任意起,且很容易與一般詞語重合,例如作品中各種專業書籍、教科書、人物傳記等,角色名與人名也極易出現混淆。在沒有上下文的情況下,哪怕是人類也難以區分這些短語的正確類別。但是,比如“高等數學”,當這個詞單獨出現的時候,我們大概率會認為它所指的是那個學科,而不是某一本教科書。
所以,根據這一原則,我們找到那些沖突的類別,直接從訓練樣本中刪掉,避免模型困惑。果真,基于這一原則刪掉了幾萬條數據之后,模型的效果甚至提升了1個點。
我們認為,這個結果是可以推廣到所有基于 prompt 的任務上的。prompt 模型、樣本、預測錯誤三者之間形成了一個對抗、迭代的關系,基于這樣一種機制,充分利用預訓練語言模型從海量語料里面學習到的知識,我們可以更加輕松地去迭代優化數據,同時也能夠標注生成更大規模的高質量數據,幫助其他的模型得到更好的結果。
用于知識增強
至此,我們就沒有必要拘泥于 prompt 的任務形式了,試著開一開其他的腦洞。
前面提到,prompt 思路本質上是將預訓練語言模型看作是一個知識庫(Language Models as Knowledge Bases),而 prompt 奏效了,給我們的啟發是,知識增強的方式,可以更加自然。
首先,我們假設海量的預訓練語料中已經包含了比如對于某一個實體的知識,包括它的描述知識,和它的分布知識(即上下文提示)。那么,不僅限于 prompt 的任務形式,我們直接使用包含了知識的自然文本,到預訓練語言模型中檢索出它的表示,是否就可以得到一種更加自然,且與預訓練語言模型天生更加契合的知識增強方式呢?
實際上,在細粒度命名實體識別任務 CLUENER 上,就存在類似的例子。CLUENER 任務中,有幾個非常難以區分的類別,分別是電影、游戲、書籍。這三種都是作品類的命名實體,在上下文中沒有相應的信息的時候,極易發生混淆,實際上數據中的標簽上也有一些混淆。但是在實驗中,我們發現,在輸入文本中明確提示了答案的時候,模型往往能正確標注出命名實體的類別。這間接佐證了,模型是有能力感知到輸入文本中的提示的。
那么我們當即決定先采取最樸素的方法,在輸入文本的后面追加一些知識文本做提示,實驗過后,在一些易混淆 case 上取得了一些成效,但是整體效果提升不大,這當然是符合預期的,畢竟這種樸素的插入并沒有什么目的,沒有讓模型有“觀察的重點”,而下面的一篇工作[2],則是我們的想法的更完善版本。
這篇工作使用了4種方式將知識融合到 NLP 模型中:
KT 方式和我前面嘗試的方式一樣,直接將知識文本(KT)追加到輸入之中;
KT-Attn 則是在 attention 上疊加了一個可見性矩陣,控制只有知識描述的 token 能夠看到自身描述的知識;
KT-Emb 是使用 encoder 先計算得到 KT 的表示,再疊加到文本表示上;
KG-Emb 則是使用知識圖譜表示去增強模型,圖譜表示則是使用 TransE 計算得到
其中,KT 方式的知識來自于 Wikitonary 詞典數據,通過詞性標注等方式查到對應的詞,將詞典中的釋義看作是知識,加入到任務之中。KG-Emb 的方式,則是使用 Wikidata 的數據,將圖譜知識融合到任務中。其中 KT-Attn 方式是我心中比較理想的增強方式,而 KT-Emb 方法是我沒有想到過的,但是看了文章之后我也嘗試理解了這個方法,感覺上也是 make sense 的。
實驗結果如下:
可以看到,KT-Attn 的方式和 KT-Emb 方式在兩種規模的模型里面取得的增益也是最多的,這也符合我這一節想要表述的觀點。同時,作者還做了一個 case 分析,在 CoLA (語法檢測)任務上,作者分別比對了知識增強前和知識增強后,各個 token 對結果的重要程度貢獻,結果如下:
其中,黃色代表重要,紫色代表不重要??梢钥吹?#xff0c;知識增強之后,第一句 has 和 kissed 最終的重要度顯著提升,我們也知道,這兩個詞對語法正確的判定尤為重要,第二句中 Sue to stay 最終被視作不重要,也符合我們對英文語法的認知。
后面作者也做了各種分析,以及分析了什么樣的知識在什么樣的任務上會起到作用,以及分別評估了在不同的預訓練模型上,使用這4種方式分別取得了什么樣的效果。我就不再贅述了,感興趣的讀者們可以去看原文。
我在另一篇論文[3]的解讀中,也提到了另外一種利用預訓練語言模型做圖譜 linking 消歧的方式,這里也不再重復解讀了。
小結
總而言之,我認為 prompt 作為一種可以更加充分利用預訓練語言模型的方法,其未來是無限可期的,畢竟現在的預訓練語言模型,還是基于大量的自然語料訓練而成的,也就是說,預訓練語言模型里面的知識是正確的,所以更需要我們充分抽取、利用它。prompt 還是一個年輕的方向,還有大量的可能性可以去發掘,例如,怎樣將它優雅地應用在序列標注任務上,就是我一直想要弄明白的問題,我們也會在我們未來的中文理解項目上不斷地去探索 prompt 的應用方式,爭取也能夠做出我們理想中的各種中文文本理解的模型。
萌屋作者:Severus
Severus,在某廠工作的老程序員,主要從事自然語言理解方向,資深死宅,日常憤青,對個人覺得難以理解的同行工作都采取直接吐槽的態度。筆名取自哈利波特系列的斯內普教授,覺得自己也像他那么自閉、刻薄、陰陽怪氣,也向往他為愛而偉大。
作品推薦
深度學習,路在何方?
數據還是模型?人類知識在深度學習里還有用武之地嗎?
在錯誤的數據上,刷到 SOTA 又有什么意義?
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
后臺回復關鍵詞【頂會】
獲取ACL、CIKM等各大頂會論文集!
?
[1] Liu, Pengfei, et al. "Pre-train, prompt, and predict: A systematic survey of prompting methods in natural language processing." arXiv preprint arXiv:2107.13586 (2021).
[2] Xu, Ruochen, et al. "Does Knowledge Help General NLU? An Empirical Study." arXiv preprint arXiv:2109.00563 (2021).
[3] Islam, Sk Mainul, and Sourangshu Bhattacharya. "Scalable End-to-End Training of Knowledge Graph-Enhanced Aspect Embedding for Aspect Level Sentiment Analysis." arXiv preprint arXiv:2108.11656 (2021).
總結
以上是生活随笔為你收集整理的格局打开,带你解锁 prompt 的花式用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样高效阅读一份深度学习项目代码?
- 下一篇: 排得更好VS估得更准VS搜的更全「推荐、