预培训NLP变压器模型库:Bert&Roberta、GPT&GPT-2、Transformer XL、XLnet和XLM

pytorch-transformers-pvt-nightl的Python项目详细描述


Pythorch变压器

circleci

Pythorch Transformers(以前称为Pythorch Pretrained Bert)是一个用于自然语言处理(NLP)的最先进的预训练模型库。

库当前包含以下模型的pytorch实现、预先训练的模型权重、使用脚本和转换实用程序:

  1. bert(来自google)与论文一起发布的bert:jacob devlin,ming-w的《深度双向变压器语言理解的预培训》。张爱玲、李肯顿和克里斯蒂娜·图坦诺娃。
  2. gpt(来自openai)与alec radford,kart的论文一起发布Hik Narasimhan、Tim Salimans和Ilya Sutskever。
  3. gpt-2(来自openai)与alec radford*,jeffrey wu*的论文语言模型是无监督的多任务学习者*,Rewon Child,David Luan,Dario Amodei**和Ilya Sutskever**。
  4. transformer xl(来自google/cmu)发表了一篇文章,作者是zihang dai*,杨志林*,杨一鸣,卡博内尔(Jaime Carbonell),曲克诉勒(Quoc v.le),拉斯兰·萨拉胡蒂诺夫(Ruslan Salakhutdinov)。
  5. xlnet(来自google/cmu)随论文发布.xlnet:语言理解的广义自回归预训练*,杨一鸣,卡博内尔,萨拉胡迪诺夫,库奥克诉勒。
  6. xlm(来自Facebook)与Guillaume Lample和Alexis Conneau的跨语言语言模型预培训论文一起发布。
  7. roberta(来自facebook),与论文a一起发布,作者Yinhan Liu,Myl奥特、纳曼·戈亚尔、杜敬飞、曼达·乔希、陈丹琪、奥马尔·利维、迈克·刘易斯、卢克·泽特莱莫耶、维塞林·斯托亚诺夫。
  8. distilbert(来自huggingface),与blogpost一起发布,更小、更快,更便宜、更轻:推出了蒸馏版的"伯特",作者是Victor Sanh、Lysande处女作和Thomas Wolf。

这些实现已经在几个数据集上进行了测试(参见示例脚本),并且应该与原始实现的性能相匹配(例如,bert全字屏蔽的squad上大约93 f1,openai gpt的rocstories上大约88 f1,transformer xl的wikitext上大约18.3 fuzzity,大约0.916 PE用于xlnet的sts-b上的ason r系数)。有关性能的更多详细信息,请参见文档的"示例"部分。 <表><广告>节 说明 < /广告><正文>安装如何安装软件包快速游览:用法标记器和模型使用:bert和gpt-2快速教程:微调/使用脚本使用提供的脚本:Glue、Squad和文本生成从Pythorch Pretrained Bert迁移到Pythorch Transformers" rel="nofollow">从Pythorch Pretrained Bert迁移到Pythorch Transformers将代码从pytorch pretrained bert迁移到pytorch transformers 文档完整的API文档及更多内容

安装

此repo在python 2.7和3.5+上测试(示例仅在python 3.5+和pytorch 1.0.0+上测试)

具有PIP

Pythorch变压器可由PIP安装,如下所示:

pip install pytorch-transformers

来源

克隆存储库并运行:

pip install [--editable] .

测试

库和示例脚本包含一系列测试。库测试可以在测试文件夹中找到,测试示例可以在示例中找到文件夹

这些测试可以使用pytest运行(如果需要,请使用pip install pytest安装pytest)。

您可以使用以下命令从克隆存储库的根目录运行测试:

python -m pytest -sv ./pytorch_transformers/tests/
python -m pytest -sv ./examples/

是否要在移动设备上运行变压器模型?

您应该查看我们的swift-coreml transformersrepo。

它包含了一个从pytorch训练的transformer模型(这里,gpt-2)到运行在ios设备上的coreml模型的转换脚本示例。

在将来的某个时候,您将能够无缝地从pytorch中的预培训或微调模型过渡到coreml中的产品化模型, 或者在coreml中创建一个模型或应用程序的原型,然后从pytorch中研究其超参数或架构。超级刺激!

快速游览

让我们快速浏览一下pytorch变形金刚。每个模型架构的详细示例(bert、gpt、gpt-2、transformer xl、xlnet和xlm)可以在完整文档中找到。

