我們正在開發該項目,用於標記NLPER總是符合的任務。
使用XLNET進行以下任務
警報,這些代碼尚未完成。謹慎使用。
例如,使用以下方式運行scipts
python2.7 /home/dev/Documents/xlnet-master/run_blstm_crf-run_race.py
--use_tpu
--model_config_path /home/dev/Documents/xlnet_models/xlnet_cased_L-12_H-768_A-12/xlnet_config.json
--spiece_model_file /home/dev/Documents/xlnet_models/xlnet_cased_L-12_H-768_A-12/spiece.model
--model_dir /home/dev/Documents/xlnet_models/finetuned/
--data_dir /home/dev/Documents/udify-master/data/ud/xlnet_data/
--do_train True
--save_steps 2
--output_dir /home/dev/Documents/xlnet_models/output_dir https://universaldependencencies.org/
您可以使用“查找./ -name *test/dev/train.conll”來查找所有conll文件,並使用XARG將其複製到data_dir
https://github.com/yuchenlin/ontonotes-5.0-ner-bio
只需使用Python腳本文件將英語文件複製到data_dir:onotonotes_conll_copyfile.py(您可能需要修改路徑)
歡迎PR !請幫助開發項目以增強我們的NLP功率!
XLNET是一種基於新穎的廣義置換語言建模目標的新的無監督語言表示學習方法。此外,XLNET還採用Transformer-XL作為骨幹模型,在涉及長篇小說的語言任務方面表現出色。總體而言,XLNET在各種下游語言任務上取得了最新的(SOTA),包括問答,自然語言推斷,情感分析和文檔排名。
有關技術細節和實驗結果的詳細說明,請參閱我們的論文:
XLNET:通用自動回報預處理以了解語言理解
Zhilin Yang*,Zihang dai*,Yiming Yang,Jaime Carbonell,Ruslan Salakhutdinov,Quoc V. Le
(*:同等貢獻)
預印2019年
截至2019年6月19日,XLNet在20個任務上的表現優於Bert,並在18個任務上取得了最新的成果。以下是XLNET-LARGE和BERT-LARGE之間的一些比較,它們具有相似的模型大小:
| 模型 | 種族準確性 | squad1.1 em | squad2.0 em |
|---|---|---|---|
| Bert-large | 72.0 | 84.1 | 78.98 |
| XLNET基礎 | 80.18 | ||
| Xlnet-large | 81.75 | 88.95 | 86.12 |
我們在表中使用小隊開發結果來排除其他因素,例如使用其他培訓數據或其他數據增強技術。有關測試號,請參見小隊排行榜。
| 模型 | IMDB | Yelp-2 | Yelp-5 | dbpedia | 亞馬遜2 | 亞馬遜5 |
|---|---|---|---|---|---|---|
| Bert-large | 4.51 | 1.89 | 29.32 | 0.64 | 2.63 | 34.17 |
| Xlnet-large | 3.79 | 1.55 | 27.80 | 0.62 | 2.40 | 32.26 |
以上數字是錯誤率。
| 模型 | mnli | Qnli | QQP | rte | SST-2 | MRPC | 可樂 | STS-B |
|---|---|---|---|---|---|---|---|---|
| Bert-large | 86.6 | 92.3 | 91.3 | 70.4 | 93.2 | 88.0 | 60.6 | 90.0 |
| XLNET基礎 | 86.8 | 91.7 | 91.4 | 74.0 | 94.7 | 88.2 | 60.2 | 89.5 |
| Xlnet-large | 89.8 | 93.9 | 91.8 | 83.8 | 95.6 | 89.2 | 63.6 | 91.8 |
我們使用表中的單任務開發結果來排除其他因素,例如多任務學習或使用合奏。
截至2019年7月16日,已提供以下模型:
XLNet-Large, Cased :24層,1024個隱藏,16頭XLNet-Base, Cased :12層,768隱藏,12頭。該模型對完整數據進行了培訓(與論文中的數據不同)。我們目前僅發布Cased模型,因為在我們考慮的任務上,我們發現:(1)對於基本設置,殼體和未基於的模型具有相似的性能; (2)對於大型設置,在某些任務中,外殼模型要好一些。
每個.zip文件包含三個項目:
xlnet_model.ckpt ),其中包含預訓練的權重(實際上是3個文件)。spiece.model )。xlnet_config.json )指定模型的超參數。我們還計劃在不同的設置下不斷釋放更多預定的模型,包括:
為了接收有關更新,公告和新版本的通知,我們建議在Google組上訂閱XLNET。
截至2019年6月19日,該代碼基礎已在Python2下用Tensorflow 1.13.1進行了測試。
XLNet-Large SOTA SOTA在本文中使用GPU和12GB-16GB的RAM產生,因為16GB GPU只能持有XLNet-Large的長度為512的單個序列。因此,需要大量(從32到128,等於batch_size )的GPU來重現論文中的許多結果。給定上面提到的內存問題,使用默認的登錄腳本( run_classifier.py和run_squad.py ),我們使用TensorFlow 1.13.1 :單個16GB GPU上的最大批處理大小進行了基準測試。
| 系統 | SEQ長度 | 最大批處理大小 |
|---|---|---|
XLNet-Base | 64 | 120 |
| ... | 128 | 56 |
| ... | 256 | 24 |
| ... | 512 | 8 |
XLNet-Large | 64 | 16 |
| ... | 128 | 8 |
| ... | 256 | 2 |
| ... | 512 | 1 |
在大多數情況下,可以減少批處理大小train_batch_size或最大序列長度max_seq_length以適合給定的硬件。性能的下降取決於任務和可用資源。
用於執行分類/回歸框的代碼在run_classifier.py中。它還包含用於標準一文物分類,一道文檔回歸和文檔對分類的示例。在這裡,我們提供了兩個具體示例,介紹瞭如何使用run_classifier.py 。
從這裡開始,我們假設XLNET-LARGE和XLNET-BASE分別已下載到$LARGE_DIR和$BASE_DIR 。
通過運行此腳本下載膠水數據,然後將其解放到某些目錄$GLUE_DIR 。
通過運行,用XLNET-LARGE執行多GPU (4 V100 GPU)
CUDA_VISIBLE_DEVICES=0,1,2,3 python run_classifier.py
--do_train=True
--do_eval=False
--task_name=sts-b
--data_dir= ${GLUE_DIR} /STS-B
--output_dir=proc_data/sts-b
--model_dir=exp/sts-b
--uncased=False
--spiece_model_file= ${LARGE_DIR} /spiece.model
--model_config_path= ${LARGE_DIR} /xlnet_config.json
--init_checkpoint= ${LARGE_DIR} /xlnet_model.ckpt
--max_seq_length=128
--train_batch_size=8
--num_hosts=1
--num_core_per_host=4
--learning_rate=5e-5
--train_steps=1200
--warmup_steps=120
--save_steps=600
--is_regression=True通過單個GPU評估鑑定結果
CUDA_VISIBLE_DEVICES=0 python run_classifier.py
--do_train=False
--do_eval=True
--task_name=sts-b
--data_dir= ${GLUE_DIR} /STS-B
--output_dir=proc_data/sts-b
--model_dir=exp/sts-b
--uncased=False
--spiece_model_file= ${LARGE_DIR} /spiece.model
--model_config_path= ${LARGE_DIR} /xlnet_config.json
--max_seq_length=128
--eval_batch_size=8
--num_hosts=1
--num_core_per_host=1
--eval_all_ckpt=True
--is_regression=True
# Expected performance: "eval_pearsonr 0.916+ "注意:
num_core_per_host表示要使用的GPU數量。train_batch_size是指每gpu批量尺寸。eval_all_ckpt允許人們評估所有保存的檢查點(保存頻率由save_steps控制),並根據開發性能選擇最佳模型。data_dir和output_dir分別是指“原始數據”和“預處理tfrecords”的目錄,而model_dir是保存檢查點和張量事件的工作目錄。 model_dir應設置為init_checkpoint的單獨文件夾。--train_batch_size=32和--num_core_per_host=1 ,以及init_checkpoint和model_config_path中的更改。train_batch_size並增加num_core_per_host以使用相同的訓練設置。通過運行下載並解開IMDB數據集
wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
tar zxvf aclImdb_v1.tar.gz啟動Google Cloud TPU V3-8實例(有關如何設置Cloud TPU,請參見Google Cloud TPU教程)。
設置您的Google存儲存儲桶路徑$GS_ROOT ,然後將IMDB數據集移動並驗證的檢查點進入您的Google存儲。
通過運行使用XLNet-Large執行TPU登錄
python run_classifier.py
--use_tpu=True
--tpu= ${TPU_NAME}
--do_train=True
--do_eval=True
--eval_all_ckpt=True
--task_name=imdb
--data_dir= ${IMDB_DIR}
--output_dir= ${GS_ROOT} /proc_data/imdb
--model_dir= ${GS_ROOT} /exp/imdb
--uncased=False
--spiece_model_file= ${LARGE_DIR} /spiece.model
--model_config_path= ${GS_ROOT} / ${LARGE_DIR} /model_config.json
--init_checkpoint= ${GS_ROOT} / ${LARGE_DIR} /xlnet_model.ckpt
--max_seq_length=512
--train_batch_size=32
--eval_batch_size=8
--num_hosts=1
--num_core_per_host=8
--learning_rate=2e-5
--train_steps=4000
--warmup_steps=500
--save_steps=500
--iterations=500
# Expected performance: "eval_accuracy 0.962+ "注意:
data_dir和spiece_model_file都使用本地路徑而不是Google存儲路徑。原因是數據預處理實際上是在本地執行的。因此,使用本地路徑會導致更快的預處理速度。 run_squad.py中包含了小隊數據集的代碼。
運行代碼:
(1)將squad2.0數據集下載到$SQUAD_DIR中:
mkdir -p ${SQUAD_DIR} && cd ${SQUAD_DIR}
wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json
wget https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v2.0.json (2)使用腳本scripts/prepro_squad.sh執行數據預處理。
為了準確地將字符位置(原始數據)映射到句子件位置(用於訓練),這將需要一段時間。
有關更快的並行預處理,請參閱run_squad.py中的標誌--num_proc和--proc_id 。
(3)執行培訓和評估。
為了獲得最佳性能,XLNET-LARGE使用序列長度512和批次48進行訓練。
結果,重現GPU的最佳結果非常困難。
對於使用一個TPU V3-8的培訓,在設置了TPU和Google Storage之後,就可以簡單地運行腳本scripts/tpu_squad_large.sh 。
run_squad.py將自動執行閾值搜索,並輸出分數。使用scripts/tpu_squad_large.sh ,預期的F1分數應為88.6(我們多次運行的中位數)。
另外,可以將XLNET基本與GPU一起使用(例如三V100)。一組合理的超參數可以在腳本scripts/gpu_squad_base.sh中找到。
讀取理解任務競賽的代碼包含在run_race.py中。
運行代碼:
(1)從官方網站下載Race數據集,並將原始數據打開到$RACE_DIR 。
(2)進行培訓和評估:
script/tpu_race_large_bsz32.sh 。script/tpu_race_large_bsz8.sh )。提供了與GPU一起使用Google Colab的一個示例。請注意,由於該硬件在示例中受到限制,因此結果比我們獲得的最佳功能要差。它主要用作示例,應進行相應的修改以最大程度地提高性能。
對於Finetuning,您很可能可以修改現有文件,例如run_classifier.py , run_squad.py和run_race.py ,以適合您的任務。但是,我們還提供了XLNET的抽象,以實現更靈活的用法。以下是一個示例:
import xlnet
# some code omitted here...
# initialize FLAGS
# initialize instances of tf.Tensor, including input_ids, seg_ids, and input_mask
# XLNetConfig contains hyperparameters that are specific to a model checkpoint.
xlnet_config = xlnet . XLNetConfig ( json_path = FLAGS . model_config_path )
# RunConfig contains hyperparameters that could be different between pretraining and finetuning.
run_config = xlnet . create_run_config ( is_training = True , is_finetune = True , FLAGS = FLAGS )
# Construct an XLNet model
xlnet_model = xlnet . XLNetModel (
xlnet_config = xlnet_config ,
run_config = run_config ,
input_ids = input_ids ,
seg_ids = seg_ids ,
input_mask = input_mask )
# Get a summary of the sequence using the last hidden state
summary = xlnet_model . get_pooled_out ( summary_type = "last" )
# Get a sequence output
seq_out = xlnet_model . get_sequence_output ()
# build your applications based on `summary` or `seq_out`以下是在XLNET中進行令牌化的一個示例:
import sentencepiece as spm
from prepro_utils import preprocess_text , encode_ids
# some code omitted here...
# initialize FLAGS
text = "An input text string."
sp_model = spm . SentencePieceProcessor ()
sp_model . Load ( FLAGS . spiece_model_file )
text = preprocess_text ( text , lower = FLAGS . uncased )
ids = encode_ids ( sp_model , text )其中FLAGS.spiece_model_file是與預處理模型相同的zip中的句子模型文件, FLAGS.uncased是指示是否要進行的布爾。
請參閱train.py ,以便在TPU上進行預處理和train_gpu.py進行GPU預處理。首先,我們需要將文本數據預處理到Tfrecords中。
python data_utils.py
--bsz_per_host=32
--num_core_per_host=16
--seq_len=512
--reuse_len=256
--input_glob= * .txt
--save_dir= ${SAVE_DIR}
--num_passes=20
--bi_data=True
--sp_path=spiece.model
--mask_alpha=6
--mask_beta=1
--num_predict=85如果input_glob定義了所有輸入文本文件, save_dir是tfrecords的輸出目錄,而sp_path是句子件模型。這是我們訓練句子模型的腳本
spm_train
--input= $INPUT
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--character_coverage=0.99995
--model_type=unigram
--control_symbols= < cls > , < sep > , < pad > , < mask > , < eod >
--user_defined_symbols= < eop > ,.,(,), " ,-,–,£,€
--shuffle_input_sentence
--input_sentence_size=10000000使用特殊符號,包括control_symbols和user_defined_symbols 。我們使用<eop>和<eod>分別表示段落的結尾和文檔的結尾。
輸入文本文件到data_utils.py必須使用以下格式:
<eop> ,以指示相應的句子結束段落。例如,文本輸入文件可能是:
This is the first sentence.
This is the second sentence and also the end of the paragraph.<eop>
Another paragraph.
Another document starts here.
預處理後,我們準備為XLNET預處理。以下是用於預處理Xlnet-large的超參數:
python train.py
--record_info_dir= $DATA /tfrecords
--train_batch_size=2048
--seq_len=512
--reuse_len=256
--mem_len=384
--perm_size=256
--n_layer=24
--d_model=1024
--d_embed=1024
--n_head=16
--d_head=64
--d_inner=4096
--untie_r=True
--mask_alpha=6
--mask_beta=1
--num_predict=85如果我們僅列出最重要的標誌和其他標誌,則可以根據特定用例進行調整。