遷移學習NLP:BERT、ELMo等直觀圖解

摘要: 圖解,2018年自然語言處理領域最成功的方向!

2018年是自然語言處理的轉折點,能捕捉潛在意義和關係的方式表達單詞和句子的概念性理解正在迅速發展。此外,NLP社區已經出現了非常強大的組件,你可以在自己的模型和管道中自由下載和使用(它被稱爲NLP的ImageNet時刻)。

在這個時刻中,最新里程碑是發佈BERT,它被描述NLP一個新時代的開始。BERT是一個模型,它打破了前幾個模型處理基於語言的任務的記錄。該模型的論文發佈後不久,團隊還開放了該模型的代碼,並提供了已經在大量數據集上預先訓練過的模型的下載版本。這是一個重大的發展,因爲它使任何人都可以構建一個涉及語言處理的機器學習模型,他們成功的將這個強大的工具變成了一個易於使用的組件,從而節省了訓練NLP模型所需的時間,精力和資源。

兩種不同的BERT。你可以下載在1中預訓練的模型(它是在未註釋的數據上進行訓練),在2中是針對特殊場景對其進行微調。

BERT是建立在最近NLP社區中涌現的一些聰明的想法之上,包括但不限於半監督序列學習Andrew DaiQuoc Le)、<u style="box-sizing: border-box;">ELMo</u>(由Matthew Peters和來自AI2的研究人員和UW CSE),ULMFiT(由fast.ai創始人Jeremy HowardSebastian Ruder提供)和OpenAI轉換器(由OpenAI研究人員RadfordNarasimhanSalimansSutskever提供)和Transformer(Vaswani等人)。

需要注意的一些概念才能完全瞭解BERT的內容。因此,讓我們首先看一下在查看模型本身所涉及的概念之前可以使用BERT的場景。

示例:句子分類

BERT最擅長的是分類單個文本,這個模型看起來像這樣:

爲了訓練這樣的模型,你必須訓練分類器,在訓練階段BERT模型發生的變化很小。該過程稱爲微調,並且整個過程是源於半監督序列學習和ULMFiT。

既然我們在討論分類器,那麼我們就處於機器學習的監督學習領域。這意味着我們需要一個標記的數據集來訓練這樣的模型。以垃圾郵件分類器示例,標記的數據集將是電子郵件和標籤的列表(“垃圾郵件”或“非垃圾郵件”)。

這種用例的其他示例包括:

1、情緒分析

輸入:電影/產品評論。輸出:評論是正面還是負面?

示例數據集:SST

2、事實查證

輸入:句子。輸出:“索賠”或“不索賠”

更誇張/前沿的例子:

輸入:是否進行索賠。輸出:“真”或“假”

Full Fact是一個爲公衆利益建立自動事實檢查工具的組織。他們的部分管道其實是一個分類器,它可以讀取新聞文章並檢測聲明(將文本分類爲“聲明”或“不聲明”),以此進行事實驗證。

模型架構

現在你已經瞭解瞭如何使用BERT的用例,接下來讓我們仔細看看它是如何工作的。

首先介紹BERT的兩種型號:

l   BERT BASE:與OpenAI Transformer的尺寸相當,性價比很高;

l   BERT LARGE:一個非常龐大的模型,它的性能最好;

BERT基本上是訓練有素的轉換器(Transformer)編碼器堆棧。現在是你閱讀The Illustrated Transformer的好時機,該文章解釋了Transformer模型-BERT的基本概念以及我們接下來要討論的概念。

兩種BERT模型都有大量的編碼器層(本文稱之爲Transformer Blocks),其中Base版本爲12個,Large版本爲24個。它們還具有更大的前饋網絡(分別爲768和1024個隱藏單元)以及比初始論文中的轉換器更多attention heads(分別爲12和16)(初始論文的轉換器中有6個編碼器層,512個隱藏單元,和8個attention heads)。

模型輸入

第一個接口輸入提供了一個特殊的接口[CLS],原因將在後面變得明顯,CLS在這裏代表分類。

就像轉換器的香草編碼器一樣,BERT採用一系列字作爲輸入。每一層都應用自我關注,並通過前饋網絡傳遞其結果,然後將其交給下一個編碼器。

在架構方面,到目前爲止,這與轉換器完全相同。

模型輸出

每個位置輸出大小爲hidden_​​size的矢量(BERT Base中的768)。對於我們上面看過的句子分類示例,我們只關注第一個位置的輸出(我們將特殊的接口[CLS]標記傳遞到)。

該向量現在可以用作我們選擇的分類器的輸入,通過使用單層神經網絡作爲分類器,這樣效果就能達到我們想要的。

