1 简介

          有关BERT的知识点可以参考如下链接 ,这里使用官方预训练好的BERT模型,在SQuAD v1.1上进行微调。BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding_SU_ZCS的博客-CSDN博客

         BERT开源代码:https://github.com/google-research/bert

下载预训练模型

模型名称BERT-BASE-UNCASED
结构层数:12,隐藏单元:768,Attention:12
链接https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip

        解压后得到vocab.txt(词表,里边全部为小写),bert_config.json(模型参数),bert_model(包含三个ckpt三个文件。二进制文件,存放了模型预训练权重等)。新建文件夹BERT_BASE_UNCASED_DIR,将几个文件放入BERT_BASE_UNCASED_DIR下。

模型名称BERT-BASE-CASED
结构层数:12,隐藏单元:768,Attention:12
链接https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip

           新建文件夹BERT_BASE_CASED_DIR,将几个文件放入BERT_BASE_CASED_DIR下。

       两者区别:UNCASED不支持小写,词表中只有小写字母,文本中的大写字母需要全部降为小写字母。UNCASED不支持小写,词表中大小写字母都有,文本中的大写字母不需要降小处理。

模型名称BERT-LARGE-UNCASED
结构层数:24,隐藏单元:1024,Attention:16
链接https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-24_H-1024_A-16.zip

     新建文件夹BERT_LARGE_UNCASED_DIR,将几个文件放入BERT_LARGE_UNCASED_DIR下。

模型名称BERT-LARGE-CASED
结构层数:24,隐藏单元:1024,Attention:16
链接https://storage.googleapis.com/bert_models/2018_10_18/cased_L-24_H-1024_A-16.zip

     新建文件夹BERT_LARGE_CASED_DIR,将几个文件放入BERT_LARGE_CASED_DIR下。

3 微调

3.1 SQuAD 1.1 

3.1.1 BERT_BASE_UNCASED_DEV

       首先下载Squad 1.1的数据集,得到train-v1.1.json和dev-v1.1.json。在bert-master目录下新建文件夹SQUAD_DIR _v1,将train-v1.1.json和dev-v1.1.json放入其中,链接:

https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json
https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json

       在bert-master文件夹下新建BERT_BASE_UNCASED_DEV,用于存放微调模型的参数、验证集结果。执行如下命令进行微调和在验证集上测试:

python run_squad.py \
  --vocab_file=BERT_BASE_UNCASED_DIR/vocab.txt \
  --bert_config_file=BERT_BASE_UNCASED_DIR/bert_config.json \
  --init_checkpoint=BERT_BASE_UNCASED_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=SQUAD_DIR_v1/train-v1.1.json \
  --do_predict=True \
  --predict_file=SQUAD_DIR_v1/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=BERT_BASE_UNCASED_DEV

   GPU用的P100,用了四块,大约两个多小时微调完成。可以看到BERT_BASE_UNCASED_DEV有如下,其中predictions为验证集的预测结果。 

接下来执行评估,执行如下命令:

python SQUAD_DIR_v1/evaluate-v1.1.py SQUAD_DIR_v1/dev-v1.1.json BERT_BASE_UNCASED_DEV/predictions.json 

结果:EM:0.8059   F1:0.8814

3.1.2 BERT_BASE_CASED_DEV

      在bert-master文件夹下新建BERT_BASE_CASED_DEV,用于存放微调模型的参数、验证集结果。执行如下命令进行微调和在验证集上测试:

python run_squad.py \
  --vocab_file=BERT_BASE_CASED_DIR/vocab.txt \
  --bert_config_file=BERT_BASE_CASED_DIR/bert_config.json \
  --init_checkpoint=BERT_BASE_CASED_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=SQUAD_DIR_v1/train-v1.1.json \
  --do_predict=True \
  --predict_file=SQUAD_DIR_v1/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= BERT_BASE_CASED_DEV

结果:EM:0.7999   F1:0.8790

3.1.3 BERT_BASE_CASED_DEV(do_lower_case=False)

       在bert-master文件夹下新建BERT_BASE_CASED_DLF_DEV,用于存放微调模型的参数、验证集结果。执行如下命令进行微调和在验证集上测试:

python run_squad.py \
  --vocab_file=BERT_BASE_CASED_DIR/vocab.txt \
  --bert_config_file=BERT_BASE_CASED_DIR/bert_config.json \
  --init_checkpoint=BERT_BASE_CASED_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=SQUAD_DIR_v1/train-v1.1.json \
  --do_predict=True \
  --predict_file=SQUAD_DIR_v1/dev-v1.1.json \
  --train_batch_size=12 \
  --learning_rate=3e-5 \
  --do_lower_case=False \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir= BERT_BASE_CASED_DLF_DEV

结果:EM:0.8137    F1:0.8863

