自google在2018年10月底公布BERT在11項(xiàng)nlp任務(wù)中的卓越表現(xiàn)后,BERT(Bidirectional Encoder Representation from Transformers)就成為NLP領(lǐng)域大火,在本文中,我們將研究BERT模型,理解它的工作原理,這個(gè)是NLP(自然語(yǔ)言處理)的非常重要的部分。
備注:前面的文章講了transformer的原理
作者:jinjiajia95
出處:https://blog.csdn.net/weixin_40746796/article/details/89951967
原作者:Jay Alammar
原鏈接:https://jalammar.github.io/illustrated-bert/
前言
2018年可謂是自然語(yǔ)言處理(NLP)的元年,在我們?nèi)绾我宰钅?strong>捕捉潛在語(yǔ)義關(guān)系的方式 來(lái)輔助計(jì)算機(jī)對(duì)的句子概念性的理解 這方面取得了極大的發(fā)展進(jìn)步。此外, NLP領(lǐng)域的一些開(kāi)源社區(qū)已經(jīng)發(fā)布了很多強(qiáng)大的組件,我們可以在自己的模型訓(xùn)練過(guò)程中免費(fèi)的下載使用。(可以說(shuō)今年是NLP的ImageNet時(shí)刻,因?yàn)檫@和幾年前計(jì)算機(jī)視覺(jué)的發(fā)展很相似)
你需要注意一些事情才能恰當(dāng)?shù)睦斫釨ERT的內(nèi)容,不過(guò),在介紹模型涉及的概念之前可以使用BERT的方法。
示例:句子分類
使用BERT最簡(jiǎn)單的方法就是做一個(gè)文本分類模型,這樣的模型結(jié)構(gòu)如下圖所示:
為了訓(xùn)練一個(gè)這樣的模型,(主要是訓(xùn)練一個(gè)分類器),在訓(xùn)練階段BERT模型發(fā)生的變化很小。該訓(xùn)練過(guò)程稱為微調(diào),并且源于 Semi-supervised Sequence Learning 和 ULMFiT.。
為了更方便理解,我們下面舉一個(gè)分類器的例子。分類器是屬于監(jiān)督學(xué)習(xí)領(lǐng)域的,這意味著你需要一些標(biāo)記的數(shù)據(jù)來(lái)訓(xùn)練這些模型。對(duì)于垃圾郵件分類器的示例,標(biāo)記的數(shù)據(jù)集由郵件的內(nèi)容和郵件的類別2部分組成(類別分為“垃圾郵件”或“非垃圾郵件”)。
情感分析
輸入:電影/產(chǎn)品評(píng)論。輸出:評(píng)論是正面還是負(fù)面?
示例數(shù)據(jù)集:SST
事實(shí)查證
輸入:句子。輸出:“索賠”或“不索賠”
更雄心勃勃/未來(lái)主義的例子:
輸入:句子。輸出:“真”或“假”
模型架構(gòu)
現(xiàn)在您已經(jīng)了解了如何使用BERT的示例,讓我們仔細(xì)了解一下他的工作原理。
BERT的論文中介紹了2種版本:
BERT BASE - 與OpenAI Transformer的尺寸相當(dāng),以便比較性能
BERT LARGE - 一個(gè)非常龐大的模型,它完成了本文介紹的最先進(jìn)的結(jié)果。
BERT的基礎(chǔ)集成單元是Transformer的Encoder。關(guān)于Transformer的介紹可以閱讀作者之前的文章:The Illustrated Transformer,該文章解釋了Transformer模型 - BERT的基本概念以及我們接下來(lái)要討論的概念。
2個(gè)BERT的模型都有一個(gè)很大的編碼器層數(shù),(論文里面將此稱為Transformer Blocks) - 基礎(chǔ)版本就有12層,進(jìn)階版本有24層。同時(shí)它也有很大的前饋神經(jīng)網(wǎng)絡(luò)( 768和1024個(gè)隱藏層神經(jīng)元),還有很多attention heads(12-16個(gè))。這超過(guò)了Transformer論文中的參考配置參數(shù)(6個(gè)編碼器層,512個(gè)隱藏層單元,和8個(gè)注意頭)
模型輸入
BERT與Transformer 的編碼方式一樣。將固定長(zhǎng)度的字符串作為輸入,數(shù)據(jù)由下而上傳遞計(jì)算,每一層都用到了self attention,并通過(guò)前饋神經(jīng)網(wǎng)絡(luò)傳遞其結(jié)果,將其交給下一個(gè)編碼器。
這樣的架構(gòu),似乎是沿用了Transformer 的架構(gòu)(除了層數(shù),不過(guò)這是我們可以設(shè)置的參數(shù))。那么BERT與Transformer 不同之處在哪里呢?可能在模型的輸出上,我們可以發(fā)現(xiàn)一些端倪。
模型輸出
每個(gè)位置返回的輸出都是一個(gè)隱藏層大小的向量(基本版本BERT為768)。以文本分類為例,我們重點(diǎn)關(guān)注第一個(gè)位置上的輸出(第一個(gè)位置是分類標(biāo)識(shí)[CLS]) 。如下圖
該向量現(xiàn)在可以用作我們選擇的分類器的輸入,在論文中指出使用單層神經(jīng)網(wǎng)絡(luò)作為分類器就可以取得很好的效果。原理如下。:
例子中只有垃圾郵件和非垃圾郵件,如果你有更多的label,你只需要增加輸出神經(jīng)元的個(gè)數(shù)即可,另外把最后的激活函數(shù)換成softmax即可。
Parallels with Convolutional Nets(BERT VS卷積神經(jīng)網(wǎng)絡(luò))
對(duì)于那些具有計(jì)算機(jī)視覺(jué)背景的人來(lái)說(shuō),這個(gè)矢量切換應(yīng)該讓人聯(lián)想到VGGNet等網(wǎng)絡(luò)的卷積部分與網(wǎng)絡(luò)末端的完全連接的分類部分之間發(fā)生的事情。你可以這樣理解,實(shí)質(zhì)上這樣理解也很方便。
詞嵌入的新時(shí)代?
BERT的開(kāi)源隨之而來(lái)的是一種詞嵌入的更新。到目前為止,詞嵌入已經(jīng)成為NLP模型處理自然語(yǔ)言的主要組成部分。諸如Word2vec和Glove 等方法已經(jīng)廣泛的用于處理這些問(wèn)題,在我們使用新的詞嵌入之前,我們有必要回顧一下其發(fā)展。
詞嵌入的回顧
為了讓機(jī)器可以學(xué)習(xí)到文本的特征屬性,我們需要一些將文本數(shù)值化的表示的方式。Word2vec算法通過(guò)使用一組固定維度的向量來(lái)表示單詞,計(jì)算其方式可以捕獲到單詞的語(yǔ)義及單詞與單詞之間的關(guān)系。使用Word2vec的向量化表示方式可以用于判斷單詞是否相似,對(duì)立,或者說(shuō)判斷“男人'與’女人”的關(guān)系就如同“國(guó)王”與“王后”。(這些話是不是聽(tīng)膩了? emmm水文必備)。另外還能捕獲到一些語(yǔ)法的關(guān)系,這個(gè)在英語(yǔ)中很實(shí)用。例如“had”與“has”的關(guān)系如同“was”與“is”的關(guān)系。
這樣的做法,我們可以使用大量的文本數(shù)據(jù)來(lái)預(yù)訓(xùn)練一個(gè)詞嵌入模型,而這個(gè)詞嵌入模型可以廣泛用于其他NLP的任務(wù),這是個(gè)好主意,這使得一些初創(chuàng)公司或者計(jì)算資源不足的公司,也能通過(guò)下載已經(jīng)開(kāi)源的詞嵌入模型來(lái)完成NLP的任務(wù)。
ELMo:語(yǔ)境問(wèn)題
上面介紹的詞嵌入方式有一個(gè)很明顯的問(wèn)題,因?yàn)槭褂妙A(yù)訓(xùn)練好的詞向量模型,那么無(wú)論上下文的語(yǔ)境關(guān)系如何,每個(gè)單詞都只有一個(gè)唯一的且已經(jīng)固定保存的向量化形式。“Wait a minute “ - 出自(Peters et. al., 2017, McCann et. al., 2017, and yet again Peters et. al., 2018 in the ELMo paper )
這和中文的同音字其實(shí)也類似,用這個(gè)舉一個(gè)例子吧, '長(zhǎng)’ 這個(gè)字,在 '長(zhǎng)度’ 這個(gè)詞中表示度量,在 '長(zhǎng)高’ 這個(gè)詞中表示增加。那么為什么我們不通過(guò)”長(zhǎng)’周圍是度或者是高來(lái)判斷它的讀音或者它的語(yǔ)義呢?嗖嘎,這個(gè)問(wèn)題就派生出語(yǔ)境化的詞嵌入模型。
EMLo改變Word2vec類的將單詞固定為指定長(zhǎng)度的向量的處理方式,它是在為每個(gè)單詞分配詞向量之前先查看整個(gè)句子,然后使用bi-LSTM來(lái)訓(xùn)練它對(duì)應(yīng)的詞向量。
ELMo會(huì)訓(xùn)練一個(gè)模型,這個(gè)模型接受一個(gè)句子或者單詞的輸入,輸出最有可能出現(xiàn)在后面的一個(gè)單詞。想想輸入法,對(duì)啦,就是這樣的道理。這個(gè)在NLP中我們也稱作Language Modeling。這樣的模型很容易實(shí)現(xiàn),因?yàn)槲覀儞碛写罅康奈谋緮?shù)據(jù)且我們可以在不需要標(biāo)簽的情況下去學(xué)習(xí)。
從上圖可以發(fā)現(xiàn),每個(gè)展開(kāi)的LSTM都在最后一步完成預(yù)測(cè)。
對(duì)了真正的ELMo會(huì)更進(jìn)一步,它不僅能判斷下一個(gè)詞,還能預(yù)測(cè)前一個(gè)詞。(Bi-Lstm)
ELMo通過(guò)下圖的方式將hidden states(的初始的嵌入)組合咋子一起來(lái)提煉出具有語(yǔ)境意義的詞嵌入方式(全連接后加權(quán)求和)
ULM-FiT:NLP領(lǐng)域應(yīng)用遷移學(xué)習(xí)
ULM-FiT機(jī)制讓模型的預(yù)訓(xùn)練參數(shù)得到更好的利用。所利用的參數(shù)不僅限于embeddings,也不僅限于語(yǔ)境embedding,ULM-FiT引入了Language Model和一個(gè)有效微調(diào)該Language Model來(lái)執(zhí)行各種NLP任務(wù)的流程。這使得NLP任務(wù)也能像計(jì)算機(jī)視覺(jué)一樣方便的使用遷移學(xué)習(xí)。
The Transformer:超越LSTM的結(jié)構(gòu)
Transformer論文和代碼的發(fā)布,以及其在機(jī)器翻譯等任務(wù)上取得的優(yōu)異成果,讓一些研究人員認(rèn)為它是LSTM的替代品,事實(shí)上卻是Transformer比LSTM更好的處理long-term dependancies(長(zhǎng)程依賴)問(wèn)題。Transformer Encoding和Decoding的結(jié)構(gòu)非常適合機(jī)器翻譯,但是怎么利用他來(lái)做文本分類的任務(wù)呢?實(shí)際上你只用使用它來(lái)預(yù)訓(xùn)練可以針對(duì)其他任務(wù)微調(diào)的語(yǔ)言模型即可。
OpenAI Transformer:用于語(yǔ)言模型的Transformer解碼器預(yù)訓(xùn)練
事實(shí)證明,我們并不需要一個(gè)完整的transformer結(jié)構(gòu)來(lái)使用遷移學(xué)習(xí)和一個(gè)很好的語(yǔ)言模型來(lái)處理NLP任務(wù)。我們只需要Transformer的解碼器就行了。The decoder is a good choice because it’s a natural choice for language modeling (predicting the next word) since it’s built to mask future tokens – a valuable feature when it’s generating a translation word by word.
通過(guò)這種結(jié)構(gòu)調(diào)整,我們可以繼續(xù)在相似的語(yǔ)言模型任務(wù)上訓(xùn)練模型:使用大量的未標(biāo)記數(shù)據(jù)集訓(xùn)練,來(lái)預(yù)測(cè)下一個(gè)單詞。舉個(gè)列子:你那7000本書喂給你的模型,(書籍是極好的訓(xùn)練樣本~比博客和推文好很多。)訓(xùn)練框架如下:
Transfer Learning to Downstream Tasks
通過(guò)OpenAI的transformer的預(yù)訓(xùn)練和一些微調(diào)后,我們就可以將訓(xùn)練好的模型,用于其他下游NLP任務(wù)啦。(比如訓(xùn)練一個(gè)語(yǔ)言模型,然后拿他的hidden state來(lái)做分類。),下面就介紹一下這個(gè)騷操作。(還是如上面例子:分為垃圾郵件和非垃圾郵件)
OpenAI論文概述了許多Transformer使用遷移學(xué)習(xí)來(lái)處理不同類型NLP任務(wù)的例子。如下圖例子所示:
BERT: From Decoders to Encoders
OpenAI transformer為我們提供了基于Transformer的精密的預(yù)訓(xùn)練模型。但是從LSTM到Transformer的過(guò)渡中,我們發(fā)現(xiàn)少了些東西。ELMo的語(yǔ)言模型是雙向的,但是OpenAI的transformer是前向訓(xùn)練的語(yǔ)言模型。我們能否讓我們的Transformer模型也具有Bi-Lstm的特性呢?
R-BERT:“Hold my beer”
Masked Language Model
BERT說(shuō):“我要用 transformer 的 encoders”
Ernie不屑道:“呵呵,你不能像Bi-Lstm一樣考慮文章”
BERT自信回答道:“我們會(huì)用masks”
解釋一下Mask:
語(yǔ)言模型會(huì)根據(jù)前面單詞來(lái)預(yù)測(cè)下一個(gè)單詞,但是self-attention的注意力只會(huì)放在自己身上,那么這樣100%預(yù)測(cè)到自己,毫無(wú)意義,所以用Mask,把需要預(yù)測(cè)的詞給擋住。
如下圖:
我們回顧一下OpenAI transformer處理不同任務(wù)的輸入轉(zhuǎn)換,你會(huì)發(fā)現(xiàn)在某些任務(wù)上我們需要2個(gè)句子作為輸入,并做一些更為智能的判斷,比如是否相似,比如 給出一個(gè)維基百科的內(nèi)容作為輸入,同時(shí)在放入一條針對(duì)該條目的問(wèn)題,那么我們的算法模型能夠處理這個(gè)問(wèn)題嗎?
為了使BERT更好的處理2個(gè)句子之間的關(guān)系,預(yù)訓(xùn)練的過(guò)程還有一個(gè)額外的任務(wù):給定2個(gè)句子(A和B),A與B是否相似?(0或者1)
特殊NLP任務(wù)
BERT的論文為我們介紹了幾種BERT可以處理的NLP任務(wù):
短文本相似
文本分類
QA機(jī)器人
語(yǔ)義標(biāo)注
BERT用做特征提取
微調(diào)方法并不是使用BERT的唯一方法,就像ELMo一樣,你可以使用預(yù)選訓(xùn)練好的BERT來(lái)創(chuàng)建語(yǔ)境化詞嵌入。然后你可以將這些嵌入提供給現(xiàn)有的模型。
哪個(gè)向量最適合作為上下文嵌入?我認(rèn)為這取決于任務(wù)。本文考察了六種選擇(與微調(diào)模型相比,得分為96.4):
如何使用BERT
使用BERT的最佳方式是通過(guò) BERT FineTuning with Cloud TPUs 谷歌云上托管的筆記
(https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/bert_finetuning_with_cloud_tpus.ipynb)。
如果你未使用過(guò)谷歌云TPU可以試試看,這是個(gè)不錯(cuò)的嘗試。另外BERT也適用于TPU,CPU和GPU
下一步是查看BERT倉(cāng)庫(kù)中的代碼:
該模型在modeling.py (BertModel類)中構(gòu)建,與vanilla Transformer編碼器完全相同。
(https://github.com/google-research/bert/blob/master/modeling.py)
run_classifier.py是微調(diào)過(guò)程的一個(gè)示例。
它還構(gòu)建了監(jiān)督模型的分類層。
(https://github.com/google-research/bert/blob/master/run_classifier.py)
如果要構(gòu)建自己的分類器,請(qǐng)查看該文件中的create_model()方法。
可以下載幾種預(yù)先訓(xùn)練的模型。
涵蓋102種語(yǔ)言的多語(yǔ)言模型,這些語(yǔ)言都是在維基百科的數(shù)據(jù)基礎(chǔ)上訓(xùn)練而成的。
BERT不會(huì)將單詞視為tokens。
相反,它注重WordPieces。
tokenization.py是將你的單詞轉(zhuǎn)換為適合BERT的wordPieces的tokensizer。
(https://github.com/google-research/bert/blob/master/tokenization.py)
您還可以查看BERT的PyTorch實(shí)現(xiàn)。
(https://github.com/huggingface/pytorch-pretrained-BERT)
AllenNLP庫(kù)使用此實(shí)現(xiàn)允許將BERT嵌入與任何模型一起使用。
(https://github.com/allenai/allennlp)
(https://github.com/allenai/allennlp/pull/2067)
聯(lián)系客服