❶ 圖解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任務,模型輸入會有微調,對模型輸出的利用也有差異,例如:
根據具體任務的不同,在實際應用中我們可以腦洞大開,通過調整模型的輸入、輸出將模型適配到真實業務場景中。
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之上又添加了三種關鍵操作:
可以看到,Transformer Encoder的輸入和輸出在形式上還是完全相同,因此,Transformer Encoder同樣可以表示為將輸入文本中各個字的語義向量轉換為相同長度的增強語義向量的一個黑盒。
3.3 BERT model
組裝好TransformerEncoder之後,再把多個Transformer Encoder一層一層地堆疊起來,BERT模型就大功告成了!
在論文中,作者分別用12層和24層Transformer Encoder組裝了兩套BERT模型,兩套模型的參數總數分別為110M和340M。
原文參考:
https://cloud.tencent.com/developer/article/1389555
❷ BERT關系抽取之R-BERT模型
前期知識准備 :RNN, CNN, BERT, SemEval-2010 Task 8數據集, F1值
關系分類是一個重要的NLP任務,其主要目標是提取出實體之間的關系。最先進的關系分類方法主要是基於CNN或RNN。最近,預訓練BERT模型在許多NLP的分類和序列標注任務中都獲得了非常好的結果。關系分類不同於其他NLP任務的主要原因是它既依賴於句子的信息,又依賴於兩個目標實體的信息。在本文中,我們提出了一個用來解決關系分類任務的模型,它既利用了預訓練的BERT語言模型,又結合來自目標實體的信息。我們定位目標實體並通過預訓練結構傳遞信息,同時還結合了兩個實體的相關編碼。在SemEval-2010 Task 8任務上,相比目前的最優模型我們的方法獲得了有效的提升。簡桐搜
R-BERT的預訓練完全採用BERT模型,輸入句子為單句,因此不需要添加[SEP]。其輸出分為三部分,分別是[CLS]隱含狀態向量和兩個實體的隱含狀態向量。作者認為第一部分可以保存句子的語義內容,後兩個部分可以保存兩個實體的信息。
其中,i ,j分別為第一個實體的首、尾字元位置;k,m分別為第二個實體的首、尾字元位置。神經網路中,權重系數和偏置系數均共享,即 W0 = W1 = W2,b0 = b1 = b2。
該數據集包含9類語義關系和一個Other類別,規定某關系如果不屬於9類語義關系中的一種,則其屬於Other類別。9類關系分別是:Cause-Effect、Component-Whole、Content-Container、Entity-Destination、Entity-Origin、Instrument-Angency、Member-Collection、Message-Topic和Proct-Procer。數據集中共有10717個句子,8000個句子為訓練集,2717個句子為測試集,每個句子包含e1和e2兩個名詞以及與該句子相關的關系類型。需要注意的是,關系是有向的,即關系(e1, e2)和關系(e2, e1)不同。
作者還在相同的數據集上比較了其他多種模型,其中包括:SVM、RNN、MVRNN、CNN+Softmax、FCM、CR-CNN、Attention CNN、Att-Pooling-CNN和Entity Attention Bi-LSTM,以F1值作為評測標准,其結果如下:
可見,R-BERT的F1值達到了89.25,相比於其他方法有著明顯的優勢。
為了探究BERT模型之外的部分對最後識別結果的影響,作者分別進行了如下額外實驗,並得到結論:
(1)去除了實體前後的標識符,這種做法會使模型的F1值從89.25%降到87.98%,說明了標識符可以幫助提供實體信息。
(2)在BERT輸出層僅使用[CLS]句子向量而不利用實體向量,這樣會使得模型F1值從89.25%降到87.99%,說輪正明主動明確實體信息對模型是有幫助的。
想辦法給模型明確實體的位置對於關系抽取問題精度的提升是有攔歷幫助的。
https://zhuanlan.hu.com/p/78445887
https://blog.csdn.net/qq_36426650/article/details/96629835
❸ BERT詳解(附帶ELMo、GPT 介紹)
首先我會詳細闡述 BERT 原理,然後簡單介紹一下 ELMO 以及 GPT
BERT 全稱為 B idirectional E ncoder R epresentation from T ransformer,是 Google 以 無監督的方式利用大量無標注文本 「煉成」的語言模型,其架構為 Transformer 中的 Encoder(BERT=Encoder of Transformer)
我在 Transformer 詳解 中已經詳細的解釋了所有 Transformer 的相關概念,這里就不再贅述
以往為了解決不同的 NLP 任務,我們會為該任務設計一個最合適的神經網路架構並做訓練,以下是一些簡單的例子
不同的 NLP 任務通常需要不同的模型,而設計這些模型並測試其 performance 是非常耗成本的(人力,時間,計算資源)。如果有一個能 直接處理各式 NLP 任務的通用架構 該有多好?
隨著時代演進,不少人很自然地有了這樣子的想法,而 BERT 就是其中一個將此概念付諸實踐的例子
Google 在預訓練 BERT 時讓它同時進行兩個任務:
1. 漏字填空
2. 下個句子預測
對正常人來說,要完成這兩個任務非常簡單。只要稍微看一下前後文就知道完形填空任務中 [MASK] 里應該填 退了 ;而 醒醒吧 後面接 你沒有妹妹 也十分合理(?)
接下來我會分別詳細介紹論文中這兩個任務的設計細節
在 BERT 中,Masked LM(Masked Language Model)構建了語言模型,簡單來說,就是 隨機遮蓋或替換 一句話裡面的任意字或詞,然後讓模型通過上下文預測那一個被遮蓋或替換的部分,之後 做 Loss 的時候也只計算被遮蓋部分的 Loss ,這其實是一個很容易理解的任務,實際操作如下:
這樣做的好處是,BERT 並不知道 [MASK] 替換的是哪一個詞,而且 任何一個詞都有可能是被替換掉的,比如它看到的 apple 可能是被替換的詞 。這樣強迫模型在編碼當前時刻詞的時候 不能太依賴當前的詞 ,而要考慮它的上下文,甚至根據上下文進行 "糾錯"。比如上面的例子中,模型在編碼 apple 時,根據上下文 my dog is,應該 把 apple 編碼成 hairy 的語義而不是 apple 的語義
我們首先拿到屬於上下文的一對句子,也就是兩個句子,之後我們要在這兩個句子中加一些特殊的 token: [CLS]上一句話[SEP]下一句話[SEP] 。也就是在句子開頭加一個 [CLS] ,在兩句話之間和句末加 [SEP] ,具體地如下圖所示
可以看到,上圖中的兩句話明顯是連續的。如果現在有這么一句話 [CLS] 我的狗很可愛 [SEP] 企鵝不擅長飛行 [SEP] ,可見這兩句話就 不是連續的 。在實際訓練中,我們會讓這兩種情況出現的數量為** 1:1**
Token Embedding 就是正常的詞向量,即 PyTorch 中的 nn.Embedding()
Segment Embedding 的作用是用 embedding 的信息讓模型 分開上下句 ,我們給上句的 token 全 0,下句的 token 全 1,讓模型得以判斷上下句的起止位置,例如
Position Embedding 和 Transformer 中的不一樣,不是三角函數,而是 學習出來的
BERT 預訓練階段實際上是將上述兩個任務結合起來,同時進行,然後將所有的 Loss 相加,例如
BERT 的 Fine-Tuning 共分為 4 種類型,以下內容、圖片均來自台大李宏毅老師 Machine Learning 課程 (以下內容 圖在上,解釋在下)
為什麼要用CLS?
這里李宏毅老師有一點沒講到,就是為什麼要用第一個位置,即 [CLS] 位置的 output。這里我看了網上的一些博客,結合自己的理解解釋一下。因為 BERT 內部是 Transformer,而 Transformer 內部又是 Self-Attention, 所以 [CLS] 的 output 裡面肯定含有整句話的完整信息 ,這是毋庸置疑的。但是 Self-Attention 向量中,自己和自己的值其實是佔大頭的,現在假設使用 的 output 做分類,那麼這個 output 中實際上會更加看重 ,而 又是一個有實際意義的字或詞,這樣難免會影響到最終的結果。但是 [CLS] 是沒有任何實際意義的,只是一個佔位符而已,所以就算 [CLS] 的 output 中自己的值佔大頭也無所謂。當然你 也可以將所有詞的 output 進行 concat,作為最終的 output
首先將問題和文章通過 [SEP] 分隔,送入 BERT 之後,得到上圖中黃色的輸出。此時我們還要訓練兩個 vector,即上圖中橙色和黃色的向量。首先將橙色和所有的黃色向量進行 dot proct,然後通過 softmax,看哪一個輸出的值最大,例如上圖中 對應的輸出概率最大,那我們就認為 s=2
同樣地,我們用藍色的向量和所有黃色向量進行 dot proct,最終預測得 的概率最大,因此 e=3。最終,答案就是 s=2,e=3
你可能會覺得這裡面有個問題,假設最終的輸出 s>e 怎麼辦,那不就矛盾了嗎?其實在某些訓練集里,有的問題就是沒有答案的,因此此時的預測搞不好是對的,就是沒有答案
以上就是 BERT 的詳細介紹,參考以下文章
ELMo是Embedding from language Model的縮寫,它通過無監督的方式對語言模型進行預訓練來學習單詞表示
這篇論文的想法其實非常簡單,但是效果卻很好。它的思路是用 深度的雙向 Language Model 在大量未標注數據上訓練語言模型 ,如下圖所示
在實際任務中,對於輸入的句子,我們使用上面的語言模型來處理它,得到輸出向量,因此這可以看作是一種 特徵提取 。但是 ELMo 與普通的 Word2Vec 或 GloVe 不同,ELMo 得到的 Embedding 是 有上下文信息 的
具體來說,給定一個長度為 N 的句子,假設為 ,語言模型會計算給定 的條件下出現 的概率:
傳統的 N-gram 模型 不能考慮很長的歷史 ,因此現在的主流是使用 多層雙向 LSTM 。在時刻 ,LSTM 的第 層會輸出一個隱狀態 ,其中 , 是 LSTM 的層數。最上層是 ,對它進行 softmax 之後得到輸出詞的概率
類似的,我們可以用 一個反向 來計算概率:
通過這個 LSTM,我們可以得到 。我們的損失函數是這兩個 LSTM 的 加和 :
這兩個 LSTM 有各自的參數 和 ,而 Word Embedding 參數 和 Softmax 參數 是共享的
為了用於下游(DownStream)的特定任務,我們會把不同層的隱狀態組合起來,具體組合的參數是根據不同的特定任務學習出來的,公式如下:
GPT 得到的語言模型參數不是固定的,它會根據特定的任務進行調整(通常是微調),這樣的到的句子表示能更好的適配特定任務。它的思想也很簡單,使用 單向 Transformer 學習一個語言模型 ,對句子進行無監督的 Embedding,然後 根據具體任務對 Transformer 的參數進行微調 。GPT 與 ELMo 有兩個主要的區別:
這里解釋一下上面提到的 單向 Transformer 。在 Transformer 的文章中,提到了 Encoder 與 Decoder 使用的 Transformer Block 是不同的。在 Decoder Block 中,使用了 Masked Self-Attention ,即句子中的每個詞都只能對 包括自己在內的前面所有詞進行 Attention ,這就是單向 Transformer。GPT 使用的 Transformer 結構就是將 Encoder 中的 Self-Attention 替換成了 Masked Self-Attention ,具體結構如下圖所示
訓練的過程也非常簡單,就是將 n 個詞的詞嵌入 ( ) 加上位置嵌入 ( ),然後輸入到 Transformer 中,n 個輸出分別預測該位置的下一個詞
這里的位置編碼沒有使用傳統 Transformer 固定編碼的方式,而是動態學習的
Pretraining 之後,我們還需要針對特定任務進行 Fine-Tuning。假設監督數據集合 的輸入 是一個詞序列 ,輸出是一個分類的標簽 ,比如情感分類任務
我們把 輸入 Transformer 模型,得到最上層最後一個時刻的輸出 ,將其通過我們新增的一個 Softmax 層(參數為 )進行分類,最後用 CrossEntropyLoss 計算損失,從而根據標准數據調整 Transformer 的參數以及 Softmax 的參數 。這等價於最大似然估計:
正常來說,我們應該調整參數使得 最大,但是 為了提高訓練速度和模型的泛化能力 ,我們使用 Multi-Task Learning,同時讓它最大似然 和
這里使用的 還是之前語言模型的損失(似然),但是使用的數據不是前面無監督的數據 ,而是使用當前任務的數據 ,而且只使用其中的 ,而不需要標簽
針對不同任務,需要簡單修改下輸入數據的格式,例如對於相似度計算或問答,輸入是兩個序列,為了能夠使用 GPT,我們需要一些特殊的技巧把兩個輸入序列變成一個輸入序列
ELMo 和 GPT 最大的問題就是 傳統的語言模型是單向的 —— 我們根據之前的歷史來預測當前詞。但是我們不能利用後面的信息。比如句子 The animal didn』t cross the street because it was too tired 。我們在編碼 it 的語義的時候需要同時利用前後的信息,因為在這個句子中, it 可能指代 animal 也可能指代 street 。根據 tired ,我們推斷它指代的是 animal 。但是如果把 tired 改成 wide ,那麼 it 就是指代 street 了。傳統的語言模型,都 只能利用單方向的信息 。比如前向的 RNN,在編碼 it 的時候它看到了 animal 和 street ,但是它還沒有看到 tired ,因此它不能確定 it 到底指代什麼。如果是後向的 RNN,在編碼的時候它看到了 tired ,但是它還根本沒看到 animal ,因此它也不能知道指代的是 animal 。 Transformer 的 Self-Attention 理論上是可以同時關注到這兩個詞的,但是根據前面的介紹,為了使用 Transformer 學習語言模型,必須 用 Mask 來讓它看不到未來的信息 ,所以它也不能解決這個問題的
根據上文內容預測下一個可能跟隨的單詞,就是常說的自左向右的語言模型任務,或者反過來也行,就是根據下文預測前面的單詞,這種類型的LM被稱為自回歸語言模型。(GPT,ELMO)GPT 就是典型的自回歸語言模型。ELMO盡管看上去利用了上文,也利用了下文,但是本質上仍然是自回歸LM,這個跟模型具體怎麼實現有關系。ELMO是做了兩個方向(從左到右以及從右到左兩個方向的語言模型),但是是分別有兩個方向的自回歸LM,然後把LSTM的兩個方向的隱節點狀態拼接到一起,來體現雙向語言模型這個事情的。所以其實是兩個自回歸語言模型的拼接,本質上仍然是自回歸語言模型。
自回歸語言模型有優點有缺點,缺點是只能利用上文或者下文的信息,不能同時利用上文和下文的信息,當然,貌似ELMO這種雙向都做,然後拼接看上去能夠解決這個問題,因為融合模式過於簡單,所以效果其實並不是太好。它的優點,其實跟下游NLP任務有關,比如生成類NLP任務,比如文本摘要,機器翻譯等,在實際生成內容的時候,就是從左向右的, 自回歸語言模型天然匹配這個過程 。而Bert這種DAE模式,在生成類NLP任務中,就面臨訓練過程和應用過程不一致的問題,導致 生成類的NLP任務到目前為止都做不太好 。
自回歸語言模型只能根據上文預測下一個單詞,或者反過來,只能根據下文預測前面一個單詞。相比而言,Bert通過 在輸入X中隨機Mask掉一部分單詞 ,然後預訓練過程的主要任務之一是根據上下文單詞來預測這些被Mask掉的單詞,如果你對Denoising Autoencoder比較熟悉的話,會看出,這確實是典型的DAE的思路。那些被Mask掉的單詞就是在輸入側加入的所謂噪音。類似Bert這種預訓練模式,被稱為DAE LM。
這種DAE LM的優缺點正好和自回歸LM反過來,它能比較自然地融入雙向語言模型,同時看到被預測單詞的上文和下文,這是好處。缺點是啥呢? 主要在輸入側引入[Mask]標記,導致預訓練階段和Fine-tuning階段不一致的問題 ,因為Fine-tuning階段是看不到[Mask]標記的。DAE嗎,就要引入噪音,[Mask] 標記就是引入噪音的手段,這個正常。
XLNet的出發點就是:能否 融合自回歸LM和DAE LM兩者的優點 。就是說如果站在自回歸LM的角度,如何引入和雙向語言模型等價的效果;如果站在DAE LM的角度看,它本身是融入雙向語言模型的,如何拋掉表面的那個[Mask]標記,讓預訓練和Fine-tuning保持一致。當然,XLNet還講到了一個Bert被Mask單詞之間相互獨立的問題。
❹ BERT:深度雙向預訓練語言模型
論文標題:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
論文鏈接: https://arxiv.org/abs/1810.04805
BERT(Bidirectional Encoder Representations from Transformers)通過預訓練來學習無標注數據中的深度雙向表示,預訓練結束後通過添加一個額外的輸出層進行微調,最終在多個NLP任務上實現了SOTA。
預訓練語言模型在實踐中證明對提高很多自然語言處理任務有效,其中包括句子層級的任務,比如自然語言推斷(natural language inference)和復述(paraphrasing),還有token層級的任務,比如命名實體識別(named entity recognition)和問答(question answering)。
在下游任務中應用預訓練語言模型表示的方法有兩種:feature-based的方法和fine-tuning的方法。舉例來說,ELMo這種預訓練語言模型使用feature-based的方法,通過將ELMo的預訓練的表示作為額外的特徵輸入到特定於任務的模型中去;GPT使用fine-tuning的方法,通過引入少量的特定於任務的參數,在下游任務中訓練時所有的預訓練參數。
截止BERT之前的預訓練語言模型都是單向的(unidirectional),包括GPT和ELMo,這樣的方法對句子層級的任務不是最優的,而且對於token層級的任務比如問答非常有害。BERT使用masked language model(MLM)的方法來預訓練,這種方法能夠訓練一個雙向的(directional)語言模型。除了masked language model的預訓練的方法,BERT還使用了next sentence prediction的預訓練方法。
BERT的使用分為兩個階段:預訓練(pre-training)和微調(fine-tuning)。預訓練階段模型通過兩種不同的預訓練任務來敗神訓練無標注數據。微調階段模型使用預訓練參數初始化,然後使用下游任務(downstream task)的標注數據來微調參數。
BERT的一個顯著特點是它察如虧在不同的任務上有統一的架構,使用時只需要在BERT後面接上下游任務的結構即可使用。
BERT的模型架構是一個多層雙向的Transformer的encoder。我們標記模型的層數(每一層是一個Tranformer的block)為 ,模型的hidden size為 ,self-attention head的數量為 。兩個比較通用的BERT架構為 和 。
對比GPT,BERT使用了雙向self-attention架構,而GPT使用的是受限的self-attention, 即限制每個token只能attend到其左邊的token。
BERT的輸入橡譽表示能夠是一個句子或者是一個句子對,這是為了讓BERT能夠應對各種不同的下游任務。BERT的輸入是一個序列,該序列包含一個句子的token或者兩個句子結合在一起的token。
具體地,我們會將輸入的自然語言句子通過 WordPiece embeddings 來轉化為token序列。這個token序列的開頭要加上 [CLS] 這個特殊的token,最終輸出的 [CLS] 這個token的embedding可以看做句子的embedding,可以使用這個embedding來做分類任務。
由於句子對被pack到了一起,因此我們需要在token序列中區分它們,具體需要兩種方式:
①在token序列中兩個句子的token之間添加 [SEP] 這樣一個特殊的token;
②我們為每個token添加一個用來學習的embedding來區分token屬於句子A還是句子B,這個embedding叫做segment embedding。
具體地,BERT的輸入由三部分相加組成:token embeddings、segment embeddings和position embeddings。如下圖所示:
BERT使用兩個無監督的任務進行預訓練,分別是Masked LM和Next Sentence Prediction(NSP)。如下圖所示,我們定義輸入的embedding為 ,BERT最終輸出的 [CLS] 的embedding為 ,最終輸出的第 個token的embedding為 。
我們有理由相信一個深度雙向模型比left-to-right模型和left-to-right和right-to-left簡單連接的模型的效果更加強大。不幸的是,標準的條件語言模型只能夠夠left-to-right或者right-to-left地訓練,這是因為雙向條件會使每個token能夠間接地「看到自己」,並且模型能夠在多層上下文中簡單地預測目標詞。
為了能夠雙向地訓練語言模型,BERT的做法是簡單地隨機mask掉一定比例的輸入token(這些token被替換成 [MASK] 這個特殊token),然後預測這些被遮蓋掉的token,這種方法就是Masked LM(MLM),相當於完形填空任務(cloze task)。被mask掉的詞將會被輸入到一個softmax分類器中,分類器輸出的維度對應詞典的大小。在預訓練時通常為每個序列mask掉15%的token。與降噪自編碼器(denoising auto-encoders)相比,我們只預測被mask掉的token,並不重建整個輸入。
這種方法允許我們預訓練一個雙向的語言模型,但是有一個缺點就是造成了預訓練和微調之間的mismatch,這是因為 [MASK] 這個token不會在微調時出現。為了緩解這一點,我們採取以下做法:在生成訓練數據時我們隨機選擇15%的token進行替換,被選中的token有80%的幾率被替換成 [MASK] ,10%的幾率被替換成另一個隨機的token,10%的幾率該token不被改變。然後 將使用交叉熵損失來預測原來的token。
一些重要的NLP任務如Question Answering (QA)或者Natural Language Inference (NLI)需要理解句子之間的關系,而這種關系通常不會被語言模型直接捕捉到。為了使得模型能夠理解句子之間的關系,我們訓練了一個二值的Next Sentence Prediction任務,其訓練數據可以從任何單語語料庫中生成。具體的做法是:當選擇句子A和句子B作為訓練數據時,句子B有50%的幾率的確是句子A的下一句(標簽是 IsNext ),50%的幾率是從語料庫中隨機選擇的句子(標簽是 NotNext )。 [CLS] 對應的最後一個隱層輸出向量被用來訓練NSP任務,這個embedding就相當於sentence embedding。雖然這個預訓練任務很簡單,但是事實上在微調時其在QA和NLI任務上表現出了很好的效果。在前人的工作中,只有sentence embedding被遷移到下游任務中,而BERT會遷移所有的參數來初始化下游任務模型。
Transformer的self-attention機制允許BERT建模多種下游任務。對於包含句子對的任務,通常的做法是先獨立地對句子對中的句子進行編碼,然後再應用雙向交叉注意(bidirectional cross attention)。而BERT使用self-attention機制統一了這兩個過程,這是因為對拼接起來的句子對進行self-attention有效地包含了兩個句子之間的雙向交叉注意(bidirectional cross attention)。
對於每個任務來說,我們只需要將任務特定的輸入輸出插入到BERT中然後端到端地微調即可。舉例子來說,BERT的預訓練輸入句子A和句子B在微調時可以類比為:
①paraphrasing任務中的句子對;
②entailment任務中的hypothesis-premise對;
③question answering任務中的question-passage對;
④text classification或者sequence tagging任務中的text-∅對(也就是只輸入一個text,不必一定需要兩個句子)。
對於BERT的輸出,對於一些token-level的任務,BERT的token表示將被輸入到一個輸出層,比如sequence tagging或者question answering任務;對於entailment或者sentiment analysis這樣的任務,可以將 [CLS] 對應的表示輸入到一個輸出層。
我們使用 [CLS] 這個token的最後一層的隱層向量 作為聚合的表示,可以認為是sentence embedding。在微調時只引入一個新的權重 ,這里的 代表標簽的數量,然後計算標准分類損失 。下圖展示了BERT在GLUE上的效果:
在這個數據集上,我們將question和passage拼接起來作為一個輸入序列(中間是 [SEP] )。在微調時引入一個start向量 和一個end向量 ,計算 和 的點積然後通過 函數作為word 是答案的span起始位置的概率: 。答案的終止位置也做上述類似處理。從 到 的候選區間的得分記作 ,我們挑選 的最大得分區間作為預測的結果。下圖展示了BERT在SQuAD v1.1上的效果:
SQuAD v2.0有的question在提供的passage中沒有答案存在。在微調時我們設置沒有答案的問題的span的起始和結束位置都是 [CLS] 這個token,也就是start和end的可能性空間包含進了 [CLS] 的位置。在預測時,我們比較沒有答案的span得分 和最優的有答案得分 。當 時,我們預測這是一個有答案的問題,這里的 用來在dev set上選擇最優的 。下圖展示了BERT在SQuAD v2.0上的效果:
微調時我們為BERT構建4個輸入序列,每一個是所給的句子(句子A)和一個可能的延續(句子B)。然後引入一個向量,該向量和每一個輸入對應的 [CLS] 的embedding的點積再通過一個 層來得到每個選擇的得分。下圖展示了BERT在SWAG上的效果:
❺ BERT預訓練模型
n-gram語言模型:根據前面n個詞預測當前詞,它的缺點是,一般只能取1-2,n越大計算成本越高,這就使得它關注的信息是非常局限的。
預訓練語言模型:wordvec\glove\fasttext。wordvec是根據周圍詞預測當前詞或當前詞預測周圍詞,相比於n-gram,它關注了下文,但它仍然是關注局部信息。glove通過構建詞頻共現矩陣來訓練詞向量,將全局信息融入到詞向量中。fasttext仍然是局部的,只是他分詞是基於subword,對於oov詞相對友好。三者共同的缺點是,無法解決一詞多義問題。
高級語言模型:elmo\GPT,elmo採用1層靜態向量+2層單向LSTM提取特徵,並且能夠解決一詞多義,elmo是一個雙向語言模型,但實際上是兩個單向語言模型(方向相反)的拼接,這種融合特徵的隱搭能力比 BERT 一體化融合特徵方式弱。GPT採用Transformer的decoder單元提取特徵,同樣也可以解決一詞多義問題,但GPT是單向的。所以,對上下文信息的融合,二者能力還不夠。
bert是雙向語言模型,句子沒有shift_mask操作,所以是完整的上下文環境,證實了雙向語言模型對文本特徵表示的重要性。bert同時證實了預訓練模型能夠簡化很多繁重任務的網路結構,在11個nlp任務上都有顯著提升。
bert採用Transformer的encoder單元提取特徵,encoder中包含幾個重要的機制:self-attention、muti-head attention、position encoding。
bert分為bert_base和bert_large大小兩個模型,bert_base採用了12個encoder單元,768維隱藏層,12個attention。bert_base採用了24個encoder單元,1024維隱藏層,16個attention。
input:單句或句對組合,有[cls]作為句子開頭的標記,[sep]作為句子分隔和結束的標記。
token embedding:對於英文採用WordPiece embeddings,也就是一個單詞會被拆成詞根詞綴的,比如圖中的playing被拆灶擾拿成了play和ing兩個token;對於中文,就是單子拆分。
segment embedding:相鄰句子採用不同的標志分隔,形如111111111100000011111100000。
position embedding:在transformer中,單詞之間是沒有先後順序的,而語言本身是有序的,所以採用採用正餘弦函數來計算每個單詞的先後順序,這種方式有點勉強,算是折中方式。
前面講到elmo也是雙向語言模型,它是採用bi-LSTM來提取特徵,如下:
比如一句話:『北京是中國的首都』,在LSTM中從左往右,預測『中國』的時候只能看到『北京』,從右往左,預測『中國』的時候只能看到『首都』,然後將兩個lstm的輸出做拼接來達到上下文信息融合的目的李旦。其實是沒有完全做到雙向,只是以結構的改變來接近雙向語言模型。真正的雙向是預測『中國』的時候,需要同時看到『北京』和『首都』。由此,mask LM產生了。
mask LM的原理是將『中國』遮蓋住,同時用『北京』和『首都』來預測『中國』。『北京』和『首都』聯系起來語言模型很容易聯想到就是『中國』啦。這個思想和wordvec的CBOW模型如出一轍,就是用周圍詞預測當前詞,只是這個思想放在厲害的transformer中,便能大顯其能。
BERT的mask方式:在選擇mask的15%的詞當中,80%情況下使用mask掉這個詞,10%情況下採用一個任意詞替換,剩餘10%情況下保持原詞彙不變。這樣mask的優點是什麼?
1)被隨機選擇15%的詞當中以10%的概率用任意詞替換去預測正確的詞,相當於文本糾錯任務,為BERT模型賦予了一定的文本糾錯能力;
2)被隨機選擇15%的詞當中以10%的概率保持不變,緩解了finetune時候與預訓練時候輸入不匹配的問題(預訓練時候輸入句子當中有mask,而finetune時候輸入是完整無缺的句子,即為輸入不匹配問題)。
在Mask LM任務中,模型學到了詞與詞之間的關系,而NSP任務是要模型學到句子與句子之間的關系,比如問答、推理等。它將訓練語料分為兩類,一是將50%語料構建成正常語序的句子對,比如A-B句子對,B就是A的實際下一個句子,並做標記為isnext;二是將50%語料構建成非正常語序句子對,B是來自語料庫的隨機句子,並做標記為notnext。然後通過對句子對的關系做分類,預測B到底是不是A句子的下一個句子,使模型具有句子級別的識別能力。
微調的目的在於我們的任務與bert預訓練任務是不一致的,但是bert是非常好的語言模型,他具備提取詞法和句法的強大能力。將bert嵌入到我們的網路結構中,能夠簡化在語言模型方面的復雜結構。只需要將輸入做成和bert適配的格式就行,而在bert後面接上全連接、CNN等簡單模型進行訓練,就能夠使訓練得到一個比較好的效果。
GPT 和 BERT 都採用Transformer,Transformer 是encoder-decoder 結構,GPT 的單向語言模型採用 decoder 部分,decoder 的部分見到的都是不完整的句子;BERT 的雙向語言模型則採用 encoder 部分,採用了完整句子。他倆最主要的區別在於BERT是雙向語言模型,更適合文本分類等任務,GPT是單向語言模型,更適合生成式任務。
1)低層網路捕捉了短語級別的結構信息
2)表層信息特徵在底層網路(3,4),句法信息特徵在中間層網路(6~9),語義信息特徵在高層網路。(9~12)
3)主謂一致表現在中間層網路(8,9)
1)ROBERTA
•靜態mask->動態mask:在bert中每一個epoch被mask的是相同的詞,而ROBERTA在每一個epoch結束,重新隨機15%的詞,使不同的詞被mask。
•去除句對NSP任務,輸入連續多個句子:在bert中最長是512個token,輸入單句或者句對不容易把512個token占滿,ROBERTA輸入更多句子占滿512個坑位。
•訓練使用更多數據 更大batch size 更長時間
2)ALBERT
•減少參數:詞表 V 到隱層 H 的中間,插入一個小維度 E,即一個VxH的embedding變成兩個VxE, ExH的兩個fc。
•共享所有層的參數:Attention 和 FFN,在bert中每一層的Attention 和 FFN的參數是不一樣的。
•SOP 替換 NSP:負樣本換成了同一篇文章中的兩個逆序的句子,bert中是A-->B和A-->隨機,ALBERT中是A-->B,B-->A。
•BERT對MASK 15% 的詞來預測。ALBERT 預測的是 n-gram 片段,包含更完整的語義信息。
•訓練數據長度:90%取512,BERT90% 128
•對應BERT large:H:1024 ->4096 L:24->12 窄而深->寬而淺
❻ Bert技術
google在2018年10月底公布BERT在11項nlp任務中的卓越表現,NLP任務的兩個衡量指標上全面超越人類,並且還在11種不同NLP測試中創出最佳成績,包括將GLUE基準推至80.4%(絕對改進7.6%),MultiNLI准確度達到86.7% (絕對改進率5.6%)等,此後,BERT(Bidirectional Encoder Representation from Transformers)就成為NLP領域大火、整個ML界略有耳聞的模型。
BERT的出現,徹底改變了預訓練產生詞向量和下游具體NLP任務的關系,提出龍骨級的訓練詞向量概念。
詞向量,就是用一個向量的形式表示一個詞。
(1)one-hot編碼:詞的符號化。
(2)詞的分布式表示:詞的語義由其上下文決定。以(CBOW)為例,如果有一個句子「the cat sits one the mat」,在訓練的時候,將「the cat sits one the」作為輸入,預測出最後一個詞是「mat」。分布式表示的較大優點在於它具有非常強大的表徵能力,比如n維向量每維k個值,可以表徵k的n次方個概念。
其中,詞嵌入就是分布式表示的一種:基於神經網路的分布表示一般派畝稱為詞向量、詞嵌入( word embedding)或分布式表示( distributed representation)。核心依然是上下文的表示以及上下文與目標詞之間的關系的建模。本質:詞向量是訓練神經網路迅羨信時候的隱藏層參數或者說矩陣。
兩種訓練模式:CBOW (Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model)
NLP任務分成兩部分,一是預訓練產生詞向量,二是對詞向量操作實現特定功能。而詞向量模型是一個工具,可以把抽象存在的文字轉換成可以進行數學公式操作的向量,而對這些向量的操作,才是NLP真正要做的任務。從word2vec到ELMo到BERT,做的其實主要是把下游具體NLP任務的活逐漸移到預訓練產生詞向量上。
(1)word2vec:上下文概率的一種表示,但無法對一詞多義進行建模
(2)ELMo:用的是一個雙向的LSTM語言模型,由一個前向和一個後向語言模型構成,目標函數就是取這兩個方向語言模型的最大似然。
在預訓練好這個語言模型之後,ELMo就是根據下面的公式來用作詞表示,其實就是把這個雙向語言模型的每一中間層進行一個求和。最簡單的也可以使用最高層的表示來作為ELMo。
然後在進行有監督的NLP任務時,可以將ELMo直接當做特徵拼接到具體任務模型的詞向量輸入或者是模型的最高層表示上。總結一下,不像傳統的詞向量,每一個詞只對應一個詞向量,ELMo利用預訓練好的雙向語言模型,然後根據具體輸入從該語言模型中可以得到上下文依賴的當前詞表示(對於不同上下文的同一個詞的表示是不一樣的),再當成特徵加入到具體的NLP有監督模型里。
(3)bert
word2vec——>ELMo:
結果:上下文無關的static向量變成上下文相關的dynamic向量,比如蘋果在不同語境vector不同。
操作:encoder操作轉移到預訓練產生詞向量過程實現。
ELMo——>BERT:
結果:訓練出的word-level向量變成sentence-level的向量,下游具體NLP任務調用更方便,修正了ELMo模型的潛在問題。
操作:使用句子級負采樣獲得句子表示/句對關系,Transformer模型代替LSTM提升畝輪表達和時間上的效率,masked LM解決「自己看到自己」的問題。
(1)bert模型證明了雙向預訓練對於語言表示的重要性。與採用單向語言模型進行預訓練的模型不同,BERT使用masked language models 進行預訓練的深層雙向表示。
(2)經過預訓練的模型表示解決了許多為特定任務而設計架構的需要。BERT是第一個基於微調的表示模型,它在一系列句子級和詞級別的任務上實現了最先進的性能,優於許多具有特定任務架構的系統。
bert架構由兩步實現:預訓練和模型微調;在預訓練階段,基於無標注數據通過多輪預訓練任務完成。在微調階段,bert模型由預訓練的參數進行初始化,然後由待下游的任務數據進行參數微調。
bert模型是多層雙向transformer編碼器。將層的數量(Transformer blocks)表示為L,隱藏的大小表示為H,而self-attention heads 為A。在所有的情況下,我們將feed-forward/filter大小設置為4H,即H=768時,為3072, H=1024時,為4096.
bert的兩種格式:
BERTBASE : L=12, H=768, A=12, Total Parameter=110M,
BERTLARGE : L=24, H=1024, A=16, Total Parameters=340M
為了使用bert可以應對各式各樣的下游任務,bert的輸入為token序列,它可以表示一個句子或句子對(比如對話)。使用該方案,輸入可以是任意跨度的相鄰文本,即一個token序列可以是單個句子,也可以是多個句子。
具體地說,bert使用30000個詞的詞級別的embeddings。每個序列的起始token是[CLS]。句子對被打包在一個序列中,用兩種方式區別句子。方法一,使用特殊token[SEP];方法二,在每個標記中添加一個學習過的嵌入,表示它是屬於句子A還是句子B。
兩個無監督任務對BERT進行訓練。
任務一:Masked LM語言模型。
為了訓練雙向表示模型,隨機按百分比的方式(一般選15%)屏蔽輸入序列中的部分詞,然後預測那些屏蔽詞。在這種情況下,屏蔽詞的最終隱向量經softmax運算後輸出。有點類似於中文的完形填空。
雖然如些操作可以獲得一個雙向的預訓練模型,但這在預訓練和微調之間創建了一個不匹配,因為在微調過程中從來沒有見過[MASK]詞。為了減輕這一點,我們並不總是用實際的[MASK]詞替換被屏蔽的詞。相反,生成隨機選擇15%的詞進行預測,例如在句子 my dog is hairy 選擇了 hairy。接著執行下面的過程:
數據生成器不會總是用[MASK] 替換所選單詞,而是執行以下操作:
80%的時間,將單詞替換為[MASK]詞。例如 my dog is hairy -> my dog is [MASK]
10%的時間, 用一個隨機詞替換這個詞, 例如 my dog is hairy -> my dog is apple
10%的時間, 保持單詞不變,例如 my dog is hairy -> my dog is hairy。
每一輪使用交叉熵損失來預測原始詞。
任務二:下一句的預測;
許多重要的下游任務,如問答(QA)和自然語言推理(NLI),都基於理解兩個文本句之間的關系,而語言建模並不能直接捕獲到這兩個文本句之間的關系。為了訓練一個理解句子關系的模型,我們預訓練了一個二分類的預測下一個句子的任務,該任務可以由任何單語語料庫生成。
具體來說,在為每個訓練前的例子選擇句子A和B時,50%的時間B是A後面的實際下一個句子,50%的時間B是來自語料庫的隨機句子。例如:
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
我們完全隨機選擇NotNext 句子,最終預測模型在這個任務中達到97%-98%的准確率。
預訓練數據:預訓練過程很大程度上依賴現有語言模型的數據。從維基網路上抽取文本信息,忽略列表,表格和標題。對於預訓練過程來說,使用文檔級別的語料庫而不是經過亂序後的句子級語料庫來提取長的連續序列是很重要的。
對於序列級別分類任務,BERT微調很簡單。BERT使用self-attention機制來統一兩個過程。因為編碼文本序列中,使用self-attention有效地包含了兩上句子之間雙向交叉的attention。
微調過程,就是對於每一個任務,簡單地將特定的輸入和輸出接入bert,然後端到端地調節全部參數即可。在輸入端,句子A和句子B類似於(1)語義句子對(2)假設前提(3)問答中的問句(4)文本分類或序列標記中文本。在輸出端,token向量被傳遞給token級別任務的輸出層,例如,序列標簽,問答對的答案。[CLS]向量被傳遞給分類的輸出層,用於分類或情感分析。
相對於預訓練,微調要相對容易。大多數模型超參數與預訓練相同,除了批的大小、學習率和訓練輪數。
可以通過一個額外的輸出層對預訓練的BERT表示進行微調,以創建適用於各種任務的最先進模型,比如問答和語言推斷,無需對特定與任務的架構進行實質性修改。
第一,如果NLP任務偏向在語言本身中就包含答案,而不特別依賴文本外的其它特徵,往往應用Bert能夠極大提升應用效果。
第二,Bert特別適合解決句子或者段落的匹配類任務。就是說,Bert特別適合用來解決判斷句子關系類問題,這是相對單文本分類任務和序列標注等其它典型NLP任務來說的,很多實驗結果表明了這一點。
第三,Bert的適用場景,與NLP任務對深層語義特徵的需求程度有關。感覺越是需要深層語義特徵的任務,越適合利用Bert來解決
第四,Bert比較適合解決輸入長度不太長的NLP任務,而輸入比較長的任務,典型的比如文檔級別的任務,Bert解決起來可能就不太好。
【引用】:
bert論文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
https://www.cnblogs.com/robert-dlut/p/8638283.html
https://blog.csdn.net/DarrenXf/article/details/89184225
https://www.cnblogs.com/xlturing/p/10824400.html
https://www.cnblogs.com/ylHe/p/10193166.html
❼ BERT模型
BERT有兩部分:pre-training和fine-tuning。在pre-training階段,會在沒有標注數據橘陸且不同預訓練任務上訓練模型;在fine-tuning階段,BERT會根據預訓練模型的參數初始化,然後在下游任戚運務的標注數據進行fine-tuned。
BERT是一個多層雙向的transformer encoder模型。是的,BERT中的transformer只有encoder,沒有decoder!!!
BERT模型中使用的是WordPiece embeddings,最後一層隱藏層的向量會作為每個token的表示。另外,有3個特殊字元如下圓仔頃:
還需要說明的是,BERT模型中sentence並不是語義層面的句子,可以是連續的文本。sequence指的是token 序列,可以是單個sentence也可以是合在一起的 two sentences。
相比之前的預訓練模型,BERT在預訓練階段做了兩個無監督任務:MLM(masked LM)和next sentence prediction(NSP)。
通過源碼能看到:
我沒明白為什麼傳統模型無法雙向訓練,而用masked LM可以解決雙向訓練的問題:
某 文章 的解釋是:
masked LM的做法:
在masked LM任務中只會預測masked token,其他token不做預測。
有一些任務比如問答(QA)和自然語言推理(NLI)都是對兩句話關系的理解,但是語言模型無法捕捉這種信息。為了讓訓練的模型能獲取句子之間的關系,在預訓練的時候多加了一個二值化的NSP任務。具體做法:
對這部分我的疑問是:
原文中不理解的地方:
❽ [模型]什麼是BERT 模型
參考鏈接: BERT模型圖解
1、掘晌BERT 結構圖
如圖:
2、官方論文
https://arxiv.org/pdf/1810.04805.pdf
3、BERT 模型簡述
BERT 是基於 Transformer 的雙向編碼表示模型,被用於作為預訓練模型,給下游任務使用。它由對 Transformer 的編碼器進行堆疊而成。每個編碼器都包含了兩個子層,第一個子層是多頭注意力層,可以在對某個特定字進行編碼時,也可以注意到其他字;第二個子層則是前向反饋層。而 BERT 還是一判拿鋒個遮蔽語言敏氏模型,因為輸入給 BERT 的語料中,有部分的字會被隨機替換為 mask 符號。