importtorchfrompytorch_transformersimport*# PyTorch-Transformers has a unified API# for 7 transformer architectures and 30 pretrained weights.#          Model          | Tokenizer          | Pretrained weights shortcutMODELS=[(BertModel,BertTokenizer,'bert-base-uncased'),(OpenAIGPTModel,OpenAIGPTTokenizer,'openai-gpt'),(GPT2Model,GPT2Tokenizer,'gpt2'),(TransfoXLModel,TransfoXLTokenizer,'transfo-xl-wt103'),(XLNetModel,XLNetTokenizer,'xlnet-base-cased'),(XLMModel,XLMTokenizer,'xlm-mlm-enfr-1024'),(RobertaModel,RobertaTokenizer,'roberta-base')]# Let's encode some text in a sequence of hidden-states using each model:formodel_class,tokenizer_class,pretrained_weightsinMODELS:# Load pretrained model/tokenizertokenizer=tokenizer_class.from_pretrained(pretrained_weights)model=model_class.from_pretrained(pretrained_weights)# Encode textinput_ids=torch.tensor([tokenizer.encode("Here is some text to encode",add_special_tokens=True)])# Add special tokens takes care of adding [CLS], [SEP], <s>... tokens in the right way for each model.withtorch.no_grad():last_hidden_states=model(input_ids)[0]# Models outputs are now tuples# Each architecture is provided with several class for fine-tuning on down-stream tasks, e.g.BERT_MODEL_CLASSES=[BertModel,BertForPreTraining,BertForMaskedLM,BertForNextSentencePrediction,BertForSequenceClassification,BertForMultipleChoice,BertForTokenClassification,BertForQuestionAnswering]# All the classes for an architecture can be initiated from pretrained weights for this architecture# Note that additional weights added for fine-tuning are only initialized# and need to be trained on the down-stream tasktokenizer=BertTokenizer.from_pretrained('bert-base-uncased')formodel_classinBERT_MODEL_CLASSES:# Load pretrained model/tokenizermodel=model_class.from_pretrained('bert-base-uncased')# Models can return full list of hidden-states & attentions weights at each layermodel=model_class.from_pretrained(pretrained_weights,output_hidden_states=True,output_attentions=True)input_ids=torch.tensor([tokenizer.encode("Let's see all hidden-states and attentions on this text")])all_hidden_states,all_attentions=model(input_ids)[-2:]# Models are compatible with Torchscriptmodel=model_class.from_pretrained(pretrained_weights,torchscript=True)traced_model=torch.jit.trace(model,(input_ids,))# Simple serialization for models and tokenizersmodel.save_pretrained('./directory/to/save/')# savemodel=model_class.from_pretrained('./directory/to/save/')# re-loadtokenizer.save_pretrained('./directory/to/save/')# savetokenizer=tokenizer_class.from_pretrained('./directory/to/save/')# re-load# SOTA examples for GLUE, SQUAD, text generation...

快速浏览微调/使用脚本

