중국어, TensorFlow 및 PyTorch용 XLNet
XLNet은 2019년 6월 CMU와 Google Brain이 제안한 새로운 사전 훈련 모델입니다. 여러 작업에서 Bert를 능가합니다. 자동회귀언어모델(Autoregressive Language Modeling)을 유지하는 형태입니다.
Autoencoding Language Modeling의 장점을 결합하여 Permutation Language Modeling을 제안합니다. 그리고 Transformer-XL을 기반으로 하며,
긴 텍스트를 처리하는 능력이 향상되었습니다.
이 프로젝트는 [2]의 작업을 참조하며 대규모 데이터를 결합하여 3억 개 이상의 매개변수가 있는 24층 중국 xlnet_zh _Large 모델을 교육합니다.
뉴스, 대화형 토론, 백과사전, 30G 이상의 원본 텍스트, 약 100억 개의 중국어 문자를 포함한 훈련 데이터 이 프로젝트는 중국어 RoBERTa 모델 사전 훈련을 위해 RoBERTa_zh 프로젝트와 동일한 훈련 데이터를 사용합니다.
32개의 v3-8 머신을 포함하여 Google TPU v3-256을 사용하여 2일간 학습한 결과, 각 v3-8 머신에는 200,000단계에 대해 학습된 128G의 비디오 메모리가 포함되어 있으며 시퀀스 길이(sequence_length)는 512, 배치(batch_size)는 512입니다. .
xlnet_zh _Large는 완전히 테스트되지 않았습니다. 귀하의 작업에서 매우 잘 수행될 수도 있고 일부 작업에서는 제대로 수행되지 않을 수도 있습니다. 우리는 좋은 소식과 나쁜 소식이 모두 있을 것으로 예상했지만 현재 문장 쌍 작업(LCQMC 작업)에서는 나쁜 소식입니다.
이 프로젝트의 중국 사전 훈련 모델을 사용하는 경우 테스트 비교 효과를 알려주십시오. 직접 끌어오기 요청을 하고 작업의 테스트 비교를 README.md에 추가하거나 이슈에 게시할 수 있습니다.
또한 중국 사전 훈련 모델 변환기 토론 그룹(QQ: 836811304)에 참여하여 테스트 비교에 대해 알려줄 수도 있습니다.
xlnet_zh _Large, Baidu Netdisk 또는 Google 드라이브, 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: # 词汇表
PyTorch 버전은 비슷한 이름을 사용하여 변환할 수 있습니다. 특히 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)
신고하고 추가해주세요.
XNLI, LCQMC, 독해 데이터 세트 CMRC, CCF-감정-분석 등을 포함한 데이터 세트 또는 작업에는 제한이 없습니다.
1. tfrecord를 생성합니다:
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 &
첫 번째 단계에서는 이미 어휘가 있다고 가정합니다(이 프로젝트의 어휘는 src/spiece.model에 있음). 자신만의 어휘를 생성하고 생성해야 하는 경우 자세한 내용은 SentencePiece를 참조하세요.
어휘 생성: spm_train
--input=gs://raw_text/data_2019_raw/*.txt
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--character_coverage=0.99995
--model_type=유니그램
--control_symbols=<cls>,<sep>,<패드>,<마스크>,<eod>
--user_define_symbols=<eop>,.,(,),",-,–,£,€
--shuffle_input_sentence
--input_sentence_size=200000000
2. 훈련 모델:
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: 언어 이해를 위한 일반화된 자동 회귀 사전 훈련
[2] 중국어-사전 훈련된-XLNet
[3] XLNet: Bert와의 동작 메커니즘 및 유사점과 차이점 비교