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")

歡迎關注磐創博客資源匯總站: http://docs.panchuang.net/

歡迎關注PyTorch官方中文教程站: http://pytorch.panchuang.net/

OpenCV中文官方文檔: http://woshicver.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM