)
PaddleHub 文本分类实战基于 ERNIE/BERT 预训练模型的动态图 Fine-tune 完整指南PaddleFormers【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers本篇指南以 PaddleFormers 仓库中的 demo/text_classification 示例为核心系统讲解如何使用 PaddleHub 加载 ERNIE、BERT、RoBERTa 等 Transformer 预训练模型以动态图方式在中文情感分类数据集 ChnSentiCorp 上完成 Fine-tune、评估与预测的完整流程。读完本文你将掌握 PaddleHub Fine-tune API 的四大核心步骤选择模型、加载数据集、配置优化策略与运行参数、模型预测理解hub.Module、hub.datasets.ChnSentiCorp、hub.Trainer的底层工作机制并能在真实数据上独立复现一次文本分类任务。背景从序列模型到预训练模型 Fine-tune在 2017 年之前工业界和学术界对 NLP 文本处理普遍依赖序列模型 Recurrent Neural Network (RNN)其典型结构如下图所示。RNN 及其变体如 LSTM、GRU能够按时间步建模文本的序列依赖但在长文本建模、并行训练等方面存在明显局限。近年来随着深度学习的发展模型参数数量飞速增长为了训练这些参数需要更大的数据集来避免过拟合。然而对于大部分 NLP 任务来说构建大规模的标注数据集成本过高、非常困难特别是对于句法和语义相关的任务。相比之下大规模未标注语料库的构建则相对容易。研究表明基于大规模未标注语料库的预训练模型Pretrained Models, PTM能够习得通用的语言表示将预训练模型 Fine-tune 到下游任务能够获得出色的表现同时也能避免从零开始训练模型的巨大开销。本示例展示了如何使用 PaddleHub 的 Transformer 模型 Module如 ERNIE、BERT、RoBERTa 等以动态图方式完成文本分类任务的 Fine-tune 与预测。快速开始启动 Fine-tune 训练我们以中文情感分类公开数据集 ChnSentiCorp 为示例数据集。运行下面的命令即可在训练集train.tsv上进行模型训练并在开发集dev.tsv上验证# 设置使用的GPU卡号 export CUDA_VISIBLE_DEVICES0 python train.py对应地仓库中的 demo/text_classification/train.py 为完整的可执行训练脚本demo/text_classification/predict.py 为预测脚本。代码步骤PaddleHub Fine-tune API 四步走使用 PaddleHub Fine-tune API 进行 Fine-tune 可以分为 4 个步骤。Step1: 选择模型import paddlehub as hub model hub.Module(nameernie_tiny, version2.0.1, taskseq-cls, num_classes2)其中参数说明如下name模型名称可以选择ernie、ernie_tiny、bert-base-cased、bert-base-chinese、roberta-wwm-ext、roberta-wwm-ext-large等。versionmodule 版本号。当本地 Module 不满足指定版本条件时PaddleHub 会重新向服务器请求下载合适的 Module参见 paddlehub/module/module.py 中Module.__new__对version的处理逻辑。taskFine-tune 任务类型此处为seq-cls表示文本分类任务。从 paddlehub/module/nlp_module.py 中TransformerModule._tasks_supported的定义可以看到当前支持的 Fine-tune 任务还包括token-cls序列标注与text-matching文本匹配taskNone时则退化为获取句向量/词向量的 Embedding 模式。num_classes当前文本分类任务的类别数根据具体使用的数据集确定默认为 2。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)通过以上一行代码model被初始化为一个适用于文本分类任务的模型在 ERNIE Tiny 预训练模型之后拼接一个全连接分类网络Fully Connected整体结构如下该结构示意源自 BERT 论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》其做法是取预训练模型输出的[CLS]位置池化表示通过全连接层映射到num_classes维的类别得分。Step2: 下载并加载数据集train_dataset hub.datasets.ChnSentiCorp( tokenizermodel.get_tokenizer(), max_seq_len128, modetrain) dev_dataset hub.datasets.ChnSentiCorp( tokenizermodel.get_tokenizer(), max_seq_len128, modedev) test_dataset hub.datasets.ChnSentiCorp( tokenizermodel.get_tokenizer(), max_seq_len128, modetest)参数说明tokenizer该 Module 所需用到的 tokenizer它会对输入文本完成切词并转化成 Module 运行所需的模型输入格式。mode数据模式可选项为train、test、dev默认为train。max_seq_lenERNIE/BERT 模型使用的最大序列长度若出现显存不足请适当调低这一参数。预训练模型 ERNIE 对中文数据的处理以字token为单位tokenizer 的作用是将原始输入文本转化成模型可以接受的输入数据形式input_ids、token_type_ids等。PaddleHub 2.0 中的各种预训练模型已经内置了相应的 tokenizer可以通过model.get_tokenizer()方法获取。从源码看paddlehub/datasets/chnsenticorp.py 中的ChnSentiCorp通过装饰器download_data(url...)在首次使用时自动下载并缓存数据集到DATA_HOME/chnsenticorp目录并根据mode自动选择train.tsv、test.tsv或dev.tsv数据文件同时指定标签列表为[0, 1]二分类。其基类 paddlehub/datasets/base_nlp_dataset.py 中的TextClassificationDataset完成了从原始 TSV 文件到模型输入的转换_read_file按\t分隔读取每行数据构造InputExample第 0 列为标签第 1 列为文本_convert_examples_to_records调用 tokenizer 将文本编码为input_ids、token_type_ids不同 paddlenlp 版本下字段名可能是segment_ids并映射标签索引__getitem__返回(input_ids, token_type_ids, label)三元组供 Trainer 中的paddle.io.DataLoader直接消费。Step3: 选择优化策略和运行配置optimizer paddle.optimizer.Adam(learning_rate5e-5, parametersmodel.parameters()) trainer hub.Trainer(model, optimizer, checkpoint_dirtest_ernie_text_cls, use_gpuTrue) trainer.train(train_dataset, epochs3, batch_size32, eval_datasetdev_dataset) # 在测试集上评估当前训练模型 trainer.evaluate(test_dataset, batch_size32)优化策略Paddle 2.0-rc 提供了多种优化器选择如SGD、Adam、Adamax等。其中Adam的关键参数learning_rate全局学习率默认为 1e-3预训练模型 Fine-tune 通常使用更小的学习率如 5e-5。parameters待优化的模型参数。仓库中的 demo/text_classification/train.py 实际使用的是paddle.optimizer.AdamW(learning_rateargs.learning_rate, parametersmodel.parameters())即带权重衰减的 Adam 变体默认学习率为 5e-5这也是 Transformer 预训练模型 Fine-tune 时更常见的选择。运行配置Trainer主要控制 Fine-tune 的训练过程其完整实现位于 paddlehub/finetune/trainer.py包含以下可控参数model被优化模型必须是paddle.nn.Layer的实例optimizer优化器选择use_gpu是否使用 GPU 训练内部通过paddle.set_device切换设备use_vdl是否使用 VisualDL 可视化训练过程开启时会在checkpoint_dir/visualization下写入日志checkpoint_dir保存模型参数的目录默认值为ckpt_{time.time()}compare_metrics保存最优模型时用于比较指标的函数默认取validation_step返回的第一个指标值越大越好可通过自定义compare_metrics(old_metric, new_metric)调整。trainer.train主要控制具体的训练过程参数如下train_dataset训练时所用的数据集epochs训练轮数batch_size训练的批大小如果使用 GPU请根据实际情况调整num_workers数据加载子进程数量默认为 0eval_dataset验证集指定后 Trainer 会在每个save_interval轮结束时执行评估log_interval打印日志的间隔单位为执行批训练的次数save_interval保存模型的间隔频次单位为训练的轮数。从 trainer.py 的训练循环可以看出几个关键机制训练数据通过paddle.io.DistributedBatchSampler(shuffleTrue)打乱并以paddle.io.DataLoader加载天然支持多卡分布式训练nranks 1时自动包装paddle.DataParallel每个save_interval轮结束时如果提供了eval_dataset会自动调用evaluate计算验证集指标并通过compare_metrics判断是否优于历史最优若更优则将模型保存到${checkpoint_dir}/best_model目录同时把best_metrics持久化为metrics.pkl训练过程中按log_interval打印loss、lr、step/sec与预计剩余时间ETA并可选写入 VisualDL。另外Trainer在初始化时会自动扫描checkpoint_dir下形如epoch_N的目录并恢复最近的断点模型参数model.pdparams 优化器状态model.pdopt因此中断后重新运行脚本可以继续训练。模型预测当完成 Fine-tune 后验证集上表现最优的模型会被保存在${CHECKPOINT_DIR}/best_model目录下其中${CHECKPOINT_DIR}为训练时指定的 checkpoint 目录示例中为test_ernie_text_cls。我们以以下 3 条中文评论为待预测数据使用该模型进行情感二分类预测这个宾馆比较陈旧了特价的房间也很一般。总体来说一般 怀着十分激动的心情放映可是看着看着发现在放映完毕后出现一集米老鼠的动画片 作为老的四星酒店房间依然很整洁相当不错。机场接机服务很好可以在车上办理入住手续节省时间。import paddlehub as hub data [ [这个宾馆比较陈旧了特价的房间也很一般。总体来说一般], [怀着十分激动的心情放映可是看着看着发现在放映完毕后出现一集米老鼠的动画片], [作为老的四星酒店房间依然很整洁相当不错。机场接机服务很好可以在车上办理入住手续节省时间。], ] label_map {0: negative, 1: positive} model hub.Module( nameernie_tiny, version2.0.1, taskseq-cls, load_checkpoint./test_ernie_text_cls/best_model/model.pdparams, label_maplabel_map) results, probs model.predict(data, max_seq_len50, batch_size1, use_gpuFalse, return_probTrue) for idx, text in enumerate(data): print(Data: {} \t Lable: {} \t Prob: {}.format(text[0], results[idx], probs[idx]))这里需要特别说明几个预测阶段的参数load_checkpoint指向 Fine-tune 产出的最优模型参数文件model.pdparams用于恢复训练好的分类网络label_map定义预测结果索引到语义标签的映射{0: negative, 1: positive}。从 paddlehub/module/nlp_module.py 的实现可以看到predict内部对模型输出执行paddle.argmax(probs, axis1)得到类别索引再通过self.label_map[i]转换为可读标签predict方法的核心参数dataList[List[str]]每个元素为单条文本或其组成的列表、max_seq_len默认 128、batch_size默认 1、use_gpu默认 False、return_prob是否同时返回各类别概率默认 False。当return_probTrue时方法返回(results, probs)二元组否则只返回标签列表。参数配置正确后执行python predict.py即可输出每条文本的预测标签与对应概率。把示例脚本改造成可配置的训练入口仓库中的 demo/text_classification/train.py 对上述 API 进行了工程化封装通过 argparse 暴露了完整的命令行参数便于在不同数据集和硬件环境下复用命令行参数类型默认值说明--num_epochint3Fine-tune 训练轮数--use_gpuboolTrue是否使用 GPU 训练取值 True/False--learning_ratefloat5e-5训练学习率--max_seq_lenint128最长序列长度--batch_sizeint32每个 batch 的样本数--checkpoint_dirstr./checkpoint模型 checkpoint 保存目录--save_intervalint1每训练 n 轮保存一次 checkpoint训练主流程与文档中的四步完全对应加载ernie_tiny模型 → 构造 train/dev/test 三个 ChnSentiCorp 数据集 → 创建 AdamW 优化器与hub.Trainer→ 调用trainer.train携带eval_dataset与save_interval→ 最后在测试集上执行trainer.evaluate输出评估指标。这也说明PaddleHub 的 Fine-tune API 可以非常平滑地从最小示例演进为可配置的生产脚本。小结本指南以 ChnSentiCorp 情感分类任务为例完整走通了 PaddleHub 动态图模式下预训练模型 Fine-tune的文本分类流水线模型侧hub.Module(name..., taskseq-cls, num_classes...)一键获得预训练 Transformer 分类头的完整模型支持 ERNIE/BERT/RoBERTa/ELECTRA 等十余种模型自由切换数据侧hub.datasets.ChnSentiCorp(tokenizermodel.get_tokenizer(), max_seq_len..., mode...)自动完成数据集下载、tokenize、编码与标签映射训练侧hub.Trainer封装了训练循环、断点续训、VisualDL 可视化、验证集评估与最优模型保存等机制推理侧加载best_model/model.pdparams与label_map后通过model.predict(..., return_probTrue)即可输出预测标签与概率。如需进一步了解其他任务的 Fine-tune 用法可参考仓库中 demo/text_classification/embedding词向量嵌入场景、demo/sequence_labeling、demo/text_matching 等示例数据集实现的通用基类分类、序列标注、文本匹配均位于 paddlehub/datasets/base_nlp_dataset.py可按需扩展自定义数据集。【免费下载链接】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),仅供参考