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