今天要介紹的模型是曾經海嘯般的刷新各大榜單的BERT (Bidirectional Encoder Representations form Transformers) ,這個模型在 2018 年由 Google 推出,他的特色不止很強,還很有經濟效益。

很強的部分, BERT 在推出不久後就在各大排行榜屠榜了,以知名的問答資料庫 SQuAD 2.0 為例,BERT 問世後的半年左右,前五名全都與 BERT 相關。

圖片來源:Standford NLP with DL 課程

至於我會說他很有經濟效益,是因為 BERT 只要以大量資料訓練過一次,再以相對少量的資料微調,就可以完成很廣泛的任務。也就是說,我們不用為了每一個任務都客製化一個模型架構,只要將 BERT 稍作延伸,他就能處理多種 NLP 任務(還處理得很好)!

為什麼 BERT 這麼厲害?接著我們就要來更仔細的介紹 BERT 了。

BERT 到底是?


BERT 的架構是 Transformer 的 Encoder ,大家還記得 Attention 一章的 Encoder 與 Decoder 嗎? Encoder 可以把我們輸入的詞轉成一個向量,再由 Decoder 讀取這個向量的資訊後生成我們要的 output 。

身為一個 Encoder,BERT 做的事情是:當我們把輸入句子的每個字處理成一串 Embedding 的序列後丟給 BERT ,他會輸出另一個 Embedding 的序列,我們就可以從這個序列取需要的部分,進一步的丟到其他模型完成我們要的任務。

圖片來源: 李宏毅教授 BERT 課程

順帶一提, BERT 在輸入中文句子時,是以「字」而非「詞」為單位,原因是在處理輸入句子的 Embedding 時,我們使用 One-Hot Encoding 來轉換輸入的序列,中文的詞難以窮舉,但是常用字的相對數量少了許多,Embedding 後向量的維度較小。若是忘記 One-Hot Encoding ,可以參考我之前的文章喚醒記憶。

如何訓練 BERT


BERT 的訓練分為兩大步驟: Pre-training 與 Fine-Tuning 。在 Pre-training 階段, Google 使用大量文本資料,以非監督式學習的方式訓練模型。而在 Fine-Tuning 階段則是針對不同的任務,以有標籤的資料訓練、對模型微調。


圖片來源:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

Pre-training

在這個階段 BERT 以兩個任務來做訓練:

  • 遮罩語言模型 (Masked LM)
  • 下一句子預測 (Next Sentence Prediction)

Masked LM 這個任務, 句子中有 15% 的字會被隨機以 [MASK]這個特殊的字替換,BERT 模型要預測這個被遮住的字是什麼字,簡單來說就是進行克漏字測驗啦。

使用遮罩的語言模型有一個好處,過往的語言模型都是由左而右來預測下一個字,不具有雙向理解上下文的能力,但語言應該要是雙向理解的,前後的上下文都很重要。使用遮罩的預測方式則可以解決這個問題,讓模型依上下文來預測,又不會不小心看到自己。

Next Sentence Prediction(NSP) 這個任務,則是希望 BERT 具有理解句子之間關係的能力。要做的事情很簡單,就是讓模型判斷後面的句子是否是前面句子的下一句。

