­

最新自然語言處理庫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")