最新自然语言处理库transformers

作 者 | huggingface

编 译 | VK

来 源 | Github

Transformers是TensorFlow 2.0和PyTorch的最新自然语言处理库

Transformers(以前称为pytorch-transformers和pytorch-pretrained-bert)提供用于自然语言理解(NLU)和自然语言生成(NLG)的最先进的模型(BERT,GPT-2,RoBERTa,XLM,DistilBert,XLNet,CTRL …) ,拥有超过32种预训练模型,支持100多种语言,并且在TensorFlow 2.0和PyTorch之间具有深厚的互操作性。

特性

  • 与pytorch-transformers一样易于使用
  • 像Keras一样强大而简洁
  • 在NLU和NLG任务上具有高性能
  • 教育者和从业者进入的门槛低

面向所有人的最新NLP架构

  • 深度学习研究人员
  • 练习实践学习人员
  • AI/ML/NLP教师和教育者

降低计算成本

  • 研究人员可以共享训练好的模型,而不必总是再训练
  • 从业人员可以减少计算时间和生产成本
  • 具有30多种预训练模型的10种架构,其中一些采用100多种语言

为模型生命周期的每个部分选择合适的框架

  • 3行代码训练最先进的模型
  • TensorFlow 2.0和PyTorch模型之间的深层互操作性
  • 在TF2.0/PyTorch框架之间随意迁移模型
  • 无缝选择合适的框架进行训练,评估和生产

章节

描述

安装

如何安装套件

模型架构

体系结构(带预训练权重)

在线演示

试用文本生成功能

用法

分词和模型使用:Bert和GPT-2

TF2.0和PyTorch

用10行代码训练TF2.0模型,并将其加载到PyTorch中

管道

使用管道:使用管道进行分词和微调

微调与使用脚本

使用提供的脚本:GLUE,SQuAD和文本生成

分享你的模型

上传和与社区共享你的微调模型

从pytorch-transformers到 transformers

将代码从pytorch-transformers迁移到transformers

从pytorch-pretrained-bert迁移到pytorch-transformers

将代码从pytorch-pretrained-bert迁移到transformers

安装

此仓库已在Python 3.5 +,PyTorch 1.0.0+和TensorFlow 2.0.0-rc1上进行了测试

你应该安装虚拟环境中的transformers。如果你不熟悉Python虚拟环境,请查看用户指南。

使用你要使用的Python版本创建一个虚拟环境并激活它。

现在,如果你想使用transformers,你可以使用pip进行安装。如果你想使用这些示例,则必须从源代码安装它。

pip安装

首先,你需要安装TensorFlow 2.0或PyTorch。有关适用于你平台的特定安装命令,请参阅TensorFlow安装页面和/或PyTorch安装页面。

安装TensorFlow 2.0或PyTorch后,可以使用pip如下安装transformers:

pip install transformers  

获取源码

同样在这里,你首先需要安装TensorFlow 2.0或PyTorch中。有关适用于你平台的特定安装命令,请参阅TensorFlow安装页面和/或PyTorch安装页面。

在安装TensorFlow 2.0或PyTorch之后,你可以通过克隆存储库并运行以下命令从源代码进行安装:

git clone https://github.com/huggingface/transformers  cd transformers  pip install .  

更新存储库时,应按以下方式升级transformers及其依赖项:

git pull  pip install --upgrade .  

运行示例

示例包含在存储库中,但未随库一起提供。

因此,为了运行示例的最新版本,你需要如上所述从源代码安装。

查看自述文件,了解如何运行示例。

测试

该库和一些示例脚本包括一系列测试。可以在tests文件夹中找到库测试,而在examples文件夹中可以找到示例测试。

根据安装的框架(TensorFlow 2.0或PyTorch),不相关的测试将被跳过。如果要执行所有测试,请确保两个框架都已安装。

这是为库运行测试的最简单方法:

pip install -e ".[testing]"  make test  

对于示例:

pip install -e ".[testing]"  pip install -r examples/requirements.txt  make test-examples  

有关详细信息,请参阅提供指南。

你要在移动设备上运行Transformer模型吗?

你应该查看我们的swift-coreml-transformers仓库。

https://github.com/huggingface/swift-coreml-transformers

它包含了一套工具来转换PyTorch或TensorFlow 2.0训练的transformers模型(目前包含GPT-2,DistilGPT-2,BERT和DistilBERT)以CoreML模型运行在iOS设备上。

在将来的某个时候,你将能够从预训练或微调模型无缝过渡到在CoreML中进行生产,或者在CoreML中对模型或应用进行原型设计,然后从TensorFlow 2.0和研究其超参数或体系结构!

模型架构

transformers目前提供以下NLU / NLG体系结构:

  1. BERT
  2. GPT
  3. GPT-2
  4. Transformer-XL
  5. XLNet
  6. XLM
  7. RoBERTa
  8. DistilBERT
  9. CTRL
  10. CamemBERT
  11. ALBERT
  12. T5
  13. XLM-RoBERTa
  14. MMBT
  15. FlauBERT
  16. 其他社区的模型
  17. 想要贡献一个新的模型吗?我们已经添加了详细的教程和模板来指导你添加新模型的过程。你可以在存储库的templates文件夹中找到它们。

在线演示

由Transformer.huggingface.co的Hugging Face团队构建的 Write With Transformer是此仓库的文本生成功能的正式演示。你可以用它完成GPT2Model,TransfoXLModel和XLNetModel一些实验。

快速浏览

让我们做一个快速浏览。每个模型架构的详细示例(Bert、GPT、GPT-2、Transformer-XL、XLNet和XLM)可以在完整文档中找到

