摘要:圖解,2018年自然語(yǔ)言處理領(lǐng)域最成功的方向!
2018年是自然語(yǔ)言處理的轉(zhuǎn)折點(diǎn),能捕捉潛在意義和關(guān)系的方式表達(dá)單詞和句子的概念性理解正在迅速發(fā)展。此外,NLP社區(qū)已經(jīng)出現(xiàn)了非常強(qiáng)大的組件,你可以在自己的模型和管道中自由下載和使用(它被稱(chēng)為NLP的ImageNet時(shí)刻)。

在這個(gè)時(shí)刻中,最新里程碑是發(fā)布的BERT,它被描述NLP一個(gè)新時(shí)代的開(kāi)始。BERT是一個(gè)模型,它打破了前幾個(gè)模型處理基于語(yǔ)言的任務(wù)的記錄。該模型的論文發(fā)布后不久,團(tuán)隊(duì)還開(kāi)放了該模型的代碼,并提供了已經(jīng)在大量數(shù)據(jù)集上預(yù)先訓(xùn)練過(guò)的模型的下載版本。這是一個(gè)重大的發(fā)展,因?yàn)樗谷魏稳硕伎梢詷?gòu)建一個(gè)涉及語(yǔ)言處理的機(jī)器學(xué)習(xí)模型,他們成功的將這個(gè)強(qiáng)大的工具變成了一個(gè)易于使用的組件,從而節(jié)省了訓(xùn)練NLP模型所需的時(shí)間,精力和資源。

兩種不同的BERT。你可以下載在1中預(yù)訓(xùn)練的模型(它是在未注釋的數(shù)據(jù)上進(jìn)行訓(xùn)練),在2中是針對(duì)特殊場(chǎng)景對(duì)其進(jìn)行微調(diào)。
BERT是建立在最近NLP社區(qū)中涌現(xiàn)的一些聰明的想法之上,包括但不限于半監(jiān)督序列學(xué)習(xí)(Andrew Dai和Quoc Le)、ELMo(由Matthew Peters和來(lái)自AI2的研究人員和UW CSE),ULMFiT(由fast.ai創(chuàng)始人Jeremy Howard和Sebastian Ruder提供)和OpenAI轉(zhuǎn)換器(由OpenAI研究人員Radford,Narasimhan,Salimans和Sutskever提供)和Transformer(Vaswani等人)。
需要注意的一些概念才能完全了解BERT的內(nèi)容。因此,讓我們首先看一下在查看模型本身所涉及的概念之前可以使用BERT的場(chǎng)景。
示例:句子分類(lèi)
BERT最擅長(zhǎng)的是分類(lèi)單個(gè)文本,這個(gè)模型看起來(lái)像這樣:

為了訓(xùn)練這樣的模型,你必須訓(xùn)練分類(lèi)器,在訓(xùn)練階段BERT模型發(fā)生的變化很小。該過(guò)程稱(chēng)為微調(diào),并且整個(gè)過(guò)程是源于半監(jiān)督序列學(xué)習(xí)和ULMFiT。
既然我們?cè)谟懻摲诸?lèi)器,那么我們就處于機(jī)器學(xué)習(xí)的監(jiān)督學(xué)習(xí)領(lǐng)域。這意味著我們需要一個(gè)標(biāo)記的數(shù)據(jù)集來(lái)訓(xùn)練這樣的模型。以垃圾郵件分類(lèi)器示例,標(biāo)記的數(shù)據(jù)集將是電子郵件和標(biāo)簽的列表(“垃圾郵件”或“非垃圾郵件”)。

這種用例的其他示例包括:
1、情緒分析
輸入:電影/產(chǎn)品評(píng)論。輸出:評(píng)論是正面還是負(fù)面?
示例數(shù)據(jù)集:SST
2、事實(shí)查證
輸入:句子。輸出:“索賠”或“不索賠”
更夸張/前沿的例子:
輸入:是否進(jìn)行索賠。輸出:“真”或“假”
Full Fact是一個(gè)為公眾利益建立自動(dòng)事實(shí)檢查工具的組織。他們的部分管道其實(shí)是一個(gè)分類(lèi)器,它可以讀取新聞文章并檢測(cè)聲明(將文本分類(lèi)為“聲明”或“不聲明”),以此進(jìn)行事實(shí)驗(yàn)證。
模型架構(gòu)
現(xiàn)在你已經(jīng)了解了如何使用BERT的用例,接下來(lái)讓我們仔細(xì)看看它是如何工作的。

