)
xTune 实战指南基于一致性正则的跨语言微调Consistency Regularization for Cross-Lingual Fine-Tuning【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilmxTune 是 unilm 仓库中实现 ACL 2021 论文《Consistency Regularization for Cross-Lingual Fine-Tuning》的官方代码其核心思想是用两阶段训练加一致性正则consistency regularization让 XLM-RoBERTa 在只用英语数据或少量翻译数据微调后仍能泛化到数十种目标语言。读完本文你将能够完整搭建 xTune 的训练环境、下载并预处理 XTREME 基准数据使用scripts/train.sh一键跑通分类、序列标注、问答两类任务的跨语言微调并理解源码中 R1样本一致性与 R2模型一致性两项正则损失的实现细节。一、环境与安装xTune 依赖一个定制版的 transformers仓库内 xtune/src/transformers 是基于 HuggingFace transformers 2.5.1 的分支内嵌了XLMRobertaForSequenceClassificationStable等支持一致性损失的模型类因此官方推荐使用官方 Docker 镜像运行# 官方 Docker 镜像 dancingsoul/pytorch:xTune若手动安装需在xtune/目录下执行见 xtune/setup.py其中固定了sentencepiece0.1.91、seqeval0.0.12、networkx1.11等依赖版本cd xtune pip install --user .注意训练脚本默认开启--fp16 --fp16_opt_level O2依赖 NVIDIA Apex见 xtune/src/run_cls.py 中对 apex 的 import并建议在 V100-32GB 级别的 GPU 上运行若出现 OOM可减少per_gpu_train_batch_size同时增大gradient_accumulation_steps或多卡训练。二、数据与模型准备2.1 XTREME 数据集官方微调支持 7 个 XTREME 任务xnli、pawsx分类、panxNER、udposPOS 标注、mlqa、tydiqa、xquad问答。准备步骤依据 xtune/README.md在项目根目录创建下载目录mkdir -p downloadpanx 数据集需手动下载从 XTREME 官方渠道下载panx_dataset下载文件名为AmazonPhotos.zip放入download/目录。xtune/scripts/download_data.sh 中的download_panx函数检测到AmazonPhotos.zip后会解压其中的 40 个语言包ar.tar.gz…hu.tar.gz把每个语言的train/dev/test重命名为lg-train等再调用utils_preprocess.py统一转成 TSV 格式否则该函数只打印提示并跳过。其余数据集XNLI、PAWS-X、UD-POS、SQuAD、XQuAD、MLQA、TyDiQA-GoldP、 Tatoeba/BUCC 平行语料通过一条命令下载并预处理bash scripts/download_data.sh从 download_data.sh 的实现可以看到每个数据集下载后都会执行python utils_preprocess.py --data_dir ... --output_dir ... --task task统一格式化为脚本可读取的 TSVudpos还会额外用 conllu_to_conll.py 把 conllu 转成 conll保留 fused form即词级标注这是 panx/udpos 这类 token 级任务必需的。官方 README 特别提醒两点为了便于评估仓库保留了测试集标签而 XTREME 官方仓库在预处理时会删除测试标签并打乱测试句顺序用于跨语言检索因此若使用 XTREME 官方仓库的数据需要在其utils_process.py中把csv.writer(fout, delimiter\t)替换为csv.writer(fout, delimiter\t, quotingcsv.QUOTE_NONE, quotechar)。训练panx/udpos前train.sh会自动调用 preprocess_panx.sh、preprocess_udpos.sh 做二次预处理按最大长度切分、生成labels.txt无需手动干预见 xtune/scripts/train.sh#L29-L33。2.2 平行句翻译数据XTREME 官方提供 SQuAD v1.1仅 train/dev、MLQA、PAWS-X、TyDiQA-GoldP、XNLI、XQuAD 的平行翻译下载后将xtreme_translations文件夹整体移入download/目录即可。panx 与 udpos 的目标语言翻译官方未提供xTune 用 Google 翻译补齐了这部分论文方提供了处理好的版本供下载并与xtreme_translations合并存放。以 XNLI 为例脚本从$DATA_DIR/xtreme_translations/XNLI/读取翻译文件见 train_xnli.sh#L27panx 则使用xtreme_translations/translate_train.panx.txt见 train_panx.sh#L47。2.3 双语词典code-switching 用cross-lingual-transfer设置下的数据增广使用词级 code-switching需要从 MUSE 仓库获得英-目标语言平行词典按download/dicts/en-lang.txt的组织方式放入下载目录。源码在 NoisedDataGenerator 初始化 中逐语言读取en-{lang}.txt每行以src\ttgt解析构建成lang2dict映射缺失词典的语言会被自动剔除并打日志。2.4 预训练模型仅支持 XLM-RoBERTaxlm-roberta-base/xlm-roberta-large采用 HuggingFace 格式一键下载bash scripts/download_model.shdownload_model.sh 会从 HuggingFace 拉取两个模型目录下的pytorch_model.bin、config.json、sentencepiece.bpe.model、tokenizer.json四个文件到download/xlm-roberta-{base,large}/。三、两阶段微调train.sh完全参数解析xTune 的完整调用入口只有两个层级bash ./scripts/train.sh [setting] [dataset] [model] [stage] [gpu] [data_dir] [output_dir]train.sh本身只是参数转发器xtune/scripts/train.sh7 个位置参数均有默认值另支持第 8 个可选参数SEED默认 1位置参数说明默认值 / 可选值[setting]数据设置translate-train-all除英语外使用官方平行翻译参与训练cross-lingual-transfer只用英语训练零样本跨语言迁移默认cross-lingual-transfer[dataset]XTREME 任务名xnli、panx、pawsx、udpos、mlqa、tydiqa、xquad默认xnli[model]预训练模型xlm-roberta-base、xlm-roberta-large[stage]训练阶段1或2默认1[gpu]设置CUDA_VISIBLE_DEVICES默认0[data_dir]训练数据目录默认$REPO/download/[output_dir]微调输出目录默认$REPO/outputs/脚本随后分发到scripts/$SETTING/train_${TASK}.sh共 7 个任务 × 2 个设置 14 个任务脚本。以 XNLI 分类为例两个设置下的默认超参translate-train-all/train_xnli.sh 与 cross-lingual-transfer/train_xnli.sh超参取值含义EPOCH10训练轮数MAXL256最大序列长度LANGSar,bg,de,el,en,es,fr,hi,ru,sw,th,tr,ur,vi,zh评估语言XNLI 的 15 种语言含 enEVALUATE_STEPS5000每多少步在训练中途评估一次BATCH_SIZE/GRAD_ACCbase: 32/1large: 16/2每卡 batch 与梯度累积LRbase: 7e-6large: 5e-6AdamW 学习率R1_LAMBDA5.0样本一致性损失权重 λ1R2_LAMBDAtranslate-train-all: 1.0cross-lingual-transfer: 5.0模型一致性损失权重 λ2CSR仅 cross-lingual-transfer0.3code-switching 比例各任务脚本按语言数量与序列长度调整超参例如 panx 的 40 语言、MAX_LENGTH128、EVALUATE_STEPS1000、base 模型LR1e-5translate-train-all/train_panx.sh#L26-L45。3.1 两阶段训练的语义Stage 1在英语训练集上带「样本一致性example consistency」微调——每条原始样本都会生成一个加噪/翻译/码切换后的变体要求两个视角下的模型输出分布保持一致R1 损失。Stage 2在「英语 增广」的训练集上继续训练增广方式按设置而定translate-train-all用mt即用官方平行翻译增广cross-lingual-transfer用cs即 code-switching并额外加载 Stage 1 的最优 checkpoint 作为冻结教师模型对增广样本施加「模型一致性model consistency」正则R2 损失。官方建议token 级任务序列标注 panx/udpos、问答 mlqa/tydiqa/xquad务必两个阶段都跑文本分类任务在算力受限时可以只跑 Stage 1。3.2 Stage 2 如何衔接 Stage 1Stage 2 脚本会显式指定 Stage 1 产物例如 XNLI translate-train-all 的 Stage 2train_xnli.sh#L78-L116FIRST_STAGE_MODEL_PATH${OUT_DIR}/xnli/xlm-roberta-base-LR7e-6-epoch10-MaxLen256-Translate-R1_LAMBDA5.0/checkpoint-best python ./src/run_cls.py ... \ --first_stage_model_path $FIRST_STAGE_MODEL_PATH \ --enable_data_augmentation \ --augment_ratio 1.0 \ --augment_method mt \ --r2_lambda $R2_LAMBDA训练过程中每当验证集平均指标超过历史最优会把模型另存为checkpoint-best见 save_checkpoint_best分类任务以valid_avg.acc为选择标准rel任务用 ndcg。checkpoint-best正是 Stage 2 加载的教师模型来源因此Stage 2 必须在 Stage 1 同一OUT_DIR下运行。四、示例XNLI 的两种数据设置4.1 translate-train-all利用各语言平行翻译# Stage 1必跑 bash ./scripts/train.sh translate-train-all xnli xlm-roberta-base 1 # Stage 2可选推荐 bash ./scripts/train.sh translate-train-all xnli xlm-roberta-base 2该设置下 Stage 1 开启--enable_translate_data --translation_path $DATA_DIR/xtreme_translations/XNLI/即在 R1 一致性配对中直接随机替换成其他语言译文Stage 2 再以--augment_method mt --augment_ratio 1.0把等量的翻译样本加入训练集。4.2 cross-lingual-transfer只用英语零样本迁移# Stage 1必跑 bash ./scripts/train.sh cross-lingual-transfer xnli xlm-roberta-base 1 # Stage 2可选推荐 bash ./scripts/train.sh cross-lingual-transfer xnli xlm-roberta-base 2该设置下训练数据完全来自英语增广手段是词级 code-switching--overall_ratio 1.0 --enable_code_switch --code_switch_ratio 0.3 --dict_dir $DATA_DIR/dicts --dict_languages ar,bg,de,el,es,fr,hi,ru,sw,th,tr,ur,vi,zhcross-lingual-transfer/train_xnli.sh#L77-L81。Stage 2 中增广方法切换为cs并且 Stage 1/Stage 2 的R2_LAMBDA均为 5.0。panx、udpos、mlqa、tydiqa、xquad、pawsx 的调用方式完全一致只是把[dataset]换成对应任务名token 级任务入口是 xtune/src/run_tag.py、问答任务入口是 xtune/src/run_qa.py分类任务入口是 xtune/src/run_cls.py参数体系相同。五、源码级原理R1 与 R2 一致性损失5.1 数据侧NoisedDataGenerator 如何构造「噪声视图」run_cls.py 中的NoisedDataGenerator负责为每条样本生成一致性配对支持多种扰动手段命令行参数在 main() 中定义enable_translate_data/translation_path通过get_translation_pairrun_cls.py#L499-L533把当前句随机换成某个目标语言的官方平行译文tgt2src_dict保证从目标语言视角也能映射回英语原文实现「en↔tgt」双向替换。enable_code_switch/code_switch_ratio/dict_dir/dict_languages在encode_sentencerun_cls.py#L240-L277中逐 token 以overall_ratio × code_switch_ratio的概率把英文词替换为双语词典中的目标语言对应词并统计实际码切换比例训练日志会打印XX.XX% tokens have been code-switched。enable_bpe_sampling用 SentencePiece 的nbest_sizealpha采样替代词级扰动enable_random_noise在词嵌入上叠加 uniform/normal 噪声noise_eps控制幅度enable_word_dropout按word_dropout_rate将 token 替换为[UNK]。enable_data_augmentationaugment_ratioaugment_methodStage 2 专用。augment_examplesrun_cls.py#L204-L215按ceil(N × augment_ratio)复制样本并打乱mt方法把复制件替换为译文、cs方法对复制件做码切换编码被复制的样本被标记is_augmented1和r1_mask1原始样本同样标r1_mask1。每条样本最终被编码为 9 元张量数据集original_input_ids / attention_mask / token_type_ids / labels / is_augmented / noised_input_ids / noised_attention_mask / noised_token_type_ids / r1_maskconvert_examples_to_dataset。5.2 模型侧总损失 原始 CE 噪声 CE R1 R2自定义模型XLMRobertaForSequenceClassificationStablemodeling_xlm_roberta.py#L207-L390在一次 forward 中同时计算原始输入与噪声输入的两路 logits总损失为loss original_loss noised_loss r1_loss r2_loss其中original_loss由--original_loss开启对原始输入的交叉熵L364-L367noised_loss由--noised_loss开启对噪声输入的交叉熵默认脚本不启用仅靠一致性约束r1_loss样本一致性--enable_r1_loss--r1_lambda对r1_mask1的样本计算两路 logits 概率分布的双向 KL 散度之和再乘 λ1L374-L383r1_loss_f KL(noised_logits, logits.detach()) r1_loss_b KL(logits, noised_logits.detach()) r1_loss (r1_loss_b r1_loss_f) * r1_lambdar2_loss模型一致性Stage 2 专用当传入first_stage_model_logits且 batch 中存在is_augmented1的样本时用当前模型在这些增广样本上的 logits 对Stage 1 冻结模型torch.no_grad()下计算见 train()的输出做 KL 散度乘 λ2也可通过--use_hard_labels改用教师模型的 argmax 硬标签L322-L333。这个设计对应论文的两个核心正则Stage 1 让模型对「同一句话的不同语言/噪声视角」给出一致预测Stage 2 让模型在扩充含翻译/码切换数据上学习时不偏离 Stage 1 已经建立的跨语言一致解。run_tag.py/run_qa.py对应的 Stable 模型类以同样模式在 token 级起始/结束位置、token 对齐项与句级上实现 R1/R2modeling_xlm_roberta.py#L1125-L1176。5.3 训练循环与评估优化器为 AdamWbias、LayerNorm.weight不衰减train()#L594-L605线性 warmup 线性衰减--warmup_steps -1时以 0 warmup 直接衰减fp16 通过 Apexamp.initializeopt_level O2启用。训练中途评估--evaluate_during_training --evaluate_steps 5000触发evaluate()对--language列表里每种语言的 valid test 集逐语言计算 acc/F1xtreme_compute_metrics并聚合valid_avg/test_avg评估结果写入evaluate_logs.txt与 TensorBoardrun_cls.py#L937-L1015。训练日志中会逐行打印loss / original_loss / noised_loss / r1_loss / r2_loss便于观察正则项的收敛情况L683-L697。缓存特征按cached_{split}_xlmr-base-final_{maxlen}_{task}_{lang}缓存在data_dir下load_and_cache_examples重复运行可省去重新 tokenize 的开销。六、复现建议与常见坑OOM 处理README 给出的官方策略是降低per_gpu_train_batch_size、提高gradient_accumulation_steps或多卡脚本中 large 模型默认BATCH_SIZE16, GRAD_ACC2XNLI或32/1panx可以照此比例调整。目录约定download/下必须同时具备xnli、pawsx、udpos、panx、mlqa、tydiqa、xquad、xtreme_translations、dicts、xlm-roberta-base|large十类目录缺一项对应设置尤其是cross-lingual-transfer缺dicts、translate-train-all缺xtreme_translations都会直接失败。输出目录每次运行的OUTPUT_DIR命名中包含 LR、epoch、MaxLen、R1_LAMBDA、增广方式等超参指纹如...-Translate-R1_LAMBDA5.0与...-Aug1.0-MT-R2_Lambda1.0Stage 2 会去同指纹的 Stage 1 目录下找checkpoint-best如果 Stage 1 超参被改过务必保证两个阶段的 LR/epoch/MaxLen 等指纹一致否则路径对不上。依赖版本仓库内 transformers 为 2.5.1 定制版xtune/setup.py#L78-L81run_cls.py顶层from transformers import ...导入的正是本目录src/transformers请勿用新版 transformers 覆盖安装否则XLMRobertaForSequenceClassificationStable、xtreme_*系列符号会缺失。种子SEED为train.sh第 8 个可选参数默认 1会同步到 Python/NumPy/PyTorchset_seed。七、引用若使用了 xTune 的资源请引用 ACL 2021 论文xtune/README.mdinproceedings{bo2021xtune, author {Bo Zheng, Li Dong, Shaohan Huang, Wenhui Wang, Zewen Chi, Saksham Singhal, Wanxiang Che, Ting Liu, Xia Song, Furu Wei}, booktitle {Proceedings of ACL 2021}, title {{Consistency Regularization for Cross-Lingual Fine-Tuning}}, year {2021} }主要参考的仓库文件xtune/README.md、xtune/scripts/train.sh、xtune/scripts/download_data.sh、xtune/scripts/download_model.sh、xtune/src/run_cls.py、xtune/src/transformers/modeling_xlm_roberta.py、xtune/setup.py。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考