XLNet สำหรับภาษาจีน TensorFlow และ PyTorch
XLNet เป็นรูปแบบก่อนการฝึกอบรมใหม่ที่เสนอโดย CMU และ Google Brain ในเดือนมิถุนายน 2562 ทำได้ดีกว่าเบิร์ตในหลาย ๆ งาน จะอยู่ในรูปแบบการรักษารูปแบบภาษาแบบถอยหลังอัตโนมัติ (Autoregressive Language Modeling)
การผสมผสานข้อดีของการสร้างแบบจำลองภาษาการเข้ารหัสอัตโนมัติเข้าด้วยกัน จึงมีการเสนอการสร้างแบบจำลองภาษาการเรียงสับเปลี่ยน และมีพื้นฐานมาจาก Transformer-XL
มีความสามารถในการจัดการข้อความยาวได้ดีกว่า
โปรเจ็กต์นี้อ้างอิงถึงงานของ [2] และรวมข้อมูลจำนวนมากเพื่อฝึกโมเดล xlnet_zh _Large ภาษาจีน 24 เลเยอร์พร้อมพารามิเตอร์มากกว่า 300 ล้านพารามิเตอร์
ข้อมูลการฝึกอบรม รวมถึงข่าวสาร การสนทนาเชิงโต้ตอบ สารานุกรม ข้อความต้นฉบับมากกว่า 30G ตัวอักษรจีนเกือบ 10 พันล้านตัว โปรเจ็กต์นี้ใช้ข้อมูลการฝึกอบรมเดียวกันกับโปรเจ็กต์ RoBERTa_zh สำหรับการฝึกโมเดล RoBERTa ของจีนล่วงหน้า
ได้รับหลังจากการฝึกอบรม 2 วันโดยใช้ Google TPU v3-256 รวมถึงเครื่อง v3-8 จำนวน 32 เครื่อง แต่ละเครื่อง v3-8 มีหน่วยความจำวิดีโอ 128G ที่ผ่านการฝึกอบรมสำหรับ 200,000 ขั้นตอน โดยใช้ความยาวลำดับ (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-Sentiment-Analysis เป็นต้น
1. สร้าง 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 &
ขั้นตอนแรกถือว่าคุณมีคำศัพท์อยู่แล้ว (คำศัพท์ในโครงการนี้อยู่ใน src/spiece.model) หากคุณต้องการสร้างและสร้างคำศัพท์ของคุณเอง ดูด้านล่าง สำหรับข้อมูลเพิ่มเติม โปรดดูที่: Sentence Piece
สร้างคำศัพท์: 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_สัญลักษณ์=<cls>,<sep>,<pad>,<mask>,<eod>
--user_Defined_สัญลักษณ์=<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] จีน-PreTrained-XLNet
[3] XLNet: กลไกการทำงานและการเปรียบเทียบความเหมือนและความแตกต่างกับเบิร์ต