NSP-BERT: A Prompt-based Few-Shot Learner Through an Original Pre-training Task--Next Sentence Prediction
![/2_nsp-bert-a-prompt-based-few-shot-learner-through-an-original-pre-training-task/featured.jpg /2_nsp-bert-a-prompt-based-few-shot-learner-through-an-original-pre-training-task/featured.jpg](/2_nsp-bert-a-prompt-based-few-shot-learner-through-an-original-pre-training-task/featured.jpg)
NSP-BERT: A Prompt-based Few-Shot Learner Through an Original Pre-training Task–Next Sentence Prediction
Introduction
📌 why(研究動機)
GPT3
是一個大型語言模型,跟以前使用fine tune
的方法來比,他們不需要很多的訓練資料就可以得到不錯的效果。有研究證明模型的複雜度越高,能提高few shot的性能。但是如果要使用GPT3
這種大型語言模型,他的參數太多,我們沒有足夠的硬體設備去訓練模型。但是換成使用BERT
或是RoBERTa
這種相較於GPT3
小一點的模型,只要加入適當的提示,也可以得到類似的性能,而且參數數量比GPT要小很多。第二點是現有的提示學習中,大多數的模板是預測一個字,長度是固定的 舉例來說,如果有個模板是 “
這是____新聞
",對於英文任務來說可以填上sports
一個字,但是中文任務要填上”體育
“兩個字。對於這種長度不同的標籤,是這篇論文要解決的問題。
📌 How(研究目的)
- 對於大型語言模型來說,有許多研究表明在
few shot
或zero shot
中使用提示學習比fine tune
的效果更好。因此現在訓練模型的方式逐漸改變成- 預訓練 pre-train
- 提示 prompt
- 預測predict
- 使用
BERT
預訓練任務之一的Next Sentence preidiciton
,NSP被RoBERTa和一些論文發現在某些任務上會降低模型的表現,因此在後續的許多論文中,就很少使用NSP。但是在這篇論文的實驗中顯示出,若將NSP與提示學習一起使用在few shot 和 zero shot的任務上,則呈現的準確率相較於其他提示學習的方法是有明顯的提升。 - 針對中英文標籤長度不同的問題,可以用NSP這種以句子來做判斷是否相連的方法,可以忽略掉標籤長度不一致的問題
📌 Application
- NSP-BERT適用於中文NLP任務,因為他可以忽略模板中,需要填入答案的長度。例如在一個英文句子中,需要填入的答案是
FIFA
,則在中文中,則會用國際足球總會
填入 - 另外也可以用在
單句分類
、句子對分類
…這些NLP任務中
📌 Improvement
- 相比於PET的零樣本學習,NSP-BERT在中文的單一句子分類任務上的準確率有顯著的提高
- 跟其他基於MLM的方法相比,不管是中文或英文任務,NSP-BERT不受限於標籤詞中不確定的長度
Definition
📌 Prompt Learning
在神經網路發展起來之前,如果要對一些資料做分析或處理,可以用
SVM
或boosting
等一些機器學習演算法來做,這是不使用神經網路的全監督學習。這種學習方式依賴特徵工程
,也就是資料與label越多,模型效果越好。神經網路出來之後,需要考慮目前手邊的資料適合用哪些
神經網路架構
,例如手上有很多圖片,需要做圖片辨識,那就會用CNN,這時候的研究重點是如何設計一個神經網路架構,能有效的學習資料特徵在
BERT
推出之後,逐漸走向預訓練和微調的方式,會先在一個大型資料集上做預訓練,再根據特定任務對模型進行微調,用來適應於不同的下游任務。在這種訓練方式下,研究重點轉向目標工程
,也就是設計一個在預訓練和微調階段使用的損失函數 嗯也因為現在硬體越來越好,使得訓練出來的模型越來越大,裡面的參數也越來越多,如果使用微調會提高訓練成本和時間,因此有一種新的方式被提出來,針對不同的下游任務,例如語言翻譯、語言推理、實體連接建立適合的prompt,也可以在相對小的模型上得到與大模型類似的性能
📌 Token/Sentence Level
在prompt learning出來之前,當我們拿到一個句子,例如 No reason to watch,會經過一個分類器來判斷屬於positive
或是negative
prompt learning被提出後,我們需要先設計一個模板,例如這邊的模板是 Overall, it was a ___ movie
。這個空白可以填fantastic
,或其他單字,再將input的句子和模板合併在一起,當成一筆sample data,可以看到圖上的prompting,就是一筆sample data,經過模型預測後輸出的答案會將這個token 映射為最終得到的輸出,這是基於MLM,也就是以字為單位的PET
的作法
- Token level prompt-learning(e.g. MLM)
在prompt learning中,token level是指在把句子切分成多個token,再把模板中的mask標記替換為特殊的mask向量表示。這個做法等於把原本的句子從分類任務轉為克漏字任務,例如圖片上的句子是,意大利隊贏得了歐洲杯。後面的是提示的模板,這是[MASK]新聞
。
把這兩句合併,輸入到模型中做預測,經過MLM後會輸出機率最高的token,因為MLM輸出的字不一定是我們想要的結果
換個例子來說,假設今天的任務是把句子做二分類,分為positive
或negative
,但是MLM輸出的是happy,所以需要拿著這個happy去詞彙表中映射出最終的結果positive,這是token level
。
- Sentence level prompt-learning(e.g.
EFL(Entailment as Few-Shot Learner)
)
Sentence level
指的是在進行NLP任務時,將輸入的句子視為一個語言單位進行處理,而不是把句子分解成一個一個的token。因此Facebook就提出EFL這個想法,將原本的NLP任務轉換為文本蘊含任務,
例如國際天文學聯盟將冥王星降級為矮行星,這是一篇____新聞
,如果模板中填入的是科學
,則分類器會將這個樣本分類為蘊含
,這是sentence level
- Difference
Method
📌 Problem of MLM
MEM在大多數研究中與提示學習一起使用,並得到很好的成果。但是在英文任務的模板中,我們預期要輸出的是sports
一個字,因此只用一個mask
。
例如,第一個英文樣本中,x是原始句子,It was [mask]
是模板,經過模型預測這個標籤詞可能是sports
。但是在這個中文樣本中,因為我們的標籤有兩個字,因此需要使用兩個MASK
來對應 “體育
“這個label。如果MASK數量越多,則MLM有可能很難正確預測。
因此作者想到bert的另一個預訓練任務,NSP,可以用來解決在中文NLP任務的label長度不一致的問題。
📌 Next Sentence Prediction
NSP是BERT的預訓練任務之一
目的是判斷兩句話是否相連
,如果相連,label會輸出IsNext
,否則是NotNext
,這個任務可以幫助模型學習句子之間和上下文的關係
在圖片中,把句子A和句子B當成input,經過BERT後,每一個token都會轉成embedding,我們在這邊只關心CLS這個token
把CLS拿去給前饋神經網路,再經過一層softmax得到一個機率,這個機率就是句子A和句子B是否相連的機率。
- 第一個公式,用來判斷兩個輸入句子是否相連。
h[CLS]
是[CLS]
的隱藏向量,透過一個可學習的矩陣W ,經過一個tanh
函數的激活,再透過可學習的Wnsp
矩陣做乘法,最後輸出一個長度為 2 的向量 - 第二個公式是,把上面的向量拿來做
softmax
,會得到兩個句子是否相連的機率值,他們的總和為1
📌 Prompts in NSP-BERT
Task : Single sentence classification
NSP-BERT 與其他使用提示學習的方法一樣,需要為各種任務建立適當的模板。與MLM不同的地方是,NSP-BERT是直接把標籤放到模板中,如果兩個句子的相連機率很高,表示這個標籤屬於這個輸入句子。
根據上面這個公式,可以寫出一些範例,當輸入句子有10句,且有 運動、科技、教育
三個label。 以上面這個範例來說,因為label有三個,所以會算出3組是否相連的機率,前面的機率是Isnext,後面是notIsnext,我們的目標是兩個句子要相連且機率是最高的,因此最後輸出就會是”運動
”這個label。
📌 Answer Mapping - Candidates-Contrast
Task : cloze-style
前面說明NSP拿來做單一句子分類任務
,在這裡是用NSP做克漏字任務
,把一個文本作為輸入,根據不同的文本有不同的候選答案。NSP-BERT會預測這對句子是否為相鄰的兩句話來決定這個候選答案是不是正確答案。如果是ISNEXT
,則認為這個候選答案是正確的。否則就是錯誤的。
上面的公式,右邊的部分是根據一個句子和候選答案組成的句子對,IsNext的機率越高,則對於輸入句子x
來說,就越有可能是正確答案。
舉例來說,這裡的輸入文本x
中,要預測的地方就是idiom
這邊,可以選擇的答案有七個,因此把這七個答案一個一個填進去x
中,當作一筆資料,再拿去預測。
下面的公式,是找到機率最大的候選答案後,接著輸出答案,以這裡的範例來說,預測出的結果 j 等於 5
,拿著這個5到candidates list
的第六個位置,把label “漸入佳境
” 取出來,這樣就得到最終的預測結果y
。
📌 Answer Mapping - Samples-Contrast
Task : Sentence Pair
跟前面的candidates contrast
不同的是,samples contrast
應用在蘊含任務
,就是判斷一個句子能否從另一個句子推斷出來
的這種句子與句子之間的關係。
例如今天我們去唱歌
和我們去唱歌吧
,兩句話是具有蘊含關係的。反例就是,面積公式是甚麼
,和BE動詞有哪些
是不具有蘊含關係的。
但是這裡會遇到一個問題,在大部分樣本中,兩個句子蘊含的機率都很接近1
,所以這篇論文提出的想法是
先從開發集取得threshold,再去測試集算出兩個句子蘊含的機率。
- 透過
threshold
判斷這個機率應該落在哪個區間,因此這筆資料就屬於那個區間所對應的label
,最後輸出對應的標籤
。
演算法可以分為三個區塊,分別做三件事情
- 用
開發集
取得threshold
- 用
人為設定的batch size去分割資料
,用來比較資料在不同batch size下的表現 - 拿
開發集
取得的threshold
來預測測試集
,輸出label y
一開始先把句子1
和句子2
當成一筆資料,這樣的資料假設有30
筆,每一筆資料都先預測出一個句子是否蘊含的機率
因為這些算出來的30組機率中,IsNext的機率大部分都很接近1
,因此需要先找出一個threshold
,以這個threshold當作基準,去區分有蘊含的機率在threshold以上的屬於哪一個label,以下的屬於哪一個label
這裡用演算法實際跑一次
第一步 : 是把這些
相連的機率
與他們的句子ID
一起拿去做排序
,由低排到高
,之後把資料的數量除以標籤數量
,取得一個batch size
。例如有
30個句子對
,3個標籤
,則會分成10個一組
,總共3組
,取threshold
的方式是每一個組別的最後一個機率值當作是threshold,也就是第一組和第二組的最後一個機率都是threshold,因為這裡有三組資料,因此算出來的threshold就會有兩個數值到這邊是在
開發集
做的事情,這篇論文的作者說為了實驗的公平性
,他利用開發集來取得threshold,再使用這些threshold去預測測試集
第二步 : 因為作者想要測試在
sample contrast
這個方法在不同的batch size
下的表現,因此把測試集用預先設定好不同的batch size去分割
。- 假設有
30個句子
,3個標籤
,人為設定的batch size是6
,因此每一組有6筆資料,會分成5組。 - 之後對這6筆資料做排序,由小排到大,再把這6筆資料(人為訂定的batch size內的資料)除以標籤數量(3),就會得到一個batch,也就是演算法中
第七行的Bm
,裡面的資料量為2 - 到這裡可以根據人為設計的
batch size
,去計算不同batch size
下的accuracy,目的是為了測試人為設計的batch size
和透過threshold
分組的資料,他們在準確率上的差異性
- 假設有
第三步 : 最後是把每個
句子對
預測出蘊含的機率
,拿去跟threshold
比較後,知道這個機率是落在哪一個區間,就可以得到最後output的label。
📌 NSP-tuning
在進行few shot
學習時,為了不讓zero shot
的性能變差,這篇論文提出NSP-tuning
,來延續他在zero shot的優勢。可以從兩方面來調整
建立樣本
,在單句分類
的任務中,可以把一筆資料的正確答案視為正樣本
,其餘的答案視為負樣本
。目的是讓模型學習區分正確答案和錯誤答案的特徵。圖片中有一個輸入句子和三個label,這邊會把sports
這個label視為正樣本,其餘的label視為負樣本,這樣會產生三個樣本,他們會一起合併成同一個batch
,並輸入到模型中做訓練。損失函數
,因為NSP的輸出是一個判斷兩個句子是否蘊含的機率值,總合為一,這是在BERT預訓練時就訓練好的。如果我們不想改變預訓練模型的結構,又想要微調這個模型,論文中提到可以選擇binary cross entropy
,因為binary cross entropy適合用於二分類問題
,可以將模型輸出的機率值與真實標籤之間的差異,量化為一個實數值,再使用梯度下降去更新模型的參數。損失函數的值越小,模型輸出的結果與真實標籤的差異就會越小
,因此使用binary cross entropy可以幫助NSP-BERT更好的預測兩個輸入句子是否連續。
Experiment
📌 Datasets
在實驗中有分為英文和中文資料集,在單一句子分類的任務
中,英文任務使用了上方表格的七個資料集,中文任務使用下方表格的四個資料集。
這些資料集的格式可以看右邊的範例,一筆資料裡面有一個句子,和一個標籤,可以讓模型做分類任務
。
📌 Compare Token Level’s PET 、 Sentence Level’s EFL and NSP-BERT
- Task : Single sentence classification
- Metric : accuracy
- Model
- English : BERT- large
- Chinese : UER’s Chinese BERT-base
- Baseline : PET、EFL
這個實驗中,模型跑的NLP任務是
單一句子分類
,要比較的是各個模型在zero shot
和few shot learning
的結果。這裡使用的指標是accuracy
,這個實驗使用的模型,在英文任務中使用BERT large
,中文任務中使用UER的中文BERT-base
,UER是一個基於pytorch框架的NLP工具箱,提供豐富的預訓練模型和各種NLP工具,這裡作者使用UER預訓練好的chinese BERT-base
作為主要的模型。因為NSP-BERT是一種相對於MLM比較新的方法,作者想要證明
NSP-BERT與MLM的方法相比更具有效性
。因此選擇基於MLM的token level模型 ,PET和 sentence level的EFL 作為baseline表格的左邊,FULL是指完整訓練,zero是零樣本學習,few是少樣本學習, +號是人類在這個資料集中的表現,majority是數量最多的類別
在
zero shot
部分,可以看到在中文任務
上的表現比PET好蠻多的,在實驗中,把TNEWS
這個資料集分別做兩次實驗,左邊的數字是沒有加上keywords,右邊的數字有加上keyword,有加上keyword的表現比較好。但是在英文的某些任務
上NSP-BERT輸給PET,因為PET具有將外部知識遷入到模型的能力,而NSP-BERT沒有這種能力。在
few shot
部分,可以看到中文任務
上,NSP-BERT比其他模型的表現要好一點,這裡的EFL是一種把原先的分類任務轉為蘊含任務
,以此作為few shot learning的方法,EFL在論文中介紹了兩種不同的方法- 第一種是EFL w/ (with ) PT(pre train)是先在MNLI任務上進行預訓練,再到下游任務上做微調
- 另一種是EFL w/o (without) PT 是指直接微調預訓練模型,沒有做額外的訓練
這邊可以把使用sentence level
的 NSP-BERT
和EFL
分為一組 ,token level
的PET
分一組 來比較。
在中文任務
上,sentence level
有比較明顯的優勢。但是在英文任務
中,NSP-BERT只有在兩個資料集上取得比較好的成績,以CR
這個資料集來說,sentence level的三個模型都落後token level的PET,猜測可能是因為CR資料集相對比較小,標籤不夠豐富,另外NSP-BERT是基於原始的NSP任務進行預訓練的,相較於PET可能對於某些任務不能很好的適應。
📌 Based on two models of RoBERTa and BERT, used in different corpora, compared with PET
這個實驗的目的是想知道使用不同的預訓練語料庫對RoBERTa和vanilla BERT的影響
,這裡的語料庫有三種
- CB:使用 BERT 的語料庫從零開始進行預訓練;
- CR:使用 RoBERTa 的語料庫從頭開始進行預訓練;
- CB+Mix5:這個是使用BERT的語料庫進行了一定程度的預訓練之後,接著使用RoBERTa的語料庫再進一步訓練。這裡的mix5是使用額外五個語料庫來增加vanilla BERT的預訓練,但是因為作者那邊的設備不足,所以訓練的步數只有BERT模型的30%,等於RoBERTa的2%
這邊紅色框起來的是PET在BERT 上的表現
,藍色的部分是NSP-BERT的表現
,當他們都同時使用BERT+CB mix5的語料庫
來實驗時,可以看到在大多數任務中,NSP-BERT都優於PET。
除了subj這個資料集,這個資料集收集的是電影評論的資料,資料集裡面有兩個label,判斷這句話是客觀的或是主觀的。猜測可能是因為主觀或客觀這種label比較難使用NSP這種兩個句子是否蘊含的判斷方式來衡量。
橘色框框是PET在RoBERTa上的表現
,對於NSP-BERT來說,因為模型和語料庫的大小與RoBERTa的PET有差距,因此在表現上有落後一點點。
作者已經把BERT模型做了一些加強,雖然沒有達到RoBERTa的水準,但是在zero shot
和few shot learning
上的性能有很大的提升,跟RoBERTa
的差距也縮短不少,這裡使用的方法是把一個預訓練模型用更豐富的語料庫來訓練,就可以大大的提升效果。
📌 Observe different batch sizes
這是NSP-BERT的samples contrast answer mapping
在不同batch size
下的實驗,目的是想了解樣本對比這個方法在各個任務上,使用不同batch size的表現
。
從圖上可以看到,即使是很小的batch size,也能幫助NSP-BERT在sentence pair的任務上取得不錯的準確率,而且隨著batch size的增加,這種提升也會越來越穩定。
📌 Ablation experiment
- Model : BERT-Large
- Tasks : English single sentence classification
這裡的實驗是消融研究
,在NSP-tuning
那邊有說到在單句分類的任務
中,會把一筆資料的正確答案視為正樣本,其餘的答案視為負樣本。把這筆資料和label產生的樣本,一起合併成同一個batch,並輸入到模型中做訓練。這是耦合
的。
現在在消融實驗中,改成不使用耦合
,也就是把同一個句子產生的多個樣本分散到不同的batch中
,可以看到相較於耦合的NSP-BERT
,效果都稍微差了一點。
第二個是原先在NSP-BERT中訓練時使用的binary cross entropy
,在消融實驗中改為softmax
,效果也是不太好。由此可以看出,耦合正負樣本加上binary cross entropy,是NSP-BERT最有效和robust的方式
第三個是不使用預訓練的NSP head
,和第四個使用linear head + softmax
的方式都會使NSP-BERT的性能降低,而且也讓結果不穩定,也就是標準差的數值範圍會變大。
Conclusion
- 在這篇論文的實驗中,證明了NSP也可以和MLM一樣,適合做為
few shot
,zero shot
的學習器 - 在第二個實驗中,使用
相較於訓練BERT更小的算力來與較大的模型如RoBERTa競爭
,在zero / few shot方面的表現也不錯,雖然不能取得SOTA的成績,但是可以重新思考sentence level
的 NSP在NLP任務上的作用 - 不管是
模型大小
或是預訓練的語料庫
,都是決定few shot learning在model能力的上限
Ref :
- NSP-BERT: A Prompt-based Few-Shot Learner through an Original Pre-training Task —— Next Sentence Prediction
- https://blog.51cto.com/u_15919249/5962236
- https://jalammar.github.io/illustrated-bert/
- Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing (arXiv:2107.13586)
- https://www.youtube.com/watch?v=mol6U__9520