一、前言
2018 年是機(jī)器學(xué)習(xí)模型處理文本(或者更準(zhǔn)確地說,自然語言處理或 NLP)的轉(zhuǎn)折點(diǎn)。我們對(duì)這些方面的理解正在迅速發(fā)展:如何最好地表示單詞和句子,從而最好地捕捉基本語義和關(guān)系?此外,NLP 社區(qū)已經(jīng)發(fā)布了非常強(qiáng)大的組件,你可以免費(fèi)下載,并在自己的模型和 pipeline 中使用(今年可以說是 NLP 的 ImageNet 時(shí)刻,這句話指的是多年前類似的發(fā)展也加速了 機(jī)器學(xué)習(xí)在計(jì)算機(jī)視覺任務(wù)中的應(yīng)用)。
ULM-FiT 與 Cookie Monster(餅干怪獸)無關(guān)。但我想不出別的了...
BERT的發(fā)布是這個(gè)領(lǐng)域發(fā)展的最新的里程碑之一,這個(gè)事件標(biāo)志著NLP 新時(shí)代的開始。BERT模型打破了基于語言處理的任務(wù)的幾個(gè)記錄。在 BERT 的論文發(fā)布后不久,這個(gè)團(tuán)隊(duì)還公開了模型的代碼,并提供了模型的下載版本,這些模型已經(jīng)在大規(guī)模數(shù)據(jù)集上進(jìn)行了預(yù)訓(xùn)練。這是一個(gè)重大的發(fā)展,因?yàn)樗沟萌魏我粋€(gè)構(gòu)建構(gòu)建機(jī)器學(xué)習(xí)模型來處理語言的人,都可以將這個(gè)強(qiáng)大的功能作為一個(gè)現(xiàn)成的組件來使用,從而節(jié)省了從零開始訓(xùn)練語言處理模型所需要的時(shí)間、精力、知識(shí)和資源。
BERT 開發(fā)的兩個(gè)步驟:第 1 步,你可以下載預(yù)訓(xùn)練好的模型(這個(gè)模型是在無標(biāo)注的數(shù)據(jù)上訓(xùn)練的)。然后在第 2 步只需要關(guān)心模型微調(diào)即可。
你需要注意一些事情,才能理解 BERT 是什么。因此,在介紹模型本身涉及的概念之前,讓我們先看看如何使用 BERT。
二、示例:句子分類
使用 BERT 最直接的方法就是對(duì)一個(gè)句子進(jìn)行分類。這個(gè)模型如下所示:
為了訓(xùn)練這樣一個(gè)模型,你主要需要訓(xùn)練分類器(上圖中的 Classifier),在訓(xùn)練過程中 幾乎不用改動(dòng)BERT模型。這個(gè)訓(xùn)練過程稱為微調(diào),它起源于Semi-supervised Sequence Learning 和 ULMFiT。
由于我們?cè)谟懻摲诸惼鳎@屬于機(jī)器學(xué)習(xí)的監(jiān)督學(xué)習(xí)領(lǐng)域。這意味著我們需要一個(gè)帶有標(biāo)簽的數(shù)據(jù)集來訓(xùn)練這樣一個(gè)模型。例如,在下面這個(gè)垃圾郵件分類器的例子中,帶有標(biāo)簽的數(shù)據(jù)集包括一個(gè)郵件內(nèi)容列表和對(duì)應(yīng)的標(biāo)簽(每個(gè)郵件是“垃圾郵件”或者“非垃圾郵件”)。
其他一些例子包括:
1)語義分析
輸入:電影或者產(chǎn)品的評(píng)價(jià)。輸出:判斷這個(gè)評(píng)價(jià)是正面的還是負(fù)面的。
數(shù)據(jù)集示例:SST (https://nlp.stanford.edu/sentiment)
2)Fact-checking
輸入:一個(gè)句子。輸出:這個(gè)句子是不是一個(gè)斷言
參考視頻:https://www.youtube.com/watch?v=ddf0lgPCoSo
三、模型架構(gòu)
現(xiàn)在你已經(jīng)通過上面的例子,了解了如何使用 BERT,接下來讓我們更深入地了解一下它的工作原理。
論文里介紹了兩種不同模型大小的 BERT:
BERT BASE - 與 OpenAI 的 Transformer 大小相當(dāng),以便比較性能
BERT LARGE - 一個(gè)非常巨大的模型,它取得了最先進(jìn)的結(jié)果
BERT 基本上是一個(gè)訓(xùn)練好的 Transformer 的 decoder 的棧。關(guān)于 Transformer 的介紹,可以閱讀之前的文章《 圖解Transformer(完整版)!》,這里主要介紹 Transformer 模型,這是 BERT 中的一個(gè)基本概念。此外,我們還會(huì)介紹其他一些概念。
2 種不同大小規(guī)模的 BERT 模型都有大量的 Encoder 層(論文里把這些層稱為 Transformer Blocks)- BASE 版本由 12 層 Encoder,Large 版本有 20 層 Encoder。同時(shí),這些 BERT 模型也有更大的前饋神經(jīng)網(wǎng)絡(luò)(分別有 768 個(gè)和 1024 個(gè)隱藏層單元)和更多的 attention heads(分別有 12 個(gè)和 16 個(gè)),超過了原始 Transformer 論文中的默認(rèn)配置參數(shù)(原論文中有 6 個(gè) Encoder 層, 512 個(gè)隱藏層單元和 8 個(gè) attention heads)。
四、模型輸入
第一個(gè)輸入的 token 是特殊的 [CLS],它 的含義是分類(class的縮寫)。
就像 Transformer 中普通的 Encoder 一樣,BERT 將一串單詞作為輸入,這些單詞在 Encoder 的棧中不斷向上流動(dòng)。每一層都會(huì)經(jīng)過 Self Attention 層,并通過一個(gè)前饋神經(jīng)網(wǎng)絡(luò),然后將結(jié)果傳給下一個(gè) Encoder。
在模型架構(gòu)方面,到目前為止,和 Transformer 是相同的(除了模型大小,因?yàn)檫@是我們可以改變的參數(shù))。我們會(huì)在下面看到,BERT 和 Transformer 在模型的輸出上有一些不同。
五、模型輸出
每個(gè)位置輸出一個(gè)大小為 hidden_size(在 BERT Base 中是 768)的向量。對(duì)于上面提到的句子分類的例子,我們只關(guān)注第一個(gè)位置的輸出(輸入是 [CLS] 的那個(gè)位置)。
這個(gè)輸出的向量現(xiàn)在可以作為后面分類器的輸入。論文里用單層神經(jīng)網(wǎng)絡(luò)作為分類器,取得了很好的效果。
如果你有更多標(biāo)簽(例如你是一個(gè)電子郵件服務(wù),需要將郵件標(biāo)記為 “垃圾郵件”、“非垃圾郵件”、“社交”、“推廣”),你只需要調(diào)整分類器的神經(jīng)網(wǎng)絡(luò),增加輸出的神經(jīng)元個(gè)數(shù),然后經(jīng)過 softmax 即可。
六、與卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行對(duì)比
對(duì)于那些有計(jì)算機(jī)視覺背景的人來說,這個(gè)向量傳遞過程,會(huì)讓人聯(lián)想到 VGGNet 等網(wǎng)絡(luò)的卷積部分,和網(wǎng)絡(luò)最后的全連接分類部分之間的過程。
七、詞嵌入(Embedding)的新時(shí)代
上面提到的這些新發(fā)展帶來了文本編碼方式的新轉(zhuǎn)變。到目前為止,詞嵌入一直是 NLP 模型處理語言的主要表示方法。像 Word2Vec 和 Glove 這樣的方法已經(jīng)被廣泛應(yīng)用于此類任務(wù)。在我們討論新的方法之前,讓我們回顧一下它們是如何應(yīng)用的。
7.1 回顧詞嵌入
單詞不能直接輸入機(jī)器學(xué)習(xí)模型,而需要某種數(shù)值表示形式,以便模型能夠在計(jì)算中使用。通過 Word2Vec,我們可以使用一個(gè)向量(一組數(shù)字)來恰當(dāng)?shù)乇硎締卧~,并捕捉單詞的語義以及單詞和單詞之間的關(guān)系(例如,判斷單詞是否相似或者相反,或者像 "Stockholm" 和 "Sweden" 這樣的一對(duì)詞,與 "Cairo" 和 "Egypt"這一對(duì)詞,是否有同樣的關(guān)系)以及句法、語法關(guān)系(例如,"had" 和 "has" 之間的關(guān)系與 "was" 和 "is" 之間的關(guān)系相同)。
人們很快意識(shí)到,相比于在小規(guī)模數(shù)據(jù)集上和模型一起訓(xùn)練詞嵌入,更好的一種做法是,在大規(guī)模文本數(shù)據(jù)上預(yù)訓(xùn)練好詞嵌入,然后拿來使用。因此,我們可以下載由 Word2Vec 和 GloVe 預(yù)訓(xùn)練好的單詞列表,及其詞嵌入。下面是單詞 "stick" 的 Glove 詞嵌入向量的例子(詞嵌入向量長(zhǎng)度是 200)。
單詞 "stick" 的 Glove 詞嵌入 - 一個(gè)由200個(gè)浮點(diǎn)數(shù)組成的向量(四舍五入到小數(shù)點(diǎn)后兩位)。
由于這些向量都很長(zhǎng),且全部是數(shù)字,所以在文章中我使用以下基本形狀來表示向量:
7.2 ELMo:語境問題
如果我們使用 Glove 的詞嵌入表示方法,那么不管上下文是什么,單詞 "stick" 都只表示為同一個(gè)向量。一些研究人員指出,像 "stick" 這樣的詞有多種含義。為什么不能根據(jù)它使用的上下文來學(xué)習(xí)對(duì)應(yīng)的詞嵌入呢?這樣既能捕捉單詞的語義信息,又能捕捉上下文的語義信息。于是,語境化的詞嵌入模型應(yīng)運(yùn)而生。
語境化的詞嵌入,可以根據(jù)單詞在句子語境中的含義,賦予不同的詞嵌入。你可以查看這個(gè)視頻 RIP Robin Williams(https://zhuanlan.zhihu.com/RIP Robin Williams)
ELMo 沒有對(duì)每個(gè)單詞使用固定的詞嵌入,而是在為每個(gè)詞分配詞嵌入之前,查看整個(gè)句子,融合上下文信息。它使用在特定任務(wù)上經(jīng)過訓(xùn)練的雙向 LSTM 來創(chuàng)建這些詞嵌入。
ELMo 在語境化的預(yù)訓(xùn)練這條道路上邁出了重要的一步。ELMo LSTM 會(huì)在一個(gè)大規(guī)模的數(shù)據(jù)集上進(jìn)行訓(xùn)練,然后我們可以將它作為其他語言處理模型的一個(gè)部分,來處理自然語言任務(wù)。
那么 ELMo 的秘密是什么呢?
ELMo 通過訓(xùn)練,預(yù)測(cè)單詞序列中的下一個(gè)詞,從而獲得了語言理解能力,這項(xiàng)任務(wù)被稱為語言建模。要實(shí)現(xiàn) ELMo 很方便,因?yàn)槲覀冇写罅课谋緮?shù)據(jù),模型可以從這些數(shù)據(jù)中學(xué)習(xí),而不需要額外的標(biāo)簽。
ELMo 預(yù)訓(xùn)練過程的其中一個(gè)步驟:以 "Let’s stick to" 作為輸入,預(yù)測(cè)下一個(gè)最有可能的單詞。這是一個(gè)語言建模任務(wù)。當(dāng)我們?cè)诖笠?guī)模數(shù)據(jù)集上訓(xùn)練時(shí),模型開始學(xué)習(xí)語言的模式。例如,在 "hang" 這樣的詞之后,模型將會(huì)賦予 "out" 更高的概率(因?yàn)?"hang out" 是一個(gè)詞組),而不是 "camera"。
在上圖中,我們可以看到 ELMo 頭部上方展示了 LSTM 的每一步的隱藏層狀態(tài)向量。在這個(gè)預(yù)訓(xùn)練過程完成后,這些隱藏層狀態(tài)在詞嵌入過程中派上用場(chǎng)。
ELMo 通過將隱藏層狀態(tài)(以及初始化的詞嵌入)以某種方式(向量拼接之后加權(quán)求和)結(jié)合在一起,實(shí)現(xiàn)了帶有語境化的詞嵌入。
7.3 ULM-FiT:NLP 領(lǐng)域的遷移學(xué)習(xí)
ULM-FiT 提出了一些方法來有效地利用模型在預(yù)訓(xùn)練期間學(xué)習(xí)到的東西 - 這些東西不僅僅是詞嵌入,還有語境化的詞嵌入。ULM-FiT 提出了一個(gè)語言模型和一套流程,可以有效地為各種任務(wù)微調(diào)這個(gè)語言模型。
現(xiàn)在,NLP 可能終于找到了好的方法,可以像計(jì)算機(jī)視覺那樣進(jìn)行遷移學(xué)習(xí)了。
7.4 Transformer:超越 LSTM
Transformer 論文和代碼的發(fā)布,以及它在機(jī)器翻譯等任務(wù)上取得的成果,開始讓人們認(rèn)為它是 LSTM 的替代品。這是因?yàn)?Transformer 可以比 LSTM 更好地處理長(zhǎng)期依賴。
Transformer 的 Encoder-Decoder 結(jié)構(gòu)使得它非常適合機(jī)器翻譯。但你怎么才能用它來做文本分類呢?你怎么才能使用它來預(yù)訓(xùn)練一個(gè)語言模型,并能夠在其他任務(wù)上進(jìn)行微調(diào)(下游任務(wù)是指那些能夠利用預(yù)訓(xùn)練模型的監(jiān)督學(xué)習(xí)任務(wù))?
7.5 OpenAI Transformer:預(yù)訓(xùn)練一個(gè) Transformer Decoder 來進(jìn)行語言建模
事實(shí)證明,我們不需要一個(gè)完整的 Transformer 來進(jìn)行遷移學(xué)習(xí)和微調(diào)。我們只需要 Transformer 的 Decoder 就可以了。Decoder 是一個(gè)很好的選擇,用它來做語言建模(預(yù)測(cè)下一個(gè)詞)是很自然的,因?yàn)樗梢云帘魏髞淼脑~ 。當(dāng)你使用它進(jìn)行逐詞翻譯時(shí),這是個(gè)很有用的特性。
OpenAI Transformer 是由 Transformer 的 Decoder 堆疊而成的
這個(gè)模型包括 12 個(gè) Decoder 層。因?yàn)樵谶@種設(shè)計(jì)中沒有 Encoder,這些 Decoder 層不會(huì)像普通的 Transformer 中的 Decoder 層那樣有 Encoder-Decoder Attention 子層。不過,它仍然會(huì)有 Self Attention 層(這些層使用了 mask,因此不會(huì)看到句子后來的 token)。
有了這個(gè)結(jié)構(gòu),我們可以繼續(xù)在同樣的語言建模任務(wù)上訓(xùn)練這個(gè)模型:使用大規(guī)模未標(biāo)記的數(shù)據(jù)來預(yù)測(cè)下一個(gè)詞。只需要把 7000 本書的文字扔給模型 ,然后讓它學(xué)習(xí)。書籍非常適合這種任務(wù),因?yàn)闀臄?shù)據(jù)可以使得模型學(xué)習(xí)到相關(guān)聯(lián)的信息。如果你使用 tweets 或者文章來訓(xùn)練,模型是得不到這些信息的。
上圖表示:OpenAI Transformer 在 7000 本書的組成的數(shù)據(jù)集中預(yù)測(cè)下一個(gè)單詞。
7.6 下游任務(wù)的遷移學(xué)習(xí)
現(xiàn)在,OpenAI Transformer 已經(jīng)經(jīng)過了預(yù)訓(xùn)練,它的網(wǎng)絡(luò)層經(jīng)過調(diào)整,可以很好地處理文本語言,我們可以開始使用它來處理下游任務(wù)。讓我們先看下句子分類任務(wù)(把電子郵件分類為 ”垃圾郵件“ 或者 ”非垃圾郵件“):
OpenAI 的論文列出了一些列輸入變換方法,來處理不同任務(wù)類型的輸入。下面這張圖片來源于論文,展示了執(zhí)行不同任務(wù)的模型結(jié)構(gòu)和對(duì)應(yīng)輸入變換。這些都是非常很巧妙的做法。
八、BERT:從 Decoder 到 Encoder
OpenAI Transformer 為我們提供了一個(gè)基于 Transformer 的可以微調(diào)的預(yù)訓(xùn)練網(wǎng)絡(luò)。但是在把 LSTM 換成 Transformer 的過程中,有些東西丟失了。ELMo 的語言模型是雙向的,但 OpenAI Transformer 只訓(xùn)練了一個(gè)前向的語言模型。我們是否可以構(gòu)建一個(gè)基于 Transformer 的語言模型,它既向前看,又向后看(用技術(shù)術(shù)語來說 - 融合上文和下文的信息)。
8.1 Masked Language Model(MLM 語言模型)
那么如何才能像 LSTM 那樣,融合上文和下文的雙向信息呢?
一種直觀的想法是使用 Transformer 的 Encoder。但是 Encoder 的 Self Attention 層,每個(gè) token 會(huì)把大部分注意力集中到自己身上,那么這樣將容易預(yù)測(cè)到每個(gè) token,模型學(xué)不到有用的信息。BERT 提出使用 mask,把需要預(yù)測(cè)的詞屏蔽掉。
下面這段風(fēng)趣的對(duì)話是博客原文的。
“
BERT 說,“我們要用 Transformer 的 Encoder”。
Ernie 說,”這沒什么用,因?yàn)槊總€(gè) token 都會(huì)在多層的雙向上下文中看到自己“。
BERT 自信地說,”我們會(huì)使用 mask“。
”
BERT 在語言建模任務(wù)中,巧妙地屏蔽了輸入中 15% 的單詞,并讓模型預(yù)測(cè)這些屏蔽位置的單詞。
找到合適的任務(wù)來訓(xùn)練一個(gè) Transformer 的 Encoder 是一個(gè)復(fù)雜的問題,BERT 通過使用早期文獻(xiàn)中的 "masked language model" 概念(在這里被稱為完形填空)來解決這個(gè)問題。
除了屏蔽輸入中 15% 的單詞外, BERT 還混合使用了其他的一些技巧,來改進(jìn)模型的微調(diào)方式。例如,有時(shí)它會(huì)隨機(jī)地用一個(gè)詞替換另一個(gè)詞,然后讓模型預(yù)測(cè)這個(gè)位置原來的實(shí)際單詞。
8.2 兩個(gè)句子的任務(wù)
如果你回顧 OpenAI Transformer 在處理不同任務(wù)時(shí)所做的輸入變換,你會(huì)注意到有些任務(wù)需要模型對(duì)兩個(gè)句子的信息做一些處理(例如,判斷它們是不是同一句話的不同解釋。將一個(gè)維基百科條目作為輸入,再將一個(gè)相關(guān)的問題作為另一個(gè)輸入,模型判斷是否可以回答這個(gè)問題)。
為了讓 BERT 更好地處理多個(gè)句子之間的關(guān)系,預(yù)訓(xùn)練過程還包括一個(gè)額外的任務(wù):給出兩個(gè)句子(A 和 B),判斷 B 是否是 A 后面的相鄰句子。
BERT 預(yù)訓(xùn)練的第 2 個(gè)任務(wù)是兩個(gè)句子的分類任務(wù)。在上圖中,tokenization 這一步被簡(jiǎn)化了,因?yàn)?BERT 實(shí)際上使用了 WordPieces 作為 token,而不是使用單詞本身。在 WordPiece 中,有些詞會(huì)被拆分成更小的部分。
8.3 BERT 在不同任務(wù)上的應(yīng)用
BERT 的論文展示了 BERT 在多種任務(wù)上的應(yīng)用。
8.4 將 BERT 用于特征提取
使用 BERT 并不是只有微調(diào)這一種方法。就像 ELMo 一樣,你可以使用預(yù)訓(xùn)練的 BERT 來創(chuàng)建語境化的詞嵌入。然后你可以把這些詞嵌入用到你現(xiàn)有的模型中。論文里也提到,這種方法在命名實(shí)體識(shí)別任務(wù)中的效果,接近于微調(diào) BERT 模型的效果。
那么哪種向量最適合作為上下文詞嵌入?我認(rèn)為這取決于任務(wù)。論文里驗(yàn)證了 6 種選擇(與微調(diào)后的 96.4 分的模型相比):
8.5 如何使用 BERT
嘗試 BERT 的最佳方式是通過托管在 Google Colab 上的BERT FineTuning with Cloud TPUs。如果你之前從來沒有使用過 Cloud TPU,那這也是一個(gè)很好的嘗試開端,因?yàn)?BERT 代碼可以運(yùn)行在 TPU、CPU 和 GPU。
下一步是查看BERT 倉庫中的代碼:
模型是在modeling.py(class BertModel)中定義的,和普通的 Transformer encoder 完全相同。
run_classifier.py是微調(diào)網(wǎng)絡(luò)的一個(gè)示例。它還構(gòu)建了監(jiān)督模型分類層。如果你想構(gòu)建自己的分類器,請(qǐng)查看這個(gè)文件中的 create_model() 方法。
可以下載一些預(yù)訓(xùn)練好的模型。這些模型包括 BERT Base、BERT Large,以及英語、中文和包括 102 種語言的多語言模型,這些模型都是在維基百科的數(shù)據(jù)上進(jìn)行訓(xùn)練的。
BERT 不會(huì)將單詞作為 token。相反,它關(guān)注的是 WordPiece。tokenization.py就是 tokenizer,它會(huì)將你的單詞轉(zhuǎn)換為適合 BERT 的 wordPiece。
責(zé)任編輯:lq
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132646 -
自然語言處理
+關(guān)注
關(guān)注
1文章
618瀏覽量
13561 -
nlp
+關(guān)注
關(guān)注
1文章
488瀏覽量
22038
原文標(biāo)題:【NLP專欄】圖解 BERT 預(yù)訓(xùn)練模型!
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論