BERT原理與NSP和MLM

由於公眾號改版不再按照作者的釋出時間進行推送,為防止各位朋友錯過月來客棧推送的最新文章,大家可以手動將公眾號設定為“星標⭐”以第一時間獲得推送內容,感謝各位~

1 引言

各位朋友大家好,歡迎來到月來客棧,我是掌櫃空字元。

經過前面

一系列文章

的介紹我們總算是對於Transformer有了清晰的認知。不過說起Transformer模型,其實在它發表之初並沒有引起太大的反響,直到它的後繼者BERT[1]的出現才使得大家再次回過頭來仔細研究Transformer。因此,在接下來這個系列的文章中,掌櫃將主要從BERT的基本原理、BERT模型的實現、BERT預訓練模型在下游任務中的運用、Mask LM和NSP的實現與運用這幾個方面來詳細介紹Bert。總的來說就是先介紹如何在下游任務中運用預訓練的BERT模型,然後再介紹如何利用Mask LM和NSP這兩個任務來訓練BERT模型。

關於Bert所取得的成就這裡就不再細說,用論文裡面作者的描述來說就是:BERT不僅在概念上很簡單,並且從經驗上來看它也非常強大,以至於直接重新整理了11項NLP記錄。

BERT is conceptually simple and empirically powerful。 It obtains new state-of-the-art re- sults on eleven natural language processing tasks。

作者之所以說BERT在概念上很簡單,掌櫃猜測這是因為BERT本質上是根據Transformer中Encoder堆疊而來所以說它簡單;而作者說BERT從經驗上來看非常強大,是因為BERT在訓練過程中所基於的Mask LM和NSP這兩個任務所以說其強大。

由於BERT是基於多層的Transformer堆疊而來,因此在整篇論文中關於BERT網路結構的細節之處作者並沒有提及。同時,由於論文配了一張極具迷惑性的網路結構圖,使得在不看原始碼的基礎上你幾乎很難弄清整個網路結構的細節之處。

BERT’s model architec- ture is a multi-layer bidirectional Transformer en- coder based on the original implementation de- scribed in Vaswani et al。 (2017) and released in the tensor2tensor library。

BERT原理與NSP和MLM

圖 1。 BERT網路結構圖

如圖1所示就是論文中所展示的BERT網路結構圖。看完論文後真的不知道作者為什麼要畫這麼一個結構圖,難道就是為了凸顯“bidirectional ”?一眼看去,對於同一層的Trm來說它到底代表什麼?是類似於time step的展開,還是每個Trm都有著不同的權重?這些你都不清楚,當然論文也沒有介紹。不過在看完這部分的原始碼實現後你就會發現,其實真正的BERT網路結構大體上應該是如圖2所示的模樣。

BERT原理與NSP和MLM

圖 2。 BERT網路結構圖

雖然從圖2來看BERT的網路結構確實是不太複雜,但是其中的Transformer模組相較於原始Transformer[2]中的實現依舊有著不小的差別,不過這並不影響從整體上來認識BERT。

2 動機

2。1 面臨問題

在論文的介紹部分作者談到,預訓練語言模型(Language model pre-training)對於下游很多自然語言處理任務都有著顯著的改善。但是作者繼續說到,現有預訓練模型的網路結構限制了模型本身的表達能力,其中最主要的限制就是沒有采用雙向編碼的方法來對輸入進行編碼。

Language model pre-training has been shown to be effective for improving many natural language processing tasks。 We argue that current techniques restrict the power of the pre-trained representations, espe- cially for the fine-tuning approaches。 The ma jor limitation is that standard language models are unidirectional。

例如在 OpenAI GPT中,它使用了從左到右(left-to-right)的網路架構,這就使得模型在編碼過程中只能夠看到當前只看之前的資訊。

For example, in OpenAI GPT, the authors use a left-to- right architecture, where every token can only at- tend to previous tokens in the self-attention layers of the Transformer。

BERT原理與NSP和MLM

圖 3。 不同方向編碼示意圖

如圖3所示,對於這句樣本來說,無論是採用left-to-right還是right-to-left的方法,模型在對“it”進行編碼時都不能夠很好的捕捉到其具體的指代資訊。這就像我們人在看這句話時一樣,在沒有看到“tired”這個詞之前我們是無法判斷“it”具體所指代的事物(例如把“tired”換成“wide”,則“it”指代的就是“street”)。如果採用雙向編碼的方式則從理論上來說就能夠很好的避免這個問題,如圖4所示。

BERT原理與NSP和MLM

圖 4。 注意力機制視覺化圖[3]

在圖4中,橙色線條表示“it”應該將注意力集中在哪些位置上,顏色越深則表示注意力權重越大。透過這幅圖可以發現,模型在對“it”進行編碼時,將大部分注意力都集中在了“The animal”上,而這也符合我們預期的結果。

2。2 解決思路

