Bert系列(一)——demo運(yùn)行

谷歌推出的Bert署咽,最近有多火,估計(jì)做自然語(yǔ)言處理的都知道生音。據(jù)稱在SQuAD等11項(xiàng)任務(wù)當(dāng)中達(dá)到了state of the art宁否。bert的原理可參考論文,或者網(wǎng)上其他人翻譯的資料缀遍。谷歌已經(jīng)在github上開(kāi)源了代碼慕匠,相信每一個(gè)從事NLP的都應(yīng)該和我一樣摩拳擦掌,迫不及待地想要學(xué)習(xí)它了吧域醇。

就我個(gè)人而言學(xué)習(xí)一個(gè)開(kāi)源項(xiàng)目台谊,第一步是安裝蓉媳,第二步是跑下demo,第三步才是閱讀源碼锅铅。安裝bert簡(jiǎn)單酪呻,直接github上拉下來(lái)就可以了,跑demo其實(shí)也不難盐须,參照README.md一步步操作就行了玩荠,但是經(jīng)我實(shí)操過(guò)后,發(fā)現(xiàn)里面有個(gè)小坑贼邓,所以用這篇文章記錄下來(lái)阶冈,供讀者參考。

閑言少敘塑径,書(shū)歸正傳女坑。本次介紹的demo只有兩個(gè),一個(gè)是基于MRPC(Microsoft Research Paraphrase Corpus )的句子對(duì)分類任務(wù)统舀,一個(gè)是基于SQuAD語(yǔ)料的閱讀理解任務(wù)堂飞。run demo分為以下幾步:

1、下載bert源碼

這沒(méi)什么好說(shuō)的绑咱,直接clone

git clone https://github.com/google-research/bert.git

2、下載預(yù)訓(xùn)練模型

BERT-Base, Uncased

可選預(yù)訓(xùn)練模型.png

為什么選擇BERT-Base, Uncased這個(gè)模型呢枢泰?原因有三:1描融、訓(xùn)練語(yǔ)料為英文,所以不選擇中文或者多語(yǔ)種衡蚂;2窿克、設(shè)備條件有限,如果您的顯卡內(nèi)存小于16個(gè)G毛甲,那就請(qǐng)乖乖選擇base,不要折騰large了年叮;3、cased表示區(qū)分大小寫玻募,uncased表示不區(qū)分大小寫只损。除非你明確知道你的任務(wù)對(duì)大小寫敏感(比如命名實(shí)體識(shí)別、詞性標(biāo)注等)那么通常情況下uncased效果更好七咧。

3跃惫、下載訓(xùn)練數(shù)據(jù):

(1)下載MRPC語(yǔ)料:

官網(wǎng)上指定的方式是通過(guò)跑腳本download_glue_data.py來(lái)下載 GLUE data 。指定數(shù)據(jù)存放地址為:glue_data艾栋, 下載任務(wù)為:MRPC爆存,執(zhí)行(本篇中所有python3的命令同樣適用于python):

python3 download_glue_data.py --data_dir glue_data --tasks MRPC

執(zhí)行后發(fā)現(xiàn)下載失敗,究其原因是下面這兩個(gè)鏈接訪問(wèn)不上蝗砾,幾天后試了一次又能下載了先较,可能對(duì)方服務(wù)端不穩(wěn)定携冤。

MRPC_TRAIN = 'https://s3.amazonaws.com/senteval/senteval_data/msr_paraphrase_train.txt'
MRPC_TEST = 'https://s3.amazonaws.com/senteval/senteval_data/msr_paraphrase_test.txt'

如果不能下載,可以參考我當(dāng)時(shí)的做法:
1闲勺、手動(dòng)下載dev_ids.tsv映射表保存在glue_data/MRPC文件夾下

"MRPC":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2Fmrpc_dev_ids.tsv?alt=media&token=ec5c0836-31d5-48f4-b431-7480817f1adc',

2曾棕、因?yàn)?GLUE data官網(wǎng)也訪問(wèn)不了,所以只能去微軟官網(wǎng)下載:https://www.microsoft.com/en-ca/download/details.aspx?id=52398
將 msr_paraphrase_test.txt霉翔, msr_paraphrase_train.txt兩個(gè)解壓后的文件放在mrpc_ori_corpus文件夾下

3睁蕾、注釋掉腳本download_glue_data.py里下載dev_ids.tsv文件的語(yǔ)句(如果你的服務(wù)器能下載可以不注釋,使用代碼下載不必手動(dòng)下載):

65 # urllib.request.urlretrieve(TASK2PATH["MRPC"], os.path.join(mrpc_dir, "dev_ids.tsv"))

執(zhí)行

python3 download_glue_data.py --data_dir glue_data --tasks MRPC --path_to_mrpc mrpc_ori_corpus

如果在glue_data/MRPC文件下出現(xiàn) dev.tsv债朵,test.tsv子眶,train.tsv這三個(gè)文件,說(shuō)明MRPC語(yǔ)料下載成功序芦。

(2)下載SQuAD語(yǔ)料:

