Transformers 介紹(上)

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框架之間隨意遷移模型
  • 無縫選擇合適的框架進行訓練,評估和生產

安裝

此倉庫已在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:

<code>pip install transformers/<code>

獲取源碼

同樣在這裡,你首先需要安裝TensorFlow 2.0或PyTorch中。有關適用於你平臺的特定安裝命令,請參閱TensorFlow安裝頁面和/或PyTorch安裝頁面。

在安裝TensorFlow 2.0或PyTorch之後,你可以通過克隆存儲庫並運行以下命令從源代碼進行安裝:

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

更新存儲庫時,應按以下方式升級transformers及其依賴項:

<code>git pull 
pip install --upgrade ./<code>

運行示例

示例包含在存儲庫中,但未隨庫一起提供。

因此,為了運行示例的最新版本,你需要如上所述從源代碼安裝。

查看自述文件,瞭解如何運行示例。

測試

該庫和一些示例腳本包括一系列測試。可以在tests文件夾中找到庫測試,而在examples文件夾中可以找到示例測試。

根據安裝的框架(TensorFlow 2.0或PyTorch),不相關的測試將被跳過。如果要執行所有測試,請確保兩個框架都已安裝。

這是為庫運行測試的最簡單方法:

<code>pip install -e ".[testing]"
make test/<code>

對於示例:

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

有關詳細信息,請參閱提供指南。

你要在移動設備上運行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一些實驗。

Transformers 介紹(上)

Transformers 介紹(上)

快速瀏覽

讓我們做一個快速瀏覽。每個模型架構的詳細示例(Bert、GPT、GPT-2、Transformer-XL、XLNet和XLM)可以在完整文檔中找到

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

<code>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/') # 重載
/<code>

快速遊覽TF2.0的訓練和與PyTorch的互操作性

讓我們做一個快速的例子如何用12行代碼訓練TensorFlow 2.0模型,然後加載在PyTorch快速檢驗/測試。

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


分享到:


相關文章: