BERT模型:天然語言處理最新里程碑完整詳解!

全文共7055字,預計學習時長14分鐘git

BERT全稱是來自變換器的雙向編碼器表徵量(Bidirectional Encoder Representations from Transformers),它是Google於2018年底開發併發布的一種新型語言模型。與BERT模型類似的預訓練語言模型例如問答、命名實體識別、天然語言推理、文本分類等在許多天然語言處理任務中發揮着重要做用。微信

BERT是一種基於微調的多層雙向變換器編碼器。首先介紹下該變換器的架構,這一點尤其重要。網絡

什麼是變換器(Transformer)?架構

2017年,谷歌發表了一篇題爲《你所須要的是注意力》的論文,該論文提出一種基於注意力的結構,以處理與序列模型相關的問題,例如機器翻譯。傳統的神經機器翻譯大多使用循環神經網絡(RNN)或卷積神經網絡(CNN)做爲編碼-解碼的模型庫。然而,谷歌這一基於注意力的變換器模型摒棄傳統的RNN和CNN公式。該模型高度並行運行,所以在提升翻譯性能的同時,其訓練速度也很是快。併發

進一步闡述變換器模型前,咱們先對注意力作個介紹。函數

什麼是注意力(Attention)?性能

注意力機制可看做模糊記憶的一種形式。記憶由模型的隱藏狀態組成,模型選擇從記憶中檢索內容。深刻了解注意力以前,先簡要回顧Seq2Seq模型。傳統的機器翻譯主要基於Seq2Seq模型。該模型分爲編碼層和解碼層,並由RNN或RNN變體(LSTM、GRU等)組成。編碼矢量是從模型的編碼部分產生的最終隱藏狀態。該向量旨在封裝全部輸入元素的信息,以幫助解碼器進行準確的預測。其用於充當模型解碼器部分的初始隱藏狀態。學習

Seq2Seq模型的主要瓶頸是須要將源序列的所有內容壓縮爲固定大小的矢量。若是文本稍長,則很容易丟失文本的某些信息。爲解決這個問題,注意力應運而生。注意機制經過使解碼器回顧源序列隱藏狀態,而後將其加權平均值做爲附加輸入提供給解碼器來緩解該問題。使用注意力,顧名思義,模型在解碼階段選擇最適合當前節點的上下文做爲輸入內容。編碼

注意力與傳統的Seq2Seq模型有兩個主要區別。人工智能

第一,編碼器向解碼器提供更多數據,而且編碼器會向解碼器提供全部節點的隱藏狀態,而不只僅是編碼器的最後節點的隱藏狀態。

第二,解碼器不直接將全部編碼器提供的隱藏狀態做爲輸入,而是採用選擇機制來選擇與當前位置最匹配的隱藏狀態。爲此,它嘗試經過計算每一個隱藏狀態的得分值並對得分進行softmax計算來肯定哪一個隱藏狀態與當前節點相關性最高,這使得隱藏狀態的更高相關性具備更大的分數值,不太相關的隱藏狀態具備較小的分數值。而後它將每一個隱藏狀態與其softmax得分相乘,從而放大分數高的隱藏狀態,淹沒分數低的隱藏狀態。該評分練習在解碼器側的每一個迭代時間完成。

如今,將注意機制用可視化予以表現,研究注意流程如何進行:

1.注意解碼器RNN接收<END>令牌的嵌入和初始解碼器隱藏狀態。

2.RNN處理其輸入,產生一個輸出和一個新的隱藏狀態向量(h4),並丟棄輸入。

3.注意步驟:使用編碼器隱藏狀態和h4向量來計算該迭代時間的語境向量(C4)。

4.將h4和C4連成一個向量。

5.將這個向量傳遞給前饋神經網絡(一個與模型共同訓練的網絡)。

6.前饋神經網絡的輸出即該迭代時間的輸出字。

7.重複下一個迭代時間的步驟

