您現在的位置是:首頁 > 籃球

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

  • 由 機器之心Pro 發表于 籃球
  • 2021-08-08
簡介BERT:從解碼器到編碼器如果你回頭看看 OpenAI Transformer 用以處理不同任務的輸入變換,你會發現某些任務需要模型給出有關兩個句子的一些知識(比如它們是否只是彼此的複述版本

什麼埃組詞

選自jalammar。github。io

作者:Jay Alammar

機器之心編譯

機器之心編譯

前段時間,谷歌釋出了基於雙向 Transformer 的大規模預訓練語言模型 BERT,該預訓練模型能高效抽取文字資訊並應用於各種 NLP 任務,該研究憑藉預訓練模型重新整理了 11 項 NLP 任務的當前最優效能記錄。技術博主 Jay Alammar 近日發文透過圖解方式生動地講解了 BERT 的架構和方法基礎。

2018 年是機器學習模型處理文字(更準確地說是自然語言處理,簡稱 NLP)的一個轉折點。如何最好地表徵詞和句子以便最好地理解其潛在含義和關係?我們對此的概念理解正在快速演進。此外,NLP 社群也一直都在提出強大的新元件——你可以免費下載它們並將其用在你自己的模型和流程中(這被稱為 NLP 的 ImageNet 時刻,是指這類似於多年前用於計算機視覺任務的機器學習的加速發展)。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

ULM-FiT 和 Cookie Monster 沒任何直接聯絡,但我想不到其它東西……

這一領域最近的里程碑是 BERT 的釋出,人們將這一事件譽為 NLP 新時代的開端。BERT 這種模型打破了多項模型處理基於語言的任務的紀錄。在描述該模型的論文釋出之後不久,其研究團隊還開源了該模型的程式碼,併發布了可供下載的模型版本——已經在大規模資料集上經過預訓練。這是一個重大的進展,因為它讓任何人都可以構建涉及語言處理的機器學習模型,並將這種強大工具用作其中的元件——這能節省從頭開始訓練語言處理模型所需的時間、精力、知識和資源。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

BERT 的開發分為兩個步驟。你可以下載在步驟 1 中預訓練過的模型(在無標註資料上訓練過);只需考慮針對步驟 2 進行調整。

BERT 的開發基礎包含很多 NLP 社群內近期湧現出的聰明思路,其中包括但不限於半監督序列學習(來自 Andrew Dai and Quoc Le)、ELMo(來自 Matthew Peters 以及 AI2 和華盛頓大學計算機科學與工程系的研究者)、ULMFiT(來自 fast。ai 創始人 Jeremy Howard 和 Sebastian Ruder)、OpenAI transformer(來自 OpenAI 的研究者 Radford、Narasimhan、Salimans 和 Sutskever)、Transformer(Vaswani et al)。

要恰當地瞭解 BERT 究竟是什麼,你需要了解很多概念。所以我們先來看看可以如何使用 BERT,之後再介紹涉及該模型的概念。

參與:Panda

使用 BERT 最直接的方式是將其用於分類單個文字。該模型看起來會是這樣的:

為了訓練這樣一個模型,你主要必須訓練分類器(Classifier),而讓 BERT 模型在訓練過程中有儘可能小的變化。這個訓練階段被稱為微調(Fine-Tuning),而且源自半監督序列學習和 ULMFiT。

為不熟悉這一主題的人解釋一下:因為我們正在談論分類器,那麼我們就處於機器學習的監督學習領域。也就是說我們需要一個有標註的資料集來訓練模型。對於這個垃圾郵件分類器示例,有標註的資料集即為郵件資訊和對應標籤構成的列表(每條郵件資訊被標註為「垃圾郵件」或「非垃圾郵件」)。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

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

參與:Panda

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

示例資料集:SST:https://nlp。stanford。edu/sentiment/

示例:句子分類

輸入:句子。輸出:「事實宣告」或「非事實宣告」。

更雄心勃勃且更有未來感的示例:輸入:稱述句。輸出:「真」或「假」。

Full Fact 是一家組織機構為公共利益構建的一款自動事實檢查工具。其一部分工作流程是讓分類器閱讀新聞並檢查宣告的事實(將文字分類為「事實宣告」或「非事實宣告」),之後再進行事實查證(這個事情現在是人類在做,希望未來能讓機器做)。

影片:用於自動化事實查證的句子嵌入:https://www。youtube。com/watch?v=ddf0lgPCoSo

情感分析

現在你的腦子裡已經有一個有關 BERT 使用方式的示例用例了,現在我們來仔細看看它的工作方式。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

這篇論文為 BERT 提出了兩種大小的模型:

BERT BASE:與 OpenAI Transformer 大小相當,這是為了比較兩者的表現而構建的。

BERT LARGE:一個非常巨大的模型,實現了當前最佳。

BERT 基本上就是一個經過訓練的 Transformer Encoder 的堆疊。現在該向你推薦我之前解釋 Transformer 的文章了:https://jalammar。github。io/illustrated-transformer/ ;Transformer 模型是 BERT 以及我們後面將會討論的很多概念的基礎概念。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

這兩種大小的 BERT 模型都有很多編碼器層(這篇論文稱之為 Transformer Blocks)——Base 版有 12 層,Large 版有 24 層。相比於 Transformer 初始論文的參考實現的預設配置(6 個編碼器層、512 個隱藏單元和 8 個注意頭),它們還有更大的前饋網路(分別有 768 和 1024 個隱藏單元)和更多注意頭(attention head,分為有 12 和 16 個)。

事實檢查

首個輸入的 token 由一個特殊的 [CLS] token 填補,原因後面就會明瞭。CLS 表示 Classification。

與 Transformer 的簡單純粹的編碼器一樣,BERT 以詞序列為輸入,這些詞會在其堆疊中不斷向上流動。每一層都會應用自注意,並會透過一個前饋網路傳遞它的結果,然後將其移交給下一個編碼器。

在架構方面,直到這部分為止都與 Transformer 完全相同(除了規模大小,見上述的配置)。在輸出的位置,我們開始看到不同。

模型架構

每個位置都會輸出一個大小為 hidden_size(BERT Base 為 768)的向量。對於我們上面看到的句子分類示例,我們僅關注第一個位置的輸出(即我們傳遞了特殊的 [CLS] token 的位置)。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

現在,這個向量就可以被用作我們所選擇的分類器的輸入。這篇論文僅使用單層神經網路作為分類器就取得了非常優良的結果。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

如果你有更多標籤(比如如果你的電子郵件服務會將郵件標註為「垃圾郵件」、「非垃圾郵件」、「社交」、「廣告」),那麼你只需要調整分類器網路使其具有更多輸出神經元,然後透過 softmax 即可。

模型輸入

如果你有計算機視覺的背景,你可能會發現這種向量傳遞類似於 VGGNet 等網路的卷積部分與網路末端的全連線分類部分之間的情況。

模型輸出

這些新進展帶來了詞編碼方式的轉變。到目前為止,詞嵌入一直都是推動 NLP 模型解決語言任務的主要力量。word2vec 和 GloVe 等方法在這類任務上得到了廣泛的應用。我們先來看看之前的做法,然後再看現在有什麼變化。

對比卷積網路

要讓機器學習模型能處理詞,首先需要將詞表示成某種數值形式,以便模型進行計算。Word2Vec 表明我們可以使用向量(某種數值列表)來恰當地表徵詞,使得這些表徵能具備詞之間的語義或含義關係(比如能說明詞的含義是否相似或相反,像是「斯德哥爾摩」和「瑞典」這一組詞與「開羅」和「埃及」這一組詞之間具有同樣的關係)以及句法或基於語法的關係(比如「had」和「has」之間的關係與「was」和「is」之間的關係一樣)。

這一領域很快認識到,使用在大規模文字資料上預訓練後的詞嵌入是一個很棒的思路,而不是在通常很小的資料集上與模型一起訓練詞嵌入。因此,人們就可以下載詞以及使用 Word2Vec 或 GloVe 預訓練後生成的詞嵌入了。下面是詞「stick」的 GloVe 嵌入示例(嵌入向量大小為 200):

詞「stick」的 GloVe 詞嵌入,這是一個由 200 個浮點數(四捨五入到兩位小數)構成的向量。這裡給出的並不完整,總共有 200 個值。

因為這些向量很大而且都是數字,所以本文會使用下面的簡單圖形來表示它們:

嵌入的新時代

如果我們使用這種 GloVe 表示方法,那麼不管上下文如何,詞「stick」都會表示成這個向量。很多 NLP 研究者意識到了這種操作並不穩妥,比如 Peters et。 al。, 2017、McCann et。 al。, 2017 以及 Peters et。 al。, 2018 的 ELMo 論文。根據使用的場景,「stick」可能具有多種含義。為什麼不根據其所處的語境/上下文來確定詞嵌入呢——這樣既能獲得該詞在上下文中的含義,還能得到其它語境資訊?為此,語境化詞嵌入誕生了。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

語境化詞嵌入能根據詞在句子語境中的含義給予其不同的嵌入。

ELMo 並不為每個詞使用一個固定的嵌入,而是會在為句子中的詞分配嵌入之前檢查整個句子。它使用了一個在特定任務上訓練的雙向 LSTM 來建立這些嵌入。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

ELMo 是向 NLP 預訓練所邁出的重要一步。ELMo LSTM 會在我們資料集的語言的一個大規模資料集上進行訓練,然後我們可以將其用作其它需要處理語言的模型的元件。

回顧詞嵌入

ELMo 的訓練方式是預測一個詞序列的下一個詞,並以此來獲得對語言的理解——這個任務被稱為語言建模。這是很方便的,因為我們有大量文字資料,這樣的模型無需標籤也能學習。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

ELMo 的預訓練過程中的一步。給定「Let‘s stick to」為輸入,預測下一個最有可能的詞——這是一個語言建模任務。在大型資料集上訓練時,模型會開始提取語言模式。在這個示例中,模型不太可能準確猜出下一個詞。更現實的情況是,比如在出現了「hang」這個詞之後,為「out」分配更高的機率(以拼出「hang out」),而不是「camera」。

我們可以看到從 ELMo 的頭部後面伸出的每個未展開的 LSTM 步驟的隱藏狀態。在這個預訓練完成之後,它們能用在嵌入過程中。

ELMo 實際上更進了一步,訓練了一個雙向 LSTM——使其語言模型不僅有對下一個詞的感知,還有對前一個詞的感知。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

一個很讚的介紹 ELMo 的幻燈片:https://goo。gl/Fg5pF9

ELMo 透過一種特定方式(連線之後加權求和)對隱藏狀態(和初始嵌入)進行分組,從而構建出語境化的嵌入。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

ELMo:上下文很重要

ULM-FiT 引入了新的方法,可有效利用模型在預訓練階段學習到的很多東西——不只是嵌入,而且也不只是語境化嵌入。ULM-FiT 引入了一種新語言模型和新處理過程,可針對多種任務對語言模型進行調整。NLP 終於有一種做遷移學習的方法了,或許就像計算機視覺一樣。

ELMo 有何奧妙?

Transformer 論文和程式碼的釋出以及其在機器翻譯等任務上取得的結果開始讓該領域內的一些人思考用 Transformer 替代 LSTM。這是因為事實上 Transformer 在處理長期依賴方面優於 LSTM。

Transformer 的編碼器-解碼器結構使其能完美應用於機器翻譯。但我們如何將其用於句子分類呢?我們怎麼將其用於預訓練語言模型,然後再針對其它任務調整這個語言模型呢?(該領域將這些利用了預訓練的模型或元件的監督學習任務稱為下游任務)。

ULM-FiT:解決 NLP 中的遷移學習

事實證明,我們不需要整個 Transformer,就能將遷移學習和可調節的語言模型用於 NLP 任務。我們只需要 Transformer 的解碼器就夠了。解碼器是很好的選擇,因為這是語言建模的自然選擇(預測下一個詞),因為它是為得到未來 token 的掩碼而構建的——對逐詞生成翻譯任務而言,這是很有價值的特徵。

OpenAI Transformer 是由 Transformer 的解碼器堆疊構成的。

該模型堆疊了 12 個解碼器層。因為其中沒有編碼器,所以這些解碼器層不會有編碼器-解碼器注意子層(attention sublayer),而原本的 Transformer 解碼器層中有這樣的注意子層。但是,OpenAI Transformer 中仍然有自注意層。

使用這種結構,我們可以繼續在同一語言建模任務上訓練該模型:使用大規模(無標註)資料集預測下一個詞。丟給它 7000 本書的文字讓它學習就行了!對這類任務而言,書籍是很棒的資料,因為書籍能讓模型學習關聯相關的資訊,即使這些資訊已被大量文字分隔開——當你用微博或文章等短篇幅文字進行訓練時,很難學到這類關聯屬性。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

OpenAI Transformer 現在已經準備好基於 7000 本書構成的資料集來預測下一個詞了。

Transformer:超越 LSTM

現在 OpenAI Transformer 已經過了預訓練,其中的層也經過了調節,可以合理地處理語言,我們可以開始將其用於下游任務了。首先我們來看看句子分類(將郵件訊息分類為「垃圾郵件」或「非垃圾郵件」)。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

如何使用預訓練後的 OpenAI Transformer 來分類句子

OpenAI 的論文羅列了一些輸入變換,用以處理不同型別的任務的輸入。下圖即來自該論文,展示了用於執行不同任務的模型結構和輸入變換。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

是不是很巧妙?

OpenAI Transformer:為語言建模訓練 Transformer 解碼器

OpenAI Transformer 為我們提供了基於 Transformer 的可微調的預訓練模型。但在這種從 LSTM 到 Transformer 的過度中卻缺失了一些東西。ELMo 的語言模型是雙向的,而 OpenAI Transformer 僅訓練一個單向語言模型。我們能否構建出一種既能向前看也能向後看(即同時基於上文和下文)的基於 Transformer 的模型?

「瞧我的!」BERT 說。

遷移學習到下游任務

BERT 說:「我們將使用 Transformer 編碼器。」

「太瘋狂了,」Ernie 說,「每個人都知道雙向調節會讓每個詞都在多層上下文中間接地看到自己。」

「我們將使用掩碼(mask)。」BERT 自信地說。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

BERT 巧妙的語言建模任務會掩蓋輸入中 15% 的詞,並讓模型來預測缺失的詞。

尋找合適的任務來訓練 Transformer 編碼器堆疊是一個複雜的難題,BERT 透過採用來自早期文獻的「有掩碼的語言模型」概念而解決了這一難題(在早期文獻中被稱為完形填空任務(Cloze))。

除了掩蔽 15% 的輸入,BERT 還混用了一些方法來改善模型之後的調整。有時候它會隨機將一個詞替換成另一個詞,然後讓模型預測該位置的正確詞。

BERT:從解碼器到編碼器

如果你回頭看看 OpenAI Transformer 用以處理不同任務的輸入變換,你會發現某些任務需要模型給出有關兩個句子的一些知識(比如它們是否只是彼此的複述版本?給定一個維基百科詞條以及涉及該詞條內容的問題作為輸入,我們能否回答該問題?)

要讓 BERT 更好地處理多個句子之間的關係,其預訓練過程還包括一項額外任務:給定兩個句子(A 和 B),B 是否有可能是 A 後面的句子?

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

BERT 預訓練的這個次級任務是一個兩句子分類任務。這幅圖中的 token 化過度簡化了一些,因為 BERT 實際上是使用 WordPieces 作為 token,而不是使用詞——因此某些詞會被分解成更小的塊。

有掩碼的語言模型

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

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

兩句子任務

微調方法並不是使用 BERT 的唯一方式。和 ELMo 一樣,你也可以使用預訓練後的 BERT 來建立語境化的詞嵌入。然後你可以將這些嵌入輸入你已有的模型——論文表明,在命名實體識別等任務上,該過程得到的結果並不比微調 BERT 差很多。

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

哪種向量最適合用作語境化嵌入?我認為這取決於具體任務。這篇論文考察了 6 種選擇(對比得到了 96。4 分的微調模型):

圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?

針對特定任務的模型

嘗試 BERT 的最好方式是動手過一遍使用 Cloud TPU 的 BERT 微調,參考託管在 Google Colab 上的筆記:https://goo。gl/vaZRH1。如果你之前從未用過 Cloud TPU,這就是你的上手時機!這些 BERT 程式碼也適用於 TPU、CPU 和 GPU。

接下來應該看看 BERT 程式碼庫中的程式碼:https://github。com/google-research/bert

模型構建在 modeling。py 之中(BertModel 類),基本上與原始的 Transformer 編碼器完全一樣。

run_classifier。py 是一個微調過程的示例。它也構建了這個監督式模型的分類層。如果你想構建自己的分類器,請查閱該檔案中的 create_model() 方法。

其中提供了幾個可下載的預訓練模型。BERT Base 和 BERT Large 模型都有,涵蓋英語和漢語等語言,還有一個在維基百科上訓練的覆蓋了 102 種語言的多語言模型。

BERT 並不將詞視為 token,而是將 WordPieces 視為 token。tokenization。py 是 token 化演算法,可將詞轉換成適用於 BERT 的 WordPieces。

你還可以檢視 BERT 的 PyTorch 實現。AllenNLP 庫使用了這一實現,讓任何模型都可以使用 BERT 嵌入。

BERT 的 PyTorch 實現:https://github。com/huggingface/pytorch-pretrained-BERT

AllenNLP:https://github。com/allenai/allennlp

最後附上機器之心釋出的 BERT 相關文章:

最強 NLP 預訓練模型!谷歌 BERT 橫掃 11 項 NLP 任務記錄

谷歌終於開源 BERT 程式碼:3 億引數量,機器之心全面解讀

資源 | 最強預訓練模型 BERT 的 Pytorch 實現(非官方)

推出一個半月,斯坦福 SQuAD 問答榜單前六名都在使用 BERT

原文連結:https://jalammar。github。io/illustrated-bert/

將 BERT 用於特徵提取

Top