XLNet pour le chinois, TensorFlow et PyTorch
XLNet est un nouveau modèle de pré-formation proposé par la CMU et Google Brain en juin 2019. Surclasse Bert dans plusieurs tâches. Il s’agit de conserver le modèle de langage autorégressif (Autoregressive Language Modeling).
Combinant les avantages de la modélisation du langage à codage automatique, la modélisation du langage par permutation est proposée. Et il est basé sur Transformer-XL,
A une meilleure capacité à gérer des textes longs.
Ce projet fait référence aux travaux de [2] et combine des données massives pour former un modèle chinois xlnet_zh _Large à 24 couches avec plus de 300 millions de paramètres.
Données de formation, y compris des actualités, des discussions interactives, des encyclopédies, plus de 30 G de texte original, près de 10 milliards de caractères chinois ; Ce projet utilise les mêmes données de formation que le projet RoBERTa_zh pour la pré-formation du modèle chinois RoBERTa.
Obtenu après 2 jours de formation avec Google TPU v3-256 ; comprenant 32 machines v3-8, chaque machine v3-8 contient 128 G de mémoire vidéo entraînée pour 200 000 étapes, en utilisant une longueur de séquence (sequence_length) de 512, le lot (batch_size) étant de 512 ; .
xlnet_zh _Large n'a pas été entièrement testé. Il peut fonctionner extrêmement bien dans vos tâches, ou mal dans certaines tâches. Nous nous attendions à ce qu'il y ait à la fois de bonnes et de mauvaises nouvelles ; mais actuellement, dans la tâche de paire de phrases (tâche LCQMC), c'est une mauvaise nouvelle.
Si vous utilisez le modèle de pré-formation chinois de ce projet, veuillez nous indiquer votre effet de comparaison de tests : vous pouvez directement faire une pull request et ajouter la comparaison de tests dans votre tâche au README.md, ou la publier dans un numéro ;
Vous pouvez également rejoindre le groupe de discussion chinois sur les transformateurs de modèles de pré-formation (QQ : 836811304) et nous informer de la comparaison des tests.
xlnet_zh _Large, Baidu Netdisk ou Google Drive, version 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: # 词汇表
La version de PyTorch peut être convertie en utilisant un nom similaire, créez spécifiquement le projet 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)
Veuillez le signaler et l'ajouter.
Il n'y a aucune limite aux ensembles de données ou aux tâches, y compris XNLI, LCQMC, l'ensemble de données de compréhension en lecture CMRC, CCF-Sentiment-Analysis, etc.
1. Générez des tfrecords :
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 &
La première étape suppose que vous disposez déjà d'un vocabulaire (le vocabulaire de ce projet se trouve dans src/spiece.model) ; si vous devez créer et générer votre propre vocabulaire, voir ci-dessous. Pour plus d'informations, reportez-vous à : SentencePièce.
Générer du vocabulaire : spm_train
--input=gs://raw_text/data_2019_raw/*.txt
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--character_coverage=0,99995
--model_type=unigramme
--control_symbols=<cls>,<sep>,<pad>,<mask>,<eod>
--user_defined_symbols=<eop>,.,(,),",-,–,£,€
--shuffle_input_sentence
--input_sentence_size=200000000
2. Modèle de formation :
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 : Pré-entraînement autorégressif généralisé pour la compréhension du langage
[2] Chinois-Pré-Formé-XLNet
[3] XLNet : Mécanisme de fonctionnement et comparaison des similitudes et différences avec Bert