BERT的demo运行
概述
自从google发布了《Pre-training of Deep Bidirectional Transformers for Language Understanding》,一举刷新多项NLP领域记录后。BERT模型可谓红遍NLP领域,许多人都想使用BERT对自己的数据进行预处理。本文接下来将会简单介绍几个使用BERT模型运行的demo。由于当前对bert分析的文章太多,这里也不在赘述。如果之前没有了解过bert模型,可以点击这里。或者可以直接点击原论文进行查看。
实际操作
1.环境
运行环境:linux环境(楼主也运行过windows,总是有各种不知名错误,最后放弃了)
GPU:1080Ti(之前用1050Ti的跑总是显示GPU不够,也不知道最小应该多少,直接上的1080Ti就可以跑了)
python:3.6.5
Tensorflow-gpu :1.12.0(>=1.11.0)(文章要求最低1.11.0版本,楼主也是直接升级到最新,至于bert-pytorch开源版本跑起来总是各种问题,等楼主解决了,再更新,这期只介绍tensorflow版本的bert)
2.下载bert源码和demo源码
直接通过linux命令行,直接clone
git clone https://github.com/google-research/bert.git
(Bert源码)
git clone https://github.com/ProHiryu/bert-chinese-ner
(使用预训练语言模型BERT做中文NER尝试,fine - tune BERT模型)
3.下载预训练模型
BERT-Base, Uncased
英文模型
(之所以选择这个版本是首先因为训练语言为英文,同时显存资源有限,于是选择Base版本。cased表示区分大小写,uncased表示不区分大小写。除非你明确知道你的任务对大小写敏感(比如命名实体识别、词性标注等)那么通常情况下uncased效果更好。)
BERT-Base, Chinese中文模型
4.下载训练数据:
(1)下载MRPC语料:
官网上指定的方式是通过跑脚本download_glue_data.py来下载 GLUE data 。指定数据存放地址为:glue_data, 下载任务为:MRPC,执行(本篇中所有python3的命令同样适用于python):
python3 download_glue_data.py --data_dir glue_data --tasks MRPC
但是大概率下载不下来,我就是这样。能下载的步骤也很麻烦,于是楼主下载之后放到网盘了。
链接:https://pan.baidu.com/s/1-b4I3ocYhiuhu3bpSmCJ_Q
提取码:z6mk
2)下载SQuAD语料:
基本上没什么波折,可以使用下面三个链接直接下载,放置于$SQUAD_DIR路径下
train-v1.1.json
dev-v1.1.json
evaluate-v1.1.py
3)NEWS数据
用于BERT做中文NER尝试,不过源码自带了,不用单独下载
5. run demo:
(1) 基于MRPC语料的句子对分类任务
训练:
设置环境变量,指定预训练模型文件和语料地址
export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
export GLUE_DIR=/path/to/glue_data
在bert源码文件里执行run_classifier.py,基于预训练模型进行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/
–do_eval为true的意思,即会生成模型验证结果文件如下图。如果false,既没有验证结果生成。
模型保存在output_dir, 验证结果为:
***** Eval results *****
eval_accuracy = 0.845588
eval_loss = 0.505248
global_step = 343
loss = 0.505248
预测:
指定fine-tune之后模型文件所在地址
export TRAINED_CLASSIFIER=/path/to/fine/tuned/classifier
执行以下语句完成预测任务,预测结果输出在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语料的阅读理解任务
设置为语料所在文件夹为$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文件,执行:
python3 $SQUAD_DIR/evaluate-v1.1.py $SQUAD_DIR/dev-v1.1.json predictions.json
看到以下结果,说明执行无误:
{"f1": 88.41249612335034, "exact_match": 81.2488174077578}
(3)使用预训练语言模型BERT做中文NER尝试
export BERT_BASE_DIR=/path/to/bert/chinese_L-12_H-768_A-12
export GLUE_DIR=data/
python BERT_NER.py \ --do_train=true \
--do_eval=true \
--data_dir=$BERT_BASE_DIR \
--bert_config_file=$GLUE_DIR/bert_config.json \
--init_checkpoint=$GLUE_DIR/bert_model.ckpt \
--vocab_file=vocab.txt \
--output_dir=./output/result_dir/
模型保存在output_dir,
验证结果为:
eval_f = 0.9662649
eval_precision = 0.9668882
eval_recall = 0.9656949
global_step = 135181
loss = 40.160034
6.总结:
本文详细介绍了使用当下热门的bert模型做的demo的使用,同时提供了难以下载的数据集。简要介绍了环境,和一些参数的意义。