【新智元指南】Google NLP模型的官方TensorFlow实现非常强大。现在,它的PyTorch版本来了!只需简单运行一次转换脚本就可以得到一个PyTorch模型,结果和原版本差不多甚至更好。
上周,谷歌最强的NLP模型BERT开放了官方的TensorFlow代码和预训练模型,引起了很多关注。
现在,PyTorch用户的福利来了:一个叫拥抱脸的团队最近披露了谷歌官方的TensorFlow library of BERT模型的op-for-op PyTorch的重新实现:
https://github.com/huggingface/pytorch-pretrained-BERT
这个实现可以为BERT加载任何预先训练好的TensorFlow检查点(尤其是Google的官方预训练模型),并提供一个转换脚本。
BERT基和BERT大模型的参数分别为110M和340M。为了获得良好的性能,很难在单个GPU上使用推荐的批处理大小来微调它们。为了帮助微调模型,回购还提供了三种可以在微调脚本中激活的技术:梯度累积、多GPU和分布式训练。
结果如下:
在序列级MRPC分类任务上,该实现使用小型BERT-base模型再现了原始实现的84%-88%的准确率。在token级的SQuAD 任务上,该个实现使用小型BERT-base模型再现了原始实现的88.52 F1的结果。作者指出,他正在努力复制其他任务的结果和一个更大的BERT模型。
BERT模型的PyTorch实现
这个存储库包含了Google BERT模型的官方TensorFlow存储库的op-for-op PyTorch的重新实现。谷歌的官方知识库与Bert的论文《BERT:用于语言理解的深度双向变形金刚的预训练》一起出版,作者是雅各布·德夫林(Jacob Devlin)、张明伟(Ming-Wei Chang)、肯顿·李(Kenton Lee)和克里斯蒂娜·图塔诺娃(Kristina Toutanova)。
这个实现可以为BERT(尤其是Google的预训练模型)加载任何预训练的TensorFlow检查点,并提供一个转换脚本(见下文)。
此外,我们将在本周晚些时候添加模型代码的多语言版本和中文版本。
脚本:加载任何张量流检查点
使用convert _ TF _ check point _ to _ PyTorch . py脚本,可以转换py torch保存文件(尤其是Google发布的官方预训练模型)中BERT的任何TensorFlow检查点。
这个脚本以TensorFlow检查点(三个文件,以bert_model.ckpt开头)和相关的配置文件(bert_config.json)为输入,为这个配置创建PyTorch模型。从PyTorch模型的TensorFlow检查点加载权重,并将生成的模型保存在标准的PyTorch保存文件中,该文件可以通过torch.load()导入(参见extract_features.py、run_classifier.py、run_squad.py中的示例)。
您只需要运行这个转换脚本一次,就可以得到一个PyTorch模型。然后,可以忽略TensorFlow检查点(以bert_model.ckpt开头的三个文件),但是一定要保留配置文件(bert_config.json)和词汇文件(vocab.txt),因为PyTorch模型也需要这些文件。
要运行这个特定的转换脚本,您需要安装TensorFlow和PyTorch。图书馆的其余部分只需要PyTorch。
以下是一个预先训练的BERT-Base未封闭模型的转换过程示例:
export BErt _ BASE _ DIR =/path/to/BERT/uncased _ L-12 _ H-768 _ A-12 Tyson convert _ TF _ check point _ to _ py torch . py-TF _ check point _ path $ BERT _ BASE _ DIR/BERT _ model . ckpt-BERT _ config _ file $ BERT _ BASE _ DIR/BERT _ config . JSON-py torch _ dump _ path $ BERT _ BASE _ DIR/py torch _ model bin。
您可以在此下载谷歌的培训前转型模型:
https://github.com/google-research/bert#pre-trained-models
伯特的PyTorch模型
在这个库中,我们提供了三个PyTorch模型,可以在modeling.py中找到:
BertModel - 基本的BERT Transformer 模型BertForSequenceClassification - 顶部带有sequence classification head的BERT模型BertForQuestionAnswering - 顶部带有token classification head 的BERT模型,以下是每个模型的一些细节。
1 .BertModel
BertModel是一个基本的BERT Transformer模型,它包括一个求和点、位置和序列嵌入层,然后是一系列相同的自关注块(BERT-base是12块,BERT-large是24块)。
输入和输出与张量流模型相同。
具体来说,这个模型的输入是:
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
BertforseSequenceClassification是一个微调模型,它包括BertModel和BertModel顶部的序列级分类器。
序列级分类器是一个线性层,它将输入序列中第一个字符的最后一个隐藏状态作为输入(参见BERT论文中的图3a和3b)。
run_classifier.py脚本提供了一个如何使用这种模型的例子,它可以用来使用BERT微调单个序列(或序列对)分类器,例如,对于MRPC任务。
3.问题回答
BertForQuestionAnswering是一个微调模型,包括BertModel,它在最后一个隐藏状态的完整序列上有令牌级分类器。
令牌级分类器将最后一个隐藏状态的完整序列作为输入,并计算每个令牌的分数(参见BERT论文的图3c和3d)。
run _ can . py脚本提供了一个如何使用这个模型的例子,它可以用来使用BERT来微调令牌分类器,例如,对于SCAnD任务。
安装、要求、测试
这段代码已经在Python 3.5+上测试过。先决条件是:
PyTorch (> = 0.4.1)tqdm要安装依赖项:
pip install -r ./requirements.txt
测试文件夹包含一系列可以使用pytest运行的测试(如有必要,安装pytest: pip安装pytest)。
您可以使用以下命令运行测试:
python -m pytest -sv测试/
大规模训练:梯度积累,多GPU,分布式训练
BERT-base和BERT-large的模型参数分别为110M和340M。为了获得良好的性能(大多数情况下批量为32),很难在单个GPU上对其进行微调。
为了帮助微调这些模型,我们引入了四种可以在微调脚本run_classifier.py和run _ squad中激活的技术:优化CPU、梯度累加、多gpu和分布式训练。
有关如何使用这些技术的更多详细信息,您可以阅读这篇关于PyTorch批处理培训技能的文章:
https://medium . com/huging face/training-big-batters-practical-tips-on-1-GPU-multi-GPU-distributed-setups-EC 88 C3 e 51255
微调BERT:运行示例
我们展示了与原始实现相同的示例:微调MRPC分类语料库上的序列分类器,以及微调问答数据集“小队”上的令牌分类器。
在运行这些示例之前,您应该下载GLUE数据并将其提取到目录$GLUE_DIR中。您还需要下载BERT-Base检查点,将其提取到一个目录$BERT_BASE_DIR,并将其转换为上一节中描述的PyTorch版本。
这个示例代码是基于微软研究自由翻译语料库(MRPC)和优化的BERT-Base。在单个K-80上运行不到10分钟。
exportGLUE _ 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 _ check point $ BERT _ PYTORCH _ DIR/py TORCH _ model . bin-max _ seq _ length 128-train _ batch _ size 32-learning _ rate-5
基于原始超参数,评价结果达到84%-88%。
第二个例子是基于班长问答任务微调BERT-Base。
export SKBall _ DIR =/path/to/SKBallPYTHON run _ SKBall . py-vocab _ file $ BERT _ BASE _ DIR/vocab . txt-BERT _ config _ file $ BERT _ BASE _ DIR/BERT _ config . JSON-init _ check point $ BERT _ PYTORCH _ DIR/py TORCH _ model . bin-do _ train-do _ predict-do _ lower _ case-train _ file $ FACTB _ DIR/train-v 1 . JSON-TRAIN _ batch _ size../debug _班长/
使用以前的超参数进行训练,可以获得以下结果:
{“f1”:88.52381567990474,“精确匹配”:81.22043519394512}
在图形处理器上调谐BERT-大
上面列出的选项允许BERT-large在GPU上轻松微调,而不是像最初的实现那样使用TPU。
例如,在服务器上使用4 k-80 s,可以在18小时内完成对with任务的BERT-大型模型的微调。我们的结果与张量流的结果相似(实际上略高):
{“精确_匹配”:84.56953642384106,“f1”:91.04028647786927
为了获得这些结果,我们使用了以下组合:
多GPU训练(在多GPU服务器上自动激活),梯度累积在CPU上执行优化步骤,将Adam的平均值存储在RAM中。以下是我们在本次运行中使用的超参数的完整列表:
python。/run _ SCANDLE . py-VOC ab _ file $ BERT _ LARGE _ DIR/VOC ab . txt-BERT _ config _ file $ BERT _ LARGE _ DIR/BERT _ config . JSON-init _ check point $ BERT _ LARGE _ DIR/py torch _ model . bin-do _ lower _ case-do _ TRAIN-do _ predict-TRAIN _ file $ SCANDLE _ predict _ file $ SCANDLE _ EVAL-learning _ rate 3 e-5-num _ TRAIN _ epochs 2-max _ seq _ length 384-doc _ stride 128-OUTPUT _ DIR
阅读更多:
1.《answering 横扫各项NLP任务的BERT模型有了PyTorch实现!提供转换脚本》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《answering 横扫各项NLP任务的BERT模型有了PyTorch实现!提供转换脚本》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/1031285.html