谷歌nlp模型的官方tensorflow实现很强,现在,它的pytorch版本来了!只需简单运行一次转换脚本,就可得到一个pytorch模型,且结果与原始版本相近,甚至更好。
上周,谷歌最强nlp模型bert开源了官方tensorflow代码和预训练模型,引起大量关注。
现在,pytorch用户的福利来了:一个名为hugging face的团队近日公开了bert模型的谷歌官方tensorflow库的op-for-op pytorch重新实现:
https://github.com/huggingface/pytorch-pretrained-bert
这个实现可以为bert加载任何预训练的tensorflow checkpoint(特别是谷歌的官方预训练模型),并提供一个转换脚本。
bert-base和bert-large模型的参数数量分别为110m和340m,为了获得良好的性能,很难使用推荐的batch size在单个gpu上对其进行微调。为了帮助微调模型,这个repo还提供了3种可以在微调脚本中激活技术:梯度累积(gradient-accumulation)、multi-gpu和分布式训练。
其结果如下:
在序列级mrpc分类任务上,该实现使用小型bert-base模型再现了原始实现的84%-88%的准确率。
在token级的squad 任务上,该个实现使用小型bert-base模型再现了原始实现的88.52 f1的结果。
作者表示,正致力于在其他任务以及更大的bert模型上重现结果。
bert模型的pytorch实现
这个存储库包含了谷歌bert模型的官方tensorflow存储库的op-for-op pytorch重新实现。谷歌的官方存储库是与bert论文一起发布的:bert: pre-training of deep bidirectional transformers for language understanding,作者是jacob devlin、ming-wei chang、kenton lee和kristina toutanova。
这个实现可以为bert加载任何预训练的tensorflow checkpoint(特别是谷歌的预训练模型),并提供了一个转换脚本(见下文)。
此外,我们将在本周晚些时候添加多语言版本和中文版本的模型代码。
脚本:加载任何tensorflow检查点
使用convert_tf_checkpoint_to_pytorch.py脚本,你可以在pytorch保存文件中转换bert的任何tensorflow检查点(尤其是谷歌发布的官方预训练模型)。
这个脚本将tensorflow checkpoint(以bert_model.ckpt开头的三个文件)和相关的配置文件(bert_config.json)作为输入,并为此配置创建pytorch模型,从pytorch模型的tensorflow checkpoint加载权重并保存生成的模型在一个标准pytorch保存文件中,可以使用 torch.load()导入(请参阅extract_features.py,run_classifier.py和run_squad.py中的示例)。
只需要运行一次这个转换脚本,就可以得到一个pytorch模型。然后,你可以忽略tensorflow checkpoint(以bert_model.ckpt开头的三个文件),但是一定要保留配置文件(bert_config.json)和词汇表文件(vocab.txt),因为pytorch模型也需要这些文件。
要运行这个特定的转换脚本,你需要安装tensorflow和pytorch。该库的其余部分只需要pytorch。
下面是一个预训练的bert-base uncased 模型的转换过程示例:
export bert_base_dir=/path/to/bert/uncased_l-12_h-768_a-12 python convert_tf_checkpoint_to_pytorch.py --tf_checkpoint_path $bert_base_dir/bert_model.ckpt --bert_config_file $bert_base_dir/bert_config.json --pytorch_dump_path $bert_base_dir/pytorch_model.bin
你可以在这里下载google的预训练转换模型:
https://github.com/google-research/bert#pre-trained-models
bert的pytorch模型
在这个库里,我们提供了三个pytorch模型,你可以在modeling.py中找到:
bertmodel- 基本的bert transformer 模型
bertforsequenceclassification- 顶部带有sequence classification head的bert模型
bertforquestionanswering- 顶部带有token classification head 的bert模型,
以下是每类模型的一些细节。
1 . bertmodel
bertmodel是一个基本的bert transformer模型,包含一个summed token、位置和序列嵌入层,然后是一系列相同的self-attention blocks(bert-base是12个blocks, bert-large是24个blocks)。
输入和输出与tensorflow 模型的输入和输出相同。
具体来说,该模型的输入是:
input_ids:一个形状为[batch_size, sequence_length]的torch.longtensor,在词汇表中包含单词的token索引
token_type_ids:形状[batch_size, sequence_length]的可选torch.longtensor,在[0,1]中选择token类型索引。类型0对应于句子a,类型1对应于句子b。
attention_mask:一个可选的torch.longtensor,形状为[batch_size, sequence_length],索引在[0,1]中选择。
模型的输出是由以下内容组成的一个元组:
all_encoder_layers:一个大小为[batch_size, sequence_length,hidden_size]的torch.floattensor列表,它是每个注意块末端隐藏状态的完整序列列表(即bert-base的12个完整序列,bert-large的24个完整序列)
pooled_output:一个大小为[batch_size, hidden_size]的torch.floattensor,它是在与输入(clf)的第一个字符相关联的隐藏状态之上预训练的分类器的输出,用于训练next-sentence任务(参见bert的论文)。
extract_features.py脚本提供了有关如何使用这类模型的示例,该脚本可用于为给定输入提取模型的隐藏状态。
2 . bertforsequenceclassification
bertforsequenceclassification是一个fine-tuning 模型,包括bertmodel,以及bertmodel顶部的一个序列级分类器(sequence-level classifier)。
序列级分类器是一个线性层,它将输入序列中第一个字符的最后隐藏状态作为输入(参见bert论文中的图3a和3b)。
run_classifier.py脚本提供了关于如何使用此类模型的示例,该脚本可用于使用bert微调单个序列(或序列对)分类器,例如用于mrpc任务。
3. bertforquestionanswering
bertforquestionanswering是一个fine-tuning 模型,包括bertmodel,它在最后隐藏状态的完整序列之上具有token级分类器(token-level classifiers)。
token-level 分类器将最后隐藏状态的完整序列作为输入,并为每个token计算得分,(参见bert论文的图3c和3d)。
run_squad.py脚本提供了有关如何使用此类模型的示例,该脚本可用于使用bert微调token分类器,例如用于squad任务。
安装、要求、测试
这段代码在python 3.5+上进行了测试。必备条件是:
pytorch (> = 0.4.1)
tqdm
安装dependencies:
pip install -r ./requirements.txt
测试文件夹中包含一系列测试,可以使用pytest运行(如果需要,请安装pytest: pip install pytest)。
你可以使用以下命令运行测试:
python -m pytest -sv tests/大批量训练:梯度积累、多gpu、分布式训练
bert-base和bert-large的模型参数分别是110m和340m,为了获得良好的性能(大多数情况下批大小是32),很难在单个gpu上对它们进行微调。
为了帮助对这些模型进行微调,我们介绍了在微调脚本run_classifier.py和run_squad中可以激活的四种技术:优化cpu、梯度积累、multi-gpu和分布式训练。
有关如何使用这些技术的更多细节,你可以阅读这篇关于pytorch批量训练技巧的文章:
https://medium.com/huggingface/training-larger-batches-practical-tips-on-1-gpu-multi-gpu-distributed-setups-ec88c3e51255
bert的微调:运行示例
我们展示了与原始实现相同的示例:在mrpc分类语料库上微调sequence级分类器和在问题回答数据集squad上微调token级分类器。
在运行这些示例之前,应该先下载glue数据,并将其解压缩到某个目录$glue_dir。还需下载bert-base checkpoint,将其解压缩到某个目录$bert_base_dir,并将其转换为上一节所述的pytorch版本。
这个示例代码基于微软研究意译语料库(mrpc)调优了bert-base,在单个k-80上运行只需不到10分钟。
export glue_dir=/path/to/glue python run_classifier.py --task_name mrpc --do_train --do_eval --do_lower_case --data_dir $glue_dir/mrpc/ --vocab_file $bert_base_dir/vocab.txt --bert_config_file $bert_base_dir/bert_config.json --init_checkpoint $bert_pytorch_dir/pytorch_model.bin --max_seq_length 128 --train_batch_size 32 --learning_rate 2e-5 --num_train_epochs 3.0 --output_dir /tmp/mrpc_output/
基于原始实现的超参数进行测试,评估结果达到84%到88%。
第二个示例是基于squad问题回答任务微调bert-base。
export squad_dir=/path/to/squad python run_squad.py --vocab_file $bert_base_dir/vocab.txt --bert_config_file $bert_base_dir/bert_config.json --init_checkpoint $bert_pytorch_dir/pytorch_model.bin --do_train --do_predict --do_lower_case --train_file $squad_dir/train-v1.1.json --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 ../debug_squad/
使用之前的超参数进行训练,得到如下结果:
{f1: 88.52381567990474, exact_match: 81.22043519394512}在gpu上微调bert-large
上面列出的选项允许在gpu上很容易地对bert-large进行微调,而不是像原始实现那样使用tpu。
例如,针对squad任务微调bert-large模型,可以在服务器上用4个k-80在18个小时内完成。我们的结果与tensorflow的实现结果相似(实际上是略高):
{exact_match: 84.56953642384106, f1: 91.04028647786927}
为了得到这些结果,我们使用了以下组合:
多gpu训练(在多gpu服务器上自动激活),
梯度累积
在cpu上执行优化步骤,将adam的平均值存储在ram中。
以下是我们在此次运行中使用的超参数的完整列表:
python ./run_squad.py --vocab_file $bert_large_dir/vocab.txt --bert_config_file $bert_large_dir/bert_config.json --init_checkpoint $bert_large_dir/pytorch_model.bin --do_lower_case --do_train --do_predict --train_file $squad_train --predict_file $squad_eval --learning_rate 3e-5 --num_train_epochs 2 --max_seq_length 384 --doc_stride 128 --output_dir $output_dir/bert_large_bsz_24 --train_batch_size 24 --gradient_accumulation_steps 2 --optimize_on_cpu
人工智能会不会成为程序员的终结者?
谷歌宣布将全面推行移动优先索引
日媒:华为投资50亿日元在日本建立工厂
AVR单片机的特性、缺点和应用
未来所有事物都将会装上微型传感器
BERT模型的PyTorch实现
腾讯联合全国11家文博单位共同举行“互联网+中华文明”数字体验展
马达价格引行业阵痛,国产马达的创新之路
X86 ubuntu环境下xenomai内核编译
Ampleon和美的持续合作开发出首个成果固态烤箱
苹果或将于2022年推AR头显 突破AR技术的界限
配电网单相接地故障检测技术与运行方式的变革
超低功耗温度测量与显示方案的详细说明
龙芯3C6000流片交付,自主服务器性能领先
BCB高温无氧烘箱用氧气分析仪
控制的吸引力:楼宇自动化中的磁传感
非对称凝胶聚合物电解质膜,可促进锂离子传输和均匀沉积
小米邀萌妹子代言红米Note4X,魅蓝5S现身闲鱼售价亮眼
LED企业出海遭遇国际纠纷,周密布局应对侵权风险
MAX1393, MAX1396 1.5V至3.6V、312