首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解密飞桨多任务学习框架PALM,让你的模型开启“学霸”模式

解密飞桨多任务学习框架PALM,让你的模型开启“学霸”模式

作者头像
用户1386409
发布于 2020-05-20 11:30:11
发布于 2020-05-20 11:30:11
96000
代码可运行
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle
运行总次数:0
代码可运行

随着预训练技术的到来,作为深度学习重要应用领域之一,自然语言处理也迎来了新的春天。通过使用预训练模型可以大大减少模型训练对数据的依赖,仅需要使用少量数据在下游任务中微调(Fine-tune),就可以获得效果非常优秀的模型。不过如果希望获得更好的效果,该怎么办呢?有人也许会说:多训练几个epoch嘛!但是对于这种单一任务且有监督学习的微调方式,单独增加训练epoch并不是一个好方法,过度的训练容易损害模型的泛化能力,发生过拟合现象。

要知道训练一个模型就像在养育一个孩子一样。在子女的教育问题上,每个家长都会投入尽可能多的人力和资源,希望把自己孩子教育成才,能够举一反三、触类旁通,成为一个“学霸”。

但是如果到考试时发现自己的孩子只会做课本上的原题,题目稍微改改就做不好,我想家长一定会欲哭无泪吧。相比模型训练又何尝不是呢?开发者不仅要投入大量的服务器硬件资源,还要辛辛苦苦写代码,结果最后训练出的模型泛化能力极差,跳出训练数据的范围,就啥也干不了,相信这绝对不是任何一个开发者希望看到的。

那么有什么方法可以提高模型的泛化能力,让模型可以更加聪明呢?其实可以在微调阶段引入辅助任务信号,通过多任务学习的方式,即将多个目标任务场景联合学习,就可以显著提高模型所学到的表征的通用性,使得模型具备更强的泛化能力。

但是基于传统的深度学习框架,多任务学习方式的代码实现门槛较高,策略调整不够灵活,成本高,且容易出错。为此,飞桨开源深度学习平台发布了High-Level的多任务学习框架PALM,该框架灵活且易于使用,旨在帮助用户快速开发具备强泛化能力的NLP模型,为模型添加学霸属性!

什么是多任务学习

在了解PALM之前,首先我们来看下什么是多任务学习。多任务学习是机器学习领域的一个研究分支,通过让模型在学习阶段同时解决多个任务,使其可以学习到任务之间的共性和差异性。

对于大部分NLP任务来说,都依赖于一个通用的文本表示模块(Encoder)来完成文本的语义向量表示,这部分往往可以看作是各任务的共性知识;而要解决不同的NLP任务,则需要在任务的输出层来编码各个不同任务所独有的强相关的知识,因此输出层往往可以表征任务之间的差异性。

图1 多任务学习网络示意图

当预训练模型应用于多任务学习中时,预训练模型本身往往作为各个任务的“共有部分”。在训练过程中,多个任务同时学习,不同任务之间共享预训练参数,从而最终得到一个更加鲁棒、更强泛化能力的模型。就像让一个孩子同时学习不同学科的知识,将不同学科的知识融会贯通,这样将来考试时无论是考课内的,还是课外的,单独学科还是考文理综合,都会信手拈来!

PALM多任务学习框架概览

了解了什么是多任务学习后,咱们来看看飞桨的PALM多任务学习框架的内部是如何组成的。如图2所示,PALM的架构包含三层,从下到上依次是组件层(Component Layer)、训练器层(Trainer Layer)和高级训练器层(High-level Trainer Layer):

  • 组件层:PALM提供了6个 解耦的组件来实现NLP任务。每个组件包含丰富的预定义类和一个基类。预定义类是针对典型的NLP任务的,而基类则是帮助用户完成该组件的自定义。
  • 训练器层:通过使用选定的构件建立计算图,用于进行训练和推理。该层描述了训练策略、模型保存和加载、评估和推理过程。一个训练器只能处理一个任务。
  • 高级训练器层:用于复杂的学习和推理策略,如多任务学习。通过添加辅助任务来训练健壮的NLP模型(提高模型的测试集和领域外的性能),或者联合训练多个相关任务来获得每个任务的更高性能。

