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體系結構:
- BERT
- GPT
- GPT-2
- Transformer-XL
- XLNet
- XLM
- RoBERTa
- DistilBERT
- CTRL
- CamemBERT
- ALBERT
- T5
- XLM-RoBERTa
- MMBT
- FlauBERT
- 其他社區的模型
- 想要貢獻一個新的模型嗎?我們已經添加了詳細的教程和模板來指導你添加新模型的過程。你可以在存儲庫的templates文件夾中找到它們。
在線演示
由Transformer.huggingface.co的Hugging Face團隊構建的 Write With Transformer是此倉庫的文本生成功能的正式演示。你可以用它完成GPT2Model,TransfoXLModel和XLNetModel一些實驗。
快速瀏覽
讓我們做一個快速瀏覽。每個模型架構的詳細示例(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>
閱讀更多 人工智能遇見磐創 的文章