圖解 BERT 模型:從零開始構建 BERT
本文首先介紹 BERT 模型要做什麼,即:模型的 輸入 、 輸出 分別是什麼,以及模型的 預訓練任務 是什麼;然後,分析模型的 內部結構 ,圖解如何將模型的輸入一步步地轉化為模型輸出;最後,我們在多箇中 / 英文、不同規模的資料集上比較了 BERT 模型與現有方法的 文字分類效果 。
1. 模型的輸入 / 輸出
BERT 模型的全稱是: BidirectionalEncoder Representations from Transformer 。從名字中可以看出, BERT 模型的目標是利用大規模無標註語料訓練、獲得文字的包含豐富語義資訊的 Representation ,即:文字的語義表示,然後將文字的語義表示在特定 NLP 任務中作微調,最終應用於該 NLP 任務。煮個栗子, BERT 模型訓練文字語義表示的過程就好比我們在高中階段學習語數英、物化生等各門基礎學科,夯實基礎知識;而模型在特定 NLP 任務中的引數微調就相當於我們在大學期間基於已有基礎知識、針對所選專業作進一步強化,從而獲得能夠應用於實際場景的專業技能。
在基於深度神經網路的 NLP 方法中,文字中的字 / 詞通常都用一維向量來表示(一般稱之為 “ 詞向量 ” );在此基礎上,神經網路會將文字中各個字或詞的一維詞向量作為輸入,經過一系列複雜的轉換後,輸出一個一維詞向量作為文字的語義表示。特別地,我們通常希望語義相近的字 / 詞在特徵向量空間上的距離也比較接近,如此一來,由字 / 詞向量轉換而來的文字向量也能夠包含更為準確的語義資訊。因此, BERT 模型的主要輸入是文字中各個字 / 詞的原始詞向量,該向量既可以隨機初始化,也可以利用 Word2Vector 等演算法進行預訓練以作為初始值;輸出是文字中各個字 / 詞融合了全文語義資訊後的向量表示,如下圖所示(為方便描述且與 BERT 模型的當前中文版本保持一致,本文統一以 字向量 作為輸入):
從上圖中可以看出, BERT 模型通過查詢字向量表將文字中的每個字轉換為一維向量,作為模型輸入;模型輸出則是輸入各字對應的融合全文語義資訊後的向量表示。此外,模型輸入除了字向量,還包含另外兩個部分:
1. 文字向量:該向量的取值在模型訓練過程中自動學習,用於刻畫文字的全域性語義資訊,並與單字 / 詞的語義資訊相融合
2. 位置向量:由於出現在文字不同位置的字 / 詞所攜帶的語義資訊存在差異(比如: “ 我愛你 ” 和 “ 你愛我 ” ),因此, BERT 模型對不同位置的字 / 詞分別附加一個不同的向量以作區分
最後, BERT 模型將字向量、文字向量和位置向量的加和作為模型輸入。特別地,在目前的 BERT 模型中,文章作者還將英文詞彙作進一步切割,劃分為更細粒度的語義單位( WordPiece ),例如:將 playing 分割為 play 和 ##ing ;此外,對於中文,目前作者尚未對輸入文字進行分詞,而是直接將單字作為構成文字的基本單位。
對於不同的 NLP 任務,模型輸入會有微調,對模型輸出的利用也有差異,例如:
-
單文字分類任務:對於文字分類任務, BERT 模型在文字前插入一個 [CLS] 符號,並將該符號對應的輸出向量作為整篇文字的語義表示,用於文字分類,如下圖所示。可以理解為:與文字中已有的其它字 / 詞相比,這個無明顯語義資訊的符號會更 “ 公平 ” 地融合文字中各個字 / 詞的語義資訊。
-
語句對分類任務:該任務的實際應用場景包括:問答(判斷一個問題與一個答案是否匹配)、語句匹配(兩句話是否表達同一個意思)等。對於該任務, BERT 模型除了新增 [CLS] 符號並將對應的輸出作為文字的語義表示,還對輸入的兩句話用一個 [SEP] 符號作分割,並分別對兩句話附加兩個不同的文字向量以作區分,如下圖所示。
-
序列標註任務:該任務的實際應用場景包括:中文分詞 & 新詞發現(標註每個字是詞的首字、中間字或末字)、答案抽取(答案的起止位置)等。對於該任務, BERT 模型利用文字中每個字對應的輸出向量對該字進行標註(分類),如下圖所示 (B 、 I 、 E 分別表示一個詞的第一個字、中間字和最後一個字 ) 。
-
……
根據具體任務的不同,在實際應用中我們可以腦洞大開,通過調整模型的輸入、輸出將模型適配到真實業務場景中。
2. 模型的預訓練任務
BERT 實際上是一個語言模型。語言模型通常採用大規模、與特定 NLP 任務無關的文字語料進行訓練,其目標是學習語言本身應該是什麼樣的,這就好比我們學習語文、英語等語言課程時,都需要學習如何選擇並組合我們已經掌握的詞彙來生成一篇通順的文字。回到 BERT 模型上,其預訓練過程就是逐漸調整模型引數,使得模型輸出的文字語義表示能夠刻畫語言的本質,便於後續針對具體 NLP 任務作微調。為了達到這個目的, BERT 文章作者提出了兩個預訓練任務: Masked LM 和 Next Sentence Prediction 。
2.1 Masked LM
Masked LM 的任務描述為:給定一句話,隨機抹去這句話中的一個或幾個詞,要求根據剩餘詞彙預測被抹去的幾個詞分別是什麼,如下圖所示。
這不就是我們高中英語常做的 完形填空 麼!所以說, BERT 模型的預訓練過程其實就是在模仿我們學語言的過程。具體來說,文章作者在一句話中隨機選擇 15% 的詞彙用於預測。對於在原句中被抹去的詞彙, 80% 情況下采用一個特殊符號 [MASK] 替換, 10% 情況下采用一個任意詞替換,剩餘 10% 情況下保持原詞彙不變。這麼做的主要原因是:在後續微調任務中語句中並不會出現 [MASK] 標記,而且這麼做的另一個好處是:預測一個詞彙時,模型並不知道輸入對應位置的詞彙是否為正確的詞彙( 10% 概率),這就迫使模型更多地依賴於上下文資訊去預測詞彙,並且賦予了模型一定的糾錯能力。
2.2 NextSentence Prediction
Next Sentence Prediction 的任務描述為:給定一篇文章中的兩句話,判斷第二句話在文字中是否緊跟在第一句話之後,如下圖所示。
當年大學考英語四六級的時候,大家應該都做過 段落重排序 ,即:將一篇文章的各段打亂,讓我們通過重新排序把原文還原出來,這其實需要我們對全文大意有充分、準確的理解。 Next Sentence Prediction 任務實際上就是段落重排序的簡化版:只考慮兩句話,判斷是否是一篇文章中的前後句。在實際預訓練過程中,文章作者從文字語料庫中隨機選擇 50% 正確語句對和 50% 錯誤語句對進行訓練,與 Masked LM 任務相結合,讓模型能夠更準確地刻畫語句乃至篇章層面的語義資訊。
BERT 模型通過對 Masked LM 任務和 Next Sentence Prediction 任務進行聯合訓練,使模型輸出的每個字 / 詞的向量表示都能儘可能全面、準確地刻畫輸入文字(單句或語句對)的整體資訊,為後續的微調任務提供更好的模型引數初始值。
3. 模型結構
瞭解了 BERT 模型的輸入 / 輸出和預訓練過程之後,我們來看一下 BERT 模型的內部結構。前面提到過, BERT 模型的全稱是: BidirectionalEncoder Representations from Transformer ,也就是說, Transformer 是組成 BERT 的核心模組,而 Attention 機制又是 Transformer 中最關鍵的部分,因此,下面我們從 Attention 機制開始,介紹如何利用 Attention 機制構建 Transformer 模組,在此基礎上,用多層 Transformer 組裝 BERT 模型。
3.1 Attention 機制
Attention: Attention 機制的中文名叫 “ 注意力機制 ” ,顧名思義,它的主要作用是讓神經網路把 “ 注意力 ” 放在一部分輸入上,即:區分輸入的不同部分對輸出的影響。這裡,我們從增強字 / 詞的語義表示這一角度來理解一下 Attention 機制。
我們知道,一個字 / 詞在一篇文字中表達的意思通常與它的上下文有關。比如:光看 “ 鵠 ” 字,我們可能會覺得很陌生(甚至連讀音是什麼都不記得吧),而看到它的上下文 “ 鴻鵠之志 ” 後,就對它立馬熟悉了起來。因此,字 / 詞的上下文資訊有助於增強其語義表示。同時,上下文中的不同字 / 詞對增強語義表示所起的作用往往不同。比如在上面這個例子中, “ 鴻 ” 字對理解 “ 鵠 ” 字的作用最大,而 “ 之 ” 字的作用則相對較小。為了有區分地利用上下文字資訊增強目標字的語義表示,就可以用到 Attention 機制。
Attention 機制主要涉及到三個概念: Query 、 Key 和 Value 。在上面增強字的語義表示這個應用場景中,目標字及其上下文的字都有各自的原始 Value , Attention 機制將目標字作為 Query 、其上下文的各個字作為 Key , 並將 Query 與各個 Key 的相似性作為權重,把上下文各個字的 Value 融入目標字的原始 Value 中。如下圖所示, Attention 機制將目標字和上下文各個字的語義向量表示作為輸入,首先通過線性變換獲得目標字的 Query 向量表示、上下文各個字的 Key 向量表示以及目標字與上下文各個字的原始 Value 表示,然後計算 Query 向量與各個 Key 向量的相似度作為權重,加權融合目標字的 Value 向量和各個上下文字的 Value 向量,作為 Attention 的輸出,即:目標字的增強語義向量表示。
Self-Attention: 對於輸入文字,我們需要對其中的每個字分別增強語義向量表示,因此,我們分別將每個字作為 Query ,加權融合文字中所有字的語義資訊,得到各個字的增強語義向量,如下圖所示。在這種情況下, Query 、 Key 和 Value 的向量表示均來自於同一輸入文字,因此,該 Attention 機制也叫 Self-Attention 。
Multi-head Self-Attention: 為了增強 Attention 的多樣性,文章作者進一步利用不同的 Self-Attention 模組獲得文字中每個字在不同語義空間下的增強語義向量,並將每個字的多個增強語義向量進行線性組合,從而獲得一個最終的與原始字向量長度相同的增強語義向量,如下圖所示。
這裡,我們再給出一個例子來幫助理解 Multi-head Self-Attention (注:這個例子僅用於幫助理解,並非嚴格正確)。看下面這句話: “ 南京市長江大橋 ” ,在不同語義場景下對這句話可以有不同的理解: “ 南京市 / 長江大橋 ” ,或 “ 南京市長 / 江大橋 ” 。對於這句話中的 “ 長 ” 字,在前一種語義場景下需要和 “ 江 ” 字組合才能形成一個正確的語義單元;而在後一種語義場景下,它則需要和 “ 市 ” 字組合才能形成一個正確的語義單元。我們前面提到, Self-Attention 旨在用文字中的其它字來增強目標字的語義表示。在不同的語義場景下, Attention 所重點關注的字應有所不同。因此, Multi-head Self-Attention 可以理解為考慮多種語義場景下目標字與文字中其它字的語義向量的不同融合方式。可以看到, Multi-head Self-Attention 的輸入和輸出在形式上完全相同,輸入為文字中各個字的原始向量表示,輸出為各個字融合了全文語義資訊後的增強向量表示。因此, Multi-head Self-Attention 可以看作是對文字中每個字分別增強其語義向量表示的黑盒。
3.2 Transformer Encoder
在 Multi-headSelf-Attention 的基礎上再新增一些 “ 佐料 ” ,就構成了大名鼎鼎的 Transformer Encoder 。實際上, Transformer 模型還包含一個 Decoder 模組用於生成文字,但由於 BERT 模型中並未使用到 Decoder 模組,因此這裡對其不作詳述。下圖展示了 Transformer Encoder 的內部結構,可以看到, Transformer Encoder 在 Multi-head Self-Attention 之上又添加了三種關鍵操作:
-
殘差連線( ResidualConnection ):將模組的輸入與輸出直接相加,作為最後的輸出。這種操作背後的一個基本考慮是:修改輸入比重構整個輸出更容易( “ 錦上添花 ” 比 “ 雪中送炭 ” 容易多了!)。這樣一來,可以使網路更容易訓練。
-
Layer Normalization :對某一層神經網路節點作 0 均值 1 方差的標準化。
-
線性轉換:對每個字的增強語義向量再做兩次線性變換,以增強整個模型的表達能力。這裡,變換後的向量與原向量保持長度相同。
可以看到, Transformer Encoder 的輸入和輸出在形式上還是完全相同,因此, Transformer Encoder 同樣可以表示為將輸入文字中各個字的語義向量轉換為相同長度的增強語義向量的一個黑盒。
3.3 BERT model
組裝好 TransformerEncoder 之後,再把多個 Transformer Encoder 一層一層地堆疊起來, BERT 模型就大功告成了!
在論文中,作者分別用 12 層和 24 層 Transformer Encoder 組裝了兩套 BERT 模型,兩套模型的引數總數分別為 110M 和 340M 。
4. BERT 模型的文字分類效果
在本文中,我們聚焦文字分類任務,對比分析 BERT 模型在中 / 英文、不同規模資料集上的文字分類效果。我們基於 Google 預訓練好的 BERT 模型( 中文采用chinese_L-12_H-768_A-12模型,下載連結: https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip; 英文采用uncased_L-12_H-768_A-12模型,下載連結: https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip)。 我們一共選擇了 6 個數據集進行實驗,各資料集的訓練集 / 測試集大小、分類任務、類別數和語言型別如下表所示。
資料集 |
訓練集大小 |
測試集大小 |
分類任務 |
類別數 |
語言型別 |
商品評論情感分析 |
9653 |
1145 |
情感極性分類 |
3 |
中文 |
Sentiment_XS |
29613 |
11562 |
情感極性分類 |
2 |
中文 |
立場分析 |
2914 |
1249 |
立場分類 |
3 |
英文 |
AG’s News |
120000 |
7600 |
新聞分類 |
4 |
英文 |
Yelp Review Full |
650000 |
50000 |
情感分類 |
5 |
英文 |
Yahoo! Answers |
1400000 |
60000 |
問答系統 |
10 |
英文 |
4.1 商品評論情感分析
該資料集旨在分析微博中表達的對特定商品的情感傾向:正面、負面或中立。我們選擇了三種方法與 BERT 模型進行對比:
-
XGBoost : NGram 特徵 +XGBoost 分類器
-
Char-level CNN :將未分詞的文字直接輸入卷積神經網路(已對比發現 Word-level CNN 效果略差)
-
Attention-based RNN :將分詞後的文字輸入迴圈神經網路(已對比發現 Char-level RNN 效果略差),並且在最終分類前採用 Attention 機制融合輸入各個詞對應的 hidden states
BERT 模型與三種對比方法的正面、負面、中立情感分類 F1 值如下:
方法 |
正面 F1 值 |
負面 F1 值 |
中立 F1 值 |
XGBoost |
67% |
60% |
91% |
Char-level CNN |
69% |
74% |
92% |
Attention-based RNN |
66% |
71% |
91% |
BERT |
71% |
76% |
92% |
從上表中可以看到, BERT 模型在正、負、中立 F1 值上均碾壓了 所有 對比方法!
4.2 Sentiment_XS
該資料集來自於論文 “SentimentClassification with Convolutional Neural Networks: an Experimental Study on aLarge-scale Chinese Conversation Corpus” ( DOI:10.1109/CIS.2016.0046 ),旨在對短文字進行正 / 負面情感極性分類。我們選擇論文中的部分代表性對比方法與 BERT 模型進行對比,包括:支援向量機分類器( SVC )、邏輯迴歸( LR )、 Naive Bayes SVM ( NBSVM )和卷積神經網路( CNN ),分類準確率如下表所示(對比方法的實驗資料來自於論文)。
方法 |
分類準確率 |
SVC |
81.89% |
LR |
81.84% |
NBSVM |
81.18% |
CNN |
87.12% |
BERT |
90.01% |
可以看到, BERT 模型在 Sentiment_XS 資料集上的分類準確率再次碾壓了 所有 對比方法!
4.3 立場分析
該資料集來自於國外文字分析評測比賽 SemEval-2016 的任務 6A :有監督立場分類,旨在分析文字中對 5 個話題的支援、反對或中立態度,包括:有神論、氣候變化、女權運動、 Hillary Clinton 和墮胎合法化。因此,該資料集實際上對應 5 個話題子集。分類效果的官方評估指標為支援類別 F1 值和反對類別 F1 值的巨集平均。我們選擇了當前立場分析領域的四個最優方法與 BERT 模型進行對比,包括:
-
SVM : NGram 特徵 + 支援向量機分類器,該方法取得了當時參加評測的所有方法的最優分類效果
-
MITRE :基於迴圈神經網路( LSTM )的方法,在參加評測的神經網路方法中取得最優效果
-
pkudblab :基於卷積神經網路的方法,在參加評測的神經網路方法中效果僅次於 MITRE
-
TGMN-CR :結合動態記憶模組與迴圈神經網路的方法,近期提出的最新方法
上述方法與 BERT 模型在 5 個數據子集上的分類效果如下表所示(對比方法的資料來自於論文: A Target-GuidedNeural Memory Model for Stance Detection in Twitter , DOI : 10.1109/IJCNN.2018.8489665 )。
方法 |
有神論 |
氣候變化 |
女權運動 |
Hillary Clinton |
墮胎合法化 |
SVM |
65.19% |
42.35% |
57.46% |
58.63% |
66.42% |
MITRE |
61.47% |
41.63% |
62.09% |
57.67% |
57.28% |
pkudblab |
63.34% |
52.69% |
51.33% |
64.41% |
61.09% |
TGMN-CR |
64.6% |
43.02% |
59.35% |
66.21% |
66.21% |
BERT |
75.51% |
46.04% |
55.35% |
67.54% |
62.5% |
從上表中可以看到, BERT 模型在 2 個數據子集中都取得了最優效果,尤其是 “ 有神論 ” 資料集, F1 值超過當前最優演算法約 10% !不過,在其餘三個資料子集中, BERT 模型的表現比較一般。
4.4 AG’s News& Yelp Review Full & Yahoo! Answers
這三個資料集算是文字分類領域的經典資料集了,分別對應新聞分類、情感分類和問答系統任務。這裡,我們選擇了 4 種在這三個資料集上進行過實驗驗證的方法與 BERT 模型進行對比,包括:
-
char-CNN :將未分詞的文字直接輸入卷積神經網路
-
FastText :一種用於文字分類的快速神經網路方法
-
VDCNN : Very Deep CNN ,顧名思義,非常非常深的卷積神經網路 Region embedding :利用區域性文字語義資訊增強文字中每個詞的語義向量表示,輸入到一個簡單神經網路中進行分類
-
DPCNN : Deep Pyramid CNN ,同樣是非常深的神經網路,通過池化操作使網路的每層神經元個數不斷減半,因此,整個神經網路看起來像是一個金字塔結構
上述對比方法與 BERT 模型在三個資料集上的分類準確率如下表所示(對比方法的資料來自於論文: A New method ofRegion Embedding for Text Classification 和 Deep PyramidConvolutional Neural Networks for Text Categorization )。
方法 |
AG’s News |
Yelp Review Full |
Yahoo! Answers |
char-CNN |
87.2% |
62% |
71.2% |
FastText |
92.5% |
63.9% |
72.3% |
VDCNN |
91.3% |
64.7% |
73.4% |
Region embedding |
92.8% |
64.9% |
73.7% |
DPCNN |
93.1% |
69.4% |
76.1% |
BERT |
94.6% |
66.0% |
74.2% |
上表表明, BERT 模型在 AG’s News 資料集上取得了最高的分類準確率,在 Yelp Review Full 和 Yahoo! Answers 資料集上也都取得了次高的分類準確率。需要注意的是,我們目前僅使用 12 層 Transformer Encoder 結構的 BERT 模型進行實驗,後續會進一步檢驗 24 層 TransformerEncoder 結構的 BERT 模型的分類效果,可以期待, BERT 模型的分類效果應該會隨著網路結構的加深而進一步有所提高。
5. 結語
本文分析了 BERT 模型的內部結構與原理,並在文字分類任務上檢驗了模型效果。從實驗結果中可以看出, BERT 模型 的文字分類 效果在許多中 / 英文資料集上都超過了現有方法,體現出了很強的泛用性。後續我們將繼續檢驗 BERT 模型在其它 NLP 任務中的效果,並研究提升模型訓練效率的方法,歡迎大家批評與指正!
Citations
Devlin J, Chang M W, Lee K, et al. Bert:Pre-training of deep bidirectional transformers for language understanding[J].arXiv preprint arXiv:1810.04805, 2018.
Vaswani A, Shazeer N, Parmar N, et al.Attention is all you need[C]//Advances in Neural Information ProcessingSystems. 2017: 5998-6008.
Zhang L, Chen C. Sentimentclassification with convolutional neural networks: an experimental study on alarge-scale Chinese conversation corpus[C]//Computational Intelligence andSecurity (CIS), 2016 12th International Conference on. IEEE, 2016: 165-169.
Mohammad S, Kiritchenko S, Sobhani P, etal. Semeval-2016 task 6: Detecting stance in tweets[C]//Proceedings of the 10thInternational Workshop on Semantic Evaluation (SemEval-2016). 2016: 31-41.
Zarrella G, Marsh A. MITRE atsemeval-2016 task 6: Transfer learning for stance detection[J]. arXiv preprintarXiv:1606.03784, 2016.
Wei W, Zhang X, Liu X, et al. pkudblabat semeval-2016 task 6: A specific convolutional neural network system foreffective stance detection[C]//Proceedings of the 10th International Workshopon Semantic Evaluation (SemEval-2016). 2016: 384-388.
Wei P, Mao W, Zeng D. A Target-GuidedNeural Memory Model for Stance Detection in Twitter[C]//2018 InternationalJoint Conference on Neural Networks (IJCNN). IEEE, 2018: 1-8.
Joulin A, Grave E, Bojanowski P, et al.Bag of tricks for efficient text classification[J]. arXiv preprintarXiv:1607.01759, 2016.
Conneau A, Schwenk H, Barrault L, et al.Very deep convolutional networks for natural language processing[J]. arXivpreprint, 2016.
Johnson R, Zhang T. Deep pyramidconvolutional neural networks for text categorization[C]//Proceedings of the55th Annual Meeting of the Association for Computational Linguistics (Volume 1:Long Papers). 2017, 1: 562-570.
如果您覺得我們的內容還不錯,就請轉發到朋友圈,和小夥伴一起分享吧~