图2 PALM的运行原理图

飞桨PALM涉及的模块如下表所示。

现在介绍完框架结构和模块了,相当于演员都到场了,该开始唱戏了!下面咱们再来看看如何使用这些模块实现多任务学习功能的吧!

如何使用PALM?

1. 安装PALM

PALM的安装非常简单,可以通过pip直接安装,也可以通过git clone的方式从github上获取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install paddlepalm
#或
git clone  https://github.com/PaddlePaddle/PALM.git

PALM同时支持了Python2 和 Python3、LinuxWindows、CPU 和 GPU等不同软硬件环境。PALM安装完成后会根据所处环境自动切换模型训练/推理设备。

此外PALM中还内置了丰富的预训练模型,用户可以轻松的切换预训练模型,探索其作为多任务学习的模型主干的有效性。

如果要查看所有可用的预训练模型并下载,请在python解释器中运行如下代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> from paddlepalm import downloader
>>> downloader.ls('pretrain')
Available pretrain items:
  => RoBERTa-zh-base
  => RoBERTa-zh-large
  => ERNIE-v2-en-base
  => ERNIE-v2-en-large
  => XLNet-cased-base
  => XLNet-cased-large
  => ERNIE-v1-zh-base
  => ERNIE-v1-zh-base-max-len-512
  => BERT-en-uncased-large-whole-word-masking
  => BERT-en-cased-large-whole-word-masking
  => BERT-en-uncased-base
  => BERT-en-uncased-large
  => BERT-en-cased-base
  => BERT-en-cased-large
  => BERT-multilingual-uncased-base
  => BERT-multilingual-cased-base
  => BERT-zh-base

>>> downloader.download('pretrain', 'BERT-en-uncased-base', './pretrain_models')

2. 参考如下例子编写代码

这里举一个对话系统构建的例子。在任务完成型的对话系统中,我们为了理解用户的对话输入,需要完成两个NLP任务:一个是意图理解,这个可以看做是一个文本分类任务;另一个是槽位填充,即识别出意图中的相关属性和属性值,这个可以看做是序列标注任务。我们希望将这两个NLP任务进行联合训练,来得到更佳的模型。

