概述
BERT簡介想象一下——你正在從事一個非??岬臄?shù)據(jù)科學項目,,并且應用了最新的最先進的庫來獲得一個好的結果!幾天后,,一個新的最先進的框架出現(xiàn)了,,它有可能進一步改進你的模型。 這不是一個假想的場景——這是在自然語言處理(NLP)領域工作的真正現(xiàn)實!過去的兩年的突破是令人興奮的,。 谷歌的BERT就是這樣一個NLP框架,。我敢說它可能是近代最有影響力的一個(我們很快就會知道為什么)。 毫不夸張地說,,BERT極大地改變了NLP的格局,。想象一下,使用一個在大型未標記數(shù)據(jù)集上訓練的單一模型,,然后在11個單獨的NLP任務上獲得SOTA結果,。所有這些任務都需要fine-tuning。BERT是我們設計NLP模型的一個結構性轉變,。 BERT啟發(fā)了許多最近的NLP架構,、訓練方法和語言模型,如谷歌的TransformerXL,、OpenAI的GPT-2,、XLNet、ERNIE2.0,、RoBERTa等,。 我的目標是給你一個全面的指導,不僅BERT,,還有它帶來的影響以及如何影響未來的NLP研究,。 目錄
什么是BERT?你可能大概聽說過BERT,你看到過它是多么不可思議,,它是如何潛在地改變了NLP的前景,。但是BERT到底是什么呢? BERT背后的研究團隊是這樣描述NLP框架的:
作為一開始,,這聽起來太復雜了。但是它確實總結了BERT的出色表現(xiàn),,因此讓我們對其進行細分,。 首先,很容易理解BERT是Transformers的雙向編碼器表示,。這里的每個詞都有其含義,,我們將在本文中逐一討論。這一行的關鍵是,,BERT是基于Transformer架構的,。 其次,BERT是在大量未標記文本的預訓練,,包括整個Wikipedia(有25億個詞!)和圖書語料庫(有8億個單詞),。
第三,,BERT是'深度雙向'模型,。雙向意味著BERT在訓練階段從目標詞的左右兩側上下文來學習信息。 模型的雙向性對于真正理解語言的意義很重要,。讓我們看一個例子來說明這一點,。在此示例中,有兩個句子,,并且兩個句子都包含單詞'bank': 如果我們僅通過選擇左側或右側上下文來預測'bank'一詞的意義,,那么在兩個給定示例中至少有一個會出錯。 解決此問題的一種方法是在進行預測之前考慮左右上下文,。這正是BERT所做的!我們將在本文的后面看到如何實現(xiàn)這一目標,。 最后,BERT最令人印象深刻的方面,。我們可以通過僅添加幾個其他輸出層來微調它,,以創(chuàng)建用于各種NLP任務的最新模型,。 從Word2Vec到BERT:NLP的學習語言表示的探索
Word2Vec和GloVe通過在大型未標記文本數(shù)據(jù)上進行預訓練模型來學習語言表示的要求始于諸如Word2Vec和GloVe之類的Word Embedding,。這些Embedding改變了我們執(zhí)行NLP任務的方式。現(xiàn)在,我們有了Embedding,,可以捕獲單詞之間的上下文關系,。 這些Embedding被用來訓練下游NLP任務的模型,并做出更好的預測,。這可以通過利用來自Embedding本身的附加信息,,甚至使用較少的特定于任務的數(shù)據(jù)來完成。 這些Embedding的一個限制是使用非常淺的語言模型,。這意味著他們能夠獲取的信息的數(shù)量是有限的,,這促使他們使用更深入、更復雜的語言模型(LSTMs和GRUs層),。 另一個關鍵的限制是,,這些模型沒有考慮單詞的上下文。讓我們以上面的“bank”為例,。同一個單詞在不同的上下文中有不同的意思,。然而,像Word2Vec這樣的Embedding將在這兩個上下文中為“bank”提供相同的Word Embedding,。 這是導致模型不準確的一個因素,。 ELMO和ULMFiTELMo是NLP社區(qū)對一詞多義問題的回應——相同的詞在不同的語境中有不同的含義。從訓練淺層前饋網(wǎng)絡(Word2vec),,逐步過渡到使用復雜的雙向LSTM體系結構的層來訓練Word Embedding,。這意味著同一個單詞可以根據(jù)它所在的上下文有多個ELMO Embedding。 那是我們開始看到預訓練作為NLP的訓練機制的優(yōu)勢,。 ULMFiT則更進一步,。這個框架可以訓練語言模型,這些模型可以進行微調,,從而在各種文檔分類任務中,,即使使用更少的數(shù)據(jù)(少于100個示例)也可以提供出色的結果。可以肯定地說,,ULMFiT破解了NLP中遷移學習的密碼,。 這就是我們在NLP中建立遷移學習黃金法則的時候:
ULMFIT之后的大多數(shù)NLP的突破調整了上述等式的組成部分,并獲得了最先進的基準,。 OpenAI的GPTOpenAI的GPT擴展了ULMFiT和ELMo引入的預訓練和微調方法,。GPT本質上用基于轉換的體系結構取代了基于lstm的語言建模體系結構。 GPT模型可以微調到文檔分類之外的多個NLP任務,,如常識推理,、語義相似性和閱讀理解。 GPT還強調了Transformer框架的重要性,,它具有更簡單的體系結構,,并且比基于lstm的模型訓練得更快,。它還能夠通過使用注意力機制來學習數(shù)據(jù)中的復雜模式。
這就是Transformer如何啟發(fā)了BERT以及接下來在NLP領域的所有突破。 現(xiàn)在,,還有一些其他的重要突破和研究成果我們還沒有提到,,比如半監(jiān)督序列學習。這是因為它們稍微超出了本文的范圍,,但是你可以閱讀相關的論文來了解更多信息,。 BERT因此,解決NLP任務的新方法變成了一個2步過程:
在這樣的背景下,,讓我們來理解BERT是如何從這里開始建立一個模型,這個模型將在很長一段時間內成為NLP中優(yōu)秀的基準,。 BERT如何工作?讓我們仔細看一下BERT,,了解為什么它是一種有效的語言建模方法。我們已經知道BERT可以做什么,,但是它是如何做到的?我們將在本節(jié)中回答這個相關問題,。 1. BERT的體系結構BERT架構建立在Transformer之上。我們目前有兩個可用的版本:
出于比較的目的,BERT基礎架構具有與OpenAI的GPT相同的模型大小,。所有這些Transformer層都是只使用Transformer的編碼器,。 現(xiàn)在我們已經了解了BERT的總體架構,接下來讓我們看看在進入模型構建階段之前需要哪些文本處理步驟,。 2.文本預處理BERT背后的開發(fā)人員已經添加了一組特定規(guī)則來表示模型的輸入文本,。其中許多是創(chuàng)造性的設計選擇,目的是使模型更好,。 對于初學者,,每個輸入的Embedding是3個嵌入的組合:
這樣一個綜合的Embedding方案包含了很多對模型有用的信息,。 這些預處理步驟的組合使BERT如此多才多藝,。這意味著,不需要對模型的體系結構進行任何重大更改,,我們就可以輕松地對它進行多種NLP任務的訓練,。 3.預訓練任務BERT已接受兩項NLP任務的預訓練:
讓我們更詳細地了解這兩個任務! 1. 屏蔽語言建模(雙向性)雙向性 BERT被設計成一個深度雙向模型。網(wǎng)絡有效地從第一層本身一直到最后一層捕獲來自目標詞的左右上下文的信息,。 傳統(tǒng)上,,我們要么訓練語言模型預測句子中的下一個單詞(GPT中使用的從右到左的上下文),要么訓練語言模型預測從左到右的上下文,。這使得我們的模型容易由于信息丟失而產生錯誤,。 ELMo試圖通過在左到右和從右到左的上下文中訓練兩個LSTM語言模型并對其進行淺級連接來解決此問題。即使它在現(xiàn)有技術上有了很大的改進,,但這還不夠,。
這就是BERT在GPT和ELMo上都大大改進的地方。看下圖: 箭頭指示從一層到下一層的信息流,。頂部的綠色框表示每個輸入單詞的最終上下文表示,。 從上圖可以明顯看出:BERT是雙向的,GPT是單向的(信息僅從左向右流動),,而ELMO是淺雙向的,。 關于屏蔽語言模型 假設我們有一句話——“我喜歡閱讀關于分析數(shù)據(jù)科學的博客”。我們想要訓練一個雙向的語言模型,。與其試圖預測序列中的下一個單詞,,不如構建一個模型,從序列本身預測缺失的單詞,。 讓我們把“分析”替換成“[MASK]”,。這是表示被屏蔽的單詞。然后,,我們將以這樣一種方式訓練該模型,,使它能夠預測“分析”這個詞語,所以句子變?yōu)?“我喜歡閱讀關于[MASK]數(shù)據(jù)科學的博客” 這是掩蔽語言模型的關鍵所在,。BERT的作者還提出了一些注意事項,,以進一步改進這項技術:
2. 下一句預測掩蔽語言模型(MLMs)學習理解單詞之間的關系,。此外,,BERT還接受了下一個句子預測任務的訓練,這些任務需要理解句子之間的關系,。 此類任務的一個很好的例子是問題回答系統(tǒng),。
由于它是一個二分類任務,,因此可以通過將任何語料庫分成句子對來輕松生成數(shù)據(jù)。就像mlm一樣,,作者在這里也添加了一些注意事項,。讓我們舉個例子: 假設我們有一個包含100,000個句子的文本數(shù)據(jù)集。因此,,將有50,000個訓練例子或句子對作為訓練數(shù)據(jù),。
這就是為什么BERT能夠成為一個真正的任務不可知的模型。它結合了掩蔽語言模型(MLM)和下一個句子預測(NSP)的預訓練任務,。 在Python中實現(xiàn)BERT以進行文本分類你的頭腦一定被BERT所開辟的各種可能性攪得團團轉,。我們有許多方法可以利用BERT的大量知識來開發(fā)我們的NLP應用程序。 最有效的方法之一是根據(jù)你自己的任務和特定于任務的數(shù)據(jù)對其進行微調,。然后我們可以使用BERT中的Embedding作為文本文檔的Embedding,。 在本節(jié)中,我們將學習如何在NLP任務中使用BERT的Embedding,。我們將在以后的文章中討論對整個BERT模型進行微調的概念,。 為了從BERT中提取Embedding,我們將使用一個非常有用的開源項目: 這個開源項目如此有用的原因是它允許我們只需兩行代碼使用BERT獲取每個句子的Embedding,。 安裝BERT-As-Service服務以一種簡單的方式工作,。它創(chuàng)建了一個BERT服務器。每次我們將一個句子列表發(fā)送給它時,,它將發(fā)送所有句子的Embedding,。 我們可以通過pip安裝服務器和客戶機。它們可以單獨安裝,,甚至可以安裝在不同的機器上: pip install bert-serving-server # server 注意,,服務器必須在Python >= 3.5上運行,而TensorFlow >= 1.10。 此外,,由于運行BERT是一個GPU密集型任務,,我建議在基于云的GPU或其他具有高計算能力的機器上安裝BERT服務器。 現(xiàn)在,,回到你的終端并下載下面列出的模型,。然后,將zip文件解壓縮到某個文件夾中,,比如/tmp/english_L-12_H-768_A-12/。 以下是發(fā)布的預訓練BERT模型列表: BERT-Base, Uncased 12-layer, 768-hidden, 12-heads, 110M parameters BERT-Large, Uncased 24-layer, 1024-hidden, 16-heads, 340M parameters BERT-Base, Cased 12-layer, 768-hidden, 12-heads, 110M parameters BERT-Large, Cased 24-layer, 1024-hidden, 16-heads, 340M parameters BERT-Base, Multilingual Cased (New) 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters BERT-Base, Multilingual Cased (Old) 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters BERT-Base, Chinese Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters 我們將下載BERT Uncased,,然后解壓縮zip文件:
將所有文件提取到一個文件夾中之后,,就可以啟動BERT服務了: bert-serving-start -model_dir uncased_L-12_H-768_A-12/ -num_worker=2 -max_seq_len 50 現(xiàn)在,你可以從Python代碼(使用客戶端庫)簡單地調用BERT-As-Service,。讓我們直接進入代碼! 打開一個新的Jupyter notebook,,試著獲取以下句子的Embedding:“I love data science and analytics vidhya”。
這里,IP地址是你的服務器或云的IP,。如果在同一臺計算機上使用,,則不需要此字段。 返回的embedding形狀為(1,768),,因為BERT的架構中一個句子由768個隱藏單元表示,。 問題:在Twitter上對不良言論進行分類讓我們拿一個真實世界的數(shù)據(jù)集來看看BERT有多有效。我們將使用一個數(shù)據(jù)集,,該數(shù)據(jù)集由一系列推文組成,,這些推文被歸類為“不良言論”或非“不良言論”。 為了簡單起見,,如果一條推文帶有種族主義或性別歧視的情緒,,我們就說它包含不良言論。因此,,我們的任務是將種族主義或性別歧視的推文與其他推文進行分類,。 數(shù)據(jù)集鏈接
以下是該項目的整體結構: 現(xiàn)在讓我們看一下代碼: import pandas as pd 你會熟悉大多數(shù)人是如何發(fā)推特的。有許多隨機的符號和數(shù)字(又名聊天語言!)我們的數(shù)據(jù)集也一樣,。我們需要在通過BERT之前對它進行預處理:
現(xiàn)在數(shù)據(jù)集是干凈的,,它被分割成訓練集和驗證集: from sklearn.model_selection import train_test_split 讓我們在訓練和驗證集中獲得所有推特的Embedding:
現(xiàn)在是建模時間!我們來訓練分類模型: from sklearn.linear_model import LogisticRegression 檢查分類精度:
即使使用如此小的數(shù)據(jù)集,我們也可以輕松獲得大約95%的分類精度,,這真的非常棒,。 我鼓勵你繼續(xù)嘗試BERT對不同問題進行嘗試 超越BERT:目前最先進的NLPBERT激發(fā)了人們對NLP領域的極大興趣,,特別是NLP任務中Transformer的應用。這導致了研究實驗室和組織的數(shù)量激增,,他們開始研究預訓練,、BERT和fine-tuning的不同方面。 許多這樣的項目在多個NLP任務上都比BERT做得好,。其中最有趣的是RoBERTa,,這是Facebook人工智能對BERT和DistilBERT的改進,而DistilBERT是BERT的精簡版和快速版,。 |
|