pytorch版本的google-ai-bert模型,带有加载google预先训练的模型的脚本

pytorch-pretrained-bert的Python项目详细描述


Pythorch Pretrained Bert:预培训变压器的大型扩展存储库

circleci

此存储库包含Op Pythorch重新实现的操作、预先培训的模型和微调示例:

这些实现已经在几个数据集上进行了测试(参见示例),并且应该与相关的TensorFlow实现的性能相匹配(例如,Bert的Squad上约91 F1,OpenAI GPT的Rocstories上约88 F1,Transformer XL的WikiText 103上约18.3困惑)。您可以在下面的示例部分中找到更多详细信息。

以下是这些型号的一些信息:

伯特与雅各布·德夫林、张明伟、李肯顿和克里斯蒂娜·图塔诺娃的论文《伯特:深层双向变形金刚语言理解预培训》一起发布。 Bert的Pythorch实现提供了Google的预训练模型、示例、笔记本和命令行界面,用于加载Bert的任何预训练TensorFlow检查点。

openai gpt与alec radford、karthik narasimhan、tim salimans和ilya sutskever的论文一起发布。 openai gpt的pytorch实现是对huggingface的pytorch实现的一个改编,它与openai的预先训练的模型和用于转换pytorch中预先训练的numpy检查点的命令行界面。

google/cmu的transformer xl与论文《transformer xl:attentive language models beyond a fixed length context》一起发布拉克胡迪诺夫。 transformer xl的pytorch实现是对原来的pytorch实现的一个改编,pytorch实现经过了轻微的修改以匹配tensorflow实现的性能并允许重新使用pretrainED砝码。提供了一个命令行界面,用于转换pytorch模型中的tensorflow检查点。

OpenAI GPT-2与论文一起发布,该论文由Alec Radford*、Jeffrey Wu*、Rewon Child、David Luan、Dario Amodei**和Ilya Sutskever*撰写,作者是:语言模型是无监督的多任务学习者。 openai gpt-2的pytorch实现是对openai实现的一个改编,它提供了openai的预先训练模型和一个命令。-用于转换pytorch中tensorflow检查点的行接口。

内容

<表><广告>节 说明 < /广告><正文>安装如何安装软件包概述套餐概述用法快速启动示例文档详细文档示例关于如何微调bert的详细示例笔记本介绍提供的Jupyter笔记本电脑tpu关于TPU支持和预培训脚本的说明命令行界面在pytorch转储中转换tensorflow检查点

安装

