PaddleHub 文本匹配实战:基于 ERNIE 双塔(Siamese)模型的 Fine-tune 与预测指南

发布时间:2026/9/23 1:38:51
PaddleHub 文本匹配实战:基于 ERNIE 双塔(Siamese)模型的 Fine-tune 与预测指南
PaddleHub 文本匹配实战基于 ERNIE 双塔Siamese模型的 Fine-tune 与预测指南【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers本文以 PaddleHub 提供的 Transformer 预训练模型ERNIE、BERT、RoBERTa 等为核心系统讲解如何以动态图方式在中文文本匹配数据集 LCQMC 上完成文本匹配任务的微调Fine-tune与预测。读者将掌握从模型选择、数据集加载、优化器与训练器配置到模型评估与批量预测的完整实战流程并理解 Sentence Transformer 双塔网络相比传统句对分类在计算效率上的核心优势。文本匹配任务与预训练模型的演进在 2017 年之前工业界和学术界对 NLP 文本的处理主要依赖序列模型如循环神经网络Recurrent Neural Network, RNN。随着深度学习的发展模型参数数量飞速增长为训练这些参数需要更大规模的数据集以避免过拟合。然而对于大部分 NLP 任务——尤其是句法、语义相关的任务——构建大规模标注数据集成本极高且非常困难相比之下大规模未标注语料库的构建则相对容易。近年来的研究表明基于大规模未标注语料库的预训练模型Pretrained Models, PTM能够习得通用的语言表示将预训练模型 Fine-tune 到下游任务可获得出色表现同时避免从零开始训练模型。本示例即展示如何使用 PaddleHub 的 Transformer 模型 Module如 ERNIE、BERT、RoBERTa 等以动态图方式完成文本匹配任务的 Fine-tune 与预测。文本匹配的两种建模方案方案一句对拼接 CLS 特征高计算量使用预训练模型 ERNIE 完成文本匹配任务一种直观做法是将 query 和 title 文本拼接后输入 ERNIE取CLS特征即 pooled_output再接全连接层进行二分类。这本质上是将文本匹配建模为句对分类任务。该方案的问题在于ERNIE 的模型参数非常庞大句对拼接输入导致计算量非常大预测速度也不够理想难以满足线上业务的延迟要求。针对这一问题可以使用 Sentence Transformer 网络来优化计算量。方案二Sentence Transformer 双塔结构推荐Sentence Transformer 采用了双塔Siamese的网络结构Query 和 Title 分别输入 Transformer 网络共享网络参数得到各自的 token embedding 特征随后对 token embedding 进行 pooling本教程使用 mean pooling 操作输出分别记作 u、v最后将三个表征(u, v, |u-v|)拼接起来进行二分类。更多关于 Sentence Transformer 的信息可参考论文 Sentence-BERT: Sentence Embeddings using Siamese BERT-NetworksarXiv:1908.10084。该结构在源码中得到完整印证。以ernie_tiny模块为例modules/text/language_model/ernie_tiny/module.pytasktext-matching时模型由ErnieModel.from_pretrained加载共享底座并在其上加Dropout(0.1)与维度为hidden_size * 3 → 2的Linear分类头损失函数为CrossEntropyLoss评估指标为paddle.metric.Accuracy()前向过程分别对 query 与 title 调用同一个self.model参数共享对 token embedding 按pad_token_id构造 attention mask 后求sum / mask得到query_mean与title_mean即 mean pooling随后计算sub |query_mean - title_mean|并concat([query_mean, title_mean, sub], axis-1)得到 3 倍 hidden size 的特征送入分类器得到 logits 与 softmax 概率。这正是文档所述双塔网络 (u, v, |u-v|)拼接的完整实现。环境依赖运行本示例需要paddlepaddle 2.0.0paddlehub 2.0.0如何开始 Fine-tune我们以中文文本匹配数据集 LCQMC 为示例数据集在训练集train.tsv上进行模型训练并在开发集dev.tsv上验证、在测试集test.tsv上测试。使用 PaddleHub Fine-tune API 进行微调分为 4 个步骤。Step1选择模型import paddlehub as hub model hub.Module(nameernie_tiny, version2.0.2, tasktext-matching)参数说明name模型名称可以选择ernie、ernie_tiny、bert-base-cased、bert-base-chinese、roberta-wwm-ext、roberta-wwm-ext-large等versionModule 版本号taskFine-tune 任务类型此处为text-matching表示文本匹配任务。通过这一行代码model即被初始化为一个适用于文本匹配任务的双塔Siamese结构模型。PaddleHub 还提供 BERT 等多种模型可供选择当前支持文本匹配任务的模型对应加载示例如下模型名PaddleHub ModuleERNIE, Chinesehub.Module(nameernie)ERNIE tiny, Chinesehub.Module(nameernie_tiny)ERNIE 2.0 Base, Englishhub.Module(nameernie_v2_eng_base)ERNIE 2.0 Large, Englishhub.Module(nameernie_v2_eng_large)BERT-Base, English Casedhub.Module(namebert-base-cased)BERT-Base, English Uncasedhub.Module(namebert-base-uncased)BERT-Large, English Casedhub.Module(namebert-large-cased)BERT-Large, English Uncasedhub.Module(namebert-large-uncased)BERT-Base, Multilingual Casedhub.Module(namebert-base-multilingual-cased)BERT-Base, Multilingual Uncasedhub.Module(namebert-base-multilingual-uncased)BERT-Base, Chinesehub.Module(namebert-base-chinese)BERT-wwm, Chinesehub.Module(namechinese-bert-wwm)BERT-wwm-ext, Chinesehub.Module(namechinese-bert-wwm-ext)RoBERTa-wwm-ext, Chinesehub.Module(nameroberta-wwm-ext)RoBERTa-wwm-ext-large, Chinesehub.Module(nameroberta-wwm-ext-large)RBT3, Chinesehub.Module(namerbt3)RBTL3, Chinesehub.Module(namerbtl3)ELECTRA-Small, Englishhub.Module(nameelectra-small)ELECTRA-Base, Englishhub.Module(nameelectra-base)ELECTRA-Large, Englishhub.Module(nameelectra-large)ELECTRA-Base, Chinesehub.Module(namechinese-electra-base)ELECTRA-Small, Chinesehub.Module(namechinese-electra-small)从源码结构看TransformerModulepaddlehub/module/nlp_module.py声明了_tasks_supported [seq-cls, token-cls, text-matching]其中text-matching即文本匹配任务不同task会在模块__init__中装配不同的任务头与损失函数。Step2下载并加载数据集train_dataset LCQMC(tokenizermodel.get_tokenizer(), max_seq_len128, modetrain) dev_dataset LCQMC(tokenizermodel.get_tokenizer(), max_seq_len128, modedev) test_dataset LCQMC(tokenizermodel.get_tokenizer(), max_seq_len128, modetest)参数说明tokenizer该 Module 所需的 tokenizer负责对输入文本完成切词并转化成 Module 运行所需的模型输入格式mode数据模式可选项为train、dev、test默认为trainmax_seq_lenERNIE/BERT 模型使用的最大序列长度若出现显存不足请适当调低该参数。预训练模型 ERNIE 对中文数据的处理以字为单位tokenizer 的作用是把原始输入文本转化成模型可以接受的输入数据形式。PaddleHub 2.0 中的各类预训练模型已内置对应 tokenizer可通过model.get_tokenizer()获取。LCQMC 数据集的加载逻辑在 paddlehub/datasets/lcqmc.py 中实现该数据集类通过download_data(url...)装饰器在首次使用时自动下载并缓存数据train/test/dev模式分别对应train.tsv/test.tsv/dev.tsv标签集合为[0, 1]0 表示不相似、1 表示相似。其基类TextMatchingDatasetpaddlehub/datasets/base_nlp_dataset.py以 tab 分隔读取文本对每行text_a \t text_b \t label并分别对 query 与 title 独立编码为input_idstoken_type_ids__getitem__返回(query_input_ids, query_token_type_ids, title_input_ids, title_token_type_ids, label)五个字段——这与双塔模型的输入形态一一对应。Step3选择优化策略和运行配置optimizer paddle.optimizer.AdamW(learning_rate5e-5, parametersmodel.parameters()) trainer hub.Trainer(model, optimizer, checkpoint_dir./, use_gpuTrue)优化策略Paddle 2.0 提供了多种优化器如SGD、AdamW、Adamax等。其中AdamW常用参数learning_rate全局学习率默认 1e-3本示例使用 5e-5是 Transformer 预训练模型微调的常见取值parameters待优化的模型参数。其余可配置参数可参考 PaddlePaddle 官方AdamWAPI 文档。运行配置Trainer主要控制 Fine-tune 的训练过程可控制参数包括model被优化模型optimizer优化器选择use_vdl是否使用 VisualDL 可视化训练过程checkpoint_dir模型参数保存目录compare_metrics保存最优模型的衡量指标比较函数未指定时默认比较validation_step返回的第一个指标值越大越好。从 paddlehub/finetune/trainer.py 的源码可以看到Trainer的底层行为根据use_gpu调用paddle.set_device选择设备若use_vdlTrue则在checkpoint_dir/visualization下创建LogWriter记录训练与评估指标训练循环中通过training_step/validation_step分发到模型并自动处理多卡paddle.DataParallel场景每个save_interval轮末会先在eval_dataset上评估若指标优于历史最优由compare_metrics判定则将模型保存到checkpoint_dir/best_model。Step4执行训练和模型评估trainer.train( train_dataset, epochs10, batch_size32, eval_datasetdev_dataset, save_interval2, ) trainer.evaluate(test_dataset, batch_size32)trainer.train执行模型训练主要参数train_dataset训练数据集epochs训练轮数batch_size训练时每一步用到的样本数目若使用 GPU请根据实际情况调整num_workers数据加载子进程数量默认为 0eval_dataset验证集设置后 Trainer 会在每个save_interval轮末执行评估并依据指标保存最优模型log_interval打印日志的间隔单位为执行的批训练次数save_interval保存模型的间隔频次单位为训练的轮数。trainer.evaluate执行模型评估主要参数eval_dataset评估所用的数据集batch_size评估时每一步用到的样本数目若使用 GPU请根据实际情况调整。需要说明的是验证集上的评估结果由模型内部的validation_step计算文本匹配任务返回acc指标见 paddlehub/module/nlp_module.py 中text-matching分支的training_step/validation_step。模型预测完成 Fine-tune 后训练过程中在验证集上表现最优的模型会被保存在${CHECKPOINT_DIR}/best_model目录下其中${CHECKPOINT_DIR}为 Fine-tune 时所选择的 checkpoint 保存目录目录内含model.pdparams与model.pdopt分别保存模型与优化器状态。以下代码使用最优模型进行预测import paddlehub as hub data [ [这个表情叫什么, 这个猫的表情叫什么], [什么是智能手环, 智能手环有什么用], [介绍几本好看的都市异能小说要完结的, 求一本好看点的都市异能小说要完结的], [一只蜜蜂落在日历上打一成语, 一只蜜蜂停在日历上猜一成语], [一盒香烟不拆开能存放多久, 一条没拆封的香烟能存放多久。], ] label_map {0: similar, 1: dissimilar} model hub.Module( nameernie_tiny, version2.0.2, tasktext-matching, load_checkpoint./checkpoint/best_model/model.pdparams, label_maplabel_map) results model.predict(data, max_seq_len128, batch_size1, use_gpuTrue) for idx, texts in enumerate(data): print(TextA: {}\tTextB: {}\t Label: {}.format(texts[0], texts[1], results[idx]))要点说明load_checkpoint指向最优模型的model.pdparams权重文件加载逻辑见 modules/text/language_model/ernie_tiny/module.pypaddle.loadset_state_dictlabel_map将模型输出的类别索引映射为可读标签此处0 → similar、1 → dissimilarmodel.predict在内部对每对(query, title)分别编码调用双塔模型计算 softmax 概率并取argmax再经label_map映射输出见 paddlehub/module/nlp_module.py 的_convert_text_to_input、_batchify与predict传入的数据要求每个元素是包含两个字符串的列表即[query, title]形式的文本对。一键运行参考仓库内的训练脚本除了逐步骤调用 API仓库还提供了可直接运行的脚本 demo/text_matching/train.py通过命令行参数即可控制训练python train.py --num_epoch 10 --use_gpu True --learning_rate 5e-5 \ --max_seq_len 64 --batch_size 128 --checkpoint_dir ./checkpoint --save_interval 2脚本默认使用ernie_tinyversion2.0.2、tasktext-matching模型支持--num_epoch训练轮数、--use_gpu是否使用 GPU、--learning_rate学习率、--max_seq_len最大序列长度、--batch_size批大小、--checkpoint_dircheckpoint 目录、--save_interval保存间隔等参数训练结束后还会在测试集上执行trainer.evaluate。对应的预测示例见 demo/text_matching/predict.py可直接体验完整训练 → 最优模型加载 → 批量预测闭环。小结本文围绕 PaddleHub 的text-matching任务完整介绍了文本匹配的两种建模思路句对拼接 CLS 分类 vs Sentence Transformer 双塔结构并以 LCQMC 为例给出了选择模型、加载数据、配置优化器与 Trainer、训练评估、加载最优 checkpoint 预测的完整四步流程。结合仓库源码可以看到双塔结构通过参数共享与 mean pooling 显著降低推理计算量Trainer自动完成 checkpoint 轮次恢复、最优模型保存与 VisualDL 可视化TextMatchingDataset与 tokenizer 将原始文本对转换为双塔模型所需的双路input_ids/token_type_ids输入。掌握上述 API 与原理后可以便捷地将 ERNIE、BERT、RoBERTa 等预训练模型迁移到自己的文本匹配如语义检索、Query-Title 相关性判定业务场景中。【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考