如期而至!谷歌開源 BERT 模型源代碼
雷鋒網 AI 科技評論按:自上個月谷歌公開 BERT 模型以來,BERT 模型以其雙向、深層等特點,成功在 11 項 NLP 任務中取得 state of the art 的結果,贏得自然語言處理學界的一片讚譽之聲。驚鴻一瞥後,人們都在期待谷歌何時會放出 BERT 模型源代碼。
直至今日,谷歌終於一鼓作氣發布了包括 BERT 模型 TensorFlow 代碼、BERT-Base 與 BERT-Large 模型的預訓練檢查點、微調實驗結果的自動化復現 TensorFlow 代碼、預訓練數據生成和數據訓練的代碼在內的「BERT 模型大禮包」。雷鋒網 AI 科技評論將通過本文分享 BERT 模型的源代碼開源網址,以及源代碼頁面 Readme 的部分簡介內容(已譯成中文),以饗讀者。
BERT 項目地址:
https://github.com/google-research/bert#fine-tuning-with-bert
BERT 項目論文:
https://arxiv.org/abs/1810.04805
什麼是 Bert ?
BERT 是一種對語言表徵進行預訓練的方法,換句話說,是經過大型文本語料庫(如維基百科)訓練後獲得的通用「語言理解」模型,該模型可用於我們最在乎的 NLP 下游任務(如問答)。BERT 之所以表現得比過往的方法要好,是因為它是首個用於進行 NLP 預訓練的無監督、深度雙向系統。
無監督意味著 BERT 僅使用文本語料庫進行訓練,這點很重要,因為在網路上存在著大量公開的多語言文本數據。
預訓練表徵可能無上下文語境,也可能有上下文語境,有上下文語境的系統可以進一步劃分成單向的或者雙向的。以 word2vec ( https://www.tensorflow.org/tutorials/representation/word2vec) 和 GloVe (https://nlp.stanford.edu/projects/glove/)為例,無上下文語境的模型為辭彙表中的每個單詞生成單個「詞嵌入」表徵,因此「 bank 」在「 bank deposit 」和「 river bank 」中可能存在同樣的表徵。反之,有上下文語境的模型會根據整句話生成詞的表徵。
BERT 建立在近期一些上下文預訓練語境表徵工作的基礎上,包括半監督序列學習( https://arxiv.org/abs/1511.01432)、預訓練生成模型(https://blog.openai.com/language-unsupervised/)、ELMo (https://allennlp.org/elmo)以及 ULMFit (http://nlp.fast.ai/classification/2018/05/15/introducting-ulmfit.html),但以上模型要麼是單向的,要麼是淺層雙向的,這意味著每個單詞只能與其左邊(或右邊)的單詞進行語境化結合。以「 I made a bank deposit 」為例,由於是單向表示,「 bank 」只能基於左邊「 I made a 」而不是與關聯性更強的「 deposit 」生成語境。過去有一些工作試圖打造出一個能夠結合上下文語境的生成模型,然而這些工作目前看來都較「 淺層 」。BERT 真正做到了結合上下文語境來生成「 bank 」,兼顧到「 I made a 」和「 deposit 」,從深度神經網路的最底層開始,擁有深度雙向屬性。
BERT 的方法很簡單:一開始先屏蔽掉輸入辭彙的 15%,然後通過深度雙向的 Transformer 編碼器運行整個序列,最後預測屏蔽的單詞。舉個例子:
Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
Labels: [MASK1] = store; [MASK2] = gallon
為了讓模型學習到句子之間的關係,我們特意將模型放在可以從任意單語語料庫里生成的簡單任務中進行訓練:給出兩個句子 A 和 B,句子 B 究竟是句子 A 的下一個銜接句,亦或者只是語料庫中隨機生成的句子?
Sentence A: the man went to the store .
Sentence B: he bought a gallon of milk .
Label: IsNextSentence
Sentence A: the man went to the store .
Sentence B: penguins are flightless .
Label: NotNextSentence
最後,我們在一個大型語料庫(維基百科 + BookCorpus )中對一個較大的模型(12 - 24 層的 Transformer 編碼器 )進行了長時間訓練,最終得到 BERT。
BERT 的使用基本可以分為兩個階段:
預訓練階段的費用不菲(在 4-16 個 TPU 上訓練需要花上4天),好在每個語種的訓練都能一次性搞定(目前模型只支持英語,多語言模型會在不久的將來發布)。我們正在陸續發布一些論文中提及的預訓練模型。大多數 NLP 研究人員日後再無需從頭預訓練自己的模型。
微調階段的費用很便宜。只要一開始使用同樣的預訓練模型,論文中所有的成果只需在單個TPU 中訓練 1 個小時就能復現(在單個 GPU 上也只需幾個小時就能復現)。以 SQUAD 為例,只要在單個 TPU 上將模型訓練 30 分鐘,就能獲得 91.0% 的 Dev F1 得分,這是單系統目前所能達到的最好水準。
BERT 的另外一個優勢是能夠輕鬆適用多種類型的 NLP 任務。論文中我們展示了BERT在句子級別(如 SST-2 )、句對級別(如 MultiNLI )、單詞級別(如 NER )以及長文本級別(如 SQuAD )任務上的最新結果,幾乎沒有對模型進行特定修改。
本次資料庫發布了哪些東西?
我們將發布以下成果:
BERT 模型(主要是標準 Transformer 結構)的 TensorFlow 代碼
全小寫語料訓練版和正常語料訓練版的 BERT-Base 與 BERT-Large 模型的預訓練檢查點
自動化復現文中重要的微調實驗結果的 TensorFlow 代碼,包括在 SQuAD、MultiNLI 和 MRPC 數據集下的訓練。
預訓練數據生成和數據訓練的代碼
可以通過免費 TPU 集群運行 BERT 的 Colab 鏈接
資料庫里的所有代碼都可以在 CPU、GPU 和 TPU 集群上運行。
使用 BERT 進行微調
重要事項:文中的所有結果都是在 64GB 內存的單個 TPU 上進行微調。我們目前無法在 12GB - 16GB 內存的 GPU 上來複現 BERT-Large 的大部分結果,因為其支持的最大 batch 數太小了。為此,我們正努力在庫中添加一段可以在 GPU 上進行更大 batch 數訓練的代碼。請在「內存不足問題」章節(https://github.com/google-research/bert/blob/master/README.md#out-of-memory-issues)查閱詳情。
此代碼使用了 TensorFlow 1.11.0 進行測試。此外,也使用了 Python2 和 Python3 進行測試(使用最多的還是 Python2 ,因為這是谷歌內部正在使用的)。
使用 BERT-Base 模型進行微調的代碼正常情況下可以在給定超參數、擁有 12GB 內存以上的 GPU 上運行。
via https://github.com/google-research/bert/blob/master/README.md
雷鋒網 AI 科技評論編譯
※驚魂 17 天!信心滿滿要搞私有化的 Elon Musk 為何打了退堂鼓?
※從安全的角度看彭博間諜晶元報道的真實性
TAG:雷鋒網 |