在論文中,作者提出了採用BERT(Bidirectional Encoder Representations from Transformers)這一網路結構來實現模型的雙向編碼學習能力。同時,為了使得模型能夠有效的學習到雙向編碼的能力,BERT在訓練過程中使用了基於掩蓋的語言模型(Masked Language Model, MLM),即隨機對輸入序列中的某些位置進行遮蔽,然後透過模型來對其進行預測。

In this paper, we improve the fine-tuning based approaches by proposing BERT: Bidirectional Encoder Representations from Transformers。 BERT alleviates the previously mentioned unidi- rectionality constraint by using a “masked lan- guage model” (MLM) pre-training objective。

作者繼續談到,由於MLM預測任務能夠使得模型編碼得到的結果同時包含上下文的語境資訊,因此有利於訓練得到更深的BERT網路模型。除此之外,在訓練BERT的過程中作者還加入了下句預測任務(Next Sentence Prediction, NSP),即同時輸入兩句話到模型中,然後預測第2句話是不是第1句話的下一句話。

3 技術實現

對於技術實現這部分內容,掌櫃將會分為三個大的部分來進行介紹。第一部分主要介紹BERT的網路結構原理以及MLM和NSP這兩種任務的具體原理;第二部分將主要介紹如何實現BERT以及BERT預訓練模型在下游任務中的使用;第三部分則是介紹如何利用MLM和NSP這兩個任務來訓練BERT模型(可以是從頭開始,也可以是基於開源的BERT預訓練模型開始)。本篇文章將先對第一部分的內容進行介紹。

3。1 BERT網路結構

正如圖2所示,BERT網路結構整體上就是由多層的Transformer Encoder堆疊所形成。關於Transformer部分的具體解讀可以參見文章

This post is all you need

[4],這裡就不再贅述。

BERT’s model architec- ture is a multi-layer bidirectional Transformer en- coder based on the original implementation de- scribed in Vaswani et al。 (2017) [2]。

當然,如果是將圖2中的結果再細緻化一點便能夠得到如圖5所示的網路結構圖。

BERT原理與NSP和MLM

圖 5。 BERT網路模型細節圖

如圖5所示便是一個詳細版的BERT網路結構圖,可以發現上半部分與之前的Transformer Encoder差不多,只不過在Input部分多了一個Segment Embedding。下面就開始分別對其中的各個部分進行介紹。

3。2 Input Embedding

如圖6所示,在BERT中Input Embedding主要包含三個部分:Token Embedding、Positional Embedding和Segment Embedding。雖然前面兩種Embedding在Transformer中已經介紹過,但是這裡需要注意的是BERT中的Positional Embedding對於每個時刻的位置並不是採用公式計算出來的,其原理也是類似普通的詞嵌入一樣為每一個位置初始化了一個向量,然後隨著網路一起訓練。

BERT原理與NSP和MLM

圖 6。 Input Embedding結構圖

當然,最值得注意的一點就是

BERT開源的預訓練模型最大隻支援512個字元的長度,這是因為其在訓練過程中(位置)詞表的最大長度只有512。

To speed up pretraing in our experiments, we pre-train the model with sequence length of 128 for 90% of the steps。 Then, we train the rest 10% of the steps of sequence of 512 to learn the positional embeddings。

除此之外,第三部分則是BERT中引入的Segment Embedding。由於BERT的主要目的是構建一個通用的預訓練模型,因此難免需要兼顧到各種NLP任務場景下的輸入。因此Segment Embedding的作用便是便是用來區分輸入序列中的不同序列,其本質就是透過一個普通的詞嵌入來區分每一個序列所處的位置。例如在NSP任務中,那麼對於任意一個序列的每一位置都將用同一個向量來進行表示,即此時Segment詞表的長度為2。

最後,再將這三部分Embedding後的結果相加(並進行標準化)便得到了最終的Input Embedding部分的輸出,如圖7所示。

圖 7。 BERT輸入圖

如圖7所示,最上面的Input表示原始的輸入序列,其中第一個字元“[CLS]”是一個特殊的分類標誌,如果下游任務是做文字分類的話,那麼在BERT的輸出結果中可以只取“[CLS]”對應的向量進行分類即可;而其中的“[SEP]”字元則是用來作為將兩句話分開的標誌。Segment Embedding層則同樣是用來區分兩句話所在的不同位置,對於每句話來說其內部各自的位置都是一樣的,當然如果原始輸入就只有一句話,那麼Segment Embedding層中對應的每個Token的位置向量都是一樣的。最後,Positional Embedding則是用來標識句子中每個Token各自所在的位置,使得模型能夠捕捉到文字”有序“這一特性。具體細節之處見後續程式碼實現。

Sentence pairs are packed together into a single sequence。 We differentiate the sentences in two ways。 First, we separate them with a special token ([SEP])。 Second, we add a learned embed- ding to every token indicating whether it belongs to sentence A or sentence B。