回到變換器

變換器模型使用編碼器-解碼器(encoder-decoder)架構。在谷歌發表的論文中,編碼層和解碼層都由6個編碼器堆疊而成。每一個編碼器和解碼器的內部結構以下:


編碼器由兩層組成,一個自注意層和一個前饋神經網絡。自我關注不只有助於當前節點關注當前單詞,還能助其獲取上下文的語義。解碼器還包含編碼器提到的雙層網絡,但在兩層中間還有一個注意層,以幫助當前節點得到須要注意的關鍵內容。

如下是變換器架構的詳細結構:

接下來逐個分析其組成部分。

自注意(Self-Attention)

自注意是變換器將其餘相關單詞的「理解」轉換爲所處理的單詞的一種方式。

首先,自注意計算三個新的向量。在論文中,向量的維度是512維。將這三個向量分別稱爲Query,Key和Value。這三個向量經過字嵌入向量與隨機初始化矩陣(論文中的維數爲(64,512))相乘而產生的,並在反向傳播過程當中不斷更新。

接下來,計算自注意的分數值,在某個位置編碼單詞時,它能決定在所輸入句子其他部分投入的注意力。該分數值可經過Query和Key向量計算得出。而後用所得結果除以一個常數。本文中,該常數爲8,這個值一般是上述矩陣第一維的平方根,即64的平方根8。而後對全部得分進行softmax計算。結果表示每一個單詞與當前位置單詞的相關性。固然,當前詞的相關性確定會很大。最後一步是將Value向量與softmax所得結果相乘並求和。結果是當前節點處的自注意值。

這種經過查詢和密鑰之間的類似度,來肯定值的權重分佈的方法,被稱爲縮放的點積注意。

多頭注意

本論文中更精闢的部分是增長了另外一種自注意機制,稱爲「多頭」注意,它不只僅初始化一組Q,K,V矩陣。相反,初始化多個組,且變換器使用8個組,所以最終結果是8個矩陣。

前饋神經網絡不能接受8個矩陣,所以須要一種方法將其減小爲1個。爲此,首先將8個矩陣鏈接在一塊兒獲得一個大矩陣,而後將這個組合矩陣與一個隨機初始化矩陣相乘獲得最後的矩陣。整個流程以下圖所示。

變換器的多頭注意有三種使用方式:

1.在「編碼-解碼注意」層中,查詢來自先前的解碼器層,存儲器鍵和值來自編碼器的輸出。這使解碼器中的每一個位置都參與輸入序列中的全部位置。並模擬出序列到序列模型中典型的編碼-解碼注意機制。

2.編碼器包含自注意層。在自注意層中,全部鍵、全部值和查詢都來自相同的位置,在這種狀況下,它們來自於編碼器中前一層的輸出。編碼器中的每一個位置均可以處理編碼器前一層中的全部位置。

3.與其類似的是,解碼器中的自注意層令解碼器中的每一個位置參與到解碼器中的全部位置,直到幷包括該位置。在此須要預防解碼器中的向左信息流,以此保持自迴歸屬性。經過掩蔽(設置爲-∞)softmax中與非法鏈接相對應的全部值來實現縮放點積注意。這將在解碼器部分更加詳細地探討,在此僅討論掩蔽(Masking)。

位置編碼

到目前爲止,尚未辦法解釋變換器模型中輸入序列中的單詞順序。爲了解決此問題,變換器在編碼器和解碼器層的輸入端增長了一個額外的矢量位置編碼。其維度與嵌入維度相同。此位置編碼的值將添加到嵌入層的值中,並做爲輸入發送到下一層。位置編碼選項有不少,包括學習和修復。

殘餘鏈接和層規範化

