BERT微调(SQuAD v1.1)
BERT在SQuAD v1.1上微调
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。
2 下载预训练模型
①
模型名称 | 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 汇总
模型 | 微调时间 | EM | F1 |
BERT_BASE_UNCASED(vocab小写,将所有文本降为小写) | 2h | 0.8059 | 0.8814 |
BERT_BASE_CASED(vocab大写,将所有文本降为小写) | 2h30min | 0.7999 | 0.8790 |
BERT_BASE_CASED(do_lower_case=False)(vocab大写,不需要将所有文本降为小写) | 2h30min | 0.8137 | 0.8896 |
BERT_LARGE_UNCASED(vocab小写,将所有文本降为小写) | 8h30min | 0.8257 | 0.8984 |
BERT_LARGE_CASED(vocab大写,将所有文本降为小写) | 11h20min | 0.8279 | 0.8975 |
BERT_LARGE_CASED(do_lower_case=False)(vocab大写,不需要将所有文本降为小写) | 11h20min | 0.8367 | 0.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",
}
更多推荐
所有评论(0)