Bert系列(一)——demo運行

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

就我個人而言學(xué)習一個開源項目,第一步是安裝,第二步是跑下demo,第三步才是閱讀源碼。安裝bert簡單,直接github上拉下來就可以了,跑demo其實也不難,參照README.md一步步操作就行了,但是經(jīng)我實操過后,發(fā)現(xiàn)里面有個小坑,所以用這篇文章記錄下來,供讀者參考。

閑言少敘,書歸正傳。本次介紹的demo只有兩個,一個是基于MRPC(Microsoft Research Paraphrase Corpus )的句子對分類任務(wù),一個是基于SQuAD語料的閱讀理解任務(wù)。run demo分為以下幾步:

1、下載bert源碼

這沒什么好說的,直接clone

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

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

BERT-Base, Uncased

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

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

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

(1)下載MRPC語料:

官網(wǎng)上指定的方式是通過跑腳本download_glue_data.py來下載 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)下載失敗,究其原因是下面這兩個鏈接訪問不上,幾天后試了一次又能下載了,可能對方服務(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'

如果不能下載,可以參考我當時的做法:
1、手動下載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、因為 GLUE data官網(wǎng)也訪問不了,所以只能去微軟官網(wǎng)下載:https://www.microsoft.com/en-ca/download/details.aspx?id=52398
將 msr_paraphrase_test.txt, msr_paraphrase_train.txt兩個解壓后的文件放在mrpc_ori_corpus文件夾下

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

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這三個文件,說明MRPC語料下載成功。

(2)下載SQuAD語料:

基本上沒什么波折,可以使用下面三個鏈接直接下載,放置于$SQUAD_DIR路徑下

4、run demo

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

訓(xùn)練:

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

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)練模型進行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, 驗證結(jié)果為:

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

預(yù)測:

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

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

執(zhí)行以下語句完成預(yù)測任務(wù),預(yù)測結(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語料的閱讀理解任務(wù)

設(shè)置為語料所在文件夾為$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文件夾下會輸出一個predictions.json文件,執(zhí)行:

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

看到以下結(jié)果,說明執(zhí)行無誤:

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

5、總結(jié):

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

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

(2) 對于部分語料無法下載的情況,提供了其他的搜集方式。

系列后續(xù)將對bert源碼進行解讀,敬請關(guān)注

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文上兩篇系列 NLP的巨人肩膀(上) NLP的巨人肩膀(中) 4.6 Bidirectional Encoder...
    weizier閱讀 6,839評論 1 22
  • 從11月初開始,google-research就陸續(xù)開源了BERT的各個版本。google此次開源的BERT是通過...
    奇點機智閱讀 84,923評論 51 102
  • NLP領(lǐng)域的伸手黨們,上個月簡直像在過年! 不僅號稱谷歌最強NLP模型的BERT如約開源了,而且最新版本還支持中文...
    奇點機智閱讀 1,549評論 0 7
  • 五月底的上海,是初夏的季節(jié),空氣里彌漫著一股悶熱的氣息,但夜里偶爾吹過涼風會撫過你的秀發(fā)。上海虹橋站,來來往...
    亞云閱讀 418評論 4 6
  • 秋風里 江水流翠 漁火搖搖輕睡 秋風里 楓葉紅醉 山邊菊花香綴 秋風里 收獲盈瑞 愁緒漸漸消退 秋風里 爽了年歲 ...
    天水居士閱讀 285評論 10 14

友情鏈接更多精彩內(nèi)容