- 深度学习
- NLP
- 预训练
- 基础模型
【免费下载链接】xlnet
XLNet: Generalized Autoregressive Pretraining for Language Understanding
本篇技术指南以当前仓库 README.md 为主线,系统讲解 XLNet 的模型原理、预训练模型发布形态、三大类下游任务(文本分类/回归、抽取式问答、阅读理解)的微调全流程,以及从零预训练的自定义使用方案。读完本文,你将掌握基于run_classifier.py、run_squad.py、run_race.py的完整微调命令与参数含义,理解xlnet.py的模型抽象接口,并能够使用data_utils.py+train.py复现 XLNet-Large 的预训练数据准备与训练配置。
一、XLNet 是什么:广义自回归预训练 + Transformer-XL 骨干
根据 README.md 的介绍,XLNet 是一种基于广义排列语言建模目标(generalized permutation language modeling objective)的全新无监督语言表征学习方法,并以 Transformer-XL 作为骨干模型——Transformer-XL 的片段级递归机制与相对位置编码使其在处理长上下文的语言任务上表现出色。因此,XLNet 在设计上同时兼顾了"自回归式建模的生成能力"与"双向上下文建模的表征能力",在问答、自然语言推理、情感分析、文档排序等下游任务上取得了当时最优(SOTA)的结果。
技术细节与完整实验结果以论文为准(参见 README 中引用的 arXiv:1906.08237,作者为 Zhilin Yang、Zihang Dai、Yiming Yang、Jaime Carbonell、Ruslan Salakhutdinov、Quoc V. Le,共同一作)。
仓库发布节奏(Release Notes):
- 2019-06-19:初始发布,包含 XLNet-Large 与完整代码;
- 2019-07-16:追加发布 XLNet-Base。
二、下游任务评测结果:XLNet vs BERT
README 给出了截至 2019 年 6 月 19 日的评测结论:XLNet 在 20 个任务上优于 BERT,并在 18 个任务上达到 SOTA。以下三张表格为 XLNet 与同等规模 BERT-Large 的对比(均采用单任务 dev 结果,排除多任务学习与集成等额外因素)。
阅读理解(Reading Comprehension)
| Model | RACE accuracy | SQuAD1.1 EM | SQuAD2.0 EM |
|---|---|---|---|
| BERT-Large | 72.0 | 84.1 | 78.98 |
| XLNet-Base | 80.18 | ||
| XLNet-Large | 81.75 | 88.95 | 86.12 |
其中 SQuAD 使用 dev 集结果,以排除额外训练数据或数据增强等干扰因素。
文本分类(Text Classification,表中为错误率)
| Model | IMDB | Yelp-2 | Yelp-5 | DBpedia | Amazon-2 | Amazon-5 |
|---|---|---|---|---|---|---|
| BERT-Large | 4.51 | 1.89 | 29.32 | 0.64 | 2.63 | 34.17 |
| XLNet-Large | 3.79 | 1.55 | 27.80 | 0.62 | 2.40 | 32.26 |
GLUE
| Model | MNLI | QNLI | QQP | RTE | SST-2 | MRPC | CoLA | STS-B |
|---|---|---|---|---|---|---|---|---|
| BERT-Large | 86.6 | 92.3 | 91.3 | 70.4 | 93.2 | 88.0 | 60.6 | 90.0 |
| XLNet-Base | 86.8 | 91.7 | 91.4 | 74.0 | 94.7 | 88.2 | 60.2 | 89.5 |
| XLNet-Large | 89.8 | 93.9 | 91.8 | 83.8 | 95.6 | 89.2 | 63.6 | 91.8 |
三、官方预训练模型:模型规格与压缩包结构
截至 2019 年 7 月 16 日,官方发布了两款cased模型(仅发布 cased 模型的原因:在 base 设置下 cased/uncased 表现接近;在 large 设置下 cased 在部分任务上略优):
- XLNet-Large, Cased:24 层(L-24)、1024 隐藏维度(H-1024)、16 头(A-16);
- XLNet-Base, Cased:12 层(L-12)、768 隐藏维度(H-768)、12 头(A-12),该模型使用完整数据训练(与论文中的 base 设置不同)。
每个压缩包内包含三件内容:
- TensorFlow checkpoint(
xlnet_model.ckpt,实际为 3 个文件):预训练权重; - SentencePiece 模型(
spiece.model):用于分词(tokenization)与还原(detokenization); - 配置文件(
xlnet_config.json):指定模型超参数。
其中xlnet_config.json对应的字段定义可以在源码 xlnet.py 的XLNetConfig类中看到,包括n_layer(层数)、d_model(隐藏维度)、n_head(注意力头数)、d_head(每个头的维度)、d_inner(前馈层隐藏维度)、ff_activation(relu 或 gelu)、untie_r(是否解开注意力中的相对位置偏置)、n_token(词表大小)。这些超参数在预训练与微调之间必须保持一致,因此被单独抽成一个配置类。官方还计划陆续发布 Wikipedia 微调版(用于 SQuAD、HotpotQA 等 Wikipedia 文本任务)、其他超参配置的预训练模型等(见 README "Future Release Plan")。
四、微调前的关键认知:显存瓶颈与 batch size 基准
README 明确指出一个现实约束:论文中的大部分 SOTA 结果是在TPU(内存远大于普通 GPU)上产出的,因此用 12GB–16GB 显存的 GPU 复现 XLNet-Large 的多数 SOTA 结果目前非常困难——16GB 显存只能容纳XLNet-Large 一条长度为 512 的序列,复现需要 32 到 128 张 GPU(即等于batch_size的数量)。官方同时提到正在实验梯度累积(gradient accumulation)以缓解显存压力,并指出社区已有在受限硬件(如 8GB 显存 GPU 在 SQuAD2.0 上取得 86.24 F1)上的替代微调方案。
使用默认微调脚本(run_classifier.py与run_squad.py)在单张16GB GPU + TensorFlow 1.13.1上实测的最大 batch size 如下:
| System | Seq Length | Max Batch Size |
|---|---|---|
XLNet-Base | 64 | 120 |
| ... | 128 | 56 |
| ... | 256 | 24 |
| ... | 512 | 8 |
XLNet-Large | 64 | 16 |
| ... | 128 | 8 |
| ... | 256 | 2 |
| ... | 512 | 1 |
实践建议:多数情况下可以降低train_batch_size或max_seq_length以适配硬件;性能下降幅度取决于任务与可用资源。
五、文本分类 / 回归微调:run_classifier.py实战
文本分类与回归微调代码集中在 run_classifier.py,内部内置了多种任务的DataProcessor,从源码 run_classifier.py 可以看到已注册的任务包括mnli_matched、mnli_mismatched、sts-b、imdb、yelp5。它还同时支持单文档分类、单文档回归与文档对分类三种范式。
以下两个例子为 README 提供的完整实操(假设 XLNet-Large 与 XLNet-Base 已分别下载至$LARGE_DIR与$BASE_DIR)。
5.1 STS-B:句对相关性回归(多 GPU)
第 1 步:下载 GLUE 数据并解压到$GLUE_DIR。
第 2 步:使用 4 张 V100 GPU 对 XLNet-Large 进行多 GPU 微调:
CUDA_VISIBLE_DEVICES=0,1,2,3 python run_classifier.py \ --do_train=True \ --do_eval=False \ --task_name=sts-b \ --data_dir=${GLUE_DIR}/STS-B \ --output_dir=proc_data/sts-b \ --model_dir=exp/sts-b \ --uncased=False \ --spiece_model_file=${LARGE_DIR}/spiece.model \ --model_config_path=${LARGE_DIR}/xlnet_config.json \ --init_checkpoint=${LARGE_DIR}/xlnet_model.ckpt \ --max_seq_length=128 \ --train_batch_size=8 \ --num_hosts=1 \ --num_core_per_host=4 \ --learning_rate=5e-5 \ --train_steps=1200 \ --warmup_steps=120 \ --save_steps=600 \ --is_regression=True第 3 步:用单 GPU 评估微调结果:
CUDA_VISIBLE_DEVICES=0 python run_classifier.py \ --do_train=False \ --do_eval=True \ --task_name=sts-b \ --data_dir=${GLUE_DIR}/STS-B \ --output_dir=proc_data/sts-b \ --model_dir=exp/sts-b \ --uncased=False \ --spiece_model_file=${LARGE_DIR}/spiece.model \ --model_config_path=${LARGE_DIR}/xlnet_config.json \ --max_seq_length=128 \ --eval_batch_size=8 \ --num_hosts=1 \ --num_core_per_host=1 \ --eval_all_ckpt=True \ --is_regression=True # 预期性能: "eval_pearsonr 0.916+ "注意事项(README 原文要点):
- GPU 训练语境下,
num_core_per_host表示使用的 GPU 数量; - 多 GPU 设置中,
train_batch_size指的是每张 GPU 的 batch size; eval_all_ckpt=True允许训练结束后评估所有保存的 checkpoint(保存频率由save_steps控制),并按 dev 性能挑选最佳模型——对应源码中 run_classifier.py 的 checkpoint 遍历与按eval_pearsonr/eval_accuracy排序取最佳的逻辑;data_dir与output_dir分别指"原始数据"与"预处理后的 TFRecords"目录,model_dir是保存 checkpoint 与 TensorFlow events 的工作目录,model_dir必须是与init_checkpoint分离的独立文件夹;- 改用 XLNet-Base 时,只需设置
--train_batch_size=32、--num_core_per_host=1,并同步修改init_checkpoint与model_config_path; - GPU 显存较小时,按比例减小
train_batch_size并增大num_core_per_host以保持相同训练设置; - 重要:训练与评估被拆成"两个阶段",因为多 GPU 评估需要正确地将数据分配到各 GPU,较为棘手,为保证正确性官方目前仅支持单 GPU 评估。
源码级补充:回归任务的评估指标是皮尔逊相关系数。在 run_classifier.py 中,regression_metric_fn通过tf.contrib.metrics.streaming_pearson_correlation计算eval_pearsonr;当--is_regression=True时,TFRecord 中的label_ids以 float32 写入(见 run_classifier.py)。而is_real_example字段用于对 padding 样本加权为 0,避免其进入指标统计——这源于 TPU 要求 batch 数量必须整除样本数,因此评估前会通过PaddingInputExample补齐(见 run_classifier.py),这一机制在 XL 中也沿用到 GPU 上。
5.2 IMDB:电影评论情感分类(TPU V3-8)
第 1 步:下载并解压 IMDB 数据集:
wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz tar zxvf aclImdb_v1.tar.gz第 2 步:启动 Google Cloud TPU V3-8 实例,并将 IMDB 数据与预训练 checkpoint 放入 Google Storage 桶$GS_ROOT。
第 3 步:TPU 微调 XLNet-Large:
python run_classifier.py \ --use_tpu=True \ --tpu=${TPU_NAME} \ --do_train=True \ --do_eval=True \ --eval_all_ckpt=True \ --task_name=imdb \ --data_dir=${IMDB_DIR} \ --output_dir=${GS_ROOT}/proc_data/imdb \ --model_dir=${GS_ROOT}/exp/imdb \ --uncased=False \ --spiece_model_file=${LARGE_DIR}/spiece.model \ --model_config_path=${GS_ROOT}/${LARGE_DIR}/model_config.json \ --init_checkpoint=${GS_ROOT}/${LARGE_DIR}/xlnet_model.ckpt \ --max_seq_length=512 \ --train_batch_size=32 \ --eval_batch_size=8 \ --num_hosts=1 \ --num_core_per_host=8 \ --learning_rate=2e-5 \ --train_steps=4000 \ --warmup_steps=500 \ --save_steps=500 \ --iterations=500 # 预期性能: "eval_accuracy 0.962+ "注意事项:
- 在 IMDB 上取得 SOTA 必须使用序列长度 512,因此示例展示如何用 TPU V3-8 完成;
- 备选方案:使用更小的序列长度、更小的 batch size,或改用 XLNet-Base 在 GPU 上训练,但会有性能损失;
- 注意
data_dir与spiece_model_file使用本地路径而非 Google Storage 路径:因为数据预处理实际在本地进行,本地路径能获得更快的预处理速度。
源码级补充:IMDB 的ImdbProcessor直接遍历train/neg、train/pos目录下的.txt文件,并把<br />替换为空格(见 run_classifier.py);分类任务的评估指标eval_accuracy由 run_classifier.py 中的metric_fn基于tf.metrics.accuracy计算。另外,run_classifier.py 支持lr_layer_decay_rate层间学习率衰减(顶层保持learning_rate,底层按指数衰减),这对深层模型微调是常用技巧。
六、SQuAD2.0 抽取式问答微调:run_squad.py实战
SQuAD 相关代码位于 run_squad.py,其损失函数为抽取式 span 问答损失(源码 function_builder.py 中的get_qa_outputs基于xlnet_model.get_sequence_output()构造输出层)。
步骤 1:下载 SQuAD2.0 数据集到$SQUAD_DIR:
mkdir -p ${SQUAD_DIR} && cd ${SQUAD_DIR} wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json wget https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v2.0.json步骤 2:使用脚本 scripts/prepro_squad.sh 进行数据预处理。该过程耗时较长,因为需要精确地将原始数据的字符位置映射到 sentencepiece 位置(用于训练)。如需并行加速预处理,可参考 run_squad.py 中的--num_proc与--proc_id标志——源码中 run_squad.py 通过train_examples[FLAGS.proc_id::FLAGS.num_proc]对样本做切片切分,配合脚本注释中的多进程示例即可并行产出多个 TFRecord 分片。
步骤 3:训练与评估。XLNet-Large 的最佳配置是序列长度 512、batch size 48,因此在 GPU 上复现最佳结果相当困难。两种推荐路径:
- TPU v3-8:TPU 与 Google Storage 就绪后,直接运行 scripts/tpu_squad_large.sh。该脚本的核心参数为
--train_batch_size=48、--learning_rate=3e-5、--train_steps=8000、--warmup_steps=1000、--adam_epsilon=1e-6,并以--do_predict=True同时产出预测。run_squad.py会在 dev 集上自动进行阈值搜索并输出分数;官方多次运行的 F1 中位数约为88.6。 - GPU(三张 V100):使用 XLNet-Base,合理的超参数参考 scripts/gpu_squad_base.sh(
--num_core_per_host=3、每卡--train_batch_size=8、--learning_rate=2e-5、--train_steps=12000)。
源码级补充——自动阈值搜索:SQuAD2.0 的难点在于存在不可回答(impossible)样本。预测时模型始终输出"最佳非空答案",同时记录空答案与非空答案的 logits 差score_diff(见 run_squad.py),评估阶段通过 squad_utils.py 的find_all_best_thresh_v2在 dev 集上自动搜索最优阈值来决定哪些样本判为"无答案",最终选择最佳 F1(target_eval_key默认best_f1,见 run_squad.py)。此外,SQuAD 预处理还涉及max_query_length(默认 64)、doc_stride(默认 128,长文档滑窗步长)、max_answer_length(默认 64)、n_best_size(默认 5)、start_n_top/end_n_top(span 起止点的 beam 大小,默认 5)等参数(见 run_squad.py)。
七、RACE 阅读理解微调:run_race.py实战
RACE(ReAding Comprehension from Examinations)的代码位于 run_race.py。该数据集有两个显著特点(README 原文):
- RACE 篇章的平均长度超过300 tokens,显著长于 SQuAD 等其他流行阅读理解数据集;
- 许多问题难度很高,需要复杂推理(可参考 misc/race_example.md 中的例题:出租车司机绕路多收费的短文,第一问需要数值比较,第二问需要推断两个司机行为的一致性)。
运行步骤:
步骤 1:从 RACE 官网下载数据集并解压原始数据到$RACE_DIR。
步骤 2:训练与评估:
- RACE 的 SOTA(accuracy 81.75)由 XLNet-Large 以序列长度 512、batch size 32 在大型 TPU v3-32 pod 设置下产出,对应脚本 scripts/tpu_race_large_bsz32.sh(注意
--num_hosts=4、--num_core_per_host=8,即 4 个 host 共 32 核); - 使用 XLNet-Large 以序列长度 512、batch size 8 在 TPU v3-8 上可得到约80.3的准确率,对应脚本 scripts/tpu_race_large_bsz8.sh(
--num_hosts=1、--num_core_per_host=8)。
源码级补充:RACE 每个样本包含一篇 context 与多个 question-answer 选项,run_race.py 的convert_single_example会将 context 截断至max_seq_length - 3(预留<sep>与<cls>等特殊 token),并将每个 question+答案选项拼接为独立样本;max_qa_length(默认 128)限制问题与选项的组合长度(超出时截取末尾部分)。同时支持--high_only/--middle_only仅评估高中或初中子集(见 run_race.py)。源码中还定义了 5 种 segment id:SEG_ID_A=0、SEG_ID_B=1、SEG_ID_CLS=2、SEG_ID_SEP=3、SEG_ID_PAD=4(见 run_race.py)。
八、Google Colab 示例
仓库提供了基于 GPU 的 Google Colab 示例 notebooks/colab_imdb_gpu.ipynb。需要注意:示例中硬件受限,结果会差于最佳水平,它主要用于演示流程,应根据实际资源调整以获得最佳性能。
九、自定义使用:XLNet 抽象接口与分词
官方为灵活使用提供了 XLNet 的抽象封装,核心实现在 xlnet.py。即使要改造现有文件(如run_classifier.py、run_squad.py、run_race.py),理解这套抽象也能帮助你快速接入自定义任务。
9.1 模型抽象示例(README 原文)
import xlnet # some code omitted here... # initialize FLAGS # initialize instances of tf.Tensor, including input_ids, seg_ids, and input_mask # XLNetConfig contains hyperparameters that are specific to a model checkpoint. xlnet_config = xlnet.XLNetConfig(json_path=FLAGS.model_config_path) # RunConfig contains hyperparameters that could be different between pretraining and finetuning. run_config = xlnet.create_run_config(is_training=True, is_finetune=True, FLAGS=FLAGS) # Construct an XLNet model xlnet_model = xlnet.XLNetModel( xlnet_config=xlnet_config, run_config=run_config, input_ids=input_ids, seg_ids=seg_ids, input_mask=input_mask) # Get a summary of the sequence using the last hidden state summary = xlnet_model.get_pooled_out(summary_type="last") # Get a sequence output seq_out = xlnet_model.get_sequence_output() # build your applications based on `summary` or `seq_out`源码级补充——接口语义:
XLNetConfig:与模型 checkpoint 绑定的超参数(n_layer、d_model、n_head、d_head、d_inner、ff_activation、untie_r、n_token),预训练与微调必须一致(xlnet.py);RunConfig:预训练与微调之间可以不同的超参数(is_training、use_tpu、use_bfloat16、dropout、dropatt、init/init_range/init_std、mem_len、reuse_len、bi_data、clamp_len、same_length),其中mem_len为缓存的历史 token 数、reuse_len为当前 batch 中会被缓存复用的 token 数、bi_data预训练时通常为 True、clamp_len=-1表示不截断相对距离(xlnet.py);XLNetModel.get_pooled_out:支持summary_type为"last"/"first"/"mean"/"attn"四种池化方式,并可选use_summ_proj线性投影(对应 modeling.py 的summarize_sequence,use_proj=True时附加 tanh 激活的全连接投影,类似 BERT 的做法);get_sequence_output()返回形状为[len, bsz, d_model]的最后一层隐藏表征,get_new_memory()返回拼接了当前输入表征的新记忆,get_embedding_table()返回可用于输入输出层权重绑定的 embedding 表。
在function_builder.py的分类/回归实现中可以看到这一抽象的实际调用链:get_classification_loss用get_pooled_out得到序列汇总向量后,通过modeling.classification_loss在classification_{task_name}作用域下输出 logits(function_builder.py);回归任务则使用regression_loss(function_builder.py)。
9.2 分词(Tokenization)
XLNet 使用 SentencePiece 分词,示例(README 原文):
import sentencepiece as spm from prepro_utils import preprocess_text, encode_ids # some code omitted here... # initialize FLAGS text = "An input text string." sp_model = spm.SentencePieceProcessor() sp_model.Load(FLAGS.spiece_model_file) text = preprocess_text(text, lower=FLAGS.uncased) ids = encode_ids(sp_model, text)其中FLAGS.spiece_model_file是预训练模型压缩包内的 SentencePiece 模型文件,FLAGS.uncased是布尔标志,表示是否做 uncasing。
源码级补充:prepro_utils.py 的preprocess_text会压缩空白、将弯引号( `` 与'')统一为直引号、按需做 NFKD 归一化并去除组合字符、可选小写化;encode_pieces(prepro_utils.py)还处理了一个细节:SentencePiece 对"数字+逗号"(如2000,)的分片在后续接入句号等标点时可能不理想,因此会先对数字部分重新编码再拼接逗号,保证数字序列的分词一致性。
十、从零预训练 XLNet:数据预处理与训练
README 指出,TPU 预训练参考 train.py,GPU 预训练参考 train_gpu.py。预训练的第一步是把纯文本预处理成 TFRecords。
10.1 文本数据预处理:data_utils.py
python data_utils.py \ --bsz_per_host=32 \ --num_core_per_host=16 \ --seq_len=512 \ --reuse_len=256 \ --input_glob=*.txt \ --save_dir=${SAVE_DIR} \ --num_passes=20 \ --bi_data=True \ --sp_path=spiece.model \ --mask_alpha=6 \ --mask_beta=1 \ --num_predict=85其中input_glob定义所有输入文本文件,save_dir为 TFRecords 输出目录,sp_path为 SentencePiece 模型。从源码看,data_utils.py会额外产出corpus_info.json(记录vocab_size、bsz_per_host、seq_len、reuse_len、bi_data、mask_alpha、mask_beta、num_predict等预处理元信息)与按format_filename规则命名的record_info-*.json索引文件(data_utils.py、data_utils.py),供后续训练加载;mask_alpha控制"多少 token 组成一个预测组",mask_beta控制"每组内 mask 多少个 token",num_predict为部分预测(partial prediction)的预测 token 数。train.py读取record_info_dir中的索引即可定位分片数据。
SentencePiece 模型训练命令(README 原文):
spm_train \ --input=$INPUT \ --model_prefix=sp10m.cased.v3 \ --vocab_size=32000 \ --character_coverage=0.99995 \ --model_type=unigram \ --control_symbols=<cls>,<sep>,<pad>,<mask>,<eod> \ --user_defined_symbols=<eop>,.,(,),",-,–,£,€ \ --shuffle_input_sentence \ --input_sentence_size=10000000输入文本格式要求(README 原文):
- 每行一个句子;
- 空行表示文档结束(End of Document);
- (可选)如需建模段落结构,可在某些行末尾(不加空格)插入
<eop>,表示该句结束一个段落。
示例:
This is the first sentence. This is the second sentence and also the end of the paragraph.<eop> Another paragraph. Another document starts here.源码级补充:特殊符号的 id 分配定义在 data_utils.py:<unk>=0、<s>=1、</s>=2、<cls>=3、<sep>=4、<pad>=5、<mask>=6、<eod>=7、<eop>=8,词表大小VOCAB_SIZE=32000(与spm_train的vocab_size=32000对应)。预处理时,<eod>被用作文档边界 token,sent_ids交替标记文档归属(data_utils.py),以便bi_data双向数据流正确切分。
10.2 预训练 XLNet-Large:train.py
以下为预训练 XLNet-Large 的关键超参数(README 原文,仅列出最重要的 flags,其余可按需调整):
python train.py --record_info_dir=$DATA/tfrecords \ --train_batch_size=2048 \ --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源码级补充:这些模型超参数在 train.py 中均有对应 flag 定义——seq_len为预训练序列长度、reuse_len为下一 batch 中复用的 token 数(通常为seq_len的一半)、mem_len为缓存的记忆步数、perm_size为排列窗口大小、d_embed为 embedding 维度、untie_r为是否解开注意力相对位置偏置、bi_data=True表示使用双向数据流。优化器相关配置(learning_rate、clip、warmup_steps、decay_method、weight_decay等)与微调一致,统一在 model_utils.py 的get_train_op中实现:学习率先线性 warmup,再按decay_method(poly多项式衰减或cos余弦衰减)下降到min_lr_ratio * learning_rate;weight_decay > 0时使用自定义AdamWeightDecayOptimizer(其实现将权重衰减与 Adam 的 m/v 解耦,等价于纯 SGD 式的 L2 正则,见 model_utils.py)。
十一、环境前提与运行说明
README 明确指出:截至 2019 年 6 月 19 日,本代码库已在Python 2 + TensorFlow 1.13.1下测试通过。代码大量使用tf.contrib(TPUEstimator、MirroredStrategy、cluster_resolver 等)与tensorflow.contrib.data.map_and_batch等旧版 API(例如 run_classifier.py),因此在运行前请确认 TensorFlow 版本为 1.x 系列,并注意 Python 2/3 兼容性(代码通过six处理了部分差异,见 prepro_utils.py)。TPU 场景下还需配置 Google Cloud TPU(tpu、tpu_zone、gcp_project等参数在 model_utils.py 的configure_tpu中统一组装为TPUClusterResolver与TPUConfig,其中num_shards = num_hosts * num_core_per_host)。
十二、总结:从 README 到仓库源码的完整闭环
本文以 README 为核心骨架,完整覆盖了 XLNet 的模型定位、评测数据、预训练模型形态、显存约束下的微调策略、三类下游任务的完整命令与参数说明、模型抽象接口与分词 API,以及从零预训练的完整链路。结合仓库源码,你可以进一步深入:
- 分类/回归微调的 TFRecord 流水线与指标计算:run_classifier.py、classifier_utils.py;
- SQuAD 的预处理、span 预测与阈值搜索:run_squad.py、squad_utils.py;
- RACE 的多选阅读理解建模:run_race.py;
- 模型抽象与 Transformer-XL 前向实现:xlnet.py、modeling.py;
- 预训练数据准备与 TPU/GPU 训练入口:data_utils.py、train.py、train_gpu.py;
- 官方微调脚本:scripts/prepro_squad.sh、scripts/tpu_squad_large.sh、scripts/gpu_squad_base.sh、scripts/tpu_race_large_bsz32.sh、scripts/tpu_race_large_bsz8.sh;
- Colab 演示:notebooks/colab_imdb_gpu.ipynb。
无论是复现论文结果、在自有数据上微调,还是基于XLNetModel抽象构建自定义任务,这份指南都能作为可直接对照的实操手册。
- 深度学习
- NLP
- 预训练
- 基础模型
【免费下载链接】xlnet
XLNet: Generalized Autoregressive Pretraining for Language Understanding
相关推荐
XLNet: 基于广义自回归预训练的语言理解新方法
XLNet: 基于广义自回归预训练的语言理解新方法 项目介绍 XLNet是一个创新的无监督语言表示学习方法,它采用了一种新颖的广义排列语言建模目标。此框架不仅颠
深度学习NLP预训练基础模型霞鹜文楷:免费商用的开源楷体字体,2万余字装上就能用
霞鹜文楷:免费商用的开源楷体字体,2万余字装上就能用 排诗词、写博客总差点味道:黑体太"工具",宋体太正式,开源楷体却几乎找不到。霞鹜文楷(LXGW WenKa
UI组件Solon-embeddings-base-0.1-openmind在商业应用中的成功案例研究:打造多语言智能检索系统的终极指南
Solon embeddings base 0.1 openmind在商业应用中的成功案例研究:打造多语言智能检索系统的终极指南 Solon embedding
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考