遷移學習NLP:BERT、ELMo等直觀圖解
2018 年是自然 語 言 處 理的 轉 折點,能捕捉潛在意 義 和關係的方式表達 單詞 和句子的概念性理解正在迅速 發 展。此外, NLP 社群已 經 出現了非常 強 大的 組 件,你可以在自己的模型和管道中自由下 載 和使用 (它被稱 為 ofollow,noindex" target="_blank"> NLP 的 ImageNet 時刻 ) 。
在 這 個時刻中 , 最新里程碑是 釋出 的 BERT ,它被 描述 NLP 一個新 時 代的開始。 BERT 是一個模型,它打破了前幾個模型 處 理基於 語 言的任 務 的 記錄 。 該 模型的 論 文 發 布後不久, 團隊還 開放了 該 模型的代 碼 ,並提供了已 經 在大量資料集上 預 先 訓練過 的模型的下 載 版本。 這是一個重大的發展,因為它使任何人都可以構建一個涉及語言處理的機器學習模型,他們成功的將這個強大的工具變成了一個易於使用的元件,從而節省了訓練NLP模型所需的時間,精力和資源 。
兩種不同的BERT 。你可以下 載 在 1 中 預訓練 的模型(它是在未注 釋 的資料上 進 行 訓練 ),在 2 中是針對特殊場景 對 其 進 行微 調 。
需要注意的一些概念才能完全瞭解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 已經過預先訓練,並且其層也經過調整以合理地處理語言,我們就可以開始將它用於下游任務。讓我們首先看一下句子分類(將電子郵件分類為“垃圾郵件”或“非垃圾郵件”):
如何使用 預 先 訓練 的 OpenA I 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 你還可以檢視 BERT 的 PyTorch 實現 。該 AllenNLP 庫使用此實現 允許使用的嵌入 BERT 與任何模型。
文章原標題《 The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning) 》
作者: Jay Alammar 譯者:虎說八道,審校:。
文章為簡譯,更為詳細的內容,請檢視 原文 。