最新自然語言處理庫transformers
- 2020 年 3 月 9 日
- 筆記

作 者 | 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體系結構:
- 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/)。
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")