首先介紹BERT的兩種型號(hào):
l? BERT BASE:與OpenAI Transformer的尺寸相當(dāng),性?xún)r(jià)比很高;
l? BERT LARGE:一個(gè)非常龐大的模型,它的性能最好;
BERT基本上是訓(xùn)練有素的轉(zhuǎn)換器(Transformer)編碼器堆?!,F(xiàn)在是你閱讀The Illustrated Transformer的好時(shí)機(jī),該文章解釋了Transformer模型-BERT的基本概念以及我們接下來(lái)要討論的概念。

兩種BERT模型都有大量的編碼器層(本文稱(chēng)之為T(mén)ransformer Blocks),其中Base版本為12個(gè),Large版本為24個(gè)。它們還具有更大的前饋網(wǎng)絡(luò)(分別為768和1024個(gè)隱藏單元)以及比初始論文中的轉(zhuǎn)換器更多attention heads(分別為12和16)(初始論文的轉(zhuǎn)換器中有6個(gè)編碼器層,512個(gè)隱藏單元,和8個(gè)attention heads)。
模型輸入

第一個(gè)接口輸入提供了一個(gè)特殊的接口[CLS],原因?qū)⒃诤竺孀兊妹黠@,CLS在這里代表分類(lèi)。
就像轉(zhuǎn)換器的香草編碼器一樣,BERT采用一系列字作為輸入。每一層都應(yīng)用自我關(guān)注,并通過(guò)前饋網(wǎng)絡(luò)傳遞其結(jié)果,然后將其交給下一個(gè)編碼器。

在架構(gòu)方面,到目前為止,這與轉(zhuǎn)換器完全相同。
模型輸出
每個(gè)位置輸出大小為hidden_??size的矢量(BERT Base中的768)。對(duì)于我們上面看過(guò)的句子分類(lèi)示例,我們只關(guān)注第一個(gè)位置的輸出(我們將特殊的接口[CLS]標(biāo)記傳遞到)。

該向量現(xiàn)在可以用作我們選擇的分類(lèi)器的輸入,通過(guò)使用單層神經(jīng)網(wǎng)絡(luò)作為分類(lèi)器,這樣效果就能達(dá)到我們想要的。

如果你有更多標(biāo)簽(例如,如果你是使用“垃圾郵件”,“非垃圾郵件”,“社交”和“促銷(xiāo)”標(biāo)記電子郵件),你只需調(diào)整分類(lèi)器網(wǎng)絡(luò)以獲得更多輸出神經(jīng)元即可,然后通過(guò)softmax。
卷積網(wǎng)相似操作
對(duì)于那些具有計(jì)算機(jī)視覺(jué)背景的人來(lái)說(shuō),這個(gè)矢量切換應(yīng)該讓人聯(lián)想到VGGNet等網(wǎng)絡(luò)的卷積部分與網(wǎng)絡(luò)末端的完全連接的分類(lèi)部分之間發(fā)生的事情。

嵌入(Embedding)的新時(shí)代
到目前為止,詞嵌入一直是影響NLP模型處理語(yǔ)言的主要力量。Word2Vec和Glove等方法已被廣泛用于此類(lèi)任務(wù)。讓我們回顧一下之前是如何使用它們的。
Word嵌入是個(gè)啥?
對(duì)于要由機(jī)器學(xué)習(xí)模型處理的詞,它們需要以某種形式的數(shù)字表示,這樣模型才可以在計(jì)算中使用。Word2Vec讓我們可以使用一個(gè)向量(一個(gè)數(shù)字列表)以一種捕獲語(yǔ)義相關(guān)關(guān)系的方式正確表示單詞(例如,判斷單詞是相似的,判斷還是在它們之間具有的關(guān)系,如“開(kāi)羅”和“埃及”之間的關(guān)系)以及句法或基于語(yǔ)法的關(guān)系(例如“was”和“is”之間的關(guān)系)。
該領(lǐng)域的研究者很快意識(shí)到,使用經(jīng)過(guò)大量文本數(shù)據(jù)預(yù)訓(xùn)練的嵌入技術(shù),而不將模型與經(jīng)常是小型數(shù)據(jù)集的模型一起訓(xùn)練,這是一個(gè)好主意。因此,你可以下載Word2Vec或GloVe預(yù)訓(xùn)練生成的單詞列表及其嵌入。

GloVe詞嵌入中“stick”一詞-是200個(gè)浮點(diǎn)數(shù)的向量。
ELMo:語(yǔ)境問(wèn)題
如果我們使用GloVe,那么“stick”這個(gè)詞將由一個(gè)向量表示,無(wú)論上下文是什么。但是,許多NLP研究人員(Peters等人,2017年,McCann等人,2017年及Peters等人,2018年在ELMo論文中)發(fā)現(xiàn)“stick”有多個(gè)含義,這取決于它的使用位置。為什么不根據(jù)它所使用的上下文給它一個(gè)嵌入呢?這樣既捕獲該上下文中的單詞含義以及其他上下文信息。因此,語(yǔ)境化嵌入詞誕生了!

語(yǔ)境化詞嵌入可以根據(jù)它們?cè)诰渥拥纳舷挛闹袛y帶的含義給出單詞不同的嵌入
ELMo不是對(duì)每個(gè)單詞使用固定嵌入,而是在為其中的每個(gè)單詞分配嵌入之前查看整個(gè)句子,它使用在特定任務(wù)上訓(xùn)練的雙向LSTM來(lái)創(chuàng)建這些嵌入。

ELMo在NLP背景下向預(yù)訓(xùn)練邁出了重要一步。ELMo LSTM將使用我們數(shù)據(jù)集語(yǔ)言中的大量數(shù)據(jù)集進(jìn)行訓(xùn)練,然后我們可以將其用作需要處理語(yǔ)言的其他模型中的組件。
ELMo的秘密是什么?
ELMo通過(guò)訓(xùn)練來(lái)預(yù)測(cè)單詞序列中的下一個(gè)單詞,這是一項(xiàng)稱(chēng)為獲得語(yǔ)言理解語(yǔ)言建模的任務(wù)。這很方便,因?yàn)槲覀儞碛写罅康奈谋緮?shù)據(jù),這樣的模型可以在不需要標(biāo)簽的情況下學(xué)習(xí)。

ELMo預(yù)訓(xùn)練過(guò)程中的一個(gè)過(guò)程:給定輸入,預(yù)測(cè)下一個(gè)最可能的單詞。在諸如“hang”之類(lèi)的單詞出現(xiàn)之后,它將為諸如“out”之類(lèi)的單詞賦予比“camera”更高的概率。
我們可以看到每個(gè)展開(kāi)的LSTM步驟的隱藏狀態(tài)都是從ELMo的頭部后面突出。在完成預(yù)訓(xùn)練之后,這些在嵌入式proecss可以派上用場(chǎng)。
ELMo實(shí)際上更進(jìn)一步,因?yàn)殡p向LSTM,這意味著它的語(yǔ)言模型不僅具有下一個(gè)詞的感覺(jué),而且還有前一個(gè)詞。

ELMo通過(guò)以某種方式將隱藏狀態(tài)(和初始嵌入)組合在一起來(lái)提出情境化嵌入(連接后加權(quán)求和)。