该库包含几个示例脚本,这些脚本对nlu和nlg任务具有sota性能:

  • 运行glue.py:在九个不同的glue任务上微调bert、xlnet和xlm的示例(序列级分类
  • 运行squad.py:在问答数据集squad 2.0上微调bert、xlnet和xlm的示例(令牌级别分类
  • run_generation.py:使用gpt、gpt-2、transformer xl和xlnet生成条件语言的示例
  • 其他特定于型号的示例(请参阅文档)。

下面是这些脚本的三个快速使用示例:

运行glue.py:微调序列分类的glue任务

通用语言理解评估(glue)基准是评估和分析自然语言理解系统的九个句子或句子对语言理解任务的部分。

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

您还应该安装示例所需的附加软件包:

pip install -r ./examples/requirements.txt
exportGLUE_DIR=/path/to/glue
exportTASK_NAME=MRPC

python ./examples/run_glue.py \
    --model_type bert \
    --model_name_or_path bert-base-uncased \
    --task_name $TASK_NAME\
    --do_train \
    --do_eval \
    --do_lower_case \
    --data_dir $GLUE_DIR/$TASK_NAME\
    --max_seq_length 128\
    --per_gpu_eval_batch_size=8\
    --per_gpu_train_batch_size=8\
    --learning_rate 2e-5 \
    --num_train_epochs 3.0 \
    --output_dir /tmp/$TASK_NAME/

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

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

在sts-b回归任务中微调xlnet模型

此示例代码使用4 v100 gpu服务器上的并行训练在sts-b语料库上微调xlnet。 并行训练是一种使用多个GPU的简单方法(但比分布式训练慢且灵活性低,请参见下文)。

exportGLUE_DIR=/path/to/glue

python ./examples/run_glue.py \
    --model_type xlnet \
    --model_name_or_path xlnet-large-cased \
    --do_train  \
    --do_eval   \
    --task_name=sts-b     \
    --data_dir=${GLUE_DIR}/STS-B  \
    --output_dir=./proc_data/sts-b-110   \
    --max_seq_length=128\
    --per_gpu_eval_batch_size=8\
    --per_gpu_train_batch_size=8\
    --gradient_accumulation_steps=1\
    --max_steps=1200\
    --model_name=xlnet-large-cased   \
    --overwrite_output_dir   \
    --overwrite_cache \
    --warmup_steps=120

因此,在这台机器上,我们的批量大小为32,如果您的机器较小,请增加梯度累积步骤以达到相同的批量大小。这些超参数将导致开发集上的皮尔逊相关系数+0.917

在mrpc分类任务中微调bert模型

此示例代码使用8 v100 gpu上的分布式训练,对microsoft research repraphase corpus(mrpc)语料库上的bert全词屏蔽模型进行微调,以达到f1>;92。

python -m torch.distributed.launch --nproc_per_node 8 ./examples/run_glue.py   \
    --model_type bert \
    --model_name_or_path bert-large-uncased-whole-word-masking \
    --task_name MRPC \
    --do_train   \
    --do_eval   \
    --do_lower_case   \
    --data_dir $GLUE_DIR/MRPC/   \
    --max_seq_length 128\
    --per_gpu_eval_batch_size=8\
    --per_gpu_train_batch_size=8\
    --learning_rate 2e-5   \
    --num_train_epochs 3.0  \
    --output_dir /tmp/mrpc_output/ \
    --overwrite_output_dir   \
    --overwrite_cache \

使用这些超参数进行训练可获得以下结果:

acc=0.8823529411764706
  acc_and_f1=0.901702786377709
  eval_loss=0.3418912578906332
  f1=0.9210526315789473
  global_step=174loss=0.07231863956341798

运行squad.py:微调squad以回答问题

此示例代码使用8 v100 gpu上的分布式训练和bert全词掩蔽无基础模型,对班数据集上的bert进行微调,以达到班上的f1>;93:

pip install pytorch-transformers
0

使用这些超参数进行训练可获得以下结果:

pip install pytorch-transformers
1

这是作为bert大的未加保护的全词屏蔽精细化的小队提供的模型

运行生成.py:使用gpt、gpt-2、transformer xl和xlnet生成文本

还包括一个条件生成脚本,用于从提示生成文本。 生成脚本包括Aman Rusia提出的技巧,用于使用Transformer XL和xlnet之类的内存模型获得高质量的生成(包括预定义的文本以使短输入更长)。

下面是如何使用小版本的openai gpt-2模型运行脚本:

pip install pytorch-transformers
2

从pytorch pretrained bert迁移到pytorch transformers

以下是从pytorch pretrained bert迁移到pytorch transformers时应注意的事项的快速摘要

模型总是输出元组

当从pytorch pretrained bert迁移到pytorch transformers时,主要的中断变化是models forward方法总是输出一个tuple和各种元素,具体取决于模型和配置参数。

每个模型的元组的确切内容在模型的docstrings和文档中有详细说明。

在几乎所有情况下,您都可以将输出的第一个元素作为您以前在pytorch pretrained bert中使用的输出。

下面是一个pytorch pretrained bertpytorch transformers的转换示例,用于bertforsequenceclassification分类模型:

pip install pytorch-transformers
3

序列化

中断对from_pretrained()方法的更改:

  1. 当用from_pretrained()方法实例化时,模型现在默认设置为求值模式。要训练他们,不要忘记将他们设置回训练模式(model.train())以激活退出模块。

  2. 从pretrained()方法提供给的附加*输入和**kwargs参数过去直接传递给基础模型的类\uu init\uu()方法。它们现在用于更新模型配置属性,而该属性可以中断基于前面的bertforsequenceclassification示例构建的派生模型类。我们正在研究一种方法,通过转发模型\uu init()方法(i)提供的位置参数和(ii)与任何配置类属性不匹配的关键字参数,来减轻\866中的这种突破性变化。

此外,虽然不是一个突破性的改变,但是序列化方法已经标准化,如果以前使用过任何其他序列化方法,您可能应该切换到新方法save_pretrained(save_directory)

下面是一个示例:

pip install pytorch-transformers
4

优化器:bertaam&openaiadam现在是adamw,计划是标准pytorch计划

以前包括的两个优化器,bertadamopenaiadam已经被一个单独的adamw优化器所取代,它有一些不同:

  • 它只执行权重衰减校正,
  • 计划现在是外部的(见下文),
  • 渐变剪辑现在也是外部的(见下文)。

新的优化器adamw与pytorchadam优化器api匹配,并允许您使用标准pytorch或apex方法进行调度和剪裁。

这些时间表现在是标准的,不再是优化器的一部分。

下面是一个从bertadamadamw的线性预热和衰减计划以及相同计划的转换示例:

pip install pytorch-transformers
5

引文

目前,还没有与Pythorch变压器相关的文件,但我们正在准备一个。同时,如果您在已发布或开源项目中使用此工作,请包括对库的说明和指向当前存储库的链接。

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

推荐PyPI第三方库


热门话题
ApachePOI如何通过java从excel文件中删除空白列?   linux到后台Java服务应用程序的简单发送/接收接口   java ActionBarPullToRefresh什么都没发生   java从millis获取错误的整数天   java相同的代码在两个不同的包上表现不同   java将每个新的char元素写入一个文件(如果被覆盖)   mysql如何在Java中通过外键链接的多个表中插入数据   java环境下mysql网络文件访问   java当使用构建器模式时,为什么我不应该重用builderobject来访问对象配置?   java jQueryServlet post异常失败   java应该使用什么逻辑来创建像《愤怒的小鸟》中那样的锁屏   java Android:在不滑动的情况下更改ViewPager中的片段   java在使用我的程序逻辑时获得空输出