在編碼器和解碼器中,在兩個子層的周圍都採用殘餘鏈接,而後進行層規範化。跳過鏈接或殘餘鏈接用於容許梯度直接流過網絡,而不經過非線性激活功能。非線性激活函數本質上是非線性的,致使梯度爆炸或消失(取決於權重)。從概念上說,跳過鏈接造成一條「總線」,它在網絡中流動,反過來,梯度也能夠沿着它向後流動。規範化有助於解決內部協變量偏移的問題。內部協變量偏移是指在神經網絡內發生的協變量偏移,即從(例如)第2層到第3層。這是由於當網絡學習且權重被更新時,網絡中特定層的輸出分佈會發生變化。這迫使較高層適應該漂移,這減慢了學習速度。在對神經網絡中的輸入進行歸一化後,沒必要擔憂輸入特徵的規模差異很大。要了解層規範化,將其與批規範化進行對比很是有用。一小批包含具備相同數量功能的多個示例。小批是矩陣 - 若是每一個輸入是多維的,則爲張量 - 其中一個軸對應批,另外一個軸或多個軸對應特徵尺寸。批規範化規範批維度中的輸入要素。層規範化的關鍵特性是它能夠對要素之間的輸入進行標準化。在批規範化中,統計信息在批處理中計算,而且對於批中的每一個示例都是相同的。相反,在層規範化中,統計數據是跨每一個特徵計算的,而且與其餘示例無關。

將殘餘鏈接和層規範化放在一塊兒

解碼器

回看變換器體系結構圖,能夠看到解碼器部分與編碼器部分類似,但底部有一個掩蓋的多頭注意。Mask表示屏蔽某些值的掩碼,以便在更新參數時它們不起做用。變換器模型中有兩種掩碼—填充掩碼和序列掩碼。填充掩碼用於全部縮放的點積注意,序列掩碼僅用於解碼器的自注意。

填充掩碼解決了輸入序列具備可變長度的問題。具體來講,在較短的序列後填0。可是若是輸入序列太長,則會截取左側的內容,並直接丟棄多餘的內容。由於這些填充的位置實際上沒有意義,注意機制不該該集中在這些位置,因此須要作一些處理。具體方法是在這些位置的值上加一個很是大的負數(負無窮大),這樣這些位置的機率在softmax計算以後將接近0!填充掩碼其實是一個張量,每一個值都是一個布爾值,false值指想要處理的值。

A序列掩碼旨在確保解碼器沒法查看未來的信息。也就是說,對於序列,在time_step t,解碼輸出應該僅取決於t以前的輸出,而不取決於t以後的輸出。這針對於變換器架構,由於沒有RNN,能夠按順序輸入序列。在此,一塊兒輸入全部內容,若是沒有掩碼,多頭注意將考慮每一個位置的整個解碼器輸入序列。經過生成上三角矩陣來實現這一點,上三角形的值全爲零,並將該矩陣應用於每一個序列。

對於解碼器的自注意,在此使用縮放的點積注意,而且添加填充掩碼和序列掩碼做爲attn_mask。在其餘狀況下,attn_mask等於填充掩碼。

另外一個細節是解碼器輸入將向右移動一個位置。這樣作的一個緣由是不但願模型在訓練期間學習如何複製解碼器輸入,但仍是想要了解給定編碼器序列和模型已經看到的特定解碼器序列,從而預測下一個單詞/字符。若是不移位解碼器序列,模型則簡單地學習「複製」解碼器輸入,由於位置 i 的目標字/字符將是解碼器輸入中的字/字符 i 。所以,經過將解碼器輸入移位一個位置,模型須要預測僅在解碼器序列中看到單詞/字符 1, …, i-1 的位置 i 的目標字/字符。這能夠防止模型學習複製/粘貼任務。用句子開頭令牌填充解碼器輸入的第一個位置,因爲右移,該位置將是空的。相似地,將一個句末標記附加到解碼器輸入序列以標記該序列的結尾,而且它還附加到目標輸出語句。

輸出層

在徹底執行解碼器層後,爲將獲得的矢量映射到來自詞彙表的單詞,在結尾添加徹底鏈接層和softmax層。

線性層是一個簡單的徹底鏈接的神經網絡,它將解碼器堆棧產生的矢量投影到一個更大的矢量中,稱爲logits矢量。假設模型知道從訓練數據集中學到的10,000個獨特的英語單詞(模型的「輸出詞彙表」) 這將使logits矢量10,000個細胞變寬 - 每一個單元對應於一個惟一單詞的得分。這就是對於線性層後的模型輸出的解釋。而後,softmax層將這些分數轉換爲機率(全部正數,全部加起來都爲1.0)。選擇具備最高几率的單元,並將與其相關聯的單詞做爲該迭代時長的輸出。

回到BERT模型

BERT模型基於變換器架構。它是一種具備雙向深度的神經網絡模型。BERT模型的關鍵技術創新是將變換器的雙向培訓應用於語言建模。這與先前從左到右查看文本序列或從左到右和從右到左組合訓練的努力嘗試造成對比。BERT模型採用了一種名爲掩蔽語言模型(Masked Language Modeling)的新技術(將在後文看到),它容許在從前不可能使用的模型中進行雙向訓練。在其vanilla form中,變換器包括兩個獨立的機制——讀取文本輸入的編碼器和產生任務預測的解碼器。因爲BERT模型的目標是生成語言模型,所以只須要編碼器機制。

谷歌最初發布了兩個版本,以下圖所示。這裏L表示變壓器的層數,H表示輸出的維數,A表示多頭注意的數量。在這兩個版本中,前饋大小都設置爲4層。

BERTBASE: L=12, H=768, A=12, Total Parameters=110M

BERTLARGE: L=24, H=1024, A=16, Total Parameters=340M

使用BERT模型有兩個階段:預訓練和微調。在預訓練期間,模型在不一樣的預訓練任務上訓練未標記的數據。對於微調,首先使用預訓練參數初始化BERT模型,並使用來自下游任務的標記數據對全部參數進行微調。每一個下游任務都有單獨的微調模型,即便它們使用相同的預訓練參數進行初始化。BERT模型的一個顯著特色是它跨越不一樣任務的統一架構。預訓練架構與最終下游架構之間的差別很小。在微調期間,全部參數都通過微調。


BERT模型預訓練過程

BERT模型預訓練階段包括兩個無監督預測任務:掩蔽語言模型和下一句預測。

掩蔽語言模型(MLM)——因爲BERT模型的雙向功能(雙向性)及其使用的多層自關注機制的效果,爲了訓練深度雙向表示,一些百分比(論文中爲15%)輸入令牌的輸入被簡單地隨機掩蓋,而後預測那些被屏蔽的令牌。對應於掩模標記的最終隱藏向量被饋送到詞彙表上的輸出softmax,如在標準學習模型LM中。與從左到右的語言模型預訓練不一樣,MLM目標容許表示融合的左側和右側的上下文,這使得能夠預先訓練深度雙向變換器。雖然這容許得到雙向預訓練模型,但缺點是預訓練和微調之間存在不匹配,由於在微調期間不出現[MASK]標記。爲了緩解這種狀況,做者並不老是用實際的[MASK]標記替換「蒙面」單詞。訓練數據生成器隨機選擇15%的令牌位置進行預測。若是選擇了第i個令牌,則將其替換爲(1)[MASK]標記80%的時間(2)隨機標記10%的時間(3)未更改的第i個標記10%時間。BERT模型損失函數僅考慮掩蔽值的預測並忽略非掩蔽字的預測。所以,模型比定向模型收斂得慢,這一特徵被其增長的情境感知所抵消。

