赞
踩
有关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下。
首先下载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
在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
在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
在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
在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
在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
模型 | 微调时间 | 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 |
有测试文本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",
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。