谷歌AI團(tuán)隊(duì)終于開源了最強(qiáng)NLP模型BERT的代碼和預(yù)訓(xùn)練模型。從論文發(fā)布以來,BERT在NLP業(yè)內(nèi)引起巨大反響,被認(rèn)為開啟了NLP的新時(shí)代。
BERT的官方代碼終于來了!
昨天,谷歌在GitHub上發(fā)布了備受關(guān)注的“最強(qiáng)NLP模型”BERT的TensorFlow代碼和預(yù)訓(xùn)練模型,不到一天時(shí)間,已經(jīng)獲得3000多星!
地址:
https://github.com/google-research/bert
BERT,全稱是BidirectionalEncoderRepresentations fromTransformers,是一種預(yù)訓(xùn)練語言表示的新方法。
新智元近期對(duì)BERT模型作了詳細(xì)的報(bào)道和專家解讀:
NLP歷史突破!谷歌BERT模型狂破11項(xiàng)紀(jì)錄,全面超越人類!
狂破11項(xiàng)記錄,谷歌年度最強(qiáng)NLP論文到底強(qiáng)在哪里?
解讀谷歌最強(qiáng)NLP模型BERT:模型、數(shù)據(jù)和訓(xùn)練
BERT有多強(qiáng)大呢?它在機(jī)器閱讀理解頂級(jí)水平測(cè)試SQuAD1.1中表現(xiàn)出驚人的成績:全部兩個(gè)衡量指標(biāo)上全面超越人類!并且還在11種不同NLP測(cè)試中創(chuàng)出最佳成績,包括將GLUE基準(zhǔn)推至80.4%(絕對(duì)改進(jìn)7.6%),MultiNLI準(zhǔn)確度達(dá)到86.7% (絕對(duì)改進(jìn)率5.6%)等。
以下是BERT模型在SQuAD v1.1問題回答任務(wù)的結(jié)果:
在幾個(gè)自然語言推理任務(wù)的結(jié)果:
以及更多其他任務(wù)。
而且,這些結(jié)果都是在幾乎沒有task-specific的神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)的情況下獲得的。
如果你已經(jīng)知道BERT是什么,只想馬上開始使用,可以下載預(yù)訓(xùn)練過的模型,幾分鐘就可以很好地完成調(diào)優(yōu)。
預(yù)訓(xùn)練模型下載:
https://github.com/google-research/bert#pre-trained-models
BERT是什么?
BERT是一種預(yù)訓(xùn)練語言表示(language representations)的方法,意思是我們?cè)谝粋€(gè)大型文本語料庫(比如維基百科)上訓(xùn)練一個(gè)通用的“語言理解”模型,然后將這個(gè)模型用于我們關(guān)心的下游NLP任務(wù)(比如問題回答)。BERT優(yōu)于以前的方法,因?yàn)樗堑谝粋€(gè)用于預(yù)訓(xùn)練NLP的無監(jiān)督、深度雙向的系統(tǒng)(unsupervised,deeply bidirectionalsystem)。
無監(jiān)督意味著BERT只使用純文本語料庫進(jìn)行訓(xùn)練,這很重要,因?yàn)?a href="http://wenjunhu.com/v/tag/1722/" target="_blank">網(wǎng)絡(luò)上有大量的公開的純文本數(shù)據(jù),而且是多語言的。
預(yù)訓(xùn)練的表示可以是上下文無關(guān)(context-free)的,也可以是上下文相關(guān)(contextual)的,并且上下文相關(guān)表示還可以是單向的或雙向的。上下文無關(guān)的模型,比如word2vec或GloVe,會(huì)為詞匯表中的每個(gè)單詞生成單個(gè)“word embedding”表示,因此bank在bank deposit(銀行存款)和river bank(河岸)中具有相同的表示。上下文模型則會(huì)根據(jù)句子中的其他單詞生成每個(gè)單詞的表示。
BERT建立在最近的預(yù)訓(xùn)練contextual representations的基礎(chǔ)上——包括半監(jiān)督序列學(xué)習(xí)、生成性預(yù)訓(xùn)練、ELMo和ULMFit——但這些模型都是單向的或淺雙向的。這意味著每個(gè)單詞只能使用其左邊(或右邊)的單詞來預(yù)測(cè)上下文。例如,在I made a bank deposit這個(gè)句子中, bank的單向表示僅僅基于I made a,而不是deposit。以前的一些工作結(jié)合了來自單獨(dú)的left-context和right-context 模型的表示,但只是一種“淺層”的方式。BERT同時(shí)使用左側(cè)和右側(cè)上下文來表示“bank”—— I made a ... deposit——從深神經(jīng)網(wǎng)絡(luò)的最底層開始,所以它是深度雙向的。
BERT使用一種簡(jiǎn)單的方法:將輸入中15%的單詞屏蔽(mask)起來,通過一個(gè)深度雙向Transformer編碼器運(yùn)行整個(gè)序列,然后僅預(yù)測(cè)被屏蔽的單詞。例如:
Input: the man went to the [MASK1] . he bought a [MASK2] of milk. Labels: [MASK1] = store; [MASK2] = gallon
為了學(xué)習(xí)句子之間的關(guān)系,我們還訓(xùn)練了一個(gè)可以從任何單語語料庫生成的簡(jiǎn)單任務(wù):給定兩個(gè)句子A和B, 讓模型判斷B是A的下一個(gè)句子,還是語料庫中的一個(gè)隨機(jī)句子?
Sentence A: the man went to the store . Sentence B: he bought a gallon of milk . Label: IsNextSentenceSentence A: the man went to the store . Sentence B: penguins are flightless . Label: NotNextSentence
然后,我們?cè)诖笮驼Z料庫(Wikipedia + BookCorpus)上訓(xùn)練了一個(gè)大型模型(12-layer 到 24-layer的Transformer),花了很長時(shí)間(100萬次更新步驟),這就是BERT。
使用BERT的兩個(gè)階段:預(yù)訓(xùn)練和微調(diào)
使用BERT分為兩個(gè)階段:預(yù)訓(xùn)練(Pre-training)和微調(diào)(Fine-tuning)。
預(yù)訓(xùn)練(Pre-training)的成本是相當(dāng)昂貴的(需要4到16個(gè)Cloud TPU訓(xùn)練4天),但是對(duì)于每種語言來說都只需訓(xùn)練一次(目前的模型僅限英語的,我們打算很快發(fā)布多語言模型)。大多數(shù)NLP研究人員根本不需要從頭開始訓(xùn)練自己的模型。
微調(diào)(Fine-tuning)的成本不高。從完全相同的預(yù)訓(xùn)練模型開始,論文中的所有結(jié)果在單個(gè)Cloud TPU上最多1小時(shí)就能復(fù)制,或者在GPU上幾小時(shí)就能復(fù)制。例如,對(duì)于SQUAD任務(wù),在單個(gè)Cloud TPU上訓(xùn)練大約30分鐘,就能獲得91.0%的Dev F1分?jǐn)?shù),這是目前單系統(tǒng)最先進(jìn)的。
BERT的另一個(gè)重要方面是,它可以很容易地適應(yīng)許多類型的NLP任務(wù)。在論文中,我們展示了句子級(jí)(例如SST-2)、句子對(duì)級(jí)別(例如MultiNLI)、單詞級(jí)別(例如NER)以及段落級(jí)別(例如SQuAD)等任務(wù)上最先進(jìn)的結(jié)果,并且,幾乎沒有針對(duì)特定任務(wù)進(jìn)行修改。
GitHub庫中包含哪些內(nèi)容?
BERT模型架構(gòu)的TensorFlow代碼(主體是一個(gè)標(biāo)準(zhǔn)Transformer架構(gòu))。
BERT-Base和BERT-Large的lowercase和cased版本的預(yù)訓(xùn)練檢查點(diǎn)。
用于復(fù)制論文中最重要的微調(diào)實(shí)驗(yàn)的TensorFlow代碼,包括SQuAD,MultiNLI和MRPC。
這個(gè)項(xiàng)目庫中所有代碼都可以在CPU、GPU和Cloud TPU上使用。
預(yù)訓(xùn)練模型
我們發(fā)布了論文中的BERT-Base和BERT-Large模型。
Uncased表示在WordPiece tokenization之前文本已經(jīng)變成小寫了,例如,John Smithbecomesjohn smith。Uncased模型也去掉了所有重音標(biāo)志。
Cased表示保留了真實(shí)的大小寫和重音標(biāo)記。通常,除非你已經(jīng)知道大小寫信息對(duì)你的任務(wù)來說很重要(例如,命名實(shí)體識(shí)別或詞性標(biāo)記),否則Uncased模型會(huì)更好。
這些模型都在與源代碼相同的許可(Apache 2.0)下發(fā)布。
請(qǐng)?jiān)贕itHub的鏈接里下載模型:
BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters
BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters
BERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parameters
BERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters (暫時(shí)未發(fā)布).
每個(gè).zip文件包含三個(gè)項(xiàng)目:
一個(gè)包含預(yù)訓(xùn)練權(quán)重的TensorFlow checkpoint (bert_model.ckpt),(實(shí)際上是3個(gè)文件)。
一個(gè)vocab文件(vocab.txt),用于將WordPiece映射到word id。
一個(gè)配置文件(bert_config.json),用于指定模型的超參數(shù)。
BERT的Fine-tuning
重要提示:論文里的所有結(jié)果都在單個(gè)Cloud TPU上進(jìn)行了微調(diào),Cloud TPU具有64GB的RAM。目前無法使用具有12GB-16GB RAM的GPU復(fù)現(xiàn)論文里BERT-Large的大多數(shù)結(jié)果,因?yàn)閮?nèi)存可以適用的最大 batch size太小。我們正在努力添加代碼,以允許在GPU上實(shí)現(xiàn)更大的有效batch size。有關(guān)更多詳細(xì)信息,請(qǐng)參閱out-of memory issues的部分。
使用BERT-Base的fine-tuning示例應(yīng)該能夠使用給定的超參數(shù)在具有至少12GB RAM的GPU上運(yùn)行。
BERT預(yù)訓(xùn)練
我們發(fā)布了在任意文本語料庫上做“masked LM”和“下一句預(yù)測(cè)”的代碼。請(qǐng)注意,這不是論文的確切代碼(原始代碼是用C ++編寫的,并且有一些額外的復(fù)雜性),但是此代碼確實(shí)生成了論文中描述的預(yù)訓(xùn)練數(shù)據(jù)。
以下是運(yùn)行數(shù)據(jù)生成的方法。輸入是純文本文件,每行一個(gè)句子。(在“下一句預(yù)測(cè)”任務(wù)中,這些需要是實(shí)際的句子)。文件用空行分隔。輸出是一組序列化為TFRecord文件格式的tf.train.Examples。
你可以使用現(xiàn)成的NLP工具包(如spaCy)來執(zhí)行句子分割。create_pretraining_data.py腳本將連接 segments,直到達(dá)到最大序列長度,以最大限度地減少填充造成的計(jì)算浪費(fèi)。但是,你可能需要在輸入數(shù)據(jù)中有意添加少量噪聲(例如,隨機(jī)截?cái)?%的輸入segments),以使其在微調(diào)期間對(duì)非句子輸入更加魯棒。
此腳本將整個(gè)輸入文件的所有示例存儲(chǔ)在內(nèi)存中,因此對(duì)于大型數(shù)據(jù)文件,你應(yīng)該對(duì)輸入文件進(jìn)行切分,并多次調(diào)用腳本。(可以將文件glob傳遞給run_pretraining.py,例如,tf_examples.tf_record *。)
max_predictions_per_seq是每個(gè)序列的masked LM預(yù)測(cè)的最大數(shù)量。你應(yīng)該將其設(shè)置為max_seq_length * masked_lm_prob(腳本不會(huì)自動(dòng)執(zhí)行此操作,因?yàn)樾枰獙⒋_切的值傳遞給兩個(gè)腳本)。
python create_pretraining_data.py --input_file=./sample_text.txt --output_file=/tmp/tf_examples.tfrecord --vocab_file=$BERT_BASE_DIR/vocab.txt --do_lower_case=True --max_seq_length=128 --max_predictions_per_seq=20 --masked_lm_prob=0.15 --random_seed=12345 --dupe_factor=5
以下是如何進(jìn)行預(yù)訓(xùn)練。
如果你從頭開始進(jìn)行預(yù)訓(xùn)練,請(qǐng)不要包含init_checkpoint。模型配置(包括詞匯大小)在bert_config_file中指定。此演示代碼僅預(yù)訓(xùn)練少量steps(20),但實(shí)際上你可能希望將num_train_steps設(shè)置為10000步或更多。傳遞給run_pretraining.py的max_seq_lengthand max_predictions_per_seq參數(shù)必須與create_pretraining_data.py相同。
python run_pretraining.py --input_file=/tmp/tf_examples.tfrecord --output_dir=/tmp/pretraining_output --do_train=True --do_eval=True --bert_config_file=$BERT_BASE_DIR/bert_config.json --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt --train_batch_size=32 --max_seq_length=128 --max_predictions_per_seq=20 --num_train_steps=20 --num_warmup_steps=10 --learning_rate=2e-5
這將產(chǎn)生如下輸出:
***** Eval results ***** global_step = 20 loss = 0.0979674 masked_lm_accuracy = 0.985479 masked_lm_loss = 0.0979328 next_sentence_accuracy = 1.0 next_sentence_loss = 3.45724e-05FAQ
問:這次公開的代碼是否與Cloud TPU兼容?GPU呢?
答:是的,這個(gè)存儲(chǔ)庫中的所有代碼都可以與CPU,GPU和Cloud TPU兼容。但是,GPU訓(xùn)練僅適用于單GPU。
問:提示內(nèi)存不足,這是什么問題?
答:請(qǐng)參閱out-of-memory issues這部分的內(nèi)容。
問:有PyTorch版本嗎?
答:目前還沒有正式的PyTorch實(shí)現(xiàn)。如果有人創(chuàng)建了一個(gè)逐行PyTorch實(shí)現(xiàn),可以讓我們的預(yù)訓(xùn)練checkpoints直接轉(zhuǎn)換,那么我們很樂意在這里鏈接到PyTorch版本。
問:是否會(huì)發(fā)布其他語言的模型?
答:是的,我們計(jì)劃很快發(fā)布多語言BERT模型。我們不能保證將包含哪些語言,但它很可能是一個(gè)單一的模型,其中包括大多數(shù)維基百科上預(yù)料規(guī)模較大的語言。
問:是否會(huì)發(fā)布比BERT-Large更大的模型?
答:到目前為止,我們還沒有嘗試過比BERT-Large更大的訓(xùn)練。如果我們能夠獲得重大改進(jìn),可能會(huì)發(fā)布更大的模型。
問:這個(gè)庫的許可證是什么?
答:所有代碼和模型都在Apache 2.0許可下發(fā)布。
-
谷歌
+關(guān)注
關(guān)注
27文章
6169瀏覽量
105439 -
代碼
+關(guān)注
關(guān)注
30文章
4790瀏覽量
68654 -
nlp
+關(guān)注
關(guān)注
1文章
488瀏覽量
22046
原文標(biāo)題:谷歌最強(qiáng)NLP模型BERT官方代碼來了!GitHub一天3000星
文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論