BERT Pretrained Model


Posted by Mars.Su on 2021-02-01

先前我們講完了Transformer的NLP模型架構了,而該模型的出現也替接下來的NLP帶了重大的影響,其後的包含GPT, BERT, XLM等Pretrained model都是受到 Transformer的啟發所演變過來的。在接下來我也會針對每一個模型去做論文的探討與分享。而今天我們要探討的是 BERT(Bidirectional Encoder Representations from Transformers),其來自google 2018年發表的論文如下:

BERT在這邊先情提要一下,他是一種利用Pretrain的方式來將文字、句子的資料訓練出來(representation),也就是訓練出Language Model,然而再根據task需求訂定不同的top-layer來做到任務的訓練與預測。所以簡單來說,BERT的主體只是將句子與上下文的資訊訓練出來,然後在最後output的部分透過不同layer的訂定來將這樣的representation視為input,最後來產出對應的task需求。

那何謂Language Model?簡單來說透過unsupervised-learning在一些文字的情況下,來預測出下一個文字為何的模型。所以對於文字不需要做標記的動作,通通將文字與句子來做訓練,讓模型學習到上下文語法結構,也就是對於語言有了一定程度的理解。我們就可以利用這個資訊來做其他下游任務的應用。所以也牽扯到Transfer-learning,進而來降低建構對於任務的模型成本,不用每一個任務就建構一個模型,先利用Language Model取得input,在微調layer就可以產生對應的任務模型。所以可說是好處多多啊。

Background

作者在這邊的有先特別提到,過往在 NLP領域當中若要利用 Pretrain的方式來產生 Language Model的做法,可以分為兩種,如下:

Feature-Based

這個方法最典型的是ELMO模型,運作原理簡單來說就是把原本pre-trained的Language Model的output作為 額外的特徵,再加以concat到原先任務訓練model的input來做訓練,所以該方法會牽扯到兩種模型。

這邊通常會包含了兩個步驟:
(1)先利用corpus A來訓練出Language Model,該模型參數已經固定。
(2)然後利用corpus B來訓練原先任務的模型(ex.句子分類),只是會先將corpusB透過Language Model得到對應的representation,來作為任務模型的額外特徵訓練。

Fine-tune

該方法只會有一種模型,差別在於一樣會訓練出Language Model,但會在最後的output加入或修正特定的layer和參數,藉此來符合任務模型的需求。以『句子分類』來說,就會在最後的layer加入softmax來做訓練。而這樣的訓練正因為加入新的layer,所以在訓練過程中,模型為了fit任務需求,模型的參數是由訓練過程中做變動的。

這裡最代表的模型是GPT,他是採用Transformer-Decoder來做訓練,透過大量的corpus來訓練出Language Model,最後加入一層linear來作為NLP任務的輸出,所以在這樣的前提下,一樣有包含了兩個步驟:
(1)透過corpusA訓練Language Model
(2)然後直接在Language Model加入layer來轉成任務模型(fine-tune),再用corpusB來做訓練,此時模型參數不固定。

BERT模型就是採用了Fine-tune的方式來做到多NLP任務。在論文中我們可以看到如下架構:

這樣的架構就是在BERTTransfer-learning,所以學會使用 BERT 就能用同個架構訓練多種 NLP 任務,進而降低自行設計與建構任務模型的成本。

雖然對於工程師或科學家而言是降低建構與設計的成本沒錯,但是有一好沒兩好,在BERT的設計當中,其中蘊含著龐大的參數量,這會造成訓練的過程十分耗資源與時間,依據作者在論文中有用到兩種BERT的架構
(1)BERT-Base:

L = 12, H = 768, A = 12, Total parameters = 110M

(2)BERT-Large:

L = 24, H = 1024, A = 16, Total parameters = 340M

L代表Transformer的層數,H代表Transformer的hidden_size,A代表self-attention的heads數量。這樣的計算量作者都用到TPU去計算,可見得所耗的資源十分可觀。

BERT Model Architecture


在BERT模型是採用Transformer-Encoder(上圖左邊元件)的Language Model架構,採用Encoder架構有什麼優點,如果讀者們還記得在Encoder當中,Transformer應用了self-attention來取得每次文字對於整體上下文的重要性,進而獲得對應的representation。所以每次計算都會採用到上下文的文字資訊。這相較於GPT採用Transformer-Decoder只能依賴先前的文字(Mask的原因)來做計算有明顯的不同。