3.1.4 BERT_LARGE_UNCASED_DEV 

       在bert-master文件夹下新建BERT_LARGE_UNCASED_DEV,用于存放微调模型的参数、验证集结果。执行如下命令进行微调和在验证集上测试:

python run_squad.py \
  --vocab_file=BERT_LARGE_UNCASED_DIR/vocab.txt \
  --bert_config_file=BERT_LARGE_UNCASED_DIR/bert_config.json \
  --init_checkpoint=BERT_LARGE_UNCASED_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=SQUAD_DIR_v1/train-v1.1.json \
  --do_predict=True \
  --predict_file=SQUAD_DIR_v1/dev-v1.1.json \
  --train_batch_size=2 \
  --learning_rate=3e-5 \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir=BERT_LARGE_UNCASED_DEV

我训练时的显卡内存16G,内存太小,所以将train_batch改为2

结果:EM:0.8257   F1:0.8984

3.1.5 BERT_LARGE_CASED_DEV 

      在bert-master文件夹下新建BERT_LARGE_CASED_DEV,用于存放微调模型的参数、验证集结果。执行如下命令进行微调和在验证集上测试:

python run_squad.py \
  --vocab_file=BERT_LARGE_CASED_DIR/vocab.txt \
  --bert_config_file=BERT_LARGE_CASED_DIR/bert_config.json \
  --init_checkpoint=BERT_LARGE_CASED_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=SQUAD_DIR_v1/train-v1.1.json \
  --do_predict=True \
  --predict_file=SQUAD_DIR_v1/dev-v1.1.json \
  --train_batch_size=2 \
  --learning_rate=3e-5 \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir=BERT_LARGE_CASED_DEV

结果:EM:0.8279    F1:0.8975

3.1.6 BERT_LARGE_CASED_DEV(do_lower_case=False) 

       在bert-master文件夹下新建BERT_LARGE_CASED_DLF_DEV,用于存放微调模型的参数、验证集结果。执行如下命令进行微调和在验证集上测试:

python run_squad.py \
  --vocab_file=BERT_LARGE_CASED_DIR/vocab.txt \
  --bert_config_file=BERT_LARGE_CASED_DIR/bert_config.json \
  --init_checkpoint=BERT_LARGE_CASED_DIR/bert_model.ckpt \
  --do_train=True \
  --train_file=SQUAD_DIR_v1/train-v1.1.json \
  --do_predict=True \
  --predict_file=SQUAD_DIR_v1/dev-v1.1.json \
  --train_batch_size=2 \
  --learning_rate=3e-5 \
  --do_lower_case=False \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir= BERT_LARGE_CASED_DLF_DEV

结果:EM:0.8367   F1:0.9020

4 汇总

模型微调时间EMF1

BERT_BASE_UNCASED(vocab小写,将所有文本降为小写)

2h0.80590.8814

BERT_BASE_CASED(vocab大写,将所有文本降为小写)

2h30min0.79990.8790

BERT_BASE_CASED(do_lower_case=False)(vocab大写,不需要将所有文本降为小写)

2h30min0.81370.8896

BERT_LARGE_UNCASED(vocab小写,将所有文本降为小写)

8h30min0.82570.8984

BERT_LARGE_CASED(vocab大写,将所有文本降为小写)

11h20min0.82790.8975

BERT_LARGE_CASED(do_lower_case=False)(vocab大写,不需要将所有文本降为小写)

11h20min0.83670.9020

5 测试

有测试文本test.json

{"data": [{"title": "test1", "paragraphs": [{"context": "Some time ago, Jack Ma was photographed on vacation in Spain, wearing a white ball cap and a golf suit, looking very comfortable, and the yacht he had previously purchased for $200 million was moored on the shore. Many netizens lamented that this is really the standard leisure life of the rich.", "qas": [{"answers": [{"answer_start": 17, "text": "Jack Ma"}], "question": "Who went on vacation to Spain?", "id": "0"}]}]}],"version":"1.1"}

原文:前段时间,马云被拍到在西班牙度假,头戴白色球帽,身穿高尔夫服,看上去很舒服,而他之前斥资2亿美元购买的游艇就停泊在岸边。 不少网友感叹,这真是有钱人的标准休闲生活。

问题:谁去了西班牙度假

答案:马云

执行推理命令:

python run_squad.py \
  --vocab_file=BERT_LARGE_CASED_DLF_DEV/vocab.txt \
  --bert_config_file=BERT_LARGE_CASED_DLF_DEV/bert_config.json \
  --init_checkpoint=BERT_LARGE_CASED_DLF_DEV/bert_model.ckpt \
  --do_predict=True \
  --predict_file=test.json \
  --train_batch_size=2 \
  --learning_rate=3e-5 \
  --do_lower_case=False \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir=test

得到预测答案:

{
    "0": "Jack Ma",
}
Logo

更多推荐