ULM-FiT:在NLP中使用遷移學(xué)習(xí)
ULM-FiT引入了有效利用模型在預(yù)訓(xùn)練期間學(xué)到的內(nèi)容的方法,這不僅僅是嵌入,而且是上下文嵌入。ULM-FiT引入了語(yǔ)言模型和流程,從而有效地微調(diào)該語(yǔ)言模型以執(zhí)行各種任務(wù)。
NLP可能與計(jì)算機(jī)視覺(jué)一樣,有了一種方法來(lái)進(jìn)行轉(zhuǎn)移學(xué)習(xí)。
The Transformer:超越LSTMs
Transformer論文和代碼的發(fā)布,以及它在機(jī)器翻譯等任務(wù)上取得的成果開(kāi)始讓一些人認(rèn)為它們是LSTM的替代品。事實(shí)上Transformer比LSTM更好地處理長(zhǎng)期依賴(lài)性。
Transformer的編碼器-解碼器結(jié)構(gòu)使其非常適合機(jī)器翻譯。但是你如何將它用于句子分類(lèi)?你如何使用它來(lái)預(yù)訓(xùn)練可以針對(duì)其他任務(wù)進(jìn)行微調(diào)的語(yǔ)言模型(這些任務(wù)就是被該領(lǐng)域稱(chēng)為使用預(yù)訓(xùn)練模型或組件的監(jiān)督學(xué)習(xí)任務(wù))。
OpenAI Transformer:預(yù)訓(xùn)練用于語(yǔ)言建模的Transformer解碼器
事實(shí)證明,我們不需要整個(gè)Transformer來(lái)為NLP任務(wù)采用轉(zhuǎn)移學(xué)習(xí)和精細(xì)可調(diào)語(yǔ)言模型,我們可以只使用Transformer的解碼器。解碼器是一個(gè)很好的選擇,因?yàn)樗钦Z(yǔ)言建模(預(yù)測(cè)下一個(gè)單詞)的必備選擇,它是為掩蓋未來(lái)的接口而構(gòu)建的。

OpenAI Transformer由Transformer的解碼器堆棧組成
該模型堆疊了十二個(gè)解碼器層。由于在該設(shè)置中沒(méi)有編碼器,因此這些解碼器層將不具有香草Transformer解碼器層具有的編碼器。然而,它仍然會(huì)有自我關(guān)注層。
通過(guò)這種結(jié)構(gòu),我們可以繼續(xù)在同一語(yǔ)言建模任務(wù)上訓(xùn)練模型:使用大量(未標(biāo)記)數(shù)據(jù)集預(yù)測(cè)下一個(gè)單詞。只是使用7000本書(shū)的文字,讓它學(xué)習(xí)!書(shū)籍非常適合這類(lèi)任務(wù),因?yàn)樗试S模型學(xué)習(xí)關(guān)聯(lián)相關(guān)信息,即使它們被大量文本分開(kāi)。例如,當(dāng)你使用推文或文章進(jìn)行訓(xùn)練時(shí),你無(wú)法獲得這些信息。

現(xiàn)在,OpenAI Transformer已經(jīng)準(zhǔn)備好接受訓(xùn)練,預(yù)測(cè)由7,000本書(shū)組成的數(shù)據(jù)集上的下一個(gè)單詞。
將學(xué)習(xí)能力轉(zhuǎn)移到下游任務(wù)
既然OpenAI Transformer已經(jīng)過(guò)預(yù)先訓(xùn)練,并且其層也經(jīng)過(guò)調(diào)整以合理地處理語(yǔ)言,我們就可以開(kāi)始將它用于下游任務(wù)。讓我們首先看一下句子分類(lèi)(將電子郵件分類(lèi)為“垃圾郵件”或“非垃圾郵件”):

如何使用預(yù)先訓(xùn)練的OpenAI Transformer進(jìn)行句子分類(lèi)
OpenAI論文概述了許多輸入轉(zhuǎn)換,以處理不同類(lèi)型任務(wù)的輸入。下圖顯示了模型的結(jié)構(gòu)和輸入轉(zhuǎn)換,以執(zhí)行不同的任務(wù)。

BERT:從解碼器到編碼器
openAI的Transformer為我們提供了基于Transformer的可調(diào)預(yù)訓(xùn)練模型。但是從LSTM到Transformer的過(guò)渡中缺少了一些東西,因?yàn)镋LMo的語(yǔ)言模型是雙向的,但openAI的Transformer只訓(xùn)練向前語(yǔ)言模型。我們能否建立一個(gè)基于Transformer的模型,其語(yǔ)言模型同時(shí)向前和向后?
蒙面語(yǔ)言模型(NLM:Masked Language Model)
“我們將使用Transformer編碼器”,BERT說(shuō)。
“這很瘋狂”,Ernie回答說(shuō),“每個(gè)人都知道雙向調(diào)節(jié)會(huì)讓每個(gè)詞在多層次的背景下間接地審視自己?!?/p>
“我們將使用蒙面工具”,BERT自信地說(shuō)。

BERT的語(yǔ)言建模任務(wù)掩蓋了輸入中15%的單詞,并要求模型預(yù)測(cè)缺失的單詞。
找到正確的任務(wù)來(lái)訓(xùn)練Transformer堆棧的編碼器是一個(gè)復(fù)雜的障礙,BERT通過(guò)采用早期文獻(xiàn)中的“蒙面語(yǔ)言模型”概念(稱(chēng)為完成任務(wù))來(lái)解決。
除了掩蓋15%的輸入之外,BERT還混合了一些東西,以改善模型后來(lái)如何微調(diào)。有時(shí)它會(huì)隨機(jī)用另一個(gè)單詞替換一個(gè)單詞,并要求模型預(yù)測(cè)該位置的正確單詞。
兩個(gè)句子的任務(wù)(Two-sentence Tasks)
如果你回顧一下OpenAI的Transformer處理不同任務(wù)的輸入變換,你會(huì)注意到一些任務(wù)要求模型具有說(shuō)出兩個(gè)句子的能力(例如,它們是否只是對(duì)方的復(fù)述?給出一個(gè)維基百科條目作為輸入,以及關(guān)于該條目作為另一個(gè)輸入的問(wèn)題。)。
為了使BERT更好地處理多個(gè)句子之間的關(guān)系,預(yù)訓(xùn)練過(guò)程包括一個(gè)額外的任務(wù):給定兩個(gè)句子(A和B),B可能是跟隨A的句子,或不是?

由于BERT實(shí)際上使用WordPieces作為接口而不是單詞,因此標(biāo)記化在此圖形中過(guò)于簡(jiǎn)化了,因此有些單詞被分解為較小的塊。
特定任務(wù)-模型
BERT論文展示了將BERT用于不同任務(wù)的多種方法。

BERT用于特征提取
微調(diào)不是使用BERT的唯一方法。就像ELMo一樣,你可以使用預(yù)先訓(xùn)練的BERT來(lái)創(chuàng)建語(yǔ)境化詞嵌入。然后,你可以將這些嵌入提供給現(xiàn)有模型-該過(guò)程論文已經(jīng)證實(shí)可以產(chǎn)生結(jié)果,在命名實(shí)體識(shí)別等任務(wù)上應(yīng)用微調(diào)BERT并不遠(yuǎn)。

哪個(gè)向量最適合作為上下文嵌入?我認(rèn)為這取決于任務(wù)。我們考察了六種選擇(與微調(diào)模型相比,得分為96.4):

BERT延伸
使用BERT的最佳方式是通過(guò)BERT FineTuning與Google Colab托管的Cloud TPU筆記本。如果你之前從未使用過(guò)云TPU,那么這也是嘗試它們的良好起點(diǎn),以及BERT代碼也適用于TPU,CPU和GPU。
下一步是查看BERT倉(cāng)庫(kù)中的代碼:
l? 該模型在modeling.py(class BertModel)中構(gòu)建,與vanilla Transformer編碼器完全相同。
lrun_classifier.py是微調(diào)過(guò)程的一個(gè)示例。它還構(gòu)建了監(jiān)督模型的分類(lèi)層,如果要構(gòu)建自己的分類(lèi)器,請(qǐng)查看create_model()該文件中的方法。
l? 可以下載幾種預(yù)先訓(xùn)練的模型,它們跨越了BERT Base和BERT Large,以及英語(yǔ),中文等語(yǔ)言,以及涵蓋102種語(yǔ)言的多語(yǔ)言模型,這些語(yǔ)言在維基百科上進(jìn)行了訓(xùn)練。
l? BERT不會(huì)將單詞視為標(biāo)記,相反,它注意者WordPieces。tokenization.py是將你的單詞轉(zhuǎn)換為適合BERT的wordPieces的標(biāo)記器。
l? 你還可以查看BERT的PyTorch實(shí)現(xiàn)。該AllenNLP庫(kù)使用此實(shí)現(xiàn)允許使用的嵌入BERT與任何模型。
本文作者:【方向】
作者:阿里云云棲社區(qū)
鏈接:http://www.itdecent.cn/p/2045dbe7ff9d
來(lái)源:簡(jiǎn)書(shū)
簡(jiǎn)書(shū)著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。