项目作者: brightmart

项目描述 :
中文预训练XLNet模型: Pre-Trained Chinese XLNet_Large
高级语言: Python
项目地址: git://github.com/brightmart/xlnet_zh.git
创建时间: 2019-09-10T09:40:11Z
项目社区:https://github.com/brightmart/xlnet_zh

开源协议:

下载


XLNet for Chinese, TensorFlow & PyTorch

XLNet中文预训练模型

XLNet是CMU和谷歌大脑在2019年6月份,提出的一个新的预训练模型。在多个任务的性能超越Bert。它是在保留自回归语言模型(Autoregressive Language Modeling)的形式下,

结合了自编码语言模型(Autoencoding Language Modeling)的优势,提出了排列语言模型(Permutation Language Modeling)。并且它基于Transfomer-XL,

有更好的处理长文本的能力。

本项目参考[2]的工作,结合海量数据,训练了一个24层的中文XLNet_zh_Large模型,含3亿多参数。

训练数据和计算资源 Training Corpus & Training Details

训练数据,包括新闻、互动讨论、百科,超过30G原始文本,近100亿个中文字; 本项目与中文预训练RoBERTa模型的RoBERTa_zh项目,使用相同的训练数据。

使用Google TPU v3-256 训练2天得到;包含32个v3-8机器,每个v3-8机器包含128G的显存;训练了20万步,使用序列长度(sequence_length)512,批次(batch_size)为512。

注意事项 Notices

XLNet_zh_Large还没有完整测试,可能在你的任务中有极好的表现,也可能在部分任务中有糟糕的表现。我们预计既会有好消息,也有坏消息;但目前在句子对任务中(LCQMC任务)是坏消息。

提供您的测试对比 Performance

如果你使用本项目的中文预训练模型,请告诉你的测试对比效果:你可以直接发生pull request将你的任务中的测试对比添加到README.md中,或发在issue中;

你也可以加入中文预训练模型transformers讨论群(QQ:836811304),并把测试对比告知我们。

XLNet中文预训练模型-下载 Download Pre-trained XLNet, for Chinese tasks

XLNet_zh_Large, 百度网盘,或 Google drive,TensorFlow版本

  1. 暂时没有去掉adam参数,去掉后模型会变成1.3G左右。
  2. XLNet_zh_Large_L-24_H-1024_A-16.zip
  3. |- xlnet_model.ckpt # 模型权重
  4. |- xlnet_model.index # 模型meta信息
  5. |- xlnet_model.meta # 模型index新
  6. |- xlnet_config.json # 配置文件
  7. |- spiece.model: # 词汇表

PyTorch版本,可使用类似的命名来转换,具体建pytorch_transformers项目:

  1. 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. 1.input_list: [1, 2, 3, 4, 5, 6]
  2. 2.sampled_list: [2, 4, 6, 5, 3, 1]
  3. 3.array_2d:
  4. [[0. 1. 1. 1. 1. 1.]
  5. [0. 0. 0. 0. 0. 0.]
  6. [0. 1. 0. 1. 1. 1.]
  7. [0. 1. 0. 0. 0. 0.]
  8. [0. 1. 0. 1. 0. 1.]
  9. [0. 1. 0. 1. 0. 0.]]
  10. import numpy as np
  11. import random
  12. def xlnet_mask(input_list):
  13. """
  14. 输入一个列表(如:[x1,x2,x3,x4]),采样到一个新的组合(如:[x3,x2,x4,x1])返回一个矩阵
  15. 要实现的是让当前单词Xi只能看到这个新顺序中自己前面的单词
  16. 即:对于序列[x3,x2,x4,x1]
  17. x2能看到x3;
  18. x4能看到x3,x2
  19. x1能看到x3,x2,x4
  20. x3什么也看不到
  21. 看到在程序里,是1,看不到是0.
  22. :param input_list:
  23. :return: matrix
  24. e.g
  25. [[0,1,1,1], # x1
  26. [0,0,1,0], # x2
  27. [0,0,0,0], # x3
  28. [0,1,1,0]] # x4
  29. """
  30. print("1.input_list:",input_list)
  31. random.shuffle(input_list) # 打乱循序
  32. sampled_list=input_list
  33. print("2.sampled_list:",sampled_list)
  34. num_size=len(input_list)
  35. array_2d=np.zeros((num_size,num_size))
  36. for index,current_element in enumerate(sampled_list):
  37. previous_element_list=sampled_list[0:index] # 被采样的组合中当前元素中自己前面的单词
  38. for previous_element in previous_element_list:
  39. array_2d[current_element-1][previous_element-1]=1
  40. print("3.array_2d:\n",array_2d)
  41. return array_2d
  42. input_list=[1,2,3,4,5,6]
  43. array_2d=xlnet_mask(input_list)

