中国語、TensorFlow、PyTorch 用の XLNet
XLNet は、2019 年 6 月に CMU と Google Brain によって提案された新しい事前トレーニング モデルです。複数のタスクでバートを上回ります。自己回帰言語モデル(Autoregressive Language Modeling)を保持する形になります。
自動エンコーディング言語モデリングの利点を組み合わせて、置換言語モデリングが提案されています。そしてそれはTransformer-XLをベースにしており、
長いテキストを処理する能力が優れています。
このプロジェクトは [2] の研究を参照し、大量のデータを組み合わせて、3 億を超えるパラメーターを持つ 24 層の中国語xlnet_zh _Large モデルをトレーニングします。
ニュース、インタラクティブなディスカッション、百科事典、30G を超えるオリジナル テキスト、約 100 億の漢字を含むトレーニング データ。このプロジェクトは、中国語 RoBERTa モデルの事前トレーニングに RoBERTa_zh プロジェクトと同じトレーニング データを使用します。
Google TPU v3-256 を使用した 2 日間のトレーニング後に取得。32 台の v3-8 マシンを含み、各 v3-8 マシンには 128G のビデオ メモリが含まれ、シーケンス長 (sequence_length) 512、バッチ (batch_size) を使用してトレーニングされました。 。
xlnet_zh _Large は十分にテストされていません。タスクによっては非常に優れたパフォーマンスを発揮する場合もあれば、一部のタスクではパフォーマンスが低下する場合もあります。良いニュースと悪いニュースの両方があると予想していましたが、現在の文ペア タスク (LCQMC タスク) では悪いニュースです。
このプロジェクトの中国語の事前トレーニング モデルを使用している場合は、テスト比較の効果を教えてください。プル リクエストを直接作成してタスクのテスト比較を README.md に追加するか、問題に投稿することができます。
中国の事前トレーニング モデル変圧器ディスカッション グループ (QQ: 836811304) に参加して、テストの比較についてお知らせいただくこともできます。
xlnet_zh _Large、Baidu Netdisk、または Google ドライブ、TensorFlow バージョン
暂时没有去掉adam参数,去掉后模型会变成1.3G左右。
xlnet_zh _Large_L-24_H-1024_A-16.zip
|- xlnet_model.ckpt # 模型权重
|- xlnet_model.index # 模型meta信息
|- xlnet_model.meta # 模型index新
|- xlnet_config.json: # 配置文件
|- spiece.model: # 词汇表
PyTorch バージョンは、同様の名前を使用して変換できます。具体的には、pytorch_transformers プロジェクトを作成します。
python -u -m pytorch_transformers.convert_tf_checkpoint_to_pytorch --tf_checkpoint_path XLNet-zh-Large-PyTorch/ --bert_config_file XLNet-zh-Large-PyTorch/config.json --pytorch_dump_path XLNet-zh-Large-PyTorch/ xlnet_zh _large_pytorch_model.bin
1.input_list: [1, 2, 3, 4, 5, 6]
2.sampled_list: [2, 4, 6, 5, 3, 1]
3.array_2d:
[[0. 1. 1. 1. 1. 1.]
[0. 0. 0. 0. 0. 0.]
[0. 1. 0. 1. 1. 1.]
[0. 1. 0. 0. 0. 0.]
[0. 1. 0. 1. 0. 1.]
[0. 1. 0. 1. 0. 0.]]
import numpy as np
import random
def xlnet_mask(input_list):
"""
输入一个列表(如:[x1,x2,x3,x4]),采样到一个新的组合(如:[x3,x2,x4,x1])返回一个矩阵
要实现的是让当前单词Xi只能看到这个新顺序中自己前面的单词
即:对于序列[x3,x2,x4,x1]
x2能看到x3;
x4能看到x3,x2
x1能看到x3,x2,x4
x3什么也看不到
看到在程序里,是1,看不到是0.
:param input_list:
:return: matrix
e.g
[[0,1,1,1], # x1
[0,0,1,0], # x2
[0,0,0,0], # x3
[0,1,1,0]] # x4
"""
print("1.input_list:",input_list)
random.shuffle(input_list) # 打乱循序
sampled_list=input_list
print("2.sampled_list:",sampled_list)
num_size=len(input_list)
array_2d=np.zeros((num_size,num_size))
for index,current_element in enumerate(sampled_list):
previous_element_list=sampled_list[0:index] # 被采样的组合中当前元素中自己前面的单词
for previous_element in previous_element_list:
array_2d[current_element-1][previous_element-1]=1
print("3.array_2d:n",array_2d)
return array_2d
input_list=[1,2,3,4,5,6]
array_2d=xlnet_mask(input_list)
報告して追加してください。
XNLI、LCQMC、読解データセット CMRC、CCF-センチメント分析などを含むデータセットやタスクに制限はありません。
1. tfrecord を生成します。
SAVE_DIR=gs:// xlnet_zh /tf_records_xlnet
INPUT=gs://raw_text/data_2019_raw/*.txt
nohup python -u data_utils.py
--bsz_per_host=32
--num_core_per_host=8
--seq_len=512
--reuse_len=256
--input_glob=${INPUT}
--save_dir=${SAVE_DIR}
--num_passes=20
--bi_data=True
--sp_path=spiece.model
--mask_alpha=6
--mask_beta=1
--num_predict=85
--uncased=False
--num_task=200
--task=1 &
最初のステップでは、語彙がすでにあることを前提としています (このプロジェクトの語彙は src/spiece.model にあります)。独自の語彙を作成して生成する必要がある場合は、以下を参照してください。
語彙の生成: spm_train
--input=gs://raw_text/data_2019_raw/*.txt
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--character_coverage=0.99995
--model_type=ユニグラム
--control_symbols=<cls>,<sep>,<pad>,<mask>,<eod>
--user_dependent_symbols=<eop>,.,(,),",-,–,£,€
--shuffle_input_sentence
--input_sentence_size=200000000
2. トレーニングモデル:
DATA=gs:// xlnet_zh /tf_records_xlnet/tfrecords/
MODEL_DIR=gs:// xlnet_zh / xlnet_zh _large
TPU_NAME=xlnet-zh-large-v3-256
TPU_ZONE=europe-west4-a
nohup python train.py
--record_info_dir=$DATA
--model_dir=$MODEL_DIR
--train_batch_size=512
--num_hosts=32
--num_core_per_host=8
--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
--uncased=False
--train_steps=200000
--save_steps=3000
--warmup_steps=10000
--max_save=30
--weight_decay=0.01
--adam_epsilon=1e-6
--learning_rate=1e-5
--dropout=0.1
--dropatt=0.1
--tpu=$TPU_NAME
--tpu_zone=$TPU_ZONE
--use_tpu=True
--track_mean=True &
XLNET_DIR=gs:// xlnet_zh / xlnet_zh _large
MODEL_DIR=gs:// xlnet_zh /fine_tuning_test/lcqmc_01
DATA_DIR=gs:// xlnet_zh /fine_tuning_test/lcqmc_01/lcqmc_tfrecords
RAW_DIR=gs://roberta_zh/compare_model_performance/lcqmc
TPU_NAME=grpc://03.06.08.09:8470
TPU_ZONE=us-central1-a
nohup python -u run_classifier.py
--spiece_model_file=./spiece.model
--model_config_path=${XLNET_DIR}/config.json
--init_checkpoint=${XLNET_DIR}/model.ckpt-192000
--task_name=lcqmc
--do_train=True
--do_eval=True
--eval_all_ckpt=True
--uncased=False
--data_dir=${RAW_DIR}
--output_dir=${DATA_DIR}
--model_dir=${MODEL_DIR}
--train_batch_size=128
--eval_batch_size=8
--num_hosts=1
--num_core_per_host=8
--num_train_epochs=3
--max_seq_length=128
--learning_rate=2e-5
--save_steps=1000
--use_tpu=True
--tpu=${TPU_NAME}
--tpu_zone=${TPU_ZONE} >> xlnet_large_lcqmc_1.out &
注: TPU_NAME is dummy, you should change IP to real one
[1] XLNet: 言語理解のための一般化された自己回帰事前トレーニング
[2] 中国語-PreTrained-XLNet
[3] XLNet: 動作メカニズムと Bert との類似点と相違点の比較