基于jiant项目实现跨语言自然语言推理(XNLI)任务
jiant jiant is an nlp toolkit 项目地址: https://gitcode.com/gh_mirrors/ji/jiant
什么是XNLI任务
跨语言自然语言推理(XNLI)是一项重要的多语言理解基准测试,它扩展了原始的英语自然语言推理(NLI)任务到15种不同语言。XNLI的核心目标是评估模型在不同语言间的推理能力迁移性。
与大多数NLP任务不同,XNLI有一个独特的特点:它本身不包含训练数据。通常的做法是:
- 使用英语的MNLI数据集进行训练
- 在其他语言的XNLI测试集上进行零样本(zero-shot)评估
这种设置对模型的跨语言迁移能力提出了很高要求,特别是当源语言(英语)和目标语言(如中文、德语等)差异较大时。
技术实现方案
在jiant框架中实现XNLI任务需要解决几个关键技术点:
- 模型选择:使用预训练的多语言模型如XLM-RoBERTa作为基础
- 任务头共享:确保MNLI和不同语言XNLI使用相同的分类头
- 训练策略:只在英语数据上训练,但在多语言数据上评估
环境准备
首先需要安装必要的依赖项和jiant框架。jiant提供了完整的自然语言处理实验工具链,支持从数据预处理到模型训练的全流程。
# 安装基础依赖
!pip install -r requirements-no-torch.txt
# 安装jiant核心包
!pip install --no-deps -e ./
数据准备
XNLI项目提供了15种语言的数据集,每种语言包含10,000个验证和测试样本。我们需要下载MNLI(训练用)和XNLI(评估用)数据:
# 下载MNLI和XNLI数据
!python jiant/scripts/download_data/runscript.py download \
--tasks mnli xnli \
--output_path=/content/tasks/
模型准备
使用XLM-RoBERTa-base作为基础模型,这是一个强大的多语言预训练模型:
export_model.export_model(
hf_pretrained_model_name_or_path="xlm-roberta-base",
output_base_path="./models/xlm-roberta-base",
)
数据处理流程
特征提取与缓存
为了提高训练效率,我们需要预先对文本数据进行tokenize和特征提取:
# 处理MNLI数据(训练和验证集)
tokenize_and_cache.main(
task_config_path="./tasks/configs/mnli_config.json",
hf_pretrained_model_name_or_path="xlm-roberta-base",
output_dir="./cache/mnli",
phases=["train", "val"],
)
# 处理XNLI数据(只需验证集)
for lang in ["de", "zh"]:
tokenize_and_cache.main(
task_config_path=f"./tasks/configs/xnli_{lang}_config.json",
hf_pretrained_model_name_or_path="xlm-roberta-base",
output_dir=f"./cache/xnli_{lang}",
phases=["val"],
)
数据样本示例
查看处理后的数据样本有助于理解模型输入:
# 英语(MNLI)样本
row = caching.ChunkedFilesDataCache("./cache/mnli/train").load_chunk(0)[0]["data_row"]
print(row.tokens)
# 德语(XNLI-de)样本
row = caching.ChunkedFilesDataCache("./cache/xnli_de/val").load_chunk(0)[0]["data_row"]
print(row.tokens)
# 中文(XNLI-zh)样本
row = caching.ChunkedFilesDataCache("./cache/xnli_zh/val").load_chunk(0)[0]["data_row"]
print(row.tokens)
模型配置关键点
任务头共享配置
这是实现跨语言迁移的核心配置,确保所有语言任务共享相同的分类头:
jiant_run_config["taskmodels_config"]["task_to_taskmodel_map"] = {
"mnli": "nli_model",
"xnli_de": "nli_model",
"xnli_zh": "nli_model",
}
完整训练配置
训练配置需要明确指定:
- 训练任务(mnli)
- 评估任务(mnli, xnli_de, xnli_zh)
- 批大小和训练轮次
- 设备设置等
jiant_run_config = configurator.SimpleAPIMultiTaskConfigurator(
task_config_base_path="./tasks/configs",
task_cache_base_path="./cache",
train_task_name_list=["mnli"],
val_task_name_list=["mnli", "xnli_de", "xnli_zh"],
train_batch_size=32,
eval_batch_size=64,
epochs=0.1,
num_gpus=1,
).create_config()
模型训练与评估
启动训练过程,并定期在验证集上评估:
run_args = main_runscript.RunConfiguration(
jiant_task_container_config_path="./run_configs/jiant_run_config.json",
output_dir="./runs/run1",
hf_pretrained_model_name_or_path="xlm-roberta-base",
model_path="./models/xlm-roberta-base/model/model.p",
model_config_path="./models/xlm-roberta-base/model/config.json",
learning_rate=1e-5,
eval_every_steps=500,
do_train=True,
do_val=True,
)
main_runscript.run_loop(run_args)
结果分析
训练完成后,我们通常会观察到:
- 英语MNLI上的性能最高
- 其他语言XNLI上的性能略低但仍有不错表现
- 语言相似性影响迁移效果(如德语可能比中文表现更好)
这种跨语言迁移实验很好地展示了预训练语言模型的多语言表示能力,以及jiant框架在复杂NLP实验中的灵活性。通过合理配置,我们可以轻松实现多任务学习和跨语言迁移的实验设计。
jiant jiant is an nlp toolkit 项目地址: https://gitcode.com/gh_mirrors/ji/jiant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考