效果测试与对比 Performance

请您报告并添加。

数据集或任务不限,包括XNLI、LCQMC、阅读理解数据集CMRC、CCF-Sentiment-Analysis等等。

模型加载(以Sentence Pair Matching即句子对任务,LCQMC为例)

预训练

1、生成tfrecords:

  1. SAVE_DIR=gs://xlnet_zh/tf_records_xlnet
  2. INPUT=gs://raw_text/data_2019_raw/*.txt
  3. nohup python -u data_utils.py \
  4. --bsz_per_host=32 \
  5. --num_core_per_host=8 \
  6. --seq_len=512 \
  7. --reuse_len=256 \
  8. --input_glob=${INPUT} \
  9. --save_dir=${SAVE_DIR} \
  10. --num_passes=20 \
  11. --bi_data=True \
  12. --sp_path=spiece.model \
  13. --mask_alpha=6 \
  14. --mask_beta=1 \
  15. --num_predict=85 \
  16. --uncased=False \
  17. --num_task=200 \
  18. --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=unigram \
—control_symbols=\,\,\,\,\ \
—user_defined_symbols=\,.,(,),\”,-,–,£,€ \
—shuffle_input_sentence \
—input_sentence_size=200000000

2、训练模型:

  1. DATA=gs://xlnet_zh/tf_records_xlnet/tfrecords/
  2. MODEL_DIR=gs://xlnet_zh/xlnet_zh_large
  3. TPU_NAME=xlnet-zh-large-v3-256
  4. TPU_ZONE=europe-west4-a
  5. nohup python train.py \
  6. --record_info_dir=$DATA \
  7. --model_dir=$MODEL_DIR \
  8. --train_batch_size=512 \
  9. --num_hosts=32 \
  10. --num_core_per_host=8 \
  11. --seq_len=512 \
  12. --reuse_len=256 \
  13. --mem_len=384 \
  14. --perm_size=256 \
  15. --n_layer=24 \
  16. --d_model=1024 \
  17. --d_embed=1024 \
  18. --n_head=16 \
  19. --d_head=64 \
  20. --d_inner=4096 \
  21. --untie_r=True \
  22. --mask_alpha=6 \
  23. --mask_beta=1 \
  24. --num_predict=85 \
  25. --uncased=False \
  26. --train_steps=200000 \
  27. --save_steps=3000 \
  28. --warmup_steps=10000 \
  29. --max_save=30 \
  30. --weight_decay=0.01 \
  31. --adam_epsilon=1e-6 \
  32. --learning_rate=1e-5 \
  33. --dropout=0.1 \
  34. --dropatt=0.1 \
  35. --tpu=$TPU_NAME \
  36. --tpu_zone=$TPU_ZONE \
  37. --use_tpu=True \
  38. --track_mean=True &

fine-tuning(以LCQMC任务为例)

  1. XLNET_DIR=gs://xlnet_zh/xlnet_zh_large
  2. MODEL_DIR=gs://xlnet_zh/fine_tuning_test/lcqmc_01
  3. DATA_DIR=gs://xlnet_zh/fine_tuning_test/lcqmc_01/lcqmc_tfrecords
  4. RAW_DIR=gs://roberta_zh/compare_model_performance/lcqmc
  5. TPU_NAME=grpc://03.06.08.09:8470
  6. TPU_ZONE=us-central1-a
  7. nohup python -u run_classifier.py \
  8. --spiece_model_file=./spiece.model \
  9. --model_config_path=${XLNET_DIR}/config.json \
  10. --init_checkpoint=${XLNET_DIR}/model.ckpt-192000 \
  11. --task_name=lcqmc \
  12. --do_train=True \
  13. --do_eval=True \
  14. --eval_all_ckpt=True \
  15. --uncased=False \
  16. --data_dir=${RAW_DIR} \
  17. --output_dir=${DATA_DIR} \
  18. --model_dir=${MODEL_DIR} \
  19. --train_batch_size=128 \
  20. --eval_batch_size=8 \
  21. --num_hosts=1 \
  22. --num_core_per_host=8 \
  23. --num_train_epochs=3 \
  24. --max_seq_length=128 \
  25. --learning_rate=2e-5 \
  26. --save_steps=1000 \
  27. --use_tpu=True \
  28. --tpu=${TPU_NAME} \
  29. --tpu_zone=${TPU_ZONE} >> xlnet_large_lcqmc_1.out &
  30. 注: TPU_NAME is dummy, you should change IP to real one

Learning Curve 学习曲线

Research supported with Cloud TPUs from Google’s TensorFlow Research Cloud (TFRC)

Reference

[1] XLNet: Generalized Autoregressive Pretraining for Language Understanding

[2] Chinese-PreTrained-XLNet

[3] XLNet:运行机制及和Bert的异同比较