下一句預測(NSP)。爲了訓練理解句子關係以及單詞之間的語義關係的模型,BERT模型還預先訓練二進制化的下一句預測任務,該任務能夠從任何文本語料庫中輕易生成。爲A和B選擇一些句子,其中50%的數據B是A的下一個句子,剩餘的50%的數據B是在語料庫中隨機選擇的,而後學習相關性。添加這種預訓練的目的是許多天然語言處理任務(如QA和NLI)須要理解兩個句子之間的關係,以便預訓練模型可以更好地適應這些任務。

爲了幫助模型區分訓練中的兩個句子,輸入在進入模型以前按如下方式處理:

1.在第一個句子的開頭插入[CLS]標記,並在每一個句子的末尾插入[SEP]標記。

2.在每一個標記中添加表示句子A或句子B的句子嵌入。句子嵌入在概念上相似於詞彙量爲2的標記嵌入。

3.向每一個標記添加位置嵌入以指示其在序列中的位置。位置嵌入的概念和實現已在變換器論文中給出。

要預測第二個句子是否確實與第一個句子鏈接,需執行如下步驟:

1.整個輸入序列通過變換器模型。

2.使用簡單的分類層(權重和誤差的學習矩陣)將[CLS]標記的輸出轉換爲2×1型的矢量。

3.使用softmax計算IsNextSequence的機率。

在訓練BERT模型時,MLM和NSP是被同時訓練的,目標是最小化兩種策略的組合損失函數。

標記化—BERT模型不會將單詞視做標記。相反,它會看WordPieces。這意味着一個單詞能夠分解爲多個子單詞。這種標記化在處理詞彙單詞時是有益的,它能夠幫助更好地表示覆雜的單詞。

BERT模型的輸入

BERT的輸入能夠是單詞序列中的單個句子或句子對(例如,[問題,答案])。對於給定的單詞,其輸入表示能夠由三部分嵌入求和組成。嵌入的可視化表示以下所示:

標記嵌入表示單詞向量。第一個字是CLS標誌,可用於後續分類任務。對於非分類任務,能夠忽略CLS標誌。段嵌入用於區分兩個句子,由於預訓練不只是語言模型,並且仍是具備兩個句子做爲輸入的分類任務。位置嵌入編碼字順序。

用於下游天然語言處理任務的BERT模型微調

對於每一個下游天然語言處理任務,只需將特定於任務的輸入和輸出插入BERT模型,並對端到端的全部參數進行微調。在輸入處,來自預訓練的句子A和句子B可類比於釋義中的句子對,蘊涵中的假設前提對,問題回答中的問題通道對等。在輸出處,標記表示被饋送到用於標記級別任務的輸出層,例如序列標記或問題回答,而且[CLS]表示被饋送到輸出層以進行分類,例如蘊涵或情緒分析。與預訓練相比,微調相對便宜。

BERT模型可用於各類語言任務,而只需在覈心模型中添加一個小層:

1.經過在[CLS]標記的變換器輸出上添加分類層,相似於下一句分類,進行情感分析等分類任務。

2.在問題回答任務(例如SQUAD v1.1)中,軟件會收到有關文本序列的問題,而且須要在序列中標記答案。使用BERT模型,能夠經過學習標記答案開始和結束的兩個額外向量來訓練Q&A模型。

3.在命名實體識別(NER)中,軟件接收文本序列,而且須要標記文本中出現的各類類型的實體(人員,組織,日期等)。使用BERT模型,能夠經過將每一個標記的輸出向量饋送到預測NER標籤的分類層來訓練NER模型。

BERT模型用於特徵提取

微調法不是使用BERT模型的惟一方法。可使用預先訓練的BERT模型建立語境化詞嵌入。而後,能夠將這些嵌入提供給現有的模型——該過程本文展現了產生結果,在命名實體識別等任務上微調BERT模型並不遠。


哪一個向量最適合做爲上下文嵌入呢?這要視任務而定。本文共考察了六種可選方法(與得分爲96.4的微調模型相比):


留言 點贊 關注

咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」


(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)

相關文章
相關標籤/搜索