如果你有更多標籤(例如,如果你是使用“垃圾郵件”,“非垃圾郵件”,“社交”和“促銷”標記電子郵件),你只需調整分類器網絡以獲得更多輸出神經元即可,然後通過softmax。

卷積網相似操作

對於那些具有計算機視覺背景的人來說,這個矢量切換應該讓人聯想到VGGNet等網絡的卷積部分與網絡末端的完全連接的分類部分之間發生的事情。

嵌入(Embedding)的新時代

到目前爲止,詞嵌入一直是影響NLP模型處理語言的主要力量。Word2Vec和Glove等方法已被廣泛用於此類任務。讓我們回顧一下之前是如何使用它們的。

Word嵌入是個啥?

對於要由機器學習模型處理的詞,它們需要以某種形式的數字表示,這樣模型纔可以在計算中使用。Word2Vec讓我們可以使用一個向量(一個數字列表)以一種捕獲語義相關關係的方式正確表示單詞(例如,判斷單詞是相似的,判斷還是在它們之間具有的關係,如“開羅”和“埃及”之間的關係)以及句法或基於語法的關係(例如“was”和“is”之間的關係)。

該領域的研究者很快意識到,使用經過大量文本數據預訓練的嵌入技術,而不將模型與經常是小型數據集的模型一起訓練,這是一個好主意。因此,你可以下載Word2Vec或GloVe預訓練生成的單詞列表及其嵌入。

GloVe詞嵌入中“stick”一詞-是200個浮點數的向量。 

ELMo:語境問題

如果我們使用GloVe,那麼“stick”這個詞將由一個向量表示,無論上下文是什麼。但是,許多NLP研究人員(Peters等人,2017年McCann等人,2017年Peters等人,2018年在ELMo論文中)發現“stick”有多個含義,這取決於它的使用位置。爲什麼不根據它所使用的上下文給它一個嵌入呢?這樣既捕獲該上下文中的單詞含義以及其他上下文信息。因此,語境化嵌入詞誕生了!

語境化詞嵌入可以根據它們在句子的上下文中攜帶的含義給出單詞不同的嵌入

ELMo不是對每個單詞使用固定嵌入,而是在爲其中的每個單詞分配嵌入之前查看整個句子,它使用在特定任務上訓練的雙向LSTM來創建這些嵌入。

ELMo在NLP背景下向預訓練邁出了重要一步。ELMo LSTM將使用我們數據集語言中的大量數據集進行訓練,然後我們可以將其用作需要處理語言的其他模型中的組件。

ELMo的祕密是什麼?

ELMo通過訓練來預測單詞序列中的下一個單詞,這是一項稱爲獲得語言理解語言建模的任務。這很方便,因爲我們擁有大量的文本數據,這樣的模型可以在不需要標籤的情況下學習。

ELMo預訓練過程中的一個過程:給定輸入,預測下一個最可能的單詞。在諸如“hang”之類的單詞出現之後,它將爲諸如“out”之類的單詞賦予比“camera”更高的概率。

我們可以看到每個展開的LSTM步驟的隱藏狀態都是從ELMo的頭部後面突出。在完成預訓練之後,這些在嵌入式proecss可以派上用場。

ELMo實際上更進一步,因爲雙向LSTM,這意味着它的語言模型不僅具有下一個詞的感覺,而且還有前一個詞。

ELMo通過以某種方式將隱藏狀態(和初始嵌入)組合在一起來提出情境化嵌入(連接後加權求和)。

ULM-FiT:在NLP中使用遷移學習

ULM-FiT引入了有效利用模型在預訓練期間學到的內容的方法,這不僅僅是嵌入,而且是上下文嵌入。ULM-FiT引入了語言模型和流程,從而有效地微調該語言模型以執行各種任務。

NLP可能與計算機視覺一樣,有了一種方法來進行轉移學習。

The Transformer:超越LSTMs

Transformer論文和代碼的發佈,以及它在機器翻譯等任務上取得的成果開始讓一些人認爲它們是LSTM的替代品。事實上Transformer比LSTM更好地處理長期依賴性。

Transformer的編碼器-解碼器結構使其非常適合機器翻譯。但是你如何將它用於句子分類?你如何使用它來預訓練可以針對其他任務進行微調的語言模型(這些任務就是被該領域稱爲使用預訓練模型或組件的監督學習任務)。

OpenAI Transformer:預訓練用於語言建模的Transformer解碼器

事實證明,我們不需要整個Transformer來爲NLP任務採用轉移學習和精細可調語言模型,我們可以只使用Transformer的解碼器。解碼器是一個很好的選擇,因爲它是語言建模(預測下一個單詞)的必備選擇,它是爲掩蓋未來的接口而構建的。

OpenAI Transformer由Transformer的解碼器堆棧組成

