0
雷鋒網(wǎng) AI 科技評論按:自上個(gè)月谷歌公開 BERT 模型以來,BERT 模型以其雙向、深層等特點(diǎn),成功在 11 項(xiàng) NLP 任務(wù)中取得 state of the art 的結(jié)果,贏得自然語言處理學(xué)界的一片贊譽(yù)之聲。驚鴻一瞥后,人們都在期待谷歌何時(shí)會(huì)放出 BERT 模型源代碼。
直至今日,谷歌終于一鼓作氣發(fā)布了包括 BERT 模型 TensorFlow 代碼、BERT-Base 與 BERT-Large 模型的預(yù)訓(xùn)練檢查點(diǎn)、微調(diào)實(shí)驗(yàn)結(jié)果的自動(dòng)化復(fù)現(xiàn) TensorFlow 代碼、預(yù)訓(xùn)練數(shù)據(jù)生成和數(shù)據(jù)訓(xùn)練的代碼在內(nèi)的「BERT 模型大禮包」。雷鋒網(wǎng) AI 科技評論將通過本文分享 BERT 模型的源代碼開源網(wǎng)址,以及源代碼頁面 Readme 的部分簡介內(nèi)容(已譯成中文),以饗讀者。
BERT 項(xiàng)目地址:
https://github.com/google-research/bert#fine-tuning-with-bert
BERT 項(xiàng)目論文:
https://arxiv.org/abs/1810.04805
什么是 Bert ?
BERT 是一種對語言表征進(jìn)行預(yù)訓(xùn)練的方法,換句話說,是經(jīng)過大型文本語料庫(如維基百科)訓(xùn)練后獲得的通用「語言理解」模型,該模型可用于我們最在乎的 NLP 下游任務(wù)(如問答)。BERT 之所以表現(xiàn)得比過往的方法要好,是因?yàn)樗鞘讉€(gè)用于進(jìn)行 NLP 預(yù)訓(xùn)練的無監(jiān)督、深度雙向系統(tǒng)。
無監(jiān)督意味著 BERT 僅使用文本語料庫進(jìn)行訓(xùn)練,這點(diǎn)很重要,因?yàn)樵诰W(wǎng)絡(luò)上存在著大量公開的多語言文本數(shù)據(jù)。
預(yù)訓(xùn)練表征可能無上下文語境,也可能有上下文語境,有上下文語境的系統(tǒng)可以進(jìn)一步劃分成單向的或者雙向的。以 word2vec ( https://www.tensorflow.org/tutorials/representation/word2vec ) 和 GloVe ( https://nlp.stanford.edu/projects/glove/ )為例,無上下文語境的模型為詞匯表中的每個(gè)單詞生成單個(gè)「詞嵌入」表征,因此「 bank 」在「 bank deposit 」和「 river bank 」中可能存在同樣的表征。反之,有上下文語境的模型會(huì)根據(jù)整句話生成詞的表征。
BERT 建立在近期一些上下文預(yù)訓(xùn)練語境表征工作的基礎(chǔ)上,包括半監(jiān)督序列學(xué)習(xí)( https://arxiv.org/abs/1511.01432 )、預(yù)訓(xùn)練生成模型( https://blog.openai.com/language-unsupervised/ )、ELMo ( https://allennlp.org/elmo )以及 ULMFit ( http://nlp.fast.ai/classification/2018/05/15/introducting-ulmfit.html ),但以上模型要么是單向的,要么是淺層雙向的,這意味著每個(gè)單詞只能與其左邊(或右邊)的單詞進(jìn)行語境化結(jié)合。以「 I made a bank deposit 」為例,由于是單向表示,「 bank 」只能基于左邊「 I made a 」而不是與關(guān)聯(lián)性更強(qiáng)的「 deposit 」生成語境。過去有一些工作試圖打造出一個(gè)能夠結(jié)合上下文語境的生成模型,然而這些工作目前看來都較「 淺層 」。BERT 真正做到了結(jié)合上下文語境來生成「 bank 」,兼顧到「 I made a 」和「 deposit 」,從深度神經(jīng)網(wǎng)絡(luò)的最底層開始,擁有深度雙向?qū)傩浴?/p>
BERT 的方法很簡單:一開始先屏蔽掉輸入詞匯的 15%,然后通過深度雙向的 Transformer 編碼器運(yùn)行整個(gè)序列,最后預(yù)測屏蔽的單詞。舉個(gè)例子:
Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
Labels: [MASK1] = store; [MASK2] = gallon
為了讓模型學(xué)習(xí)到句子之間的關(guān)系,我們特意將模型放在可以從任意單語語料庫里生成的簡單任務(wù)中進(jìn)行訓(xùn)練:給出兩個(gè)句子 A 和 B,句子 B 究竟是句子 A 的下一個(gè)銜接句,亦或者只是語料庫中隨機(jī)生成的句子?
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
最后,我們在一個(gè)大型語料庫(維基百科 + BookCorpus )中對一個(gè)較大的模型(12 - 24 層的 Transformer 編碼器 )進(jìn)行了長時(shí)間訓(xùn)練,最終得到 BERT。
BERT 的使用基本可以分為兩個(gè)階段:
預(yù)訓(xùn)練階段的費(fèi)用不菲(在 4-16 個(gè) TPU 上訓(xùn)練需要花上4天),好在每個(gè)語種的訓(xùn)練都能一次性搞定(目前模型只支持英語,多語言模型會(huì)在不久的將來發(fā)布)。我們正在陸續(xù)發(fā)布一些論文中提及的預(yù)訓(xùn)練模型。大多數(shù) NLP 研究人員日后再無需從頭預(yù)訓(xùn)練自己的模型。
微調(diào)階段的費(fèi)用很便宜。只要一開始使用同樣的預(yù)訓(xùn)練模型,論文中所有的成果只需在單個(gè)TPU 中訓(xùn)練 1 個(gè)小時(shí)就能復(fù)現(xiàn)(在單個(gè) GPU 上也只需幾個(gè)小時(shí)就能復(fù)現(xiàn))。以 SQUAD 為例,只要在單個(gè) TPU 上將模型訓(xùn)練 30 分鐘,就能獲得 91.0% 的 Dev F1 得分,這是單系統(tǒng)目前所能達(dá)到的最好水準(zhǔn)。
BERT 的另外一個(gè)優(yōu)勢是能夠輕松適用多種類型的 NLP 任務(wù)。論文中我們展示了BERT在句子級別(如 SST-2 )、句對級別(如 MultiNLI )、單詞級別(如 NER )以及長文本級別(如 SQuAD )任務(wù)上的最新結(jié)果,幾乎沒有對模型進(jìn)行特定修改。
本次資料庫發(fā)布了哪些東西?
我們將發(fā)布以下成果:
BERT 模型(主要是標(biāo)準(zhǔn) Transformer 結(jié)構(gòu))的 TensorFlow 代碼
全小寫語料訓(xùn)練版和正常語料訓(xùn)練版的 BERT-Base 與 BERT-Large 模型的預(yù)訓(xùn)練檢查點(diǎn)
自動(dòng)化復(fù)現(xiàn)文中重要的微調(diào)實(shí)驗(yàn)結(jié)果的 TensorFlow 代碼,包括在 SQuAD、MultiNLI 和 MRPC 數(shù)據(jù)集下的訓(xùn)練。
預(yù)訓(xùn)練數(shù)據(jù)生成和數(shù)據(jù)訓(xùn)練的代碼
可以通過免費(fèi) TPU 集群運(yùn)行 BERT 的 Colab 鏈接
資料庫里的所有代碼都可以在 CPU、GPU 和 TPU 集群上運(yùn)行。
使用 BERT 進(jìn)行微調(diào)
重要事項(xiàng):文中的所有結(jié)果都是在 64GB 內(nèi)存的單個(gè) TPU 上進(jìn)行微調(diào)。我們目前無法在 12GB - 16GB 內(nèi)存的 GPU 上來復(fù)現(xiàn) BERT-Large 的大部分結(jié)果,因?yàn)槠渲С值淖畲?batch 數(shù)太小了。為此,我們正努力在庫中添加一段可以在 GPU 上進(jìn)行更大 batch 數(shù)訓(xùn)練的代碼。請?jiān)凇皟?nèi)存不足問題”章節(jié)(https://github.com/google-research/bert/blob/master/README.md#out-of-memory-issues )查閱詳情。
此代碼使用了 TensorFlow 1.11.0 進(jìn)行測試。此外,也使用了 Python2 和 Python3 進(jìn)行測試(使用最多的還是 Python2 ,因?yàn)檫@是谷歌內(nèi)部正在使用的)。
使用 BERT-Base 模型進(jìn)行微調(diào)的代碼正常情況下可以在給定超參數(shù)、擁有 12GB 內(nèi)存以上的 GPU 上運(yùn)行。
via https://github.com/google-research/bert/blob/master/README.md
雷鋒網(wǎng) AI 科技評論編譯
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。