Paddle加载NLP的各类预训练模型方法总结(以文本分类任务为例,包含完整代码)

本文主要是介绍Paddle加载NLP的各类预训练模型方法总结(以文本分类任务为例,包含完整代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Introduction

最近宅在家,有空只能搞搞NLP的比赛。由于缺乏GPU的加持,只好白嫖百度的AI Studio(毕竟人家提供免费的Tesla V100)。在此不得不赞扬一下优秀的国产深度学习框架–Paddle(飞浆),代码精炼,使用简单,具有极高的集成度,非常适合初学者上手。
由于代码中用到了各种预训练模型做迁移学习,所以在此记录一下Paddle Hub加载各类预训练模型的方法。

二、Method

使用Paddle进行训练大概分为以下几个步骤:

  • 加载预训练模型
  • 加载数据集
  • 生成reader
  • 选择Fine-Tune优化策略
  • 选择运行配置
  • 组建Fine-Tune任务
  • 开始Fine-Tune
  1. 加载预训练模型

    首先需要在命令行更新paddlehub到最新版本:
    pip install --upgrade paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple
    然后通过下面的语法进行预训练模型的加载(若本地未找到会自动联网下载且不限速)

    import paddlehub as hub
    module = hub.Module(name="ernie")
    

    一些常用的NLP预训练模型如下表所示:

模型名PaddleHub Module
ERNIE, Chinesehub.Module(name=‘ernie’)
ERNIE 2.0 Tiny, Chinesehub.Module(name=‘ernie_tiny’)
ERNIE 2.0 Base, Englishhub.Module(name=‘ernie_v2_eng_base’)
ERNIE 2.0 Large, Englishhub.Module(name=‘ernie_v2_eng_large’)
RoBERTa-Large, Chinesehub.Module(name=‘roberta_wwm_ext_chinese_L-24_H-1024_A-16’)
RoBERTa-Base, Chinesehub.Module(name=‘roberta_wwm_ext_chinese_L-12_H-768_A-12’)
BERT-Base, Uncasedhub.Module(name=‘bert_uncased_L-12_H-768_A-12’)
BERT-Large, Uncasedhub.Module(name=‘bert_uncased_L-24_H-1024_A-16’)
BERT-Base, Casedhub.Module(name=‘bert_cased_L-12_H-768_A-12’)
BERT-Large, Casedhub.Module(name=‘bert_cased_L-24_H-1024_A-16’)
BERT-Base, Multilingual Casedhub.Module(nane=‘bert_multi_cased_L-12_H-768_A-12’)
BERT-Base, Chinesehub.Module(name=‘bert_chinese_L-12_H-768_A-12’)
  1. 准备Dataset
    下面是自定义数据集的写法,输入的file需要以文本\t标签的格式保存。

    from paddlehub.dataset.base_nlp_dataset import BaseNLPDatasetclass DemoDataset(BaseNLPDataset):"""DemoDataset"""def __init__(self):# 数据集存放位置self.dataset_dir = "path/to/dataset"super(DemoDataset, self).__init__(base_path=self.dataset_dir,train_file="train.tsv",dev_file="dev.tsv",test_file="test.tsv",# 如果还有预测数据(不需要文本类别label),可以放在predict.tsvpredict_file="predict.tsv",train_file_with_header=True,dev_file_with_header=True,test_file_with_header=True,predict_file_with_header=True,# 数据集类别集合label_list=["0", "1"])
    dataset = DemoDataset()
    
  2. 生成Reader
    接着生成一个reader,以文本分类任务为例,reader负责将dataset的数据进行预处理,首先对文本进行分词,然后以特定格式组织并输入给模型进行训练。

    ClassifyReader的参数有三个:

    • dataset: 传入PaddleHub Dataset;
    • vocab_path: 传入ERNIE/BERT模型对应的词表文件路径;
    • max_seq_len: ERNIE模型的最大序列长度,若序列长度不足,会通过padding方式补到max_seq_len, 若序列长度大于该值,则会以截断方式让序列长度为max_seq_len;
    reader = hub.reader.ClassifyReader(dataset=dataset,vocab_path=module.get_vocab_path(),sp_model_path=module.get_spm_path(),word_dict_path=module.get_word_dict_path(),max_seq_len=128)
    
  3. 选择Fine-Tune优化策略
    对于ERNIE/BERT这类Transformer模型来说最合适的迁移优化策略就是AdamWeightDecayStrategy了。

    AdamWeightDecayStrategy的参数有三个:

    • learning_rate: 最大学习率
    • lr_scheduler: 有linear_decay和noam_decay两种衰减策略可选
    • warmup_proprotion: 训练预热的比例,若设置为0.1, 则会在前10%的训练step中学习率逐步提升到learning_rate
    • weight_decay: 权重衰减,类似模型正则项策略,避免模型overfitting
    • optimizer_name: 优化器名称,推荐使用Adam
    strategy = hub.AdamWeightDecayStrategy(weight_decay=0.01,warmup_proportion=0.1,learning_rate=5e-5)
    

    PaddleHub还额外提供了多个优化策略,如AdamWeightDecayStrategy、ULMFiTStrategy、DefaultFinetuneStrategy等,详细参数说明请移步官方文档。

  4. 运行配置
    在进行Finetune前,我们可以设置一些运行时的配置。

    • use_cuda:设置为False表示使用CPU进行训练。如果您本机支持GPU,且安装的是GPU版本的PaddlePaddle,我们建议您将这个选项设置为True
    • epoch:要求Finetune的任务只遍历1次训练集
    • batch_size:每次训练的时候,给模型输入的每批数据大小为32,模型训练时能够并行处理批数据,因此batch_size越大,训练的效率越高,但是同时带来了内存的负荷,过大的batch_size可能导致内存不足而无法训练,因此选择一个合适的batch_size是很重要的一步
    • log_interval:每隔10 步打印一次训练日志
    • eval_interval:每隔50 步在验证集上进行一次性能评估
    • checkpoint_dir:将训练的参数和数据保存到model文件夹下
    • strategy:使用DefaultFinetuneStrategy策略进行finetune
    config = hub.RunConfig(use_cuda=True,num_epoch=5,checkpoint_dir="model",batch_size=100,eval_interval=50,strategy=strategy)
    
  5. 组建Fine-Tune任务
    有了合适的预训练模型和准备要迁移的数据集后,我们开始组建一个Task。

    • 获取module的上下文环境,包括输入和输出的变量,以及Paddle Program;
    • 从输出变量中找到用于情感分类的文本特征pooled_output;
    • 在pooled_output后面接入一个全连接层,生成Task;
    inputs, outputs, program = module.context(
    trainable=True, max_seq_len=128)# Use "pooled_output" for classification tasks on an entire sentence.
    pooled_output = outputs["pooled_output"]feed_list = [inputs["input_ids"].name,inputs["position_ids"].name,inputs["segment_ids"].name,inputs["input_mask"].name,
    ]cls_task = hub.TextClassifierTask(data_reader=reader,feature=pooled_output,feed_list=feed_list,num_classes=dataset.num_labels,config=config)
    
  6. 开始Fine-Tune
    我们通过finetune_and_eval接口来进行模型训练。这个接口在finetune的过程中会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。

    run_states = cls_task.finetune_and_eval()
    
  7. 模型预测

    import numpy as np# 写入预测的文本数据
    data = [["抗击新型肺炎第一线中国加油鹤岗・绥滨县"],["正能量青年演员朱一龙先生一起武汉祈福武汉加油中国加油"]]
    index = 0
    run_states = cls_task.predict(data=data)
    results = [run_state.run_results for run_state in run_states]
    for batch_result in results:# 获取预测的标签索引batch_result = np.argmax(batch_result, axis=2)[0]for result in batch_result:print("%s\预测值=%s" % (data[index][0], result))index += 1
    

三、Conclusion

本次文章简单介绍了以文本分类任务为例的paddle框架做预训练模型加载和微调的过程。这种新一代的国产框架确实有很多亮点,值得我们去学习与探索。

这篇关于Paddle加载NLP的各类预训练模型方法总结(以文本分类任务为例,包含完整代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031452

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo