XLNet para chino, TensorFlow y PyTorch
XLNet es un nuevo modelo de preentrenamiento propuesto por CMU y Google Brain en junio de 2019. Supera a Bert en múltiples tareas. Consiste en conservar el modelo de lenguaje autorregresivo (modelado de lenguaje autorregresivo).
Combinando las ventajas del modelado de lenguaje de codificación automática, se propone el modelado de lenguaje de permutación. Y está basado en Transformer-XL,
Tiene mejor capacidad para manejar textos largos.
Este proyecto hace referencia al trabajo de [2] y combina datos masivos para entrenar un modelo chino xlnet_zh _Large de 24 capas con más de 300 millones de parámetros.
Datos de entrenamiento, incluidas noticias, debates interactivos, enciclopedias, más de 30G de texto original y casi 10 mil millones de caracteres chinos. Este proyecto utiliza los mismos datos de entrenamiento que el proyecto RoBERTa_zh para el preentrenamiento del modelo chino RoBERTa.
Obtenido después de 2 días de entrenamiento usando Google TPU v3-256; incluidas 32 máquinas v3-8, cada máquina v3-8 contiene 128G de memoria de video entrenada para 200,000 pasos, usando una longitud de secuencia (sequence_length) 512, lote (batch_size) es 512; .
xlnet_zh _Large no se ha probado completamente. Puede funcionar extremadamente bien en sus tareas o puede funcionar mal en algunas tareas. Esperábamos que hubiera buenas y malas noticias, pero actualmente en la tarea de pares de oraciones (tarea LCQMC) son malas noticias.
Si utiliza el modelo chino de preentrenamiento de este proyecto, díganos el efecto de comparación de su prueba: puede realizar una solicitud de extracción directamente y agregar la comparación de prueba en su tarea a README.md, o publicarla en un problema;
También puede unirse al grupo de discusión sobre transformadores de modelos chinos de preentrenamiento (QQ: 836811304) e informarnos sobre la comparación de pruebas.
xlnet_zh _Large, Baidu Netdisk o Google Drive, versión 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 versión de PyTorch se puede convertir usando nombres similares, específicamente cree el proyecto 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)
Por favor informe y agréguelo.
No hay límite para conjuntos de datos o tareas, incluidos XNLI, LCQMC, conjunto de datos de comprensión de lectura CMRC, CCF-Sentiment-Analysis, etc.
1. Generar 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 &
El primer paso supone que ya tiene un vocabulario (el vocabulario de este proyecto se encuentra en src/spiece.model). Si necesita crear y generar su propio vocabulario, consulte a continuación.
Generar vocabulario: spm_train
--input=gs://raw_text/data_2019_raw/*.txt
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--character_coverage=0.99995
--model_type=unigrama
--control_symbols=<cls>,<sep>,<pad>,<máscara>,<eod>
--user_defined_symbols=<eop>,.,(,),",-,–,£,€
--shuffle_input_sentence
--input_sentence_size=200000000
2. Modelo de formación:
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: preentrenamiento autorregresivo generalizado para la comprensión del lenguaje
[2] XLNet chino preentrenado
[3] XLNet: mecanismo operativo y comparación de similitudes y diferencias con Bert