私たちは、NLPERが常に出会うタスクをタグ付けするためにこのプロジェクトを開発しています。
次のタスクにはXLNETを使用します
アラーム、これらのコードはまだ終了していません。使用することに注意してください。
たとえば、以下を使用してSCIPTを実行します。
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://universaldependencies.org/
「find ./ -name *test/dev/train.conll」を使用してすべてのconllファイルを見つけ、xargsを使用してdata_dirにコピーできます
https://github.com/yuchenlin/ontonotes-5.0-ner-bio
pythonスクリプトファイルを使用して、英語ファイルをdata_dirにコピーするだけです:onotonotes_conll_copyfile.py(パスを変更する必要があるかもしれません)
PR Sは大歓迎です! 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 |
|---|---|---|---|
| バート・ラージ | 72.0 | 84.1 | 78.98 |
| xlnet-base | 80.18 | ||
| xlnet-large | 81.75 | 88.95 | 86.12 |
Squad Devの結果をテーブルで使用して、追加のトレーニングデータや他のデータ増強技術を使用するなど、他の要因を除外します。テスト番号については、Squad Leaderboardを参照してください。
| モデル | IMDB | Yelp-2 | Yelp-5 | dbpedia | Amazon-2 | Amazon-5 |
|---|---|---|---|---|---|---|
| バート・ラージ | 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 |
|---|---|---|---|---|---|---|---|---|
| バート・ラージ | 86.6 | 92.3 | 91.3 | 70.4 | 93.2 | 88.0 | 60.6 | 90.0 |
| xlnet-base | 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モデルのみをリリースします。これが検討されているタスクでは、次のことがわかりました。 (2)大規模な設定では、一部のタスクではケースモデルが少し優れています。
各.zipファイルには3つの項目が含まれています。
xlnet_model.ckpt )。spiece.model )。xlnet_config.json )。また、以下を含む、さまざまな設定で、より先立ったモデルを継続的にリリースする予定です。
更新、発表、新しいリリースに関する通知を受信するには、GoogleグループのXLNETを購読することをお勧めします。
2019年6月19日現在、このコードベースは、Python2でTensorflow 1.13.1でテストされています。
XLNet-Large XLNet-Large結果のほとんどを再現することは現在非常に困難です(コストがかかります)。したがって、GPUの大量( batch_sizeに等しい32〜128の範囲)が、多くの結果を紙に再現する必要があります。上記のメモリの問題を考慮して、デフォルトのFinetuningスクリプト( 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を指定されたハードウェアに適合させることができます。パフォーマンスの低下は、タスクと利用可能なリソースに依存します。
分類/回帰Finetuningを実行するために使用されるコードは、 run_classifier.pyにあります。また、標準の1-ドキュメント分類、ワンドキュメント回帰、ドキュメントペア分類の例も含まれています。ここでは、 run_classifier.py使用する方法の2つの具体的な例を提供します。
これからは、XLNet-LargeとXLNet-Baseがそれぞれ$LARGE_DIRと$BASE_DIRにダウンロードされていると想定しています。
このスクリプトを実行して接着剤データをダウンロードして、ディレクトリ$GLUE_DIRに解凍します。
実行することにより、XLNet-LargeでMulti-GPU (4 V100 GPU)Finetuningを実行します
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を使用して、Finetuningの結果を評価します
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頻度はsave_stepsによって制御されます)を評価し、開発のパフォーマンスに基づいて最適なモデルを選択できます。data_dirとoutput_dir 、それぞれ「生データ」と「前処理されたtfrecords」のディレクトリを参照しますが、 model_dirチェックポイントとtensorflowイベントを保存するための作業ディレクトリです。 model_dir 、 init_checkpointの別のフォルダーとして設定する必要があります。init_checkpointとmodel_config_pathの変更とともに、 --train_batch_size=32および--num_core_per_host=1単純に設定できます。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.gzGoogle Cloud TPU V3-8インスタンスを起動します(Cloud TPUをセットアップする方法については、Google Cloud TPUチュートリアルを参照)。
Googleストレージバケットパス$GS_ROOTをセットアップし、IMDBデータセットと前処理されたチェックポイントをGoogleストレージに移動します。
実行してXLNet-LargeでTPU Finetuningを実行します
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で最良の結果を再現することは非常に困難です。
1つのTPU V3-8でトレーニングするために、TPUとGoogleストレージの両方がセットアップされた後、スクリプトscripts/tpu_squad_large.sh単純に実行できます。
run_squad.py 、チームの開発セットでしきい値検索を自動的に実行し、スコアを出力します。 scripts/tpu_squad_large.shでは、予想されるF1スコアは約88.6(複数の実行の中央値)でなければなりません。
または、GPUを使用してXLNet-Baseを使用できます(3つのV100など)。合理的なハイパーパラメーターの1つのセットは、スクリプトscripts/gpu_squad_base.shにあります。
読解タスクレースのコードはrun_race.pyに含まれています。
コードを実行するには:
(1)公式WebサイトからRaceデータセットをダウンロードし、生データを$RACE_DIRに解除します。
(2)トレーニングと評価を実行する:
script/tpu_race_large_bsz32.shを参照してください。script/tpu_race_large_bsz8.shを参照)。Google ColabをGPUで使用する例が提供されています。ハードウェアは例に制約されているため、結果は私たちが得ることができる最高のものよりも悪いことに注意してください。それは主に例として機能し、パフォーマンスを最大化するためにそれに応じて変更する必要があります。
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のincentpieceモデルファイルである場合、 FLAGS.uncased 、ゼンキングを行うかどうかを示すブールです。
TPUおよびtrain_gpu.pyのPretrainingについては、GPUの前削減については、 train.pyを参照してください。まず、テキストデータをTrecordsに前処理する必要があります。
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最も重要なフラグのみをリストし、特定のユースケースに基づいて他のフラグを調整できます。