《谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读》,上周推送的这篇文章,全面解读基于TensorFlow实现的BERT代码。现在,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-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任务。

详情请点击阅读原文


推荐阅读

131页超清 |《2018新一代人工智能白皮书:产业增长点研判》

老鸟程序员才知道的40个小技巧

资源 | 深度学习 & ChatBot全面总结

254页教程《Writing Code for NLP Research》

338页新书《Deep Learning in Natural Language Processing》

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

  1. 【NLP】BERT 模型与中文文本分类实践

    简介 2018年10月11日,Google发布的论文<Pre-training of Deep Bidirectional Transformers for Language Understan ...

  2. [深度学习] 自然语言处理 --- BERT模型原理

    一 BERT简介 NLP:自然语言处理(NLP)是信息时代最重要的技术之一.理解复杂的语言也是人工智能的重要组成部分.Google AI 团队提出的预训练语言模型 BERT(Bidirectional ...

  3. 基于bert模型的文本分类研究:“Predict the Happiness”挑战

    1. 前言 在2018年10月,Google发布了新的语言表示模型BERT-"Bidirectional Encoder Representations from Transformers& ...

  4. python安装bert模型_BERT模型的简单使用(Python)

    不涉及原理,只是快速开始使用 更详细的请参考官方文档 https://bert-as-service.readthedocs.io/en/latest/index.html 下载预训练模型 (下载可能 ...

  5. [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章开启了新的内容--Bert,首先介绍Keras-bert库安装及基础用法及文本分类工作.这篇文章将通过keras- ...

  6. 谷歌原版bert模型tf转pytorch命令

    从TensorFlow 检查点转换 提供了一个命令行界面,用于将原始的Bert/GPT/GPT-2/Transformer-XL/XLNet/XLM检查点转换为可以使用库的from_pretraine ...

  7. 【小白学习PyTorch教程】十六、在多标签分类任务上 微调BERT模型

    @Author:Runsen BERT模型在NLP各项任务中大杀四方,那么我们如何使用这一利器来为我们日常的NLP任务来服务呢?首先介绍使用BERT做文本多标签分类任务. 文本多标签分类是常见的NLP ...

  8. OpenCV转换PyTorch分类模型并使用OpenCV C ++启动

    OpenCV转换PyTorch分类模型并使用OpenCV C ++启动 转换PyTorch分类模型并使用OpenCV C ++启动 目标 简介 要求 实践 模型转换管道 推理管道 转换PyTorch分 ...

  9. Pytorch实现Bert模型

    Pytorch实现Bert模型 一.数据预处理 处理的文本是自定义的对话文本,模仿R和J两人对话 'Hello, how are you? I am Romeo.\n' # R 'Hello, Rom ...

最新文章

  1. Python常用函数与技巧总结(一)
  2. Windows Server 2008R2使用web方式修改域账户密码
  3. C/C++中的近指令、远指针和巨指针
  4. nginx修改默认端口
  5. php100 linux,PHP100精华:很靠谱linux经常使用命令
  6. 端口被占用,怎么解决?
  7. 江苏地区BA还真是慢得很
  8. 关于数据库中的char与varchar
  9. 浅谈es6 promise
  10. Jenkins + Docker 简单部署 node.js 项目
  11. java中的http请求的封装(GET、POST、form表单形式)
  12. macbook连接外接键盘
  13. 北京邮电大学计算机考研信息汇总
  14. 如何防止Tensorflow分配整个GPU内存?
  15. 思考(六十四):游戏中的角色ID问题
  16. React Native引用三方库报错underfined is not an object(evaluating 'viewproptypes.style')
  17. Gos —— 获取物理内存容量
  18. vgg16网络模型的学习理解
  19. java 获取file后缀,Java获取文件后缀的方法
  20. 淘宝直通车为什么要低价引流,低价引流的原理、低价引流的具体操作

热门文章

  1. 淘宝获取单笔订单信息服务端调用API及流程
  2. leetcode:2680 Remove Duplicates from Sorted Array 删除数组中的重复元素
  3. pip 将 某包指定到某目录 批量安装
  4. LeetCode简单题之按既定顺序创建目标数组
  5. CUDA功能和通用功能
  6. 自动调度GPU的卷积层
  7. 2021年大数据Spark(五十一):Structured Streaming 物联网设备数据分析
  8. Dockerfile的详解
  9. 【CV】Anaconda 安装教程|CSDN创作打卡
  10. Android 编译源码 注意事项