XLNet untuk bahasa Mandarin, TensorFlow & PyTorch
XLNet adalah model pra-pelatihan baru yang diusulkan oleh CMU dan Google Brain pada bulan Juni 2019. Mengungguli Bert dalam banyak tugas. Bentuknya tetap mempertahankan model bahasa autoregresif (Autoregressive Language Modeling).
Menggabungkan keunggulan Pemodelan Bahasa Autoencoding, diusulkan Pemodelan Bahasa Permutasi. Dan itu didasarkan pada Transformer-XL,
Memiliki kemampuan yang lebih baik untuk menangani teks panjang.
Proyek ini mengacu pada pekerjaan [2] dan menggabungkan data besar untuk melatih model xlnet_zh _Large Cina 24-lapisan dengan lebih dari 300 juta parameter.
Data pelatihan, termasuk berita, diskusi interaktif, ensiklopedia, lebih dari 30G teks asli, hampir 10 miliar karakter Tiongkok; Proyek ini menggunakan data pelatihan yang sama dengan proyek RoBERTa_zh untuk pra-pelatihan model RoBERTa Tiongkok.
Diperoleh setelah 2 hari pelatihan menggunakan Google TPU v3-256; termasuk 32 mesin v3-8, setiap mesin v3-8 berisi memori video 128G yang dilatih untuk 200.000 langkah, menggunakan panjang urutan (sequence_length) 512, batch (batch_size) adalah 512 .
xlnet_zh _Large belum sepenuhnya diuji. Ini mungkin berkinerja sangat baik dalam tugas Anda, atau mungkin berkinerja buruk dalam beberapa tugas. Kami memperkirakan akan ada kabar baik dan kabar buruk; namun saat ini dalam tugas pasangan kalimat (tugas LCQMC) adalah kabar buruk.
Jika Anda menggunakan model pra-pelatihan berbahasa Mandarin pada proyek ini, beri tahu kami efek perbandingan pengujian Anda: Anda dapat langsung membuat permintaan tarik dan menambahkan perbandingan pengujian dalam tugas Anda ke README.md, atau mempostingnya dalam sebuah terbitan;
Anda juga dapat bergabung dengan grup diskusi transformator model pra-pelatihan Tiongkok (QQ: 836811304) dan memberi tahu kami tentang perbandingan pengujian.
xlnet_zh _Besar, Baidu Netdisk, atau Google drive, versi 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: # 词汇表
Versi PyTorch dapat dikonversi menggunakan penamaan yang serupa, khususnya membuat proyek 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)
Silakan laporkan dan tambahkan.
Tidak ada batasan untuk kumpulan data atau tugas, termasuk XNLI, LCQMC, kumpulan data pemahaman bacaan CMRC, Analisis Sentimen CCF, dll.
1. Hasilkan 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 &
Langkah pertama mengasumsikan bahwa Anda sudah memiliki kosakata (kosakata dalam proyek ini terletak di src/spiece.model); jika Anda perlu membuat dan menghasilkan kosakata Anda sendiri, lihat di bawah. Untuk informasi lebih lanjut, lihat: SentencePiece
Hasilkan kosakata: spm_train
--input=gs://raw_text/data_2019_raw/*.txt
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--cakupan_karakter=0,99995
--model_type=unigram
--control_symbols=<cls>,<sep>,<pad>,<mask>,<eod>
--simbol_definisi_pengguna=<eop>,.,(,),",-,–,£,€
--shuffle_input_sentence
--input_sentence_size=200000000
2. Model pelatihan:
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: Pra-Pelatihan Autoregresif Umum untuk Pemahaman Bahasa
[2] Cina-Pra-Terlatih-XLNet
[3] XLNet: Mekanisme operasi dan perbandingan persamaan dan perbedaan dengan Bert