GPT: 因為採用到Transformer-Decoder Mask的原理,所以是屬於『單向Language Model』。
BERT: 則是透過Transformer-Encoder自身的self-attention,所以屬於『雙向Language Model』。

詳細的流程差異可參考作者在論文提供的架構:

Pretrain

Pretrain階段,作者在這篇論文應用了兩種方式,分別是MLM(Masked Language Model)NSP(Next Setence Prediction),利用這兩種方式來訓練出BERT Language Mode:

1. MLM(Masked Language Model)

白話一點我們可以認定成就是克漏字填空,透過隨機將句子中的token文字來作為mask來訓練預測,這樣做的用意就是讓模型可以善加應用到上下文的文字資訊。

作者在該方法的做法是隨機挑選corpus的15%來做要預測的token,所以會將這些token轉換成[MASK]這樣的token來讓模型做預測,其中對應的label就是原先的token。但這樣其實存在這一個問題,就是當整合到Finetune時,輸入的文字就不會被MASK,就會造成PretrainFinetune會有不一致,作者利用如下的方式來解決:

  • 在被15%挑選要MASK的token當中,再挑80%的token來用[MASK]代替。
    I am working from home. -> I am working from [MASK].
    
  • 在被15%挑選要MASK的token當中,再挑10%的token來用任意token代替,不管語句是否合理。
    I am working from home. -> I am working from paper.
    
  • 在被15%挑選要MASK的token當中,再挑10%的token不做任何變化。
    I am working from home. -> I am working from home.
    
2. NSP(Next Setence Prediction)

換句話說就是來預測第二個句子是否是第一個句子的下一句。所以從這邊可隱含得到再訓練的輸入必須是一個pair的結構。舉例如下:

Input: [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label = IsNext

Input: [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext

[CLS]代表是句子的一開頭,[SEP]代筆是句子與句子之間的斷點處。

Model Input


BERT的訓練當中,必須要經過特殊的input embedding建構才能做訓練。上圖是作者在論文中提出的作法,求出三個embedding最後concat做訓練,分別如下:
(1) Token Embedding:用來表示每一個token的embedding
(2) Segment Embedding:用來表示是在第一句或是第二句的embedding(第一句為0,第二句為1)
(3) Position Embedding:用來表示token先後順序的embedding
然而為了使GPU能夠平行運算,對於每個batch不足max_sequence_length的位置都用[PAD]來補齊,其對應的值也皆為0

會需要這樣設計是因為希望可以同時滿足兩種Pretrain的任務,用來表示單句或是句子pair,也透過一些特殊的token來表示token在句子之間的關係。

Bert Finetune

BERT 是一個Language Model,他能產出含有context的representation,能讓同一個token在不同位置有不同的representation,同時對下游的 Finetune NLP 任務很有幫助。


我們都知道BERTPretrain階段所做的任務是什麼了,作者在這篇論文後面也有附錄關於BERTFinetune之四種任務,這邊也帶大家來理解每個任務在做的用途,大部分的input都差不多,主要差別在於最後top-layer的output結果。

(a) Sentence Pair Classification(成對句子分類任務)

該任務用來分類兩句子之間的關係,可能是是否對調、是否合乎假設等。

(b) Single Sentence Classification(單一句子分類任務)

該任務最單純,就是辨識句子是何種分類,ex.句子是屬於正向或是負向評論等。

(c) Question Answer Task(問答任務)

該任務會學習文章,並且根據問題來搜尋文章內合適的答案,並將答案所處的位置索引回傳出來。

(d) Single Sentence Tagging Task(單一句子標記任務)

該任務大家最熟悉的應該是NER,也就是Named Entity Recognization,輸入一個句子,然後輸出該句子內有哪些實體辨別。

Conclusion

透過這篇我們不然發現原先一開始的Transformer是如何演化成像是BERT,GPT等模型來解決NLP任務,當然並不是BERT是最好,畢竟這是2018年的論文了,轉眼兩年過去其實有越來越多針對BERT所優化的模型也都出現了,像是ALBert,DistillBert,LongFormer等,每個模型都一定有他的原因才會造就他的出現,接續也會帶著大家來持續更新現在NLP的Pretrained Model。

Reference


#AI #NLP #Paper #BERT #Transfer-Learning #Transformer







Related Posts

Promise 介紹

Promise 介紹

[Day 06]: Docker Network-2

[Day 06]: Docker Network-2

JavaScript: Execution Context & Closure

JavaScript: Execution Context & Closure


Comments