基于PALM可以非常轻松的实现这个多任务训练需求。代码如下所示。(为了简化说明,这里省略了模型组网、迭代训练等部分的相关代码,仅体现PALM相关的内容。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建数据集的读取与预处理工具
seq_label_reader = palm.reader.SequenceLabelReader(vocab_path, max_seqlen, label_map, seed=random_seed) 
cls_reader = palm.reader.ClassifyReader(vocab_path, max_seqlen, seed=random_seed)

# 加载训练数据
seq_label_reader.load_data(train_slot, file_format='tsv', num_epochs=None, batch_size=batch_size) 
cls_reader.load_data(train_intent, batch_size=batch_size, num_epochs=None)

# 创建骨干网络提取文本特征
ernie = palm.backbone.ERNIE.from_config(config)

# 在ERNIE的骨干网络上注册数据集读取与预处理工具
seq_label_reader.register_with(ernie) 
cls_reader.register_with(ernie)

#  创建任务的输出层
seq_label_head = palm.head.SequenceLabel(num_classes, input_dim, dropout_prob) 
cls_head = palm.head.Classify(num_classes_intent, input_dim, dropout_prob)

# 创建任务训练单元和多任务训练模块
trainer_seq_label = palm.Trainer("slot", mix_ratio=1.0) 
trainer_cls = palm.Trainer("intent", mix_ratio=1.0)
trainer = palm.MultiHeadTrainer([trainer_seq_label, trainer_cls])

# 构建包含主干网络和任务头的前向图
loss1 = trainer_cls.build_forward(ernie, cls_head) 
loss2 = trainer_seq_label.build_forward(ernie, seq_label_head) 
loss_var = trainer.build_forward()

# 使能warmup策略以获取更好的微调效果
n_steps = seq_label_reader.num_examples * 1.5 * num_epochs
warmup_steps = int(0.1 * n_steps) 
sched = palm.lr_sched.TriangularSchedualer(warmup_steps, n_steps)

# 构建优化器
adam = palm.optimizer.Adam(loss_var, lr, sched)

# 构建反向图
trainer.build_backward(optimizer=adam, weight_decay=weight_decay)

#将准备好的reader和数据给到训练单元。
trainer.fit_readers_with_mixratio([seq_label_reader, cls_reader], "slot", num_epochs)

# 加载预训练模型
trainer.load_pretrain('./pretrain/ERNIE-v2-en-base')

# 设置训练期间保存模型
trainer.set_saver(save_path='./outputs/', save_steps=300)

# 开始训练
trainer.train(print_steps=10)

其它实现细节和完整的示例代码请参见

https://github.com/PaddlePaddle/PALM/tree/master/examples/multi-task

运行代码后,部分训练日志如下所示,可以看到不同的训练任务都在执行过程中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
global step: 5, slot: step 3/309 (epoch 0), loss: 68.965, speed: 0.58 steps/s 
global step: 10, intent: step 3/311 (epoch 0), loss: 3.407, speed: 8.76 steps/s 
global step: 15, slot: step 12/309 (epoch 0), loss: 54.611, speed: 1.21 steps/s 
global step: 20, intent: step 7/311 (epoch 0), loss: 3.487, speed: 10.28 steps/s
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
基于Spring + CXF框架的Web Service
1、用CXF编写基于Spring的Web service,也是需要分为Server服务器端、Client客户端的。
别先生
2020/12/01
1.3K0
基于Spring + CXF框架的Web Service
web项目使用cxf+spring搭建WebService,并部署到远程
说明服务发布成功,访问该项目http://localhost:8080/CXFWebservice/webservice
故久
2020/06/04
6570
常用webservice方法_太极拳初学入门的基本要领
先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于webservice的服务端,我们的系统就相当于客户端。如http://www.webxml.com.cn这个网站上面就列举了多个webservice服务站点
全栈程序员站长
2022/11/08
1.6K0
常用webservice方法_太极拳初学入门的基本要领
CXF集成Spring实现webservice的发布与请求
CXF集成Spring实现webservice的发布(服务端) 目录结构: 主要代码: package com.cxf.spring.pojo; public class User { int id ; String name = null; String address = null; String email = null; public int getId() { return id
JQ实验室
2022/02/09
5880
CXF集成Spring实现webservice的发布与请求
java调用WebService(一)
因工作需要和一个Sap相关系统以WebService的方式进行接口联调,之前仅听过这种技术,但并没有实操过,所以将本次开发相关的踩坑进行记录
matinal
2023/10/13
1.1K0
远程调用服务框架-CXF(WebServic)
本文介绍了如何利用阿里巴巴的开源项目Dubbo,实现高性能的服务化架构。首先介绍了Dubbo的基本概念和架构设计,然后详细讲解了如何使用Dubbo搭建服务化架构,并总结了在实践过程中需要注意的要点。本文对于实际项目中使用Dubbo搭建服务化架构具有一定的参考价值。
李家酒馆酒保
2017/12/27
1.8K0
远程调用服务框架-CXF(WebServic)
springMvc项目集成cxf实现webService通信方式的详细步骤
 添加webService服务接口的bean文件 applicationContext-cxf.xml
跟着飞哥学编程
2022/11/30
1.9K0
springMvc项目集成cxf实现webService通信方式的详细步骤
WebService就是这么简单
WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧…. 问题一 如果我们的网站需要提供一个天气预报这样一个需求的话,那我们该怎么做????? 天气预报这么一个功能并不是简单的JS组件就能够实现的,它的数据是依赖数据库分析出来的,甚至需要卫星探测..我们个人建站是不可能搞这么一个数据库的吧。 那么既然我们自己干不了,我们可以去找别人吗???我们从搜索引擎搜索,可以发现很多提供天气预报的网站,但是它返回的是一个网页,而我们仅仅需要的是对应的数据! 我们可能就在想,我们能
Java3y
2018/04/02
12.6K0
WebService就是这么简单
面试题-web service接口如何测试?
接口相关的测试,http 协议的接口大家平常基础的很多,基本上问题不大。webservice 接口如何测试呢?需先了解什么是 webservice 接口,和 http 协议的接口有什么不一样?
上海-悠悠
2021/03/03
2.6K0
面试题-web service接口如何测试?
WebService使用介绍(三)
exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法
HUC思梦
2020/09/03
2.8K0
WebService使用介绍(三)
cxf框架调用webservice_webservice json
Ant做为一种工具已经广泛被使用,并且历史悠久。 使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear), 也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。 由于ant是用xml语言写成的文件,并取默认名为build.xml文件。 所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。
全栈程序员站长
2022/09/29
2.1K0
cxf框架调用webservice_webservice json
Web Service简单入门示例
我们一般实现Web Service的方法有非常多种。当中我主要使用了CXF Apache插件和Axis 2两种。
全栈程序员站长
2022/07/05
4220
WebService客户端调用的5种常见方式
到此一个简单的webservice服务端项目就搭建完成了,这里我在application.properties文件中把端口改成8081:
科技新语
2024/11/21
9070
WebService客户端调用的5种常见方式
day46_Webservice学习笔记_02
开发步骤:   第一步:导入jar包   第二步:创建SEI接口,要在接口上加入注解:@WebService
黑泽君
2018/10/11
3K0
day46_Webservice学习笔记_02
cxf webservice整合spring 原
     前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。     工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。     RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。(本系列的第 2 部分将提供有关 RESTful 服务的更多信息。)     对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。     对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。     code first 或者 xml first  : 支持使用code first 或者 xml first 的方式来创建web服务。  一  借助 annotation 创建独立启动的web 服务。         准备: 新建工程 导入需要的jar 包:                      依赖的包:                             commons-logging-1.1.jar                             geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)                             geronimo-annotation_1.0_spec-1.1.jar (JSR 250)                             geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)                             geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)                             geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)                             jaxb-api-2.1.jar                             jaxb-impl-2.1.6.jar                             jaxws-api-2.1.jar                             jetty-6.1.5.jar                             jetty-util-6.1.5.jar                             neethi-2.0.jar                             saaj-api-1.3.jar                             saaj-impl-1.3.jar                             stax-api-1.0.1.jar                             wsdl4j-1.6.1.jar                             wstx-asl-3.2.1.jar                             XmlSchema-1.2.jar                             xml-resolver-1.2.jar                         spring jar 包, 用来支持xml配置:                             aopalliance-1.0.jar          
