XLNet para chinês, TensorFlow e PyTorch
XLNet é um novo modelo de pré-treinamento proposto pela CMU e Google Brain em junho de 2019. Supera Bert em múltiplas tarefas. É na forma de retenção do modelo de linguagem autoregressivo (Autoregressive Language Modeling).
Combinando as vantagens da Modelagem de Linguagem de Autoencodificação, é proposta a Modelagem de Linguagem de Permutação. E é baseado no Transformer-XL,
Tem melhor capacidade de lidar com textos longos.
Este projeto refere-se ao trabalho de [2] e combina dados massivos para treinar um modelo chinês xlnet_zh _Large de 24 camadas com mais de 300 milhões de parâmetros.
Dados de treinamento, incluindo notícias, discussões interativas, enciclopédias, mais de 30G de texto original, quase 10 bilhões de caracteres chineses. Este projeto usa os mesmos dados de treinamento que o projeto RoBERTa_zh para pré-treinar o modelo chinês RoBERTa;
Obtido após 2 dias de treinamento usando Google TPU v3-256; incluindo 32 máquinas v3-8, cada máquina v3-8 contém 128G de memória de vídeo treinada para 200.000 etapas, usando comprimento de sequência (sequence_length) 512, lote (batch_size) é 512; .
xlnet_zh _Large não foi totalmente testado. Ele pode funcionar extremamente bem em suas tarefas ou pode funcionar mal em algumas tarefas. Esperávamos que houvesse boas e más notícias, mas atualmente na tarefa de pares de frases (tarefa LCQMC) são más notícias.
Se você usar o modelo de pré-treinamento chinês deste projeto, informe-nos o efeito da comparação do teste: você pode fazer uma solicitação pull diretamente e adicionar a comparação do teste em sua tarefa ao README.md ou publicá-la em um problema;
Você também pode participar do grupo de discussão de transformadores de modelo de pré-treinamento chinês (QQ: 836811304) e nos informar sobre a comparação do teste.
xlnet_zh _Large, Baidu Netdisk ou Google Drive, versão 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: # 词汇表
A versão PyTorch pode ser convertida usando nomenclatura semelhante, crie especificamente o projeto 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 e adicione-o.
Não há limite para conjuntos de dados ou tarefas, incluindo XNLI, LCQMC, conjunto de dados de compreensão de leitura CMRC, CCF-Sentiment-Analysis, etc.
1. Gere 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 &
O primeiro passo pressupõe que você já tenha um vocabulário (o vocabulário neste projeto está localizado em src/spiece.model); caso precise criar e gerar seu próprio vocabulário, veja abaixo: SentencePiece.
Gerar vocabulário: 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>,<mask>,<eod>
--user_definido_symbols=<eop>,.,(,),",-,–,£,€
--shuffle_input_sentence
--input_sentence_size=200000000
2. Modelo de treinamento:
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é-treinamento autorregressivo generalizado para compreensão da linguagem
[2] Chinês-Pré-treinado-XLNet
[3] XLNet: Mecanismo operacional e comparação de semelhanças e diferenças com Bert