(https://huggingface.co/transformers/)。

import torch  from transformers import *    # transformer有一个统一的API  # 有10个Transformer结构和30个预训练权重模型。  #模型|分词|预训练权重  MODELS = [(BertModel,       BertTokenizer,       'bert-base-uncased'),            (OpenAIGPTModel,  OpenAIGPTTokenizer,  'openai-gpt'),            (GPT2Model,       GPT2Tokenizer,       'gpt2'),            (CTRLModel,       CTRLTokenizer,       'ctrl'),            (TransfoXLModel,  TransfoXLTokenizer,  'transfo-xl-wt103'),            (XLNetModel,      XLNetTokenizer,      'xlnet-base-cased'),            (XLMModel,        XLMTokenizer,        'xlm-mlm-enfr-1024'),            (DistilBertModel, DistilBertTokenizer, 'distilbert-base-cased'),            (RobertaModel,    RobertaTokenizer,    'roberta-base'),            (XLMRobertaModel, XLMRobertaTokenizer, 'xlm-roberta-base'),           ]    # 要使用TensorFlow 2.0版本的模型,只需在类名前面加上“TF”,例如。“TFRobertaModel”是TF2.0版本的PyTorch模型“RobertaModel”    # 让我们用每个模型将一些文本编码成隐藏状态序列:  for model_class, tokenizer_class, pretrained_weights in MODELS:      # 加载pretrained模型/分词器      tokenizer = tokenizer_class.from_pretrained(pretrained_weights)      model = model_class.from_pretrained(pretrained_weights)        # 编码文本      input_ids = torch.tensor([tokenizer.encode("Here is some text to encode", add_special_tokens=True)])  # 添加特殊标记      with torch.no_grad():          last_hidden_states = model(input_ids)[0]  # 模型输出是元组    # 每个架构都提供了几个类,用于对下游任务进行调优,例如。  BERT_MODEL_CLASSES = [BertModel, BertForPreTraining, BertForMaskedLM, BertForNextSentencePrediction,                        BertForSequenceClassification, BertForTokenClassification, BertForQuestionAnswering]    # 体系结构的所有类都可以从该体系结构的预训练权重开始  #注意,为微调添加的额外权重只在需要接受下游任务的训练时初始化    pretrained_weights = 'bert-base-uncased'  tokenizer = BertTokenizer.from_pretrained(pretrained_weights)  for model_class in BERT_MODEL_CLASSES:      # 载入模型/分词器      model = model_class.from_pretrained(pretrained_weights)        # 模型可以在每一层返回隐藏状态和带有注意力机制的权值      model = 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:]        #模型与Torchscript兼容      model = model_class.from_pretrained(pretrained_weights, torchscript=True)      traced_model = torch.jit.trace(model, (input_ids,))        # 模型和分词的简单序列化      model.save_pretrained('./directory/to/save/')  # 保存      model = model_class.from_pretrained('./directory/to/save/')  # 重载      tokenizer.save_pretrained('./directory/to/save/')  # 保存      tokenizer = BertTokenizer.from_pretrained('./directory/to/save/')  # 重载    

快速游览TF2.0的训练和与PyTorch的互操作性

让我们做一个快速的例子如何用12行代码训练TensorFlow 2.0模型,然后加载在PyTorch快速检验/测试。

import tensorflow as tf  import tensorflow_datasets  from transformers import *    # 从预训练模型/词汇表中加载数据集、分词器、模型  tokenizer = BertTokenizer.from_pretrained('bert-base-cased')  model = TFBertForSequenceClassification.from_pretrained('bert-base-cased')  data = tensorflow_datasets.load('glue/mrpc')    # 准备数据集作为tf.data.Dataset的实例  train_dataset = glue_convert_examples_to_features(data['train'], tokenizer, max_length=128, task='mrpc')  valid_dataset = glue_convert_examples_to_features(data['validation'], tokenizer, max_length=128, task='mrpc')  train_dataset = train_dataset.shuffle(100).batch(32).repeat(2)  valid_dataset = valid_dataset.batch(64)    # 准备训练:编写tf.keras模型与优化,损失和学习率调度  optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0)  loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)  metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')  model.compile(optimizer=optimizer, loss=loss, metrics=[metric])    # 用tf.keras.Model.fit进行测试和评估  history = model.fit(train_dataset, epochs=2, steps_per_epoch=115,                      validation_data=valid_dataset, validation_steps=7)    # 在PyTorch中加载TensorFlow模型进行检查  model.save_pretrained('./save/')  pytorch_model = BertForSequenceClassification.from_pretrained('./save/', from_tf=True)    #让我们看看我们的模型是否学会了这个任务  sentence_0 = "This research was consistent with his findings."  sentence_1 = "His findings were compatible with this research."  sentence_2 = "His findings were not compatible with this research."  inputs_1 = tokenizer.encode_plus(sentence_0, sentence_1, add_special_tokens=True, return_tensors='pt')  inputs_2 = tokenizer.encode_plus(sentence_0, sentence_2, add_special_tokens=True, return_tensors='pt')    pred_1 = pytorch_model(inputs_1['input_ids'], token_type_ids=inputs_1['token_type_ids'])[0].argmax().item()  pred_2 = pytorch_model(inputs_2['input_ids'], token_type_ids=inputs_2['token_type_ids'])[0].argmax().item()    print("sentence_1 is", "a paraphrase" if pred_1 else "not a paraphrase", "of sentence_0")  print("sentence_2 is", "a paraphrase" if pred_2 else "not a paraphrase", "of sentence_0")