尚浩宇
2018/08/17
8510
WebService入门之CXF教程
Apache CXF是一个开源的Service框架,可以用于简化用户的service开发,基于CXF开发的应用可提供SOAP、XML/HTTP、RESTFUL HTTP或CORBA等服务。CXF底层页可以使用不同的传输协议,包括HTTP、JMS或JBI等。
星哥玩云
2022/07/03
2.6K0
WebService入门之CXF教程
Web Service进阶(一)运行原理[通俗易懂]
利用清明小假期,温习了一遍Web Service的相关内容,对其工作原理进行了简要总结。以供有需求的朋友和自己日后参考。文章若有不当之处,敬请朋友们提出宝贵建议,以求共勉。
全栈程序员站长
2022/09/15
6410
Web Service进阶(一)运行原理[通俗易懂]
老司机带你玩转web service
当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来。毕竟是多家不同的公司的产品,研发开发语言、采用技术框架基本上是百花齐放。怎样让自家系统提供的服务具有跨平台、跨语言、跨各种防火墙
xiangzhihong
2018/02/05
1.3K0
老司机带你玩转web service
Java webservice详解「建议收藏」
  webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice服务,获取这些信息;
全栈程序员站长
2022/09/14
4K0
Java webservice详解「建议收藏」
使用JQuery、Ajax来调用WebService服务 基于Spring + CXF框架的Web Service
1、在之前的基础上修改的,如果想使用JQuery、Ajax来调用WebService服务,必须需要先获取到请求的参数值,我的参数值是下面的这部分,如何获取到这参数值呢,只需要在客户端配置出拦截器即可,后台打印的参数,然后配置到自己需要的地方即可。
别先生
2020/12/01
2.3K0
使用JQuery、Ajax来调用WebService服务
    


基于Spring + CXF框架的Web Service
相关推荐
基于Spring + CXF框架的Web Service
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档