0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

BERT的官方代碼終于來了

DPVg_AI_era ? 來源:未知 ? 作者:李倩 ? 2018-11-05 17:17 ? 次閱讀

谷歌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ā)布。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 谷歌
    +關(guān)注

    關(guān)注

    27

    文章

    6169

    瀏覽量

    105439
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4790

    瀏覽量

    68654
  • nlp
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    BERT原理詳解

    BERT原理詳解
    發(fā)表于 07-02 16:45

    串行BERT用戶指南

    A guide on using the Serial BERT
    發(fā)表于 09-23 11:01

    串行BERT編程指南

    A guide on programming the Serial BERT
    發(fā)表于 09-24 17:15

    J-BERT N4903A高性能串行BERT手冊(cè)

    Brochure for the Keysight J-BERT N4903A High-Performance Serial BERT: 4 pages
    發(fā)表于 09-26 12:17

    回收M8040A 64 Gbaud 高性能 BERT

    回收M8040A 64 Gbaud 高性能 BERT曾S:***;Q號(hào):3140751627;M8040A 64 Gbaud 高性能 BERTM8030A 多通道比特誤碼率測(cè)試儀M8062A
    發(fā)表于 07-03 11:08

    msp430g2553示例C代碼_(官方)

    msp430g2553示例C代碼_(官方)。
    發(fā)表于 03-23 16:45 ?13次下載

    FR5739的官方代碼示例

    FR5739的官方代碼示例,感興趣的小伙伴們可以看看。
    發(fā)表于 07-26 14:31 ?42次下載

    BERT模型的PyTorch實(shí)現(xiàn)

    BertModel是一個(gè)基本的BERT Transformer模型,包含一個(gè)summed token、位置和序列嵌入層,然后是一系列相同的self-attention blocks(BERT-base是12個(gè)blocks, BERT
    的頭像 發(fā)表于 11-13 09:12 ?1.4w次閱讀

    淘金記:如何尋找未開墾的Bert應(yīng)用領(lǐng)域

    Bert 給人們帶來了大驚喜,不過轉(zhuǎn)眼過去大約半年時(shí)間了,這半年來,陸續(xù)出現(xiàn)了與Bert相關(guān)的不少新工作。
    的頭像 發(fā)表于 06-11 10:36 ?2402次閱讀
    淘金記:如何尋找未開墾的<b class='flag-5'>Bert</b>應(yīng)用領(lǐng)域

    BERT再次制霸GLUE排行榜!BERT王者歸來了!

    不過,XLNet的王座沒坐太久。就在今天,F(xiàn)acebook公布一個(gè)基于BERT開發(fā)的加強(qiáng)版預(yù)訓(xùn)練模型RoBERTa——在GLUE、SQuAD和RACE三個(gè)排行榜上全部實(shí)現(xiàn)了最先進(jìn)的結(jié)果!
    的頭像 發(fā)表于 08-02 08:53 ?5641次閱讀
    <b class='flag-5'>BERT</b>再次制霸GLUE排行榜!<b class='flag-5'>BERT</b>王者歸<b class='flag-5'>來了</b>!

    如何在BERT中引入知識(shí)圖譜中信息

    引言 隨著BERT等預(yù)訓(xùn)練模型橫空出世,NLP方向迎來了一波革命,預(yù)訓(xùn)練模型在各類任務(wù)上均取得了驚人的成績。隨著各類預(yù)訓(xùn)練任務(wù)層出不窮,也有部分研究者考慮如何在BERT這一類模型中引入或者強(qiáng)化知識(shí)
    的頭像 發(fā)表于 11-03 17:52 ?4037次閱讀
    如何在<b class='flag-5'>BERT</b>中引入知識(shí)圖譜中信息

    圖解BERT預(yù)訓(xùn)練模型!

    BERT的發(fā)布是這個(gè)領(lǐng)域發(fā)展的最新的里程碑之一,這個(gè)事件標(biāo)志著NLP 新時(shí)代的開始。BERT模型打破了基于語言處理的任務(wù)的幾個(gè)記錄。在 BERT 的論文發(fā)布后不久,這個(gè)團(tuán)隊(duì)還公開了模型的代碼
    的頭像 發(fā)表于 11-24 10:08 ?3682次閱讀

    如何優(yōu)雅地使用bert處理長文本

    不同NLP任務(wù)下使用COGLTX的代碼: 論文題目: CogLTX: Applying BERT to Long Texts 論文鏈接: http://keg.cs.tsinghua.edu.cn
    的頭像 發(fā)表于 12-26 09:17 ?8784次閱讀
    如何優(yōu)雅地使用<b class='flag-5'>bert</b>處理長文本

    什么是BERT?為何選擇BERT?

    由于絕大多數(shù) BERT 參數(shù)專門用于創(chuàng)建高質(zhì)量情境化詞嵌入,因此該框架非常適用于遷移學(xué)習(xí)。通過使用語言建模等自我監(jiān)督任務(wù)(不需要人工標(biāo)注的任務(wù))訓(xùn)練 BERT,可以利用 WikiText 和 BookCorpus 等大型無標(biāo)記數(shù)據(jù)集
    的頭像 發(fā)表于 04-26 14:24 ?4332次閱讀

    總結(jié)FasterTransformer Encoder(BERT)的cuda相關(guān)優(yōu)化技巧

    FasterTransformer BERT 包含優(yōu)化的 BERT 模型、高效的 FasterTransformer 和 INT8 量化推理。
    的頭像 發(fā)表于 01-30 09:34 ?2286次閱讀
    總結(jié)FasterTransformer Encoder(<b class='flag-5'>BERT</b>)的cuda相關(guān)優(yōu)化技巧