52

Transformers 简介(上)

 4 years ago
source link: https://panchuang.net/2020/03/12/transformers-简介(上)/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文是全系列中第1 / 1篇:Transformers

  • 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一些实验。

MfUBVze.jpg!web

3UvMNjR.png!web

快速浏览

让我们做一个快速浏览。每个模型架构的详细示例(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")

原创文章,作者:磐石,如若转载,请注明出处:https://panchuang.net/2020/03/12/transformers-%e7%ae%80%e4%bb%8b%ef%bc%88%e4%b8%8a%ef%bc%89/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK