Pytorch | BERT模型实现,提供转换脚本【横扫NLP】
《谷歌终于开源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新一代人工智能白皮书:产业增长点研判》
254页教程《Writing Code for NLP Research》
338页新书《Deep Learning in Natural Language Processing》
Pytorch | BERT模型实现,提供转换脚本【横扫NLP】的更多相关文章
- BERT模型源码解析
BERT模型源码解析 modeling.py 目录 属性 类 class BertConfig(object) BERT模型配置参数类 class BertModel(object) BERT ...
- pytorch bert 源码解读
https://daiwk.github.io/posts/nlp-bert.html 目录 概述 BERT 模型架构 Input Representation Pre-training Tasks ...
- Pytorch——BERT 预训练模型及文本分类
BERT 预训练模型及文本分类 介绍 如果你关注自然语言处理技术的发展,那你一定听说过 BERT,它的诞生对自然语言处理领域具有着里程碑式的意义.本次试验将介绍 BERT 的模型结构,以及将其应用于文 ...
- Bert模型实现垃圾邮件分类
近日,对近些年在NLP领域很火的BERT模型进行了学习,并进行实践.今天在这里做一下笔记. 本篇博客包含下列内容: BERT模型简介 概览 BERT模型结构 BERT项目学习及代码走读 项目基本特性介 ...
- BERT模型在多类别文本分类时的precision, recall, f1值的计算
BERT预训练模型在诸多NLP任务中都取得最优的结果.在处理文本分类问题时,即可以直接用BERT模型作为文本分类的模型,也可以将BERT模型的最后层输出的结果作为word embedding导入到我们 ...
- 想研究BERT模型?先看看这篇文章吧!
最近,笔者想研究BERT模型,然而发现想弄懂BERT模型,还得先了解Transformer. 本文尽量贴合Transformer的原论文,但考虑到要易于理解,所以并非逐句翻译,而是根据笔者的个人理解进 ...
- NLP学习(3)---Bert模型
一.BERT模型: 前提:Seq2Seq模型 前提:transformer模型 bert实战教程1 使用BERT生成句向量,BERT做文本分类.文本相似度计算 bert中文分类实践 用bert做中文命 ...
- [NLP自然语言处理]谷歌BERT模型深度解析
我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~ 任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主 ...
- BERT模型图解
转载于 腾讯Bugly 发表于 腾讯Bugly的专栏 原文链接:https://cloud.tencent.com/developer/article/1389555 本文首先介绍BERT模型要做什么 ...
随机推荐
- vue-router+iview(简单例子)
根据上面我们已经建立好的工程项目,我们来加入路由等方法. 首先修改我们的HelloWorld.vue,加入iview的Layout组件 第二步,建立两个我们对应路由的文件 <style scop ...
- Axure之添加点击页面
添加悬停字体变色的效果 页面载入时的频道预设(我做错了,英文版本不知道那个是页面载入时的事件) 我的博客不够完善,看不到全部的图片.我后续会修改我的网站的
- Django项目:CRM(客户关系管理系统)--11--04PerfectCRM实现King_admin注册功能03
#base_admin.py #Django admin 注册功能的形式 # sites = { # 'crm':{ # 'customers':CustomerAdmin, # 'customerf ...
- 你真的了解HTML吗
有这么一段HTML,请挑毛病: <P> 哥写的不是HTML,是寂寞.<br><br> 我说: <br>不要迷恋哥,哥只是一个传说 这是原来雅虎一道笔试题 ...
- 使用Gradle构建项目
使用gradle构建项目之前,咱们先聊聊maven,使用maven构建项目和配置主要 接下来正式使用gradle来构建项目的和步骤: 1.下载源码 2.下载gradle 1.下载地址:https:// ...
- Vue. 之 npm安装Element
Vue. 之 npm安装Element 前提: 相关运行环境以搭建完成,例如:Node.Npm等. 假如我的项目目录如下: D:\DISK WORKSPACE\VSCODE\CDS\cds-ap ...
- java 3 接口与多态&输入输出流
接口 中的所有方法都是方法 抽象 使用接口实现多继承 类型的装换 数据成员就变成了static 和 final food 和 snow 都是可以吃的 可以同时实现多个接口 接口与接口之间也可以有继承关 ...
- SPSS详细操作:生存资料的Cox回归分析
SPSS详细操作:生存资料的Cox回归分析 一.问题与数据 某研究者拟观察某新药的抗肿瘤效果,将70名肺癌患者随机分为两组,分别采用该新药和常规药物进行治疗,观察两组肺癌患者的生存情况,共随访2年.研 ...
- 【JZOJ4910】【NOIP2017模拟12.3】子串
题目描述 数据范围 =w= 暴力: 从前往后枚举一个i,再从前往后枚举一个j: 如果s[i]不是s[j]的子串,更新答案,继续枚举: 如果s[i]是s[j]的子串,停止枚举. 因为对于s[k] (k& ...
- oracle-ORA-01650错误
Unable to extend rollback segment 原因:没有足够的撤销空间用来处理所有活动事务