3。3 BertEncoder

如圖8所示便是Bert Encoder的結構示意圖,其整體由多個BertLayer(也就是論文中所指代的Transformer blocks)所構成。

BERT原理與NSP和MLM

圖 8。 BertEncoder結構圖

具體的,在論文中作者分別用

來表示BertLayer的層數,即BertEncoder是由

個BertLayer所構成;用

來表示模型的維度;用

來表示多頭注意力中多頭的個數。同時,在論文中作者分別就和這兩種尺寸的BERT模型進行了實驗對比。由於這部分類似的內容在

Transformer

中已經進行了詳細介紹,所以這裡就不再贅述,細節之處見後續程式碼實現。

3。4 MLM與NSP

為了能夠更好訓練BERT網路,論文作者在BERT的訓練過程中引入兩個任務,MLM和NSP。對於MLM任務來說,其做法是隨機掩蓋掉輸入序列中

的Token(即用“[MASK]”替換掉原有的Token),然後在BERT的輸出結果中取對應掩蓋位置上的向量進行真實值預測。

In order to train a deep bidirectional representation, we simply mask some percentage of the input tokens at random, and then predict those masked tokens。 In this case, the final hidden vectors corresponding to the mask tokens are fed into an output softmax over the vocabulary, as in a standard LM。 In all of our experiments, we mask 15% of all WordPiece tokens in each sequence at random。

接著作者提到,雖然MLM的這種做法能夠得到一個很好的預訓練模型,但是仍舊存在不足之處。由於在fine-tuning時,輸入序列中並不存在“[MASK]”這樣的Token,因此這將導致pre-training和fine-tuning之間存在不匹配的問題。

Although this allows us to obtain a bidirec- tional pre-trained model, a downside is that we are creating a mismatch between pre-training and fine-tuning, since the [MASK] token does not ap- pear during fine-tuning。

為了解決這一問題,作者在原始MLM的基礎了做了部分改動,即先選定

的Token,然後將其中的

替換為“[MASK]”、

隨機替換為其它Token、剩下的

不變。最後取這

的Token對應的輸出做分類來預測其真實值。

The training data generator chooses 15% of the token positions at random for prediction。 If the i-th token is chosen, we replace the i-th token with (1) the [MASK] token 80% of the time (2) a random token 10% of the time (3) the unchanged i-th token 10% of the time。

最後,作者還給出了一個不同掩蓋策略下的對比結果,如圖9所示。

BERT原理與NSP和MLM

圖 9。 不同MASK策略對比結果圖

由於很多下游任務需要依賴於分析兩句話之間的關係來進行建模,例如問題回答等。為了使得模型能夠具備有這樣的能力,作者在論文中又提出了二分類的下句預測任務。

Many important downstream tasks such as Ques- tion Answering (QA) and Natural Language Infer- ence (NLI) are based on understanding therela- tionshipbetween two sentences。 In order to train a model that understands sentence relationships, we pre-train for a binarizednext sen- tence predictiontask。

具體地,對於每個樣本來說都是由A和B兩句話構成,其中

的情況B確實為A的下一句話(標籤為IsNext),另外的

的情況是B為語料中其它的隨機句子(標籤為NotNext),然後模型來預測B是否為A的下一句話。

Specifically, when choosing the sentences A and B for each pretraining example, 50% of the time B is the actual next sentence that follows A (labeled as IsNext), and 50% of the time it is a random sentence from the corpus (labeled as NotNext)。

BERT原理與NSP和MLM

圖 10。 ML和NSP任務網路結構圖

如圖10所示便是ML和NSP這兩個任務在BERT預訓練時的輸入輸出示意圖,其中最上層輸出的

在預訓練時用於NSP中的分類任務;其它位置上的

則用於預測被掩蓋的Token。

到此,對於BERT模型的原理以及NSP、MLM這兩個任務的內容就介紹完了。

4 總結

對於BERT來說,如果單從網路結構上來說的話,個人感覺並沒有太大的創新,這也正如作者所說“BERT整體上就是由多層的Transformer Encoder堆疊所形成”,並且所謂的“Bidirectional”其實指的也就是Transformer中的self-attention機制。真正讓BERT表現出色的應該是基於MLM和NSP這兩種任務的預訓練過程,使得訓練得到的模型具有強大的表徵能力。在下一篇文章中,掌櫃將會詳細介紹如何動手來實現BERT模型,以及如何載入現有的模型引數並運用在下游任務中。

引用

[1]BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding。

[2]Vaswani A, Shazeer N, Parmar N, et al。 Attention is all you need

[3]http://jalammar。github。io/illustrated-transformer/

[5]The Illustrated BERT, ELMo, and co。 (How NLP Cracked Transfer Learning) https://jalammar。github。io/illustrated-bert/

TAG: BERT模型TransformerEmbeddingNSP