此repo在python 2.7和3.5+上进行了测试(示例仅在python 3.5+和pytorch 0.4.1/1.0.0上进行测试

具有PIP

Pythorch预培训的BERT可由PIP安装,如下所示:

pip install pytorch-pretrained-bert

如果您想重现openai gpt文件的原始标记化过程,则需要安装ftfy(如果您使用的是python 2,则限制为4.4.3版)和spacy

pip install spacy ftfy==4.4.3
python -m spacy download en

如果不安装ftfyspacy,则openai gpt标记器将默认使用bert的basictokenizer和字节对编码进行标记(这对大多数使用来说应该很好,不用担心)。

来源

克隆存储库并运行:

pip install [--editable] .

此外,如果您想重现openai gpt模型的原始标记化过程,则需要安装ftfy(如果您使用的是python 2,则限制为4.4.3版)和spacy

pip install spacy ftfy==4.4.3
python -m spacy download en

同样,如果您不安装ftfyspacy,则openai gpt标记器将默认使用bert的basictokenizer和字节对编码(这对大多数使用来说应该很好)进行标记化。

一系列测试包含在测试文件夹中,可以使用pytest运行(如果需要,请安装pytest:pip install pytest)。

您可以使用以下命令运行测试:

python -m pytest -sv tests/

概述

此软件包包含以下类,这些类可以用python导入,并在本自述文件的doc部分中详细说明:

  • 八个带有预先训练重量的Pythorch模型(torch.nn.module)(在modeling.py文件中):

    • bert model-原始bert变压器模型(完全预先培训的),
    • bertformaskedlm-bert transformer带有预先训练的蒙面语言建模头(完全预先训练的),
    • bertfornextsentencepredition-bert transformer,上面有预先训练的下一个句子预测分类器(完全预先训练的),
    • bertforpretraining-带屏蔽语言建模头和下一个句子预测分类器的bert transformer(完全预先训练>)
    • bertforsequenceclassification-顶部有序列分类头的bert transformer(bert transformer是预先训练的,序列分类头仅初始化,必须训练),
    • bertformultiplechoice-顶部有多选头的bert transformer(用于swag之类的任务)(bert transformer是预先训练的,多选分类头仅初始化且必须训练,
    • bertfortokenclassification-顶部带有令牌分类头的bert transformer(bert transformer是预先训练的,令牌分类头仅初始化,必须训练),
    • bertforquestionanswering-顶部有令牌分类头的bert transformer(bert transformer是预先训练的,令牌分类头仅初始化,必须训练)。
  • 三个带预先训练重量的Pythorch模型(torch.nn.module)(在modeling\u openai.py文件中):

    • openai gpt model-原始openai gpt transformer模型(完全预先训练的),
    • openaigptlmheadmodel-openai gpt transformer,顶部是绑定语言建模头(完全预先训练的),
    • openai gpt doubleheadsmodel-openai gpt transformer具有绑定的语言建模头和顶部的多项选择分类头(openai gpt transformer是预先训练的,多项选择分类头仅为ini已初始化,必须接受培训),
  • 两个带有预先训练重量的Pythorch模型(torch.nn.module)(在modeling_transfo_xl.py文件中):

    • transfo xl model-transformer xl model,输出最后一个隐藏的状态和存储单元(完全预先训练的),
    • transfoxllmheadmodel-transformer xl顶部带有绑定的自适应SoftMax头,用于语言建模,输出登录/丢失和存储单元(完全预先训练的),
  • 三个带预先训练重量的Pythorch模型(torch.nn.module)(在modeling\u gpt2.py文件中):

    • gpt2模型-原始openai gpt-2变压器模型(完全预先培训的),
    • gpt2lmheadmodel-openai gpt-2 transformer,顶部是绑定语言建模头(完全预先训练的),
    • gpt2doubleheadsmodel-openai gpt-2变压器h绑定语言建模头和顶部的多项选择分类头(openai gpt-2 transformer是预先训练的,多项选择分类头只初始化,必须训练),
  • 用于bert(使用词条)的标记器(在标记化.py文件中):

    • basictokenizer-基本标记化(标点符号拆分、小写等),
    • wordpiecetokener-wordpiece标记化,
    • bertokenizer-执行端到端的标记化,即基本标记化,然后是字块标记化。
  • 用于openai gpt的标记赋予器(使用字节对编码)(在标记化_openai.py文件中):

    • openaigptokenizer-执行字节对编码(bpe)标记化。
  • 用于transformer xl的标记赋予器(自适应softmax按频率排序的单词标记)(在标记化_transfo_xl.py文件中):

    • openaigptokenizer-执行单词标记化,并可以按频率在语料库中对单词进行排序,以便在自适应softmax中使用。
  • 用于openai gpt-2的标记化器(使用字节级字节对编码)(在tokenization\u gpt2.py文件中):

    • gpt2tokenizer-执行字节级字节对编码(bpe)标记化。
  • 用于bert的优化器(在optimization.py文件中):

    • bert adam-adam算法的bert版本,具有权值衰减修正、预热和学习率的线性衰减。
  • 用于openai gpt的优化器(在optimization_openai.py文件中):

    • openai adam-openai gpt版本的adam算法,具有权值衰减修正、预热和学习率线性衰减。
  • bert、openai gpt和transformer xl的配置类(分别位于modeling.pymodeling_openai.pymodeling_transfo_xl.py文件:

    • bertconfig-用于存储bertmodel配置的配置类,以及用于从json配置文件读取和写入的实用程序。
    • openaigptconfig-用于存储openaigptmodel的配置的配置类,以及用于读取和写入json配置文件的实用程序。
    • gpt2config-用于存储gpt2模型配置的配置类,以及用于从json配置文件读取和写入的实用程序。
    • transforxlconfig-配置类,用于存储transforxlmodel的配置,以及用于从json配置文件读取和写入的实用程序。

存储库还包括:

用法

伯特

下面是一个使用bertokenizerbert modelbertformaskedlm类和google ai的预先训练的bert base uncased模型的快速开始示例。有关这些类的所有详细信息,请参见下面的文档部分。

首先,让我们使用bertokenizer

准备一个标记化输入
importtorchfrompytorch_pretrained_bertimportBertTokenizer,BertModel,BertForMaskedLM# OPTIONAL: if you want to have more information on what's happening, activate the logger as followsimportlogginglogging.basicConfig(level=logging.INFO)# Load pre-trained model tokenizer (vocabulary)tokenizer=BertTokenizer.from_pretrained('bert-base-uncased')# Tokenized inputtext="[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"tokenized_text=tokenizer.tokenize(text)# Mask a token that we will try to predict back with `BertForMaskedLM`masked_index=8tokenized_text[masked_index]='[MASK]'asserttokenized_text==['[CLS]','who','was','jim','henson','?','[SEP]','jim','[MASK]','was','a','puppet','##eer','[SEP]']# Convert token to vocabulary indicesindexed_tokens=tokenizer.convert_tokens_to_ids(tokenized_text)# Define sentence A and B indices associated to 1st and 2nd sentences (see paper)segments_ids=[0,0,0,0,0,0,0,1,1,1,1,1,1,1]# Convert inputs to PyTorch tensorstokens_tensor=torch.tensor([indexed_tokens])segments_tensors=torch.tensor([segments_ids])

让我们看看如何使用bertmodel获取隐藏状态

# Load pre-trained model (weights)model=BertModel.from_pretrained('bert-base-uncased')model.eval()# If you have a GPU, put everything on cudatokens_tensor=tokens_tensor.to('cuda')segments_tensors=segments_tensors.to('cuda')model.to('cuda')# Predict hidden states features for each layerwithtorch.no_grad():encoded_layers,_=model(tokens_tensor,segments_tensors)# We have a hidden states for each of the 12 layers in model bert-base-uncasedassertlen(encoded_layers)==12

以及如何使用bertformaskedlm

# Load pre-trained model (weights)model=BertForMaskedLM.from_pretrained('bert-base-uncased')model.eval()# If you have a GPU, put everything on cudatokens_tensor=tokens_tensor.to('cuda')segments_tensors=segments_tensors.to('cuda')model.to('cuda')# Predict all tokenswithtorch.no_grad():predictions=model(tokens_tensor,segments_tensors)# confirm we were able to predict 'henson'predicted_index=torch.argmax(predictions[0,masked_index]).item()predicted_token=tokenizer.convert_ids_to_tokens([predicted_index])[0]assertpredicted_token=='henson'

openai gpt

下面是一个使用openaigptto的快速入门示例kenizeropenaigptmodelopenaigptmheadmodel使用openai的预训练模型初始化。有关这些类的所有详细信息,请参见下面的文档部分。

首先,让我们使用openaigptokenizer

importtorchfrompytorch_pretrained_bertimportOpenAIGPTTokenizer,OpenAIGPTModel,OpenAIGPTLMHeadModel# OPTIONAL: if you want to have more information on what's happening, activate the logger as followsimportlogginglogging.basicConfig(level=logging.INFO)# Load pre-trained model tokenizer (vocabulary)tokenizer=OpenAIGPTTokenizer.from_pretrained('openai-gpt')# Tokenized inputtext="Who was Jim Henson ? Jim Henson was a puppeteer"tokenized_text=tokenizer.tokenize(text)# Convert token to vocabulary indicesindexed_tokens=tokenizer.convert_tokens_to_ids(tokenized_text)# Convert inputs to PyTorch tensorstokens_tensor=torch.tensor([indexed_tokens])

让我们看看如何使用openaigptmodel获取隐藏状态

pip install pytorch-pretrained-bert
0

以及如何使用openaigptlmheadmodel

pip install pytorch-pretrained-bert
1

变压器XL

下面是一个使用transforxltokenizertransforxlmodeltransforxlmodellmheadmodel类的快速启动示例,其中transformer xl模型已在wikitext-103上预训练。有关这些类的所有详细信息,请参见下面的文档部分。

首先,让我们准备一个带标记的输入

pip install pytorch-pretrained-bert
2

让我们看看如何使用transfoxlmodel获取隐藏状态

pip install pytorch-pretrained-bert
3

以及如何使用transforxllmheadmodel

pip install pytorch-pretrained-bert
4

OpenAI GPT-2

下面是一个使用gpt2tokenizergpt2modelgpt2lmheadmodel类和openai的预训练模型的快速启动示例。有关这些类的所有详细信息,请参见下面的文档部分。

首先,让我们准备一个带有gpt2tokenizer的标记化输入

pip install pytorch-pretrained-bert
5

让我们看看如何使用gpt2model获取隐藏状态

pip install pytorch-pretrained-bert
6

以及如何使用gpt2lmheadmodel

pip install pytorch-pretrained-bert
7

DOC

下面是包中类的详细文档,以及如何使用它们:

<表><广告>小节 说明 < /广告><正文>
加载预先训练的权重如何加载google ai/openai的预先训练权重或pytorch保存的实例序列化最佳实践如何保存和重新加载经过微调的模型配置bert、gpt、gpt-2和transformer xl的配置类的api型号bert、gpt、gpt-2和transformer xl的pytorch模型类的api 标记器 bert、gpt、gpt-2和transformer xl的tokenizers类的api优化程序 优化器的api

加载google ai或openai预先训练的权重或pytorch转储

要加载google ai、openai的预训练模型或pytorch保存的模型(使用torch.save()保存的bertforpretraining实例),pytorch模型类和标记器可以实例化为

pip install pytorch-pretrained-bert
8

< < /P>

uncased表示文本在字块标记化之前已被小写,例如,john smith变为john smith。无基础模型也会去掉任何重音标记。大小写表示保留真正的大小写和重音标记。通常,无基础模型更好,除非您知道案例信息对您的任务很重要(例如,命名实体识别或词性标记)。有关多语言和中文模型的信息,请参阅多语言自述文件或原始TensorFlow存储库。

在使用无基础模型时,请确保将--do庠lower庠case传递给示例训练脚本(或者如果使用自己的脚本并加载标记器,则将do庠lower庠case=true传递给fulltokenizer)。

示例:

pip install pytorch-pretrained-bert
9

序列化最佳实践

本节解释如何保存和重新加载微调模型(bert、gpt、gpt-2和transformer xl)。 要重新加载经过微调的模型,需要保存三种类型的文件:

  • 应在pytorch序列化之后保存的模型it self
  • 保存为json文件的模型配置文件,以及
  • 词汇表(以及基于bpe的gpt和gpt-2模型的合并)。

下面是将模型、配置和词汇表保存到output目录并重新加载e模型和之后的标记器:

pip install spacy ftfy==4.4.3
python -m spacy download en
0

如果要为每种类型的文件使用特定路径,可以使用另一种方法保存和重新加载模型:

pip install spacy ftfy==4.4.3
python -m spacy download en
1

配置

模型(bert、gpt、gpt-2和transformer xl)是根据配置类定义和构建的,配置类包含模型的参数(层数、维度…)和一些从json配置文件读写的实用程序。相应的配置类别为:

  • bertconfig用于bertmodel和bert类实例。
  • openaigptconfigforopenaigptmodel和openai gpt类实例。
  • gpt2config用于gpt2model和openai gpt-2类实例。
  • transfoxlconfig用于transfoxlmodel和transformer xl类实例。

这些配置类包含一些用于加载和保存配置的实用程序:

  • from_dict(cls,json_object):从python参数字典构造配置的类方法。返回配置类的实例。
  • from_json_file(cls,json_file):一个类方法,用于从参数的json文件构造配置。返回配置类的实例。
  • to_dict():将实例序列化到python字典。返回字典。
  • to_json_string():将实例序列化为json字符串。返回字符串。
  • 到json文件(json文件路径):将实例保存到json文件。

型号

<H4>1。bertmodel

bert model是基本的bert变换器模型,它有一层加总的令牌、位置和序列嵌入,然后是一系列相同的自关注块(bert base为12,bert large为24)。

输入和输出与tensorflow模型的输入和输出相同。

我们在这里详述。该模型采用输入: 建模.py

  • 输入id:torch.longtensor,形状为[batch_size,sequence_length],词汇表中有单词标记索引(请参阅脚本中的标记预处理逻辑extract_features.py运行_classifier.py运行_ad.py),以及
  • 令牌类型id:可选的torch.longtensor形状[批量大小,序列长度],令牌类型索引在[0,1]中选定。类型0对应于a句子a而类型1对应于a句子b标记(有关更多详细信息,请参阅bert论文)。
  • 注意遮罩:可选的torch.longtensor形状[批量大小,序列长度],索引在[0,1]中选定。如果某些输入序列长度小于当前批的最大输入序列长度,则使用此掩码。当一个批次有不同长度的句子时,我们通常用它来吸引注意力。
  • output_all_encoded_layers:控制encoded_layers输出内容的布尔值,如下所述。默认值:true

该模型输出一个元组,元组由:

  • 编码层:由输出编码层的值控制参数:

    • output_all_encoded撸u layers=true:输出每个注意块末尾的编码隐藏状态列表(即12个完整序列用于bert base,24个用于bert large),每个编码隐藏状态是大小为[批量大小,序列长度,隐藏大小]的torch.floattensor,
    • 输出所有编码层=FALse:只输出与最后一个注意块对应的编码隐藏状态,即单个大小为[批量大小,序列长度,隐藏大小]的torch.floattensor,
  • 池输出:一个大小为[批处理大小,隐藏大小]的torch.floattensor,它是在与输入的第一个字符相关联的隐藏状态(clf)上预先训练的分类器的输出,用于训练下一个句子任务(参见bert的论文)。

有关如何使用此类的示例,请参见可用于提取给定输入的模型隐藏状态的脚本。 <H4>2。bertforpretraining

bertforpretraining包括bertmodel变压器,然后是两个预培训主管:

  • 蒙面语言建模头,和
  • 下一个句子分类标题。

输入包括bertmodel类的输入和两个可选标签:

  • 蒙版lmu标签:蒙版语言建模标签:torch.longtensor of shape[批量大小,序列长度],索引选择在[-1,0,…,声音大小]。所有设置为-1的标签都将被忽略(屏蔽),仅计算在[0,…,vocab_size]中设置的标签的损失。
  • 下一个句子标签:下一个句子分类丢失:torch.longtensor形状[批量大小],索引在[0,1]中选定。0=>;下一句是续句,1=>;下一句是随机句。

输出

  • 如果蒙面语言标签下一个句子标签不是:输出总损失,即蒙面语言建模损失和下一个句子分类损失之和。

  • 如果屏蔽lmu标签下一个句子标签:输出包含

    • 蒙面语言建模登录,和
    • 下一个句子分类登录。

关于如何使用这个类的一个例子,请参见可以用于在特定的不同文本语料库上微调bert语言模型的脚本。如果语言风格与原始的bert训练语料库(wiki+bookcorpus)不同,这将提高模型性能。

<H4>3。bertformaskedlm

bertformaskedlm包括bertmodel转换器和(可能的)经过预培训的蒙面语言建模主管。

输入包括输入

  • 蒙版lmu标签:蒙版语言建模标签:torch.longtensor of shape[批量大小,序列长度],索引选择在[-1,0,…,声音大小]。所有设置为-1的标签都将被忽略(屏蔽),仅计算在[0,…,vocab_size]中设置的标签的损失。

输出

  • 如果屏蔽语言标签不是:输出屏蔽语言建模丢失。
  • 如果屏蔽语言标签无:则输出屏蔽语言建模登录。
<H4>4。bertfornextsentencepredition

bertfornextsentencepredition包括bertmodel转换器,后跟下一个句子分类标题。

输入包括输入bertmodel类和可选标签:

  • 下一个句子标签:下一个句子分类丢失:torch.longtensor的形状[批量大小]在[0,1]中选择的索引。0=>;下一句是续句,1=>;下一句是随机句。

输出

  • 如果下一个句子标签不是:输出下一个句子分类丢失。
  • 如果下一个句子标签:输出下一个句子分类登录。
<H4>5。bertforsequenceclassification

bertforsequenceclassification是一个微调模型,它包括bertmodel和位于bertmodel之上的序列级(序列或序列对)分类器。

序列级分类器是一个线性层,它将输入序列中第一个字符的最后一个隐藏状态作为输入(参见bert论文中的图3a和3b)。

有关如何使用此类的示例,请参见run_classifier.py脚本,该脚本可用于使用bert微调单个序列(或序列对)分类器,例如用于mrpc任务。

<H4>6。bertformultiplechoice

bertformultiplechoice是一个微调模型,它包括bertmodelbertmodel上的线性层。

线性层为多项选择问题的每一个选择输出一个值,然后与实例对应的所有输出都通过一个softmax来获得模型选择。

这个实现很大程度上受到了openai的启发,它通过生成性的预训练来提高语言理解能力。t/issues/38" rel="nofollow">问题

关于如何使用这个类的示例,请参见run_swag.py脚本,该脚本可用于使用bert微调多项选择分类器,例如用于swag任务。

<H4>7。Bertfortokenclassification

bertfortokenclassification是一个微调模型,它包括bertmodel和位于bertmodel之上的令牌级分类器

令牌级分类器是一个线性层,它接收序列的最后一个隐藏状态作为输入。

<H4>8。bertforquestionanswering

bertforquestionanswering是一个微调模型,它包括bertmodel和一个令牌级别的分类器,它们位于最后隐藏状态的完整序列之上。

令牌级分类器将最后一个隐藏状态的完整序列作为输入,并为每个令牌计算几个(例如两个)分数,这些分数可以分别是给定令牌是一个开始/code>和一个结束/code>令牌的分数(参见伯特纸)。

有关如何使用此类的示例,请参见run戋squad.py脚本,该脚本可用于使用bert微调令牌分类器,例如,对于squad任务。

<H4>9。openaigptmodel

openai gpt model是一个基本的openai gpt转换器模型,它有一层总和标记和位置嵌入,然后是一系列12个相同的自我注意块。

openai gpt使用一个嵌入矩阵来存储单词和特殊的嵌入。 特殊令牌嵌入是未预先训练的附加令牌:[sep][cls]。 如果使用特殊令牌,则在微调期间需要对其进行培训。 特殊嵌入的数量可以使用set num_special_tokens(num_special_tokens)函数来控制。

嵌入在令牌嵌入矩阵中的顺序如下:

pip install spacy ftfy==4.4.3
python -m spacy download en
2

其中嵌入了Total_令牌dings可以作为config.total_tokens_embeddings获得,它是: total_tokens_embeddings=config.vocab_size+config.n_special 您应该使用关联索引来索引嵌入项。

输入和输出与tensorflow模型的输入和输出相同。

我们在这里详述。该模型采用输入: 建模/u openai.py

  • 输入id:形状为[批量大小,序列长度](或更一般的[d_1,…,d_n,序列长度]的torch.longtensor是d_1…d_n是任意维度),单词bpe令牌索引的选择范围为[0,total_tokens_embeddings[
  • 位置id:可选的torch.longtensor,其形状与输入id相同 位置索引(在[0,config.n_positions-1]范围内选择
  • 令牌类型ID:可选的torch.longtensor,其形状与输入ID相同 您可以使用它向序列中的每个输入令牌添加第三种类型的嵌入 (前两个是单词和位置嵌入)。输入、位置和标记类型的嵌入在第一个自关注块之前在变压器内求和。

此模型输出:

  • 隐藏状态:模型顶部的编码隐藏状态是torch.floattensor,大小为[批量大小,序列长度,隐藏大小](或者更一般地说是[d_1,…,d_n,隐藏大小]…d_n是输入id的维数)
<H4>10。openaigptlmheadmodel

openaigptlmheadmodel包括openaigptmodel转换器,后面是一个语言建模头,其权重与输入嵌入绑定(无附加参数)。

输入与输入的openaigptmodel类加可选标签:

  • lm_labels:可选语言建模标签:torch.longtensor of shape[批量大小,序列长度],索引选择在[-1,0,…,词汇大小]。所有设置为-1的标签都将被忽略(屏蔽),仅计算[0,…,vocab_size]中设置的标签的损失。

输出

  • 如果lm_labels不是none: 输出语言建模损失。
  • 其他: 输出lm_logits:语言将logits建模为大小为[batch_size,sequence_length,total_tokens_embeddings]的torch.floattensor(或更一般地说[d_1,…,d_n,total_tokens_embeddings])的d_1…d_n是输入id的维数)
<H4>11。openaigptdubleheadsmodel

openaigptmdoubleheadmodel包括openaigptmodel变压器,后面跟着两个磁头:

  • 一种语言建模头,其权重与输入嵌入(无附加参数)和:
  • 一个多项选择分类器(线性层,将序列中的一个隐藏状态作为输入来计算分数,请参阅论文中的详细内容)。

输入值与输入值相同

  • 多选标记id:形状为[batch_size,num_choices]的torch.longtensor,具有标记的索引,该标记的隐藏状态应用作多选分类器的输入(通常为每个选择的[cls]标记)。
  • lm_labels:可选语言建模标签:torch.longtensor of shape[批量大小,序列长度],索引选择在[-1,0,…,词汇大小]。所有设置为-1的标签都将被忽略(屏蔽),仅计算[0,…,vocab_size]中设置的标签的损失。
  • 多选标签:可选多选标签:torch.longtensor of shape[批量大小],在[0,…,num_选项]中选择索引。

输出

  • 如果lm_labelsmultiple_choice_labels不是none: 输出一个损失元组,包括语言建模损失和多项选择损失。
  • else输出一个元组,其中:
    • lm_logits:语言将logits建模为torch.floattensor大小[批量大小,数量选择,序列长度,总令牌嵌入量]
    • 多项选择登录:多项选择登录为torch.floattensor大小[批量大小,数值选择]
<H4>12。transfoxlmodel

transformer xl模型在"transformer xl:attentive language models beyond a fixed length context"中进行了描述。

变压器XL使用正弦模式和自适应SoftMax输入的相对定位,这意味着:

  • 不需要指定定位嵌入索引
  • 词汇表中的标记必须按递减频率排序。

该模型采用输入: 建模_transfo_xl.py

  • 输入id:形状为[批量大小,序列长度]的torch.longtensor,令牌索引选择范围为[0,self.config.n_token[
  • mems:以前转发的隐藏状态的可选存储器作为每个层入口的隐藏状态列表(num层)传递。每个隐藏状态都有shape[self.config.mem_len,bsz,self.config.d_model]。请注意,前两个维度在mems中与input\u ids
  • 有关。

这个模型输出一个元组(上一个隐藏状态,新的mems)

  • 最后隐藏状态:模型顶部的编码隐藏状态,大小为torch.floattensor[批量大小,序列长度,self.config.d\u模型]
  • new_mems:在每个层的入口列出(num层)更新的mem状态每个mem状态是一个大小为[self.config.mem_len,batch_size,self.config.d_model]的torch.floattensor。请注意,前两个维度在mems中与input\u ids
  • 有关。
上一个隐藏状态新mems中提取变压器xl各层的隐藏状态列表:

新的mems包含所有的隐藏状态和嵌入的输出(新的mems[0])。new_mems[-1]是最后一层下面的层的隐藏状态的输出,而最后一层的隐藏状态的输出(即,当我们有一个语言建模头在上面时,softmax的输入)。

新mems和上一个隐藏状态的形状有两个不同之处:新mems已经转换了第一个维度并且更长(大小为self.config.mem len)。下面是如何从模型输出中提取隐藏状态的完整列表:

pip install spacy ftfy==4.4.3
python -m spacy download en
3 <H4>13。transforxllmheadmodel

transfoxllmheadmodel包括transfoxlmodel变压器,然后是一个(自适应)软最大磁头,其重量与输入嵌入件相关联。

输入值与输入值相同

  • 目标:可选的torch.longtensor形状[批量大小,序列长度],目标标记索引选择范围为[0,self.config.n_token[

输出一个元组(上一个隐藏状态,新的mems)

  • softmax_输出:输出(自适应)softmax:
    • 如果目标为"无":记录令牌的概率,shape[批量大小,序列长度,n令牌]
    • 其他:阴性Log形状为[批量大小,序列长度]的目标标记的可能性
  • new_mems:在每个层的入口列出(num层)更新的mem状态每个mem状态是一个大小为[self.config.mem_len,batch_size,self.config.d_model]的torch.floattensor。请注意,前两个维度在mems中与input\u ids
  • 有关。
<H4>14。gpt2型号

gpt2model是一个openai gpt-2转换器模型,它有一层加总的令牌和位置嵌入,然后是一系列12个相同的自我注意块。

输入和输出与tensorflow模型的输入和输出相同。

我们在这里详述。该模型采用输入: 建模/u gpt2.py

  • 输入id:形状为[批量大小,序列长度](或更一般的[d_1,…,d_n,序列长度]的torch.longtensor是d_1…d_n是任意维度),单词bpe标记索引选择在[0,vocab_size[
  • 位置id:可选的torch.longtensor,其形状与输入id相同 位置索引(在[0,config.n_positions-1]范围内选择
  • 令牌类型ID:可选的torch.longtensor,其形状与输入ID相同 您可以使用它向序列中的每个输入令牌添加第三种类型的嵌入 (前两个是单词和位置嵌入)。输入、位置和标记类型的嵌入在第一个自关注块之前在变压器内求和。
  • 过去:torch.longtensor的可选列表,其中包含预先计算的隐藏状态(注意块中的键和值),以加快顺序解码(这是显示模型输出的,参见下文)。

此模型输出:

  • 隐藏状态:模型顶部的编码隐藏状态是torch.floattensor,大小为[批量大小,序列长度,隐藏大小](或者更一般地说是[d_1,…,d_n,隐藏大小]…d_n是输入id的维数)
  • 以torch.floattensors的形式显示预先计算的隐藏状态列表(每个注意块中的键和值)。它们可以重复使用以加快顺序解码(参见run-gpt2.py示例)。
<H4>15。gpt2lmheadmodel

gpt2lmheadmodel包括gpt2model转换器,然后是一个语言建模头,其权重与输入嵌入绑定(无附加参数)。

输入gpt2model类加可选标签的输入相同:

  • lm_labels:可选语言建模标签:torch.longtensor of shape[批量大小,序列长度],索引选择在[-1,0,…,词汇大小]。所有设置为-1的标签都将被忽略(屏蔽),仅计算[0,…,vocab_size]中设置的标签的损失。

输出

  • 如果lm_labels不是none: 输出语言建模损失。
  • else:一对
    • lm_logits:语言将logits建模为torch.floattensor,大小为[批量大小,序列长度,总令牌嵌入](或者更一般地说是[d_1,…,d_n,总令牌嵌入]…d_n是输入id的维数)
    • 以torch.floattensors的形式显示预先计算的隐藏状态列表(每个注意块中的键和值)。它们可以重复使用以加快顺序解码(参见run-gpt2.py示例)。
<H4>16。gpt2doubleheadsmodel

gpt2doubleheadsmodel包括gpt2model变压器和两个磁头:

    <李>一种语言建模头,其权重与输入嵌入(无附加参数)和:
  • 一个多项选择分类器(线性层,将序列中的一个隐藏状态作为输入来计算分数,请参阅论文中的详细内容)。

输入与输入的gpt2model类加上一个分类掩码和两个可选标签:

  • 多选标记id:形状为[batch_size,num_choices]的torch.longtensor,具有标记的索引,该标记的隐藏状态应用作多选分类器的输入(通常为每个选择的[cls]标记)。
  • lm_labels:可选语言建模标签:torch.longtensor of shape[批量大小,序列长度],索引选择在[-1,0,…,词汇大小]。所有设置为-1的标签都将被忽略(屏蔽),仅计算[0,…,vocab_size]中设置的标签的损失。
  • 多选标签:可选多选标签:torch.longtensor of shape[批量大小],索引在[0,…,数值选项]中选定。

输出

  • 如果lm_labelsmultiple_choice_labels不是none: 输出一个损失元组,包括语言建模损失和多项选择损失。
  • else输出一个元组,其中:
    • lm_logits:语言将logits建模为torch.floattensor大小[批量大小,数量选择,序列长度,总令牌嵌入量]
    • 多项选择登录:多项选择登录为torch.floattensor大小[批量大小,数值选择]
    • 以torch.floattensors的形式显示预先计算的隐藏状态列表(每个注意块中的键和值)。它们可以重复使用以加快顺序解码(参见run-gpt2.py示例)。

标记器

bertokenizer

bertokenizer执行端到端的标记化,即基本标记化,然后是字块标记化。

这个类有五个参数:

  • 词汇文件:词汇文件的路径。
  • 使用小写:标记时将文本转换为小写。默认值=真
  • max_len:过滤变压器输入的最大长度。如果none,则默认为模型的预训练值。默认值=无
  • 执行基本标记化:在wordpice标记化之前执行基本标记化。如果文本已预标记,则设置为false。默认值=真
  • 从不拆分:在标记化期间不应拆分的标记列表。默认值=["[unk]"、"[sep]"、"[pad]"、"[cls]"、"[mask]"]

以及三种方法:

  • 标记化(文本):通过(1)执行基本标记化和(2)字块标记化,转换str标记列表中的astr
  • convert_tokens_to_id(tokens):在词汇表中的索引列表中转换int个标记的列表。
  • 将id转换为令牌(令牌):在词汇表中的str令牌列表中转换int索引列表。
  • 保存词汇表(目录路径):将词汇表文件保存到目录路径。返回保存的词汇文件的路径:vocab_file_path。词汇表可以用bertokenizer.from廑pretrained('vocab_file廑u path')bertokenizer.from廑pretrained('directory廑u path')重新加载

有关BasicTokenizerWordPiecetTokenizer类的详细信息,请参阅tokenization.py中的文档字符串和代码。. 一般情况下,建议使用bertokenizer除非您知道自己在做什么。

打开aigptTokenizer

openaigptokenizer执行字节对编码(bpe)标记化。

这个类有四个参数:

  • 词汇文件:词汇文件的路径。
  • 合并文件:包含BPE合并的文件的路径。
  • max_len:过滤变压器输入的最大长度。如果none,则默认为模型的预训练值。默认值=无
  • 特殊标记:要添加到词汇表中进行微调的标记列表。如果没有安装spacy,并且使用bert的basictokenizer作为bpe前的标记器,则这些标记不会被拆分。默认值=无

以及五种方法:

  • 标记化(文本):通过执行bpe标记化来转换str标记列表中的astr
  • convert_tokens_to_id(tokens):在词汇表中的索引列表中转换int个标记的列表。
  • 将id转换为令牌(令牌):在词汇表中的str令牌列表中转换int索引列表。
  • 设置特殊令牌(自身,特殊令牌):更新特殊令牌列表(请参阅以上参数)
  • 编码(文本):通过执行bpe编码,在int标记列表中转换astr
  • 解码(id,skip_special_tokens=false,clean_up_tokenization_spaces=false):解码字符串中int索引的列表,并在需要时执行一些后处理:(i)从输出中删除特殊标记,以及(ii)清理标记化空间。
  • 保存词汇表(目录路径):将词汇表、合并和特殊标记文件保存到目录路径。返回三个文件的路径:vocab_file_pathmerge_file_pathspecial_tokens_file_path。词汇表可以用openaigptokenizer.from_pretrained('directory_path')重新加载

有关openaigptokenizer的详细信息,请参阅tokenization_openai.py中的文档字符串和代码。

转换生成器

transfoxltokenizer执行单词标记化。此标记赋予器可用于自适应softmax,并具有用于计算语料库中的标记的实用程序,以创建按toekn频率排序的词汇表(用于自适应softmax)。有关更多详细信息,请参阅Adaptive Softmax论文(GPU的有效Softmax近似值。

该api类似于bertokenizer的api(见上文)。

有关transforxltokenizer中这些附加方法的详细信息,请参阅tokenization_transfo_xl.py中的文档字符串和代码。

gpt2tokenizer

gpt2tokenizer执行字节级字节对编码(bpe)标记化。

这个类有三个参数:

  • 词汇文件:词汇文件的路径。
  • 合并文件:包含BPE合并的文件的路径。
  • 错误:如何处理Unicode解码错误。默认值=替换

还有两种方法:

  • 标记化(文本):通过执行字节级bpe,在str标记列表中转换astr
  • convert_tokens_to_id(tokens):在词汇表中的索引列表中转换int个标记的列表。
  • 将id转换为令牌(令牌):转换词汇表中str标记列表中的int索引列表。
  • 设置特殊令牌(自身,特殊令牌):更新特殊令牌列表(请参阅以上参数)
  • 编码(文本):通过执行字节级bpe,在int标记列表中转换astr
  • 解码(令牌):在astr中转换回int令牌的列表
  • 保存词汇表(目录路径):将词汇表、合并和特殊标记文件保存到目录路径。返回三个文件的路径:vocab_file_pathmerge_file_pathspecial_tokens_file_path。词汇表可以用openaigptokenizer.from_pretrained('directory_path')重新加载

有关gpt2tokenizer的详细信息,请参阅tokenization_gpt2.py

优化器

伯塔姆

bertadam是一个torch.optimizer优化器,适用于更接近于bert的tensorflow实现中使用的优化器。与pytorch adam优化器的区别如下:

  • Bertadam实现重量衰减修正,
  • Bertadam不会像在常规ADAM优化器中那样补偿偏差。

优化器接受以下参数:

  • lr:学习率
  • 预热:预热的t_total部分,-1表示无预热。默认值:-1
  • t_total:学习的培训步骤总数 速率表,-1表示恒定的学习速率。默认值:-1
  • 时间表:用于热身的时间表(见上文)。 可以是'warmup_linear''warmup_constant''warmup_cosine''none'none'u lrschedule对象(见下文)。 如果none'none',则学习速率始终保持恒定。 默认值:'warmup_linear'
  • b1:亚当斯b1。默认值:0.9
  • b2:亚当斯b2。默认值:0.999
  • e:亚当斯·爱普西隆。默认值:1e-6
  • 重量衰减:重量衰减。默认值:0.01
  • max_grad_norm:渐变的最大norm(-1表示没有剪辑)。默认值:1.0

openaiadam

openaiadam类似于bertadam。 与bertadam的区别在于openaiadam补偿了常规adam优化器中的偏差。

openaiadam接受与bertaam相同的参数

学习率表

.optimization模块还以继承\u lrschedule的schedule对象的形式提供附加的计划。 所有lrschedule子类在构造时都接受warmupt_total参数。 当\u lrschedule对象被传递到bertadamopenaiadam时, 忽略优化器上的warmupt_total参数,并使用lrschedule对象中的参数。 已实施计划的概述:

  • constantlr:始终返回学习速率1。
  • warmupconstantschedule:在warmup训练步骤的分数上,学习率从0线性增加到1。 保持学习率等于1。热身后。  src=
  • warmuplinearschedule:在训练步骤的分数上,学习率从0线性增加到1。 线性降低学习率从1。0。剩余的1-预热步骤。  src=
  • warmupcosineschedule:在warmup训练步骤的分数上,学习率从0线性增加到1。 将学习率从1降低。0。余弦曲线后的剩余1-预热步骤。 如果周期(默认值=0.5)与默认值不同,则预热后的学习率遵循余弦函数。  src=
  • warmupcosinewithhardrestsschedule:在训练步骤的分数上,学习率从0线性增加到1。 如果周期(默认值=1.)与默认值不同,则学习速率遵循周期乘以余弦衰减学习速率(硬重启)。  src=
  • WarmupCosinewhiwarmUprestartschedule:所有训练进度分成等长的个周期(默认值=1.)部分。 每个部分都遵循一个时间表,第一个热身阶段的分数从0线性增加。到1。 接着学习率从1下降。0。沿着余弦曲线。 注意,所有循环中所有预热步骤的总数等于预热*循环 src=

示例

<表><广告>小节 说明 < /广告><正文>培训大型模型:介绍、工具和示例如何利用梯度累积、多gpu训练、分布式训练、cpu优化和16位训练训练bert模型使用bert进行微调:运行示例在中运行示例:extract戋classif.pyrun戋classifier.pyrun戋classifier.pyrun戋squad.pyrun戋lm戋finetning.py使用openai-gpt、transformer xl和gpt-2进行微调在中运行示例:/examples运行openai-gpt.py运行transfo-xl.py运行gpt2.py微调GPU上的Bert Large如何微调bert large

培训大型模型:简介、工具和示例

bert-base和bert-large分别是110m和340m参数模型,很难在单个gpu上对它们进行微调,以获得良好的性能(在大多数情况下,批量大小为32)。

为了帮助对这些模型进行微调,我们在微调脚本中包含了一些可以激活的技术。ref="./examples/run_squad.py" rel="nofollow">run_squad.py:梯度累积、多GPU训练、分布式训练和16位训练。有关如何使用这些技术的更多详细信息,请阅读我本月早些时候发布的关于在Pythorch中训练大批量的提示。

以下是如何在脚本中使用这些技术:

要使用16位培训和分布式培训,您需要安装nvidia的apex extension如这里所述。您将在文档和相关存储库中找到关于apex内部以及如何使用apex的更多信息。nvidia团队在pytorch bert上进行的测试结果(以及我在复制这些测试时的测试结果)可以在当前存储库的相关pr中查阅

注意:要使用分布式培训,您需要在每台计算机上运行一个培训脚本。例如,可以在每台服务器上运行以下命令(有关详细信息,请参见上述博客文章):

pip install spacy ftfy==4.4.3
python -m spacy download en
4

其中,$this_machine_index是分配给您的每台机器(0,1,2…)的顺序索引,排名为0的机器具有IP地址192.168.1.1和开放端口1234

使用bert进行微调:运行示例

我们展示了几个基于(和扩展自)原始实现的微调示例

  • a序列级分类器用于九种不同的粘合任务,
  • 问答数据集中的令牌级分类器,以及
  • swag分类语料库上的序列级多项选择分类器。
  • < >另一个目标语料库上的bert语言模型

在dev set上粘合结果

我们在带有无基础bert基的glue基准开发集上得到以下结果 模型。所有实验都在一个批量大小为32的p100 gpu上运行。

<表><广告>任务公制 结果< /广告><正文>可乐马修的更正57.29SST-2准确度93.00MRPCf1/精度88.85/83.82STS-B皮尔逊/斯皮尔曼更正89.70/89.37 qqp精度/f190.72/87.41mnli匹配的科目/不匹配的科目83.95/84.39qnli准确度89.04< RTE >准确度61.01WNLI准确度53.52

其中一些结果与测试集上报告的结果明显不同 在网站上的胶水基准。对于QQP和WNLI,请参阅网站上的常见问题解答12

在运行这些粘合任务之前,您应该下载 通过运行 此脚本 并将其解压到某个目录$glue-dir

pip install spacy ftfy==4.4.3
python -m spacy download en
5

任务名称可以是cola、sst-2、mrpc、sts-b、qqp、mnli、qnli、rte、wnli之一。

开发集结果将出现在指定输出目录的文本文件'eval_results.txt'中。对于mnli,由于有两个独立的dev集,匹配和不匹配,除了"/tmp/mnli/",还有一个单独的输出文件夹,名为"/tmp/mnli-mm/"。

除mrpc、mnli、cola、sst-2外,apex在任何胶接任务中都没有进行过半精确训练。以下部分提供了如何使用mrpc运行半精确训练的详细信息。尽管如此,使用剩余的粘合任务运行半精确训练也不应该有任何问题,因为每个任务的数据处理器都继承自基类数据处理器。

mrpc

这个示例代码微调了bert对微软研究的解释。 Corpus(MRPC)Corpus,在单个K-80上运行不到10分钟,在27秒内(!)在安装了Apex的单个特斯拉V100 16GB上。

在运行此示例之前,您应该下载 通过运行 此脚本 并将其解压到某个目录$glue-dir

pip install spacy ftfy==4.4.3
python -m spacy download en
6

我们的测试在几个种子上运行,原始实现超参数的句子和句子对分类任务rel="nofollow"给出了84%到88%之间的评估结果。

使用Apex和16位精度快速运行:在27秒内在MRPC上进行微调!< /强> 首先按此处所示安装apex。 然后运行< /P>

pip install spacy ftfy==4.4.3
python -m spacy download en
7 小队

这个例子代码微调班数据集上的伯特。它在一台特斯拉V100 16GB上运行24分钟(以伯特为基础)或68分钟(以伯特为大型)。

Squad的数据可以通过以下链接下载,并应保存在$squad\u dir目录中。

pip install spacy ftfy==4.4.3
python -m spacy download en
8

使用先前的超参数进行训练,得到了以下结果:

pip install spacy ftfy==4.4.3
python -m spacy download en
9

抽汲

swag的数据可以通过克隆以下存储库来下载

pip install [--editable] .
0

在单个GPU上使用先前的超参数进行训练,得到以下结果:

pip install [--editable] .
1

lm微调

数据应该是一个文本文件,格式与样本文本文本文件格式相同(每行一句话,文档用空行分隔)。 您可以下载一个由维基百科文章生成的示范性训练语料库,并分成大约500个带有空格的句子。 在这个语料库上训练一个epoch大约需要1:20小时,在4个nvidia tesla p100上进行,其中训练批大小=200最大长度=128

感谢@rocketknight1和@tholor的工作,现在有几个脚本可用于使用预训练目标(屏蔽语言建模和下一句预测损失的组合)微调bert。这些脚本在readme文件夹的examples/lm廑finetning/中有详细说明。

openai gpt、transformer xl和gpt-2:运行示例

我们提供了openai gpt、transformer xl和openai gpt-2的三个脚本示例,它们基于(并扩展自)各自的原始实现:

  • 在rocstories数据集上微调openai gpt
  • 在WikiText 103上评估Transformer XL
  • 从预先训练的openai gpt-2模型中无条件和有条件地生成

在rocstories数据集上微调openai gpt

此示例代码微调rocstories数据集上的openai gpt。

在运行此示例之前,您应该下载 rocstories数据集并将其解压到某个目录

pip install [--editable] .
2

该命令在单个K-80上运行约10分钟,评估精度约为87.7%(作者报告的TensorFlow代码的中位精度为85.8%,OpenAI GPT报告的最佳单次运行精度为86.5%)。

在WikiText 103数据集上评估预先训练的Transformer XL

此示例代码评估wikitext 103数据集上的预先训练的transformer xl。 此命令将下载已计算词汇表的预处理版本的WikiText 103数据集。

pip install [--editable] .
3

该命令在v100上运行约1分钟,在wikitext-103上的计算复杂度为18.22(作者用tensorflow代码报告了该数据集上的复杂度约为18.3)。

从openai的gpt-2模型无条件和有条件地生成

此示例代码与原始的无条件和有条件生成代码相同。

条件生成:

pip install [--editable] .
4

无条件生成:

pip install [--editable] .
5

提供了与原始脚本中相同的选项,请参考示例代码和openai的原始存储库。

在gpu上微调bert large

我们上面列出的选项允许在GPU(而不是原始实现使用的TPU)上非常容易地微调Bert Large。

例如,可以在一台服务器上用4k-80(现在已经很老了)在18小时内对bert large进行微调。我们的结果与tensorflow实现结果相似(实际上略高):

pip install [--editable] .
6

为了得到这些结果,我们使用了以下组合:

  • 多GPU培训(在多GPU服务器上自动激活),
  • 2步梯度累积和
  • 在CPU上执行优化步骤,将ADAM的平均值存储在RAM中。

以下是此运行的超参数的完整列表:

pip install [--editable] .
7

如果您有最新的GPU(从nvidia volta系列开始),您应该尝试16位微调(fp16)。

下面是我们尝试的fp16运行的超参数示例:

pip install [--editable] .
8

结果与上述FP32结果相似(实际略高):

pip install [--editable] .
9

笔记本

我们包括三个Jupyter笔记本,用于检查Pythorch模型的预测是否与原始TensorFlow模型的预测相同。

  • 第一个笔记本(比较tf和pt模型.ipynb rel="nofollow">比较tf和pt模型.ipynb)提取tensorflow和pytorch模型的每一层上完整序列的隐藏状态,并计算它们之间的标准差。在给定的例子中,我们得到模型的各种隐藏状态的标准偏差为1.5e-7到9e-7。

  • 第二个笔记本(比较tf和pt models squad.ipynb rel="nofollow">tf和pt models squad.ipynb)比较tensorflow和pytorch模型计算的损耗,以便对bertforquestionswe的微调层进行相同的初始化。环并计算它们之间的标准偏差。在给定的示例中,模型之间的标准偏差为2.5e-7。

  • 第三个笔记本(比较tf和pt型号mlm nsp.ipynb" rel="nofollow">比较tf和pt型号mlm nsp.ipynb)比较了tensorflow和pytorch模型计算的使用预先训练的屏蔽语言模式的屏蔽令牌语言建模预测。ling型号。

请按照笔记本中的说明运行和修改它们。

命令行界面

提供了一个命令行接口,用于转换bertforpretraining类的pytorch转储中的tensorflow检查点(对于bert)或openaigptmodel类的pytorch转储中的numpy检查点(对于openai gpt)。

伯特

您可以在pytorch保存文件中使用由google发布的pretrained models)转换为pytorch.py" rel="nofollow">将检查点转换为pytorch.py脚本。

此cli将tensorflow检查点(三个文件以bert_model.ckpt开头)和相关的配置文件(bert_config.json)作为输入,并为此配置创建pytorch模型,以pytorch模式从tensorflow检查点加载权重。l并将生成的模型保存到标准py torch保存文件中,该文件可以使用torch.load()导入(请参阅extract\u features.py中的示例,run\u classifier.pyrun戋squad.py)。

只需运行此转换脚本一次即可获得pytorch模型。然后,您可以忽略tensorflow检查点(以bert_model.ckpt开头的三个文件),但请确保保留配置文件(bert_config.json)和词汇文件(vocab.txt),因为它们也是pytorch模型所需的。

要运行这个特定的转换脚本,需要安装tensorflow和pytorch(pip install tensorflow). 存储库的其余部分只需要pytorch。

下面是一个预先训练的bert base uncased模型的转换过程示例:

pip install spacy ftfy==4.4.3
python -m spacy download en
0

您可以在这里下载谷歌为转换而预先训练的模型

openai gpt

下面是一个经过预先训练的openai gpt模型的转换过程示例,假设您的numpy检查点保存为与openai预训练模型相同的格式(请参见此处

pip install spacy ftfy==4.4.3
python -m spacy download en
1

变压器XL

下面是一个预先训练的Transformer XL模型的转换过程示例(请参见此处

pip install spacy ftfy==4.4.3
python -m spacy download en
2

GPT-2

下面是一个经过预先训练的openai的gpt-2模型的转换过程示例。

pip install spacy ftfy==4.4.3
python -m spacy download en
3

TPU

TPU支持和预培训脚本

Pythorch(0.4.1)的当前稳定版本不支持TPU。不过,Pythorch(v1.0)的下一版本应该支持TPU培训,预计很快就会发布(请参阅最近的官方公告)。

下一版本发布时,我们将添加TPU支持。

最初的tensorflow代码还包含两个用于训练前bert的脚本:create_pretraining_data.pyrun_pretraining.py

因为,预培训bert是一个特别昂贵的操作,基本上需要在合理的时间内完成一个或多个tpu(请参见此处的详细信息SE培训前脚本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java PUT请求提供415不支持的媒体类型   JavaMockito:如何在不模拟所有参数的情况下轻松地存根一个方法   java如何将NameValuePair传递给安卓中的另一个活动?   servalet java中的tomcat错误   java Android手机无法连接到eclipse   nullpointerexception在Java中如何将null转换为false?   Java中的http代理身份验证   java如何确保最新版本的JAR与JNLP应用程序一起使用?   简单Java代码上的性能大内存占用   列出AWS EC2实例上运行的服务上的对象时,java 403访问被拒绝   java创建一个类,当创建一个新实例时,它会被添加到一个hasmap中   LookupService中的java getLocation方法返回null   java获取要在ListView中显示的ArrayList字符串编号/位置