為了進行 NSP 任務,處理輸入句子時要加入一些特殊的字,包括放在輸入的第一個字,代表兩個句子關係的 [CLS](希望訓練後他的 Embedding 輸出會帶有兩個句子關係的資訊), 以及放在兩個句子間,分隔兩者的 [SEP](在原始論文中,第二個句子的句末也加了 [SEP]

Google 以 BooksCorpus 上 800M 個詞與英文維基百科 2500M 個詞進行 Pre-training ,如此龐大的訓練資料耗費許多運算資源與時間。但值得雀躍的是, Google 把訓練好的模型開源出來!現在,我們都能在 github 下載這些訓練好的模型。

Fine-Tuning

在微調的階段,我們可以直接以 Pre-training 訓練好的參數初始我們的模型,再以有標籤的資料對模型進行微調。由於這一階段需要調整的參數不多,訓練所需的時間比上一階段少上許多。

至於 BERT 可以進行什麼任務呢?李宏毅教授在他的課程中舉了以下四個例子:

單一句子的分類

這類型的任務包括對句子的情緒分析(句子是正向或負向),以及文章的分類等等。做法是讓 BERT 吃進一個句子(文章的話就是一個包括標點符號的超長句子),將 [CLS] 這一項的 Embedding 輸出再接上分類器。訓練時我們只要微調 BERT 並訓練分類器即可。


圖片來源:李宏毅教授 BERT 課程

句子中每個詞的分類

這類任務是要對句子中每個詞作分類,例如圖中要找出時間、地點等關鍵詞。做法一樣是把句子丟進 BERT ,把每個詞 Embedding 的結果丟進分類器。


圖片來源:李宏毅教授 BERT 課程

兩個句子關係的分類

這種任務的例子像是圖中說的 Nature Language Inference ,給定一個前提與一個假設,讓模型判斷基於前提之下假設是否是對的,有點像是要模型判斷兩個句子是否互相同意、或是不相關。做法是把兩個句子丟進 BERT 並以 [SEP] 分隔,再把 [CLS] 輸出的 Embedding 丟進分類器。


圖片來源:李宏毅教授 BERT 課程

問答系統

這邊舉的問答系統是非開放式的那種,答案基本上是由文章中的一些字組合而成。說得更詳細一些,輸入會是文件與問題,分別用一串字 {d1, ... dN}, {q1, ... qN} 代表。輸出會是兩個整數,分別表示答案的句子在文章中的開頭與結尾,舉例來說,如果答案是文章中的第 77 個字到第 79 個字,那麼輸出就會是 77, 79 。


圖片來源:李宏毅教授 BERT 課程

接著把問題與文章像兩個句子一樣一起丟到 BERT 中,同時讓模型學習兩個向量(姑且以橘色向量與藍色向量稱之)這兩個向量的維度和 BERT 輸出的 Embedding 是相同的。首先,讓橘色向量和文章中每個詞的 Embedding 進行內積運算,經過 Softmax 後可以得到機率分佈,最高的即為預測出答案的第一個字。


圖片來源:李宏毅教授 BERT 課程

接著讓藍色向量和文章中每個詞的 Embedding 進行內積運算並經過 Softmax ,最高的為預測出答案的最後一個字,文章中從輸出第一個字到最後一個字的結果就是最後的回答了。萬一最後一個字在第一個字的前面,則表示這篇文章沒有答案。


圖片來源:李宏毅教授 BERT 課程

小結


以上介紹完了 BERT 的模型與應用,他能夠根據上下文學習字詞的 Embedding ,即使是相同的字詞、有不同上下文仍有不同的 Embedding 。這個概念稱之為 contextual word representation ,能做到這件事的模型還有 ELMO, GPT 等知名模型,有興趣的朋友可以參考李宏毅教授的課程

到今天, Blogathon 的七天挑戰算是告一段落了,希望讀者在這七天看完自然語言的演進後,能對這個領域有多一點的暸解。未來這個領域的技術仍會不斷進化,有興趣的朋友可以一起鑽研琢磨、互相分享,未來我們有緣再見吧,感謝大家的收看!

#machine learning #ML #Nature Language Processing #NLP #Deep Learning #DL #BERT







你可能感興趣的文章

Next.js 入門:從 CRA 與 Prerender 進化至 Next.js 的歷程

Next.js 入門:從 CRA 與 Prerender 進化至 Next.js 的歷程

JavaScript 閉包(Closure)新手入門解析教學

JavaScript 閉包(Closure)新手入門解析教學

極簡複習:函式和模組的 Python 程式範例

極簡複習:函式和模組的 Python 程式範例






留言討論