概述

自从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中文模型
BERT的demo运行

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尝试,不过源码自带了,不用单独下载
BERT的demo运行

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,
BERT的demo运行
验证结果为:

eval_f = 0.9662649
eval_precision = 0.9668882
eval_recall = 0.9656949
global_step = 135181
loss = 40.160034

6.总结:

本文详细介绍了使用当下热门的bert模型做的demo的使用,同时提供了难以下载的数据集。简要介绍了环境,和一些参数的意义。

相关文章: