【AI實戰(zhàn)】最強NLP預(yù)訓(xùn)練模型庫PyTorch-Transformers正式開源!支持6個預(yù)訓(xùn)練框架,27個預(yù)訓(xùn)練模型
照例先上開源地址:
https://github.com/huggingface/pytorch-transformers#quick-tour
官網(wǎng):
https://huggingface.co/pytorch-transformers/index.html
PyTorch-Transformers(正式名稱為 pytorch-pretrained-bert)是一個用于自然語言處理(NLP)的最先進的預(yù)訓(xùn)練模型庫。
該庫目前包含下列模型的 PyTorch 實現(xiàn)、預(yù)訓(xùn)練模型權(quán)重、使用腳本和下列模型的轉(zhuǎn)換工具:
這些實現(xiàn)已在幾個數(shù)據(jù)集上進行測試(參見示例腳本),應(yīng)該與原始實現(xiàn)的性能相當(dāng)(例如,BERT 全詞覆蓋(Whole-Word-Masking)在 SQUAD 數(shù)據(jù)集上的 F1 分?jǐn)?shù)為 93,OpenAI GPT 在 RocStories 上的 F1 分?jǐn)?shù)為 88,Transformer-XL 在 WikiText 103 上的 困惑度為 18.3、XLNet 的 STS-B 上的皮爾遜積矩相關(guān)系數(shù)為 0.916)。用戶可以在官方網(wǎng)站的文檔示例部分中,找到有關(guān)性能的更多詳細信息。
安? 裝
此 repo 在 Python 2.7 和 3.5+(示例代碼僅在 Python 3.5+ 上通過測試)以及 PyTorch 0.4.1 到 1.1.0 上進行了測試。
使用 pip 進行安裝
pip install pytorch-transformers
從源進行安裝
克隆存儲庫并運行如下命令:
pip install [--editable] .
測試
該庫和示例腳本包含了一系列測試。庫測試可在 “tests” 文件夾中找到,示例腳本的測試可以在 “examples”文件夾 中找到。
這些測試可以使用 pytest 運行(如果需要,可以使用 pip install pytest 來安裝 pytest)。
你可以使用以下命令從克隆存儲庫的根目錄進行測試:
python -m pytest -sv ./pytorch_transformers/tests/
python -m pytest -sv ./examples/
快速指南
讓我們快速導(dǎo)覽一下 PyTorch-Transformer。每個模型架構(gòu)(Bert、GPT、GPT-2、Transformer-XL、XLNet、XLM)的詳細示例均可在 完整的文檔 中找到。
import torch
from pytorch_transformers import *
# PyTorch-Transformers has a unified API
# for 6 transformer architectures and 27 pretrained weights.
# ? ? ? ? ?Model ? ? ? ? ?| Tokenizer ? ? ? ? ?| Pretrained weights shortcut
MODELS = [(BertModel, ? ? ? BertTokenizer, ? ? ?'bert-base-uncased'),
(OpenAIGPTModel, ?OpenAIGPTTokenizer, 'openai-gpt'),
(GPT2Model, ? ? ? GPT2Tokenizer, ? ? ?'gpt2'),
(TransfoXLModel, ?TransfoXLTokenizer, 'transfo-xl-wt103'),
(XLNetModel, ? ? ?XLNetTokenizer, ? ? 'xlnet-base-cased'),
(XLMModel, ? ? ? ?XLMTokenizer, ? ? ? 'xlm-mlm-enfr-1024')]
# Let's encode some text in a sequence of hidden-states using each model:
for model_class, tokenizer_class, pretrained_weights in MODELS:
# Load pretrained model/tokenizer
tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
model = model_class.from_pretrained(pretrained_weights)
# Encode text
input_ids = torch.tensor([tokenizer.encode("Here is some text to encode")])
last_hidden_states = model(input_ids)[0] ?# Models outputs are now tuples
# Each architecture is provided with several class for fine-tuning on down-stream tasks, e.g.
BERT_MODEL_CLASSES = [BertModel, BertForPreTraining, BertForMaskedLM, BertForNextSentencePrediction,
BertForSequenceClassification, BertForMultipleChoice, BertForTokenClassification,
BertForQuestionAnswering]
# All the classes for an architecture can be initiated from pretrained weights for this architecture
# Note that additional weights added for fine-tuning are only initialized
# and need to be trained on the down-stream task
tokenizer = BertTokenizer.from_pretrained(from_pretrained('bert-base-uncased')
for model_class in BERT_MODEL_CLASSES:
# Load pretrained model/tokenizer
model = model_class.from_pretrained('bert-base-uncased')
# Models can return full list of hidden-states & attentions weights at each layer
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:]
# Models are compatible with Torchscript
model = model_class.from_pretrained(pretrained_weights, torchscript=True)
traced_model = torch.jit.trace(model, (input_ids,))
# Simple serialization for models and tokenizers
model.save_pretrained('./directory/to/save/') ?# save
model = model_class.from_pretrained('./directory/to/save/') ?# re-load
tokenizer.save_pretrained('./directory/to/save/') ?# save
tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
# SOTA examples for GLUE, SQUAD, text generation...
微調(diào) / 用法腳本的快速指南
該庫包含幾個示例腳本,這些腳本具有用于 NLU 和 NLG 任務(wù)的 SOTA 性能:
run_glue.py :一個針對九個不同的 GLUE 任務(wù)(序列級分類)對 BERT、XLNet 和 XLM 進行微調(diào)的示例
run_squad.py :一個針對問答數(shù)據(jù)集 square 2.0(令牌級分類)對 BERT、XLNet 和 XLM 的示例
run_generation.py :一個使用 GPT、GPT-2、Transformer-XL 和 XLNet 生成條件語言的示例
其他特定于模型的示例(請參閱文檔)
以下是這些腳本的三個快速使用示例:
run_glue.py :對 GLUE 任務(wù)進行微調(diào)用于序列分類
通用語言理解評估(General Language Understanding Evaluation benchmark,GLUE)基準(zhǔn)是由九條句子或句子對語言理解任務(wù)的集合,用于評估和分析自然語言理解系統(tǒng)。
在運行這些 GLUE 任務(wù)之前,你應(yīng)該通過運行 此腳本 下載 GLUE 數(shù)據(jù),并將其解壓縮到某個目錄 $GLUE_DIR。
你還應(yīng)該安裝示例所需的附加包:
pip install -r ./examples/requirements.txt
export GLUE_DIR=/path/to/glue
export TASK_NAME=MRPC
python ./examples/run_glue.py \
--model_type bert \
--model_name_or_path bert-base-uncased \
--task_name $TASK_NAME \
--do_train \
--do_eval \
--do_lower_case \
--data_dir $GLUE_DIR/$TASK_NAME \
--max_seq_length 128 \
--per_gpu_eval_batch_size=8 ? \
--per_gpu_train_batch_size=8 ? \
--learning_rate 2e-5 \
--num_train_epochs 3.0 \
--output_dir /tmp/$TASK_NAME/
其中任務(wù)名稱可以是 CoLA、SST-2、MRPC、STS-B、QQP、MNLI、QNLI、RTE、WNLI 中的一個。
開發(fā)集的結(jié)果將出現(xiàn)在指定 output_dir 的文本文件“eval_results.txt”中。對于 MNLI,由于有兩個單獨的 dev 集,匹配的和不匹配的,除了“/tmp/MNLI/”之外,還有一個單獨的輸出文件夾,名為“/tmp/MNLI-MM/”。
在 STS-B 回歸任務(wù)上對 XLNet 模型進行微調(diào)
此示例代碼使用 4 塊 V100 GPU 的服務(wù)器上的并行訓(xùn)練,在 STS-B 語料庫上對 XLNet 進行微調(diào)。秉性訓(xùn)練是使用多個 GPU 的一種簡單方法(但比分布式訓(xùn)練速度更慢,靈活性也不如分布式訓(xùn)練,見下文)。
export GLUE_DIR=/path/to/glue
python ./examples/run_glue.py \
--model_type xlnet \
--model_name_or_path xlnet-large-cased \
--do_train ?\
--do_eval ? \
--task_name=sts-b ? ? \
--data_dir=${GLUE_DIR}/STS-B ?\
--output_dir=./proc_data/sts-b-110 ? \
--max_seq_length=128 ? \
--per_gpu_eval_batch_size=8 ? \
--per_gpu_train_batch_size=8 ? \
--gradient_accumulation_steps=1 \
--max_steps=1200 ?\
--model_name=xlnet-large-cased ? \
--overwrite_output_dir ? \
--overwrite_cache \
--warmup_steps=120
在這臺機器上,我們的批大小為 32,如果你的機器配置較差,請增加 gradient_accumulation_steps 以達到相同的批大小。這些超參數(shù)應(yīng)該導(dǎo)致在開發(fā)集上的皮爾遜積矩相關(guān)系數(shù)(Pearson correlation coefficient )為 +0.917 。
在 MRPC 分類任務(wù)上對 Bert 模型進行微調(diào)
此示例代碼使用 8 塊 V100 GPU 上的分布式訓(xùn)練,對 Microsoft Research 語句改寫語料庫(Microsoft Research Paraphrase Corpus,MRPC)中的 Bert 全詞覆蓋模型進行微調(diào),使其達到 F1>92。
使用這些超參數(shù)進行訓(xùn)練,我們得到了以下結(jié)果:
python -m torch.distributed.launch --nproc_per_node 8 ./examples/run_glue.py ? \
--model_type bert \
--model_name_or_path bert-large-uncased-whole-word-masking \
--task_name MRPC \
--do_train ? \
--do_eval ? \
--do_lower_case ? \
--data_dir $GLUE_DIR/MRPC/ ? \
--max_seq_length 128 ? \
--per_gpu_eval_batch_size=8 ? \
--per_gpu_train_batch_size=8 ? \
--learning_rate 2e-5 ? \
--num_train_epochs 3.0 ?\
--output_dir /tmp/mrpc_output/ \
--overwrite_output_dir ? \
--overwrite_cache \
使用這些超參數(shù)進行訓(xùn)練,我們得到了以下結(jié)果:
acc = 0.8823529411764706
acc_and_f1 = 0.901702786377709
eval_loss = 0.3418912578906332
f1 = 0.9210526315789473
global_step = 174
loss = 0.07231863956341798
run_squad.py :對 SQuAD 進行微調(diào)用于問答系統(tǒng)
此示例代碼使用 8 塊 V100 GPU 上的分布式訓(xùn)練和 BERT 全詞覆蓋模型對 SQuAD 數(shù)據(jù)集上的 BERT 進行微調(diào),以在 SQuAD 上達到 F1 的分?jǐn)?shù)大于 93:
python -m torch.distributed.launch --nproc_per_node=8 ./examples/run_squad.py \
--model_type bert \
--model_name_or_path bert-large-uncased-whole-word-masking \
--do_train \
--do_eval \
--do_lower_case \
--train_file $SQUAD_DIR/train-v1.1.json \
--predict_file $SQUAD_DIR/dev-v1.1.json \
--learning_rate 3e-5 \
--num_train_epochs 2 \
--max_seq_length 384 \
--doc_stride 128 \
--output_dir ../models/wwm_uncased_finetuned_squad/ \
--per_gpu_eval_batch_size=3 ? \
--per_gpu_train_batch_size=3 ? \
使用這些超參數(shù)進行訓(xùn)練,我們得到了以下結(jié)果:
python $SQUAD_DIR/evaluate-v1.1.py $SQUAD_DIR/dev-v1.1.json ../models/wwm_uncased_finetuned_squad/predictions.json
{"exact_match": 86.91579943235573, "f1": 93.1532499015869}
這是作為 bert-large-uncased-whole-word-masking-finetuned-squad 提供的模型。
run_generation.py :使用 GPT、GPT-2、Transformer-XL 和 XLNet 生成文本
還包括一個條件生成腳本,用于根據(jù)提示生成文本。生成腳本包括 Aman Rusia 提出的 技巧,利用 Transformer-XL 和 XLNet 等內(nèi)存模型獲得高質(zhì)量的生成(包括一個預(yù)定義的文本,使短輸入更長)。
下面是演示如何使用 OpenAI GPT-2 模型的小版本來運行腳本:
python ./examples/run_generation.py \
--model_type=gpt2 \
--length=20 \
--model_name_or_path=gpt2 \
從 pytorch-pretrained-bert 遷移到 pytorch-transformers
下面是一個快速總結(jié),闡述了從 pytorch-pretrained-bert 遷移到 pytorch-transformers 時應(yīng)該注意的事項。
模型總是輸出 tuples
從 pytorch-pretrained-bert 遷移到 pytorch-transformers 時,主要的突破性變化是模型的正演方法始終根據(jù)模型和配置參數(shù)輸出包含各種元素的 tuple。
每個模型的元組的確切內(nèi)容,在模型的文檔注釋和 文檔 中有詳細說明。
在幾乎所有情況下,你都可以將輸出的第一個元素作為之前在 pytorch-pretrained-bert 中使用的輸出。
下面是一個 pytorch-pretrained-bert 到 pytorch-transformers 轉(zhuǎn)換的示例,用于 BertForSequenceClassification 分類模型:
# Let's load our model
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
# If you used to have this line in pytorch-pretrained-bert:
loss = model(input_ids, labels=labels)
# Now just use this line in pytorch-transformers to extract the loss from the output tuple:
outputs = model(input_ids, labels=labels)
loss = outputs[0]
# In pytorch-transformers you can also have access to the logits:
loss, logits = outputs[:2]
# And even the attention weigths if you configure the model to output them (and other outputs too, see the docstrings and documentation)
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', output_attentions=True)
outputs = model(input_ids, labels=labels)
loss, logits, attentions = outputs
序列化
突破性更改:當(dāng)時用 from_pretrained() 方法實例化時,模型現(xiàn)在默認(rèn)設(shè)置為評估模式。要訓(xùn)練它們,不要忘記將它們設(shè)置回訓(xùn)練模式 ( model.train() ),以激活 dropout 模塊。
此外,雖然不是突破性更改,但序列化方法已經(jīng)標(biāo)準(zhǔn)化,如果你以前使用過任何其他序列化方法,你可能應(yīng)該切換到新方法 save_pretrained(save_directory) 。
下面是一個例子:
### Let's load a model and tokenizer
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
### Do some stuff to our model and tokenizer
# Ex: add new tokens to the vocabulary and embeddings of our model
tokenizer.add_tokens(['[SPECIAL_TOKEN_1]', '[SPECIAL_TOKEN_2]'])
model.resize_token_embeddings(len(tokenizer))
# Train our model
train(model)
### Now let's save our model and tokenizer to a directory
model.save_pretrained('./my_saved_model_directory/')
tokenizer.save_pretrained('./my_saved_model_directory/')
### Reload the model and the tokenizer
model = BertForSequenceClassification.from_pretrained('./my_saved_model_directory/')
tokenizer = BertTokenizer.from_pretrained('./my_saved_model_directory/')
優(yōu)化器:BertAdam 和 OpenAIAdam 現(xiàn)在是 AdamW,定時任務(wù)是標(biāo)準(zhǔn)的 PyTorch schedules。
之前包含的兩個優(yōu)化器 BertAdam 和 OpenAIAdam ,現(xiàn)在已被單個 AdamW 優(yōu)化器取代。新的優(yōu)化器 AdamW 與 PyTorch AdamW 優(yōu)化器 API 相匹配。
任務(wù)調(diào)度現(xiàn)在是標(biāo)準(zhǔn)的 PyTorch learning rate schedulers 程序,而不再是優(yōu)化器的一部分。
下面是 BertAdam 到 ?AdamW 的轉(zhuǎn)換示例,前者具有線性預(yù)熱(linear warmup)和衰減計劃,后者有相同的任務(wù)調(diào)度。
# Parameters:
lr = 1e-3
num_total_steps = 1000
num_warmup_steps = 100
warmup_proportion = float(num_warmup_steps) / float(num_total_steps) ?# 0.1
### Previously BertAdam optimizer was instantiated like this:
optimizer = BertAdam(model.parameters(), lr=lr, schedule='warmup_linear', warmup=warmup_proportion, t_total=num_total_steps)
### and used like this:
for batch in train_data:
loss = model(batch)
loss.backward()
optimizer.step()
### In PyTorch-Transformers, optimizer and schedules are splitted and instantiated like this:
optimizer = AdamW(model.parameters(), lr=lr, correct_bias=False) ?# To reproduce BertAdam specific behavior set correct_bias=False
scheduler = WarmupLinearSchedule(optimizer, warmup_steps=num_warmup_steps, t_total=num_total_steps) ?# PyTorch scheduler
### and used like this:
for batch in train_data:
loss = model(batch)
loss.backward()
scheduler.step()
optimizer.step()
引? 文
目前尚無與 PyTorch-Transformers 相關(guān)的論文,但我們正在準(zhǔn)備一篇。如果你在已發(fā)布或開源項目中使用了我們的項目,請?zhí)峒皩υ搸斓恼f明以及附上當(dāng)前存儲庫的鏈接。
https://github.com/huggingface/pytorch-transformers#quick-tour
轉(zhuǎn)自:https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247497424&idx=2&sn=d6f51df929686d84559e062e4d0225f4&chksm=fbea4f1fcc9dc6093640ab4d47fe1b2ece30927d1be606d87ae44723e0e95bea3245c640c6a0&mpshare=1&scene=24&srcid=&sharer_sharetime=1564962910032&sharer_shareid=68ae697f6949e81a714c38230b3f0ddb#rd
AI https 自然語言處理 機器學(xué)習(xí)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。