Pytorch | BERT模型实现,提供转换脚本【横扫NLP】

源 | GitHub 编译 | 肖琴 首发 | 新智元

谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读》,上周推送的这篇文章,全面解读基于TensorFlow实现的BERT代码。现在,PyTorch用户的福利来了:一个名为Hugging Face的团队近日公开了BERT模型的谷歌官方TensorFlow库的op-for-op PyTorch重新实现【点击阅读原文直接访问】

https://github.com/huggingface/pytorch-pretrained-BERT

这个实现可以为BERT加载任何预训练的TensorFlow checkpoint(特别是谷歌的官方预训练模型),并提供一个转换脚本

BERT-baseBERT-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-12python 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学习(guodongwei1991)

原文发表时间:2018-11-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

心中无码:这是一个能自动脑补漫画空缺部分的AI项目

本文将简要介绍这项研究与 DeepCreamPy 实现项目,读者可下载项目代码或预构建的二进制文件,并尝试修复漫画图像或马赛克。这一个项目可以直接使用 CPU ...

1003
来自专栏计算机视觉战队

稀疏&集成的卷积神经网络学习(续)

昨天跟大家详细的说了分类,定位的一些相关知识,今天把剩下的最后一点知识给大家补充完整,也感谢大家一直的支持,谢谢! 昨天的推送告诉大家了分类方案,我们再温习一...

3026
来自专栏Python中文社区

基于RNN自动生成古诗

專 欄 ❈ 作者:yonggege,Python中文社区专栏作者 GitHub地址:https://github.com/wzyonggege ❈ 0. ch...

2635
来自专栏专知

在浏览器上也能训练神经网络?TensorFlow.js带你玩游戏~

【导读】一直以来训练神经网络给我们的印象都是复杂、耗时、对硬件要求高。你有没有想过有一天在浏览器上也能训练神经网络~ 本文通过一篇详细的TensorFlow.j...

1300
来自专栏大数据挖掘DT机器学习

解析Tensorflow官方PTB模型的demo

RNN 模型作为一个可以学习时间序列的模型被认为是深度学习中比较重要的一类模型。在Tensorflow的官方教程中,有两个与之相关的模型被实现出来。第一个模型...

3998
来自专栏iOSDevLog

Core ML 2有什么新功能

Core ML是Apple的机器学习框架。仅在一年前发布,Core ML为开发人员提供了一种方法,只需几行代码即可将强大的智能机器学习功能集成到他们的应用程序中...

882
来自专栏PaddlePaddle

转载|在TensorFlow和PaddleFluid中使用多块GPU卡进行训练

前四篇文章我们介绍了 PaddleFluid 和 TensorFlow 的设计原理基本使用概念,分别通过在两个平台上实现完全相同的模型完成图像分类,语言模型和序...

1523
来自专栏Pytorch实践

Tensorflow常见模型及工程化方法

Tensorflow在深度学习模型研究中起到了很大的促进作用,灵活的框架免去了研究人员、开发者大量的自动求导代码工作。本文总结一下常用的模型代码和工程化需要的代...

2696
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 5 - TensorFlow轻松搞定线性回归

上一篇 第一个机器学习问题 其实是一个线性回归问题(Linear Regression),呈现了用数据来训练模型的具体方式。本篇从平行世界返回,利用Tenso...

3788
来自专栏王嘉的专栏

安全 AI 的智能对抗系统之架构实现篇

在AI的浪潮下,在现有的安全系统的基础上,SNG业务安全中心将机器学习应用到业务安全对抗中,自研建设并搭建了 – 安全AI的智能对抗系统。智能对抗系统现已应用在...

1.1K0

扫码关注云+社区