XLNet für Chinesisch, TensorFlow und PyTorch
XLNet ist ein neues Pre-Training-Modell, das im Juni 2019 von CMU und Google Brain vorgeschlagen wurde. Übertrifft Bert in mehreren Aufgaben. Dies geschieht in Form der Beibehaltung des autoregressiven Sprachmodells (Autoregressive Language Modeling).
Durch die Kombination der Vorteile der Autoencoding-Sprachmodellierung wird die Permutations-Sprachmodellierung vorgeschlagen. Und es basiert auf Transformer-XL,
Verfügt über eine bessere Fähigkeit, lange Texte zu verarbeiten.
Dieses Projekt bezieht sich auf die Arbeit von [2] und kombiniert massive Daten, um ein 24-schichtiges chinesisches xlnet_zh _Large-Modell mit mehr als 300 Millionen Parametern zu trainieren.
Trainingsdaten, einschließlich Nachrichten, interaktive Diskussionen, Enzyklopädien, mehr als 30 GB Originaltext, fast 10 Milliarden chinesische Schriftzeichen. Dieses Projekt verwendet dieselben Trainingsdaten wie das RoBERTa_zh-Projekt für das Vortraining des chinesischen RoBERTa-Modells.
Erhalten nach 2 Tagen Training mit Google TPU v3-256; einschließlich 32 v3-8-Maschinen, jede v3-8-Maschine enthält 128 GB Videospeicher; trainiert für 200.000 Schritte, mit einer Sequenzlänge (sequence_length) von 512, einem Batch (batch_size) von 512 .
xlnet_zh _Large wurde bei Ihren Aufgaben möglicherweise nicht vollständig getestet, bei einigen Aufgaben kann es jedoch eine schlechte Leistung erbringen. Wir haben erwartet, dass es sowohl gute als auch schlechte Nachrichten gibt; aber derzeit sind es bei der Satzpaaraufgabe (LCQMC-Aufgabe) schlechte Nachrichten.
Wenn Sie das chinesische Vorschulungsmodell dieses Projekts verwenden, teilen Sie uns bitte Ihren Testvergleichseffekt mit: Sie können direkt eine Pull-Anfrage stellen und den Testvergleich in Ihrer Aufgabe zu README.md hinzufügen oder ihn in einer Ausgabe veröffentlichen;
Sie können auch der chinesischen Diskussionsgruppe für Modelltransformatoren vor dem Training beitreten (QQ: 836811304) und uns über den Testvergleich informieren.
xlnet_zh _Large, Baidu Netdisk oder Google Drive, TensorFlow-Version
暂时没有去掉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: # 词汇表
Die PyTorch-Version kann mit ähnlichen Namen konvertiert werden. Erstellen Sie insbesondere das Projekt 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)
Bitte melden und hinzufügen.
Es gibt keine Begrenzung für Datensätze oder Aufgaben, einschließlich XNLI, LCQMC, Leseverständnis-Datensatz CMRC, CCF-Sentiment-Analyse usw.
1. Tfrecords generieren:
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 &
Im ersten Schritt wird davon ausgegangen, dass Sie bereits über ein Vokabular verfügen (das Vokabular in diesem Projekt befindet sich in src/spiece.model). Weitere Informationen finden Sie unter: SentencePiece
Vokabular generieren: spm_train
--input=gs://raw_text/data_2019_raw/*.txt
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--character_coverage=0,99995
--model_type=Unigramm
--control_symbols=<cls>,<sep>,<pad>,<mask>,<eod>
--user_defined_symbols=<eop>,.,(,),",-,–,£,€
--shuffle_input_sentence
--input_sentence_size=200000000
2. Trainingsmodell:
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: Generalisiertes autoregressives Vortraining für das Sprachverständnis
[2] Chinese-PreTrained-XLNet
[3] XLNet: Betriebsmechanismus und Vergleich von Ähnlichkeiten und Unterschieden mit Bert