該模型堆疊了十二個解碼器層。由於在該設置中沒有編碼器,因此這些解碼器層將不具有香草Transformer解碼器層具有的編碼器。然而,它仍然會有自我關注層。

通過這種結構,我們可以繼續在同一語言建模任務上訓練模型:使用大量(未標記)數據集預測下一個單詞。只是使用7000本書的文字,讓它學習!書籍非常適合這類任務,因爲它允許模型學習關聯相關信息,即使它們被大量文本分開。例如,當你使用推文或文章進行訓練時,你無法獲得這些信息。

現在,OpenAI Transformer已經準備好接受訓練,預測由7,000本書組成的數據集上的下一個單詞。

將學習能力轉移到下游任務

既然OpenAI Transformer已經過預先訓練,並且其層也經過調整以合理地處理語言,我們就可以開始將它用於下游任務。讓我們首先看一下句子分類(將電子郵件分類爲“垃圾郵件”或“非垃圾郵件”):

如何使用預先訓練的OpenAI Transformer進行句子分類

OpenAI論文概述了許多輸入轉換,以處理不同類型任務的輸入。下圖顯示了模型的結構和輸入轉換,以執行不同的任務。

BERT:從解碼器到編碼器

openAI的Transformer爲我們提供了基於Transformer的可調預訓練模型。但是從LSTM到Transformer的過渡中缺少了一些東西,因爲ELMo的語言模型是雙向的,但openAI的Transformer只訓練向前語言模型。我們能否建立一個基於Transformer的模型,其語言模型同時向前和向後?

蒙面語言模型(NLM:Masked Language Model)

“我們將使用Transformer編碼器”,BERT說。

“這很瘋狂”,Ernie回答說,“每個人都知道雙向調節會讓每個詞在多層次的背景下間接地審視自己。”

“我們將使用蒙面工具”,BERT自信地說。

BERT的語言建模任務掩蓋了輸入中15%的單詞,並要求模型預測缺失的單詞。

找到正確的任務來訓練Transformer堆棧的編碼器是一個複雜的障礙,BERT通過採用早期文獻中的“蒙面語言模型”概念(稱爲完成任務)來解決。

除了掩蓋15%的輸入之外,BERT還混合了一些東西,以改善模型後來如何微調。有時它會隨機用另一個單詞替換一個單詞,並要求模型預測該位置的正確單詞。

兩個句子的任務(Two-sentence Tasks)

如果你回顧一下OpenAI的Transformer處理不同任務的輸入變換,你會注意到一些任務要求模型具有說出兩個句子的能力(例如,它們是否只是對方的複述?給出一個維基百科條目作爲輸入,以及關於該條目作爲另一個輸入的問題。)。

爲了使BERT更好地處理多個句子之間的關係,預訓練過程包括一個額外的任務:給定兩個句子(A和B),B可能是跟隨A的句子,或不是?

由於BERT實際上使用WordPieces作爲接口而不是單詞,因此標記化在此圖形中過於簡化了,因此有些單詞被分解爲較小的塊。

特定任務-模型

BERT論文展示了將BERT用於不同任務的多種方法。

BERT用於特徵提取

微調不是使用BERT的唯一方法。就像ELMo一樣,你可以使用預先訓練的BERT來創建語境化詞嵌入。然後,你可以將這些嵌入提供給現有模型-該過程論文已經證實可以產生結果,在命名實體識別等任務上應用微調BERT並不遠。

哪個向量最適合作爲上下文嵌入?我認爲這取決於任務。我們考察了六種選擇(與微調模型相比,得分爲96.4):

BERT延伸

使用BERT的最佳方式是通過BERT FineTuning與Google Colab託管的Cloud TPU筆記本。如果你之前從未使用過雲TPU,那麼這也是嘗試它們的良好起點,以及BERT代碼也適用於TPU,CPU和GPU。

下一步是查看BERT倉庫中的代碼:

l   該模型在modeling.py(class BertModel)中構建,與vanilla Transformer編碼器完全相同。

l   run_classifier.py是微調過程的一個示例。它還構建了監督模型的分類層,如果要構建自己的分類器,請查看create_model()該文件中的方法。

l   可以下載幾種預先訓練的模型,它們跨越了BERT Base和BERT Large,以及英語,中文等語言,以及涵蓋102種語言的多語言模型,這些語言在維基百科上進行了訓練。

l   BERT不會將單詞視爲標記,相反,它注意者WordPieces。tokenization.py是將你的單詞轉換爲適合BERT的wordPieces的標記器。

l   你還可以查看BERTPyTorch實現。該AllenNLP庫使用此實現允許使用的嵌入BERT與任何模型。



本文作者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章