基本上沒(méi)什么波折臭杰,可以使用下面三個(gè)鏈接直接下載,放置于$SQUAD_DIR路徑下

4谚中、run demo

(1) 基于MRPC語(yǔ)料的句子對(duì)分類任務(wù)

訓(xùn)練:

設(shè)置環(huán)境變量渴杆,指定預(yù)訓(xùn)練模型文件和語(yǔ)料地址

export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
export GLUE_DIR=/path/to/glue_data

在bert源碼文件里執(zhí)行run_classifier.py,基于預(yù)訓(xùn)練模型進(jìn)行fine-tune

python run_classifier.py \
  --task_name=MRPC \
  --do_train=true \
  --do_eval=true \
  --data_dir=$GLUE_DIR/MRPC \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=3.0 \
  --output_dir=/tmp/mrpc_output/

模型保存在output_dir宪塔, 驗(yàn)證結(jié)果為:

***** Eval results *****
  eval_accuracy = 0.845588
  eval_loss = 0.505248
  global_step = 343
  loss = 0.505248

預(yù)測(cè):

指定fine-tune之后模型文件所在地址

export TRAINED_CLASSIFIER=/path/to/fine/tuned/classifier

執(zhí)行以下語(yǔ)句完成預(yù)測(cè)任務(wù)磁奖,預(yù)測(cè)結(jié)果輸出在output_dir文件夾中

python run_classifier.py \
  --task_name=MRPC \
  --do_predict=true \
  --data_dir=$GLUE_DIR/MRPC \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$TRAINED_CLASSIFIER \
  --max_seq_length=128 \
  --output_dir=/tmp/mrpc_output/

(2)基于SQuAD語(yǔ)料的閱讀理解任務(wù)

設(shè)置為語(yǔ)料所在文件夾為$SQUAD_DIR

python run_squad.py \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=$SQUAD_DIR/train-v1.1.json \
  --do_predict=True \
  --predict_file=$SQUAD_DIR/dev-v1.1.json \
  --train_batch_size=12 \
  --learning_rate=3e-5 \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir=/tmp/squad_base/

在output_dir文件夾下會(huì)輸出一個(gè)predictions.json文件,執(zhí)行:

python3 $SQUAD_DIR/evaluate-v1.1.py $SQUAD_DIR/dev-v1.1.json predictions.json

看到以下結(jié)果某筐,說(shuō)明執(zhí)行無(wú)誤:

{"f1": 88.41249612335034, "exact_match": 81.2488174077578}

5比搭、總結(jié):

本篇內(nèi)容主要解決了以下兩個(gè)問(wèn)題:

(1) 基于MRPC語(yǔ)料的句子對(duì)分類任務(wù)和基于SQuAD語(yǔ)料的閱讀理解任務(wù)的demo執(zhí)行,主要是翻譯源碼中README.md的部分內(nèi)容南誊;

(2) 對(duì)于部分語(yǔ)料無(wú)法下載的情況身诺,提供了其他的搜集方式。

系列后續(xù)將對(duì)bert源碼進(jìn)行解讀抄囚,敬請(qǐng)關(guān)注

系列文章
Bert系列(二)——模型主體源碼解讀
Bert系列(三)——源碼解讀之Pre-train
Bert系列(四)——源碼解讀之Fine-tune
Bert系列(五)——中文分詞實(shí)踐 F1 97.8%(附代碼)

Reference
1.https://github.com/google-research/bert

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霉赡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幔托,更是在濱河造成了極大的恐慌穴亏,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柑司,死亡現(xiàn)場(chǎng)離奇詭異迫肖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)攒驰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蟆湖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人玻粪,你說(shuō)我怎么就攤上這事隅津∥艽梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵伦仍,是天一觀的道長(zhǎng)结窘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)充蓝,這世上最難降的妖魔是什么隧枫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谓苟,結(jié)果婚禮上官脓,老公的妹妹穿的比我還像新娘。我一直安慰自己涝焙,他們只是感情好卑笨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仑撞,像睡著了一般赤兴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隧哮,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天桶良,我揣著相機(jī)與錄音,去河邊找鬼沮翔。 笑死艺普,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鉴竭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岸浑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搏存!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起矢洲,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤璧眠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后读虏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體责静,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盖桥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灾螃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揩徊,死狀恐怖腰鬼,靈堂內(nèi)的尸體忽然破棺而出嵌赠,到底是詐尸還是另有隱情,我是刑警寧澤熄赡,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布姜挺,位于F島的核電站,受9級(jí)特大地震影響彼硫,放射性物質(zhì)發(fā)生泄漏炊豪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一拧篮、第九天 我趴在偏房一處隱蔽的房頂上張望词渤。 院中可真熱鬧,春花似錦他托、人聲如沸掖肋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)志笼。三九已至,卻和暖如春把篓,著一層夾襖步出監(jiān)牢的瞬間纫溃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工韧掩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留紊浩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓疗锐,卻偏偏與公主長(zhǎng)得像坊谁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滑臊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容