[深度学习] 自然语言处理 --- BERT模型原理
一 BERT簡介
NLP:自然語言處理(NLP)是信息時代最重要的技術之一。理解復雜的語言也是人工智能的重要組成部分。Google AI 團隊提出的預訓練語言模型 BERT(Bidirectional Encoder Representations from Transformers)
BERT,全稱是 Pre-training of Deep Bidirectional Transformers for Language Understanding。注意其中的每一個詞都說明了 BERT 的一個特征。
在 11 項自然語言理解任務上刷新了最好指標,可以說是近年來 NLP 領域取得的最重大的進展之一。BERT 論文也斬獲 NLP 領域頂會 NAACL 2019 的最佳論文獎,BERT 的成功也啟發了大量的后續工作,不斷刷新了 NLP 領域各個任務的最佳水平。有 NLP 學者宣稱,屬于 NLP 的 ImageNet 時代已經來臨。
想象一下——你正在從事一個非常酷的數據科學項目,并且應用了最新的最先進的庫來獲得一個好的結果!幾天后,一個新的最先進的框架出現了,它有可能進一步改進你的模型。
這不是一個假想的場景——這是在自然語言處理(NLP)領域工作的真正現實!過去的兩年的突破是令人興奮的。
谷歌的BERT就是這樣一個NLP框架。我敢說它可能是近代最有影響力的一個(我們很快就會知道為什么)。
NLP常見的任務主要有:中文自動分詞、句法分析、自動摘要、問答系統、文本分類、指代消解、情感分析等。
毫不夸張地說,BERT極大地改變了NLP的格局。想象一下,使用一個在大型未標記數據集上訓練的單一模型,然后在11個單獨的NLP任務上獲得SOTA結果。所有這些任務都需要fine-tuning。BERT是我們設計NLP模型的一個結構性轉變。
二 什么是BERT?
你可能大概聽說過BERT,你看到過它是多么不可思議,它是如何潛在地改變了NLP的前景。但是BERT到底是什么呢?
BERT背后的研究團隊是這樣描述NLP框架的:
"BERT代表Transformers的雙向編碼器。它被設計為通過對左右的上下文的聯合來預訓練未標記文本得到深層的雙向表示。因此,只需一個額外的輸出層,就可以對預訓練的BERT模型進行微調,從而為各種NLP任務創建SOTA結果。"
作為一開始,這聽起來太復雜了。但是它確實總結了BERT的出色表現,因此讓我們對其進行細分。
首先,很容易理解BERT是Transformers的雙向編碼器表示。這里的每個詞都有其含義,我們將在本文中逐一討論。這一行的關鍵是,BERT是基于Transformer架構的。
其次,BERT是在大量未標記文本的預訓練,包括整個Wikipedia(有25億個詞!)和圖書語料庫(有8億個單詞)。
這個預訓練步驟是BERT成功背后的一半。這是因為當我們在大型文本語料庫上訓練模型時,我們的模型開始獲得對語言工作原理的更深入和深入的了解。這種知識幾乎可用于所有NLP任務。
第三,BERT是"深度雙向"模型。雙向意味著BERT在訓練階段從目標詞的左右兩側上下文來學習信息。
模型的雙向性對于真正理解語言的意義很重要。讓我們看一個例子來說明這一點。在此示例中,有兩個句子,并且兩個句子都包含單詞"bank":
如果我們僅通過選擇左側或右側上下文來預測"bank"一詞的意義,那么在兩個給定示例中至少有一個會出錯。
解決此問題的一種方法是在進行預測之前考慮左右上下文。這正是BERT所做的!我們將在本文的后面看到如何實現這一目標。
最后,BERT最令人印象深刻的方面。我們可以通過僅添加幾個其他輸出層來微調它,以創建用于各種NLP任務的最新模型。
三 從Word2Vec到BERT
NLP的學習語言表示的探索
"自然語言處理中的最大挑戰之一是訓練數據的短缺。由于NLP是一個具有許多不同任務的多元化領域,因此大多數特定于任務的數據集僅包含數千或數十萬個人標記的訓練示例。" – Google AI
Word2Vec和GloVe
通過在大型未標記文本數據上進行預訓練模型來學習語言表示的要求始于諸如Word2Vec和GloVe之類的Word Embedding。這些Embedding改變了我們執行NLP任務的方式。現在,我們有了Embedding,可以捕獲單詞之間的上下文關系。
這些Embedding被用來訓練下游NLP任務的模型,并做出更好的預測。這可以通過利用來自Embedding本身的附加信息,甚至使用較少的特定于任務的數據來完成。
這些Embedding的一個限制是使用非常淺的語言模型。這意味著他們能夠獲取的信息的數量是有限的,這促使他們使用更深入、更復雜的語言模型(LSTMs和GRUs層)。
另一個關鍵的限制是,這些模型沒有考慮單詞的上下文。讓我們以上面的“bank”為例。同一個單詞在不同的上下文中有不同的意思。然而,像Word2Vec這樣的Embedding將在這兩個上下文中為“bank”提供相同的Word Embedding。
這是導致模型不準確的一個因素。
ELMO和ULMFiT
ELMo是NLP社區對一詞多義問題的回應——相同的詞在不同的語境中有不同的含義。從訓練淺層前饋網絡(Word2vec),逐步過渡到使用復雜的雙向LSTM體系結構的層來訓練Word Embedding。這意味著同一個單詞可以根據它所在的上下文有多個ELMO Embedding。
那是我們開始看到預訓練作為NLP的訓練機制的優勢。
ULMFiT則更進一步。這個框架可以訓練語言模型,這些模型可以進行微調,從而在各種文檔分類任務中,即使使用更少的數據(少于100個示例)也可以提供出色的結果。可以肯定地說,ULMFiT破解了NLP中遷移學習的密碼。
這就是我們在NLP中建立遷移學習黃金法則的時候:
NLP中的遷移學習 =預訓練和微調
ULMFIT之后的大多數NLP的突破調整了上述等式的組成部分,并獲得了最先進的基準。
OpenAI的GPT
OpenAI的GPT擴展了ULMFiT和ELMo引入的預訓練和微調方法。GPT本質上用基于轉換的體系結構取代了基于LSTM的語言建模體系結構。
GPT模型可以微調到文檔分類之外的多個NLP任務,如常識推理、語義相似性和閱讀理解。
GPT還強調了Transformer框架的重要性,它具有更簡單的體系結構,并且比基于LSTM的模型訓練得更快。它還能夠通過使用注意力機制來學習數據中的復雜模式。
OpenAI的GPT通過實現多個最先進的技術,驗證了Transformer架構的健壯性和有用性。
這就是Transformer如何啟發了BERT以及接下來在NLP領域的所有突破。
現在,還有一些其他的重要突破和研究成果我們還沒有提到,比如半監督序列學習。這是因為它們稍微超出了本文的范圍,但是你可以閱讀相關的論文來了解更多信息。
BERT
因此,解決NLP任務的新方法變成了一個2步過程:
在這樣的背景下,讓我們來理解BERT是如何從這里開始建立一個模型,這個模型將在很長一段時間內成為NLP中優秀的基準。
?
四 BERT如何工作?
讓我們仔細看一下BERT,了解為什么它是一種有效的語言建模方法。我們已經知道BERT可以做什么,但是它是如何做到的?我們將在本節中回答這個相關問題。
bert從這幾方面做了改進:
- Masked LM
- NSP Multi-task Learning
- Encoder again
bert為什么更好呢?
- 單向信息流的問題 ,只能看前面,不能看后面,其實預料里有后面的信息,只是訓練語言模型任務特殊要求只能看后面的信息,這是最大的一個問題
- 其次是pretrain 和finetuning 幾個句子不匹配
1. BERT的體系結構
下圖是 Transformer 的 encoder 部分,輸入是一個 token 序列,先對其進行 embedding 稱為向量,然后輸入給神經網絡,輸出是大小為?的向量序列,每個向量對應著具有相同索引的 token。
BERT架構建立在Transformer之上。我們目前有兩個可用的版本:
- BERT Base:12層transformer,12個attention heads和1.1億個參數
- BERT Large:24層transformer,16個attention heads和3.4億個參數
Bert base的網絡結構: L(網絡層數)=12, H(隱藏層維度)=768, A(Attention 多頭個數)=12, Total Parameters= 12*768*12=110M? ?使用GPU內存:7G多
Bert large的網絡結構 (L=24, H=1024, A=16, Total Parameters=340M). 使用GPU內存:32G多
How is the number of BERT model parameters calculated? · Issue #656 · google-research/bert (github.com)https://github.com/google-research/bert/issues/656
出于比較的目的,BERT Base架構具有與OpenAI的GPT相同的模型大小。所有這些Transformer層都是只使用Transformer的編碼器。
現在我們已經了解了BERT的總體架構,接下來讓我們看看在進入模型構建階段之前需要哪些文本處理步驟。
2.文本預處理
BERT背后的開發人員已經添加了一組特定規則來表示模型的輸入文本。其中許多是創造性的設計選擇,目的是使模型更好。
- 對于英文模型,使用了 Wordpiece 模型來產生 Subword 從而減小詞表規模;對于中文模型,直接訓練基于字的模型。
- 模型輸入需要附加一個起始 Token,記為 [CLS],對應最終的 Hidden State(即 Transformer 的輸出)可以用來表征整個句子,用于下游的分類任務。
- 模型能夠處理句間關系。為區別兩個句子,用一個特殊標記符 [SEP] 進行分隔,另外針對不同的句子,將學習到的 Segment Embeddings 加到每個 Token 的 Embedding 上。
- 對于單句輸入,只有一種 Segment Embedding;對于句對輸入,會有兩種 Segment Embedding。
對于初學者,每個輸入的Embedding是3個嵌入的組合:
對于給定的目標詞,其輸入表示是通過對相應的目標詞、段和位置的Embedding進行求和來構造的。
這樣一個綜合的Embedding方案包含了很多對模型有用的信息。
這些預處理步驟的組合使BERT如此多才多藝。這意味著,不需要對模型的體系結構進行任何重大更改,我們就可以輕松地對它進行多種NLP任務的訓練。
3.預訓練任務
BERT已接受兩項NLP任務的預訓練:
- 屏蔽語言建模? Masked Language Model
- 下一句預測 Next Sentence Prediction
讓我們更詳細地了解這兩個任務!
1. Masked Language Model(MLM)
A. 雙向性
BERT被設計成一個深度雙向模型。網絡有效地從第一層本身一直到最后一層捕獲來自目標詞的左右上下文的信息。
傳統上,我們要么訓練語言模型預測句子中的下一個單詞(GPT中使用的從右到左的上下文),要么訓練語言模型預測從左到右的上下文。這使得我們的模型容易由于信息丟失而產生錯誤。
ELMo試圖通過在左到右和從右到左的上下文中訓練兩個LSTM語言模型并對其進行淺級連接來解決此問題。即使它在現有技術上有了很大的改進,但這還不夠。
"憑直覺,我們有理由相信,深層雙向模型比左向右模型或從左至右和從右至左模型的淺級連接嚴格更強大。" – BERT
這就是BERT在GPT和ELMo上都大大改進的地方。看下圖:
箭頭指示從一層到下一層的信息流。頂部的綠色框表示每個輸入單詞的最終上下文表示。
從上圖可以明顯看出:BERT是雙向的,GPT是單向的(信息僅從左向右流動),而ELMO是淺雙向的。
B. 屏蔽語言模型
假設我們有一句話——“我喜歡閱讀關于分析數據科學的博客”。我們想要訓練一個雙向的語言模型。與其試圖預測序列中的下一個單詞,不如構建一個模型,從序列本身預測缺失的單詞。
讓我們把“分析”替換成“[MASK]”。這是表示被屏蔽的單詞。然后,我們將以這樣一種方式訓練該模型,使它能夠預測“分析”這個詞語,所以句子變為:“我喜歡閱讀關于[MASK]數據科學的博客”
這是掩蔽語言模型的關鍵所在。BERT的作者還提出了一些注意事項,以進一步改進這項技術:
- 為了防止模型過于關注一個特定的位置或被掩蓋的標記,研究人員隨機掩蓋了15%的單詞
- 掩碼字并不總是被掩碼令牌[掩碼]替換,因為[掩碼]令牌在調優期間不會出現
訓練過程大量看到 [MASK] 標記,但是真正后面用的時候是不會有這個標記的,這會引導模型認為輸出是針對 [MASK] 這個標記的,但是實際使用又見不到這個標記。
因此,研究人員采用了以下方法:
- 80%的情況下,單詞被替換成帶Mask的令牌[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
那么為啥要以一定的概率使用隨機詞呢?這是因為transformer要保持對每個輸入token分布式的表征,否則Transformer很可能會記住這個[MASK]就是"hairy"。至于使用隨機詞帶來的負面影響,文章中解釋說,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的概率,其影響是可以忽略不計的。Transformer全局的可視,又增加了信息的獲取,但是不讓模型獲取全量信息。
在將單詞序列輸入給 BERT 之前,每個序列中有 15% 的單詞被 [MASK] token 替換。 然后模型嘗試基于序列中其他未被 mask 的單詞的上下文來預測被掩蓋的原單詞。
這樣就需要:
BERT 的損失函數只考慮了 mask 的預測值,忽略了沒有掩蔽的字的預測。這樣的話,模型要比單向模型收斂得慢,不過結果的情境意識增加了。
這不就是我們高中英語常做的完形填空么!所以說,BERT模型的預訓練過程其實就是在模仿我們學語言的過程。
具體來說,文章作者在一句話中隨機選擇15%的詞匯用于預測。對于在原句中被抹去的詞匯,80%情況下采用一個特殊符號[MASK]替換,10%情況下采用一個任意詞替換,剩余10%情況下保持原詞匯不變。這么做的主要原因是:在后續微調任務中語句中并不會出現[MASK]標記,而且這么做的另一個好處是:預測一個詞匯時,模型并不知道輸入對應位置的詞匯是否為正確的詞匯(10%概率),這就迫使模型更多地依賴于上下文信息去預測詞匯,并且賦予了模型一定的糾錯能力。
2. 下一句預測 Next Sentence Prediction
掩蔽語言模型(MLMs)學習理解單詞之間的關系。此外,BERT還接受了下一個句子預測任務的訓練,這些任務需要理解句子之間的關系。
此類任務的一個很好的例子是問題回答系統。
任務很簡單。給定兩個句子——A和B, B是語料庫中A后面的下一個句子,還是一個隨機的句子?
由于它是一個二分類任務,因此可以通過將任何語料庫分成句子對來輕松生成數據。就像mlm一樣,作者在這里也添加了一些注意事項。讓我們舉個例子:
假設我們有一個包含100,000個句子的文本數據集。因此,將有50,000個訓練例子或句子對作為訓練數據。
- 對于50%的對來說,第二個句子實際上是第一個句子的下一個句子
- 對于剩下的50%,第二句是語料庫中的一個隨機句子
- 第一種情況的標簽是“IsNext”,而第二種情況的標簽是“NotNext”
這就是為什么BERT能夠成為一個真正的任務不可知的模型。它結合了掩蔽語言模型(MLM)和下一個句子預測(NSP)的預訓練任務。
當年大學考英語四六級的時候,大家應該都做過段落重排序,即:將一篇文章的各段打亂,讓我們通過重新排序把原文還原出來,這其實需要我們對全文大意有充分、準確的理解。
Next Sentence Prediction任務實際上就是段落重排序的簡化版:只考慮兩句話,判斷是否是一篇文章中的前后句。在實際預訓練過程中,文章作者從文本語料庫中隨機選擇50%正確語句對和50%錯誤語句對進行訓練,與Masked LM任務相結合,讓模型能夠更準確地刻畫語句乃至篇章層面的語義信息。
BERT模型通過對Masked LM任務和Next Sentence Prediction任務進行聯合訓練,使模型輸出的每個字/詞的向量表示都能盡可能全面、準確地刻畫輸入文本(單句或語句對)的整體信息,為后續的微調任務提供更好的模型參數初始值。
五 BERT使用場景
BERT 可以用于各種NLP任務,只需在核心模型中添加一個層,例如:
從上圖中可以看出
1? 字向量:BERT模型通過查詢字向量表將文本中的每個字轉換為一維向量,作為模型輸入;模型輸出則是輸入各字對應的融合全文語義信息后的向量表示。
2. 文本向量:該向量的取值在模型訓練過程中自動學習,用于刻畫文本的全局語義信息,并與單字/詞的語義信息相融合
3. 位置向量:由于出現在文本不同位置的字/詞所攜帶的語義信息存在差異(比如:“我愛你”和“你愛我”),因此,BERT模型對不同位置的字/詞分別附加一個不同的向量以作區分
最后,BERT模型將字向量、文本向量和位置向量的加和作為模型輸入。特別地,在目前的BERT模型中,文章作者還將英文詞匯作進一步切割,劃分為更細粒度的語義單位(WordPiece),例如:將playing分割為play和##ing;此外,對于中文,目前作者尚未對輸入文本進行分詞,而是直接將單字作為構成文本的基本單位。
對于不同的NLP任務,模型輸入會有微調,對模型輸出的利用也有差異:
1. 單文本分類任務:
對于文本分類任務,BERT模型在文本前插入一個[CLS]符號,并將該符號對應的輸出向量作為整篇文本的語義表示,用于文本分類,如下圖所示。可以理解為:與文本中已有的其它字/詞相比,這個無明顯語義信息的符號會更“公平”地融合文本中各個字/詞的語義信息。
2 語句對分類任務
該任務的實際應用場景包括:問答(判斷一個問題與一個答案是否匹配)、語句匹配(兩句話是否表達同一個意思)等。對于該任務,BERT模型除了添加[CLS]符號并將對應的輸出作為文本的語義表示,還對輸入的兩句話用一個[SEP]符號作分割,并分別對兩句話附加兩個不同的文本向量以作區分,如下圖所示。
3. 序列標注任務:
該任務的實際應用場景包括:中文分詞&新詞發現(標注每個字是詞的首字、中間字或末字)、答案抽取(答案的起止位置)等。對于該任務,BERT模型利用文本中每個字對應的輸出向量對該字進行標注(分類),如下圖所示(B、I、E分別表示一個詞的第一個字、中間字和最后一個字)。
六 BERT的評價
總結下BERT的主要貢獻:
- 引入了Masked LM,使用雙向LM做模型預訓練。
- 為預訓練引入了新目標NSP,它可以學習句子與句子間的關系。
- 進一步驗證了更大的模型效果更好: 12 --> 24 層。
- 為下游任務引入了很通用的求解框架,不再為任務做模型定制。
- 刷新了多項NLP任務的記錄,引爆了NLP無監督預訓練技術。
BERT優點
- Transformer Encoder因為有Self-attention機制,因此BERT自帶雙向功能。
- 因為雙向功能以及多層Self-attention機制的影響,使得BERT必須使用Cloze版的語言模型Masked-LM來完成token級別的預訓練。
- 為了獲取比詞更高級別的句子級別的語義表征,BERT加入了Next Sentence Prediction來和Masked-LM一起做聯合訓練。
- 為了適配多任務下的遷移學習,BERT設計了更通用的輸入層和輸出層。
- 微調成本小。
BERT缺點
- task1的隨機遮擋策略略顯粗獷,推薦閱讀《Data Nosing As Smoothing In Neural Network Language Models》。
- [MASK]標記在實際預測中不會出現,訓練時用過多[MASK]影響模型表現。每個batch只有15%的token被預測,所以BERT收斂得比left-to-right模型要慢(它們會預測每個token)。
- BERT對硬件資源的消耗巨大(大模型需要16個tpu,歷時四天;更大的模型需要64個tpu,歷時四天。
?
七 實現BERT以進行文本分類
你的頭腦一定被BERT所開辟的各種可能性攪得團團轉。我們有許多方法可以利用BERT的大量知識來開發我們的NLP應用程序。
最有效的方法之一是根據你自己的任務和特定于任務的數據對其進行微調。然后我們可以使用BERT中的Embedding作為文本文檔的Embedding。
在本節中,我們將學習如何在NLP任務中使用BERT的Embedding。我們將在以后的文章中討論對整個BERT模型進行微調的概念。
為了從BERT中提取Embedding,我們將使用一個非常有用的開源項目: https://github.com/hanxiao/bert-as-service
這個開源項目如此有用的原因是它允許我們只需兩行代碼使用BERT獲取每個句子的Embedding。
安裝BERT-As-Service
服務以一種簡單的方式工作。它創建了一個BERT服務器。每次我們將一個句子列表發送給它時,它將發送所有句子的Embedding。
我們可以通過pip安裝服務器和客戶機。它們可以單獨安裝,甚至可以安裝在不同的機器上:
pip install bert-serving-server # server pip install bert-serving-client # client, independent of `bert-serving-server`注意,服務器必須在Python >= 3.5上運行,而TensorFlow >= 1.10。
此外,由于運行BERT是一個GPU密集型任務,我建議在基于云的GPU或其他具有高計算能力的機器上安裝BERT服務器。
現在,回到你的終端并下載下面列出的模型。然后,將zip文件解壓縮到某個文件夾中,比如/tmp/english_L-12_H-768_A-12/。
以下是發布的預訓練BERT模型列表:
BERT-Base, Uncased 12-layer, 768-hidden, 12-heads, 110M parameters https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zipBERT-Large, Uncased 24-layer, 1024-hidden, 16-heads, 340M parameters https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-24_H-1024_A-16.zipBERT-Base, Cased 12-layer, 768-hidden, 12-heads, 110M parameters https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zipBERT-Large, Cased 24-layer, 1024-hidden, 16-heads, 340M parameters https://storage.googleapis.com/bert_models/2018_10_18/cased_L-24_H-1024_A-16.zipBERT-Base, Multilingual Cased (New) 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters https://storage.googleapis.com/bert_models/2018_11_23/multi_cased_L-12_H-768_A-12.zipBERT-Base, Multilingual Cased (Old) 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters https://storage.googleapis.com/bert_models/2018_11_03/multilingual_L-12_H-768_A-12.zipBERT-Base, Chinese Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip我們將下載BERT Uncased,然后解壓縮zip文件:
wget https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip && unzip uncased_L-12_H-768_A-12.zip將所有文件提取到一個文件夾中之后,就可以啟動BERT服務了:
bert-serving-start -model_dir uncased_L-12_H-768_A-12/ -num_worker=2 -max_seq_len 50現在,你可以從Python代碼(使用客戶端庫)簡單地調用BERT-As-Service。讓我們直接進入代碼!
打開一個新的Jupyter notebook,試著獲取以下句子的Embedding:“I love data science and analytics vidhya”。
from bert_serving.client import BertClient# 使用BERT服務器的ip地址與它建立連接;如果是同一臺電腦,不用填寫IP bc = BertClient(ip="SERVER_IP_HERE") # 獲取embedding embedding = bc.encode(["I love data science and analytics vidhya."]) # 檢查embedding的形狀,應該是 1x768 print(embedding.shape)這里,IP地址是你的服務器或云的IP。如果在同一臺計算機上使用,則不需要此字段。
返回的embedding形狀為(1,768),因為BERT的架構中一個句子由768個隱藏單元表示。
問題: 在Twitter上對不良言論進行分類
讓我們拿一個真實世界的數據集來看看BERT有多有效。我們將使用一個數據集,該數據集由一系列推文組成,這些推文被歸類為“不良言論”或非“不良言論”。
為了簡單起見,如果一條推文帶有種族主義或性別歧視的情緒,我們就說它包含不良言論。因此,我們的任務是將種族主義或性別歧視的推文與其他推文進行分類。
數據集鏈接
https://datahack.analyticsvidhya.com/contest/practice-problem-twitter-sentiment-analysis/?utm_source=blog&utm_medium=demystifying-bert-groundbreaking-nlp-framework。
我們將使用BERT從數據集中的每個推特中提取Embedding,然后使用這些Embedding來訓練文本分類模型。
以下是該項目的整體結構:
現在讓我們看一下代碼:
import pandas as pd import numpy as np# 加載數據 train = pd.read_csv('BERT_proj/train_E6oV3lV.csv', encoding='iso-8859-1') train.shape你會熟悉大多數人是如何發推特的。有許多隨機的符號和數字(又名聊天語言!)我們的數據集也一樣。我們需要在通過BERT之前對它進行預處理:
import re# 清理噪聲 def clean_text(text):# 只剩字符text = re.sub(r'[^a-zA-Z\']', ' ', text)# 去除unicode字符text = re.sub(r'[^\x00-\x7F]+', '', text)# 轉換成小寫text = text.lower()return texttrain['clean_text'] = train.tweet.apply(clean_text)現在數據集是干凈的,它被分割成訓練集和驗證集:
from sklearn.model_selection import train_test_split# 分割成訓練集和驗證集 X_tr, X_val, y_tr, y_val = train_test_split(train.clean_text, train.label, test_size=0.25, random_state=42)print('X_tr shape:',X_tr.shape)讓我們在訓練和驗證集中獲得所有推特的Embedding:
from bert_serving.client import BertClient# 連接BERT服務器 bc = BertClient(ip="YOUR_SERVER_IP") # 編碼訓練集和驗證集 X_tr_bert = bc.encode(X_tr.tolist()) X_val_bert = bc.encode(X_val.tolist())現在是建模時間!我們來訓練分類模型:
from sklearn.linear_model import LogisticRegression# 使用LR模型 model_bert = LogisticRegression() # 訓練 model_bert = model_bert.fit(X_tr_bert, y_tr) # 預測 pred_bert = model_bert.predict(X_val_bert)檢查分類精度:
from sklearn.metrics import accuracy_scoreprint(accuracy_score(y_val, pred_bert))即使使用如此小的數據集,我們也可以輕松獲得大約95%的分類精度,這真的非常棒。
我鼓勵你繼續嘗試BERT對不同問題進行嘗試
超越BERT:目前最先進的NLP
BERT激發了人們對NLP領域的極大興趣,特別是NLP任務中Transformer的應用。這導致了研究實驗室和組織的數量激增,他們開始研究預訓練、BERT和fine-tuning的不同方面。
許多這樣的項目在多個NLP任務上都比BERT做得好。其中最有趣的是RoBERTa,這是Facebook人工智能對BERT和DistilBERT的改進,而DistilBERT是BERT的精簡版和快速版。
BERT相關論文、文章和代碼資源匯總
1、Google官方:
1) BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
一切始于10月Google祭出的這篇Paper, 瞬間引爆整個AI圈包括自媒體圈: https://arxiv.org/abs/1810.04805
2) Github: https://github.com/google-research/bert
11月Google推出了代碼和預訓練模型,再次引起群體亢奮。
3) Google AI Blog: Open Sourcing BERT: State-of-the-Art Pre-training for Natural Language Processing
2、第三方解讀:
1) 張俊林博士的解讀, 知乎專欄:從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史
我們在AINLP微信公眾號上轉載了這篇文章和張俊林博士分享的PPT,歡迎關注:
- 從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史
- 預訓練在自然語言處理的發展: 從Word Embedding到BERT模型
2) 知乎: 如何評價 BERT 模型?
3) 【NLP】Google BERT詳解
4) [NLP自然語言處理]谷歌BERT模型深度解析
5) BERT Explained: State of the art language model for NLP
6) BERT介紹
7) 論文解讀:BERT模型及fine-tuning
8) NLP突破性成果 BERT 模型詳細解讀
9) 干貨 | BERT fine-tune 終極實踐教程: 奇點智能BERT實戰教程,在AI Challenger 2018閱讀理解任務中訓練一個79+的模型。
10) 【BERT詳解】《Dissecting BERT》by Miguel Romero Calvo
Dissecting BERT Part 1: The Encoder
Understanding BERT Part 2: BERT Specifics
Dissecting BERT Appendix: The Decoder
11)BERT+BiLSTM-CRF-NER用于做ner識別
12)AI賦能法律 | NLP最強之谷歌BERT模型在智能司法領域的實踐淺談
3 第三方代碼:
1) pytorch-pretrained-BERT: https://github.com/huggingface/pytorch-pretrained-BERT
Google官方推薦的PyTorch BERB版本實現,可加載Google預訓練的模型:PyTorch version of Google AI's BERT model with script to load Google's pre-trained models
2) BERT-pytorch: https://github.com/codertimo/BERT-pytorch
另一個Pytorch版本實現:Google AI 2018 BERT pytorch implementation
3) BERT-tensorflow: https://github.com/guotong1988/BERT-tensorflow
Tensorflow版本:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
4) bert-chainer: https://github.com/soskek/bert-chainer
Chanier版本: Chainer implementation of "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"
5) bert-as-service: https://github.com/hanxiao/bert-as-service
將不同長度的句子用BERT預訓練模型編碼,映射到一個固定長度的向量上:Mapping a variable-length sentence to a fixed-length vector using pretrained BERT model
這個很有意思,在這個基礎上稍進一步是否可以做一個句子相似度計算服務?有沒有同學一試?
6) bert_language_understanding: https://github.com/brightmart/bert_language_understanding
BERT實戰:Pre-training of Deep Bidirectional Transformers for Language Understanding: pre-train TextCNN
7) sentiment_analysis_fine_grain: https://github.com/brightmart/sentiment_analysis_fine_grain
BERT實戰,多標簽文本分類,在 AI Challenger 2018 細粒度情感分析任務上的嘗試:Multi-label Classification with BERT; Fine Grained Sentiment Analysis from AI challenger
8) BERT-NER: https://github.com/kyzhouhzau/BERT-NER
BERT實戰,命名實體識別: Use google BERT to do CoNLL-2003 NER !
9) BERT-keras: https://github.com/Separius/BERT-keras
Keras版: Keras implementation of BERT with pre-trained weights
BERT的非官方實現,可以加載官方的預訓練模型進行特征提取和預測。
https://github.com/CyberZHG/keras-bert
已經基本實現bert,并且能成功加載官方權重,經驗證模型輸出跟keras-bert一致,大家可以放心使用
https://github.com/bojone/bert4keras
10) tbert: https://github.com/innodatalabs/tbert
PyTorch port of BERT ML model
11) BERT-Classification-Tutorial: https://github.com/Socialbird-AILab/BERT-Classification-Tutorial
12) BERT-BiLSMT-CRF-NER: https://github.com/macanv/BERT-BiLSMT-CRF-NER
Tensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuning
13) bert-Chinese-classification-task
bert中文分類實踐
14) bert-chinese-ner: https://github.com/ProHiryu/bert-chinese-ner
使用預訓練語言模型BERT做中文NER
15)BERT-BiLSTM-CRF-NER
Tensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuning
16) bert-sequence-tagging: https://github.com/zhpmatrix/bert-sequence-tagging
基于BERT的中文序列標注
參考:
理解BERT:一個突破性NLP框架的綜合指南
圖解BERT模型:從零開始構建BERT
BERT預訓練模型的演進過程
總結
以上是生活随笔為你收集整理的[深度学习] 自然语言处理 --- BERT模型原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 塞尔达骆驼神兽的攻略是什么
- 下一篇: [深度学习] 自然语言处理--- 基于K