论文笔记:OpenPrompt: An Open-source Framework for Prompt-learning

news2024/9/26 1:24:34

 论文来源:ACL2022

论文地址:https://aclanthology.org/2022.acl-demo.10.pdf

论文代码:https://github.com/thunlp/OpenPrompt

笔记仅供参考,撰写不易,请勿恶意转载抄袭!


Abstract

        目前,还没有标准的提示学习实现框架,而且大多数现有的的提示学习代码库,仅在特定场景提供有限的实现。在提示学习中,由于需要考虑模板策略、初始化策略和表达器策略等诸多细节。实践者在快速调整所需的提示学习方法以适应其应用方面面临着障碍在本文中,介绍了OpenPrompt,统一的易于使用的工具包,用于在PLMs上进行快速学习。OpenPrompt具有效率、模块化和可扩展性,其可组性允许在统一的范式中自由组合不同的PLMs、任务格式和提示模块。用户可以方便地部署提示学习框架,并对其在不同NLP任务上的泛化性进行评估,不受约束。

Introduction

        提示学习问题可以视为PLMs、人类先验知识和需要处理的特定的NLP任务的综合。

        存在的问题:

        1. 当前的深度学习或NLP库很难很好的支持提示学习的特定实现,同时也缺乏一个标准的范式。以往的研究为了追求最有效的方法来实现提示学习,对现有的传统微调框架进行了最少的修改,导致可读性差,甚至可复现性不稳定。

        2. 提示学习的性能随着模板和表达器的选择而变化很大,为实现带来了更多障碍。

        3. 目前还没有专门为提示学习而设计的综合开源框架,这使得很难尝试新方法并与之前的方法进行严格比较。

        贡献:介绍了一个开源、易用、可扩展的提示学习工具包,OpenPrompt。

        OpenPrompt将提示学习的整个框架模块化,并考虑每个模块之间的交互。强调了OpenPrompt的可组性,它支持多种任务格式、PLMs和提示模板的灵活组合。该特点使用户能够在各种任务上评估其提示学习模型的通用性,且不仅仅是在特定任务上的表现。

Design and Implementation 

         如 Figure 1所示,OpenPrompt提供了基于Pytorch的提示学习的完整生命周期。本节首先介绍OpenPrompt的可组性,然后详细介绍了OpenPrompt中每个组件的设计与实现。

 Combinability(可组性)

        OpenPrompt支持task、PLMs和提示模块的灵活组合。例如,从模型的角度来看,T5不只用于跨度预测,GPT不只用于生成任务。从提示的角度来看,还可以使用prefix-tuning进行分类,使用软提示进行生成。在OpenPrompt框架中,这些组合都可以很容易的在NLP任务上实现和验证,这样可以更好地理解所涉及的机制。

Pre-trained Language Models

        提示学习的一个核心思想是使用附加的带有[MASK]的上下文来模仿PLMs的预训练目标,并更好刺激这些模型。因此,PLMs的选择对提示学习的整个流程至关重要。PLMs可以根据预训练目标大致分为3组。

        第1组PLMs使用MLM来重构被随机mask的序列,只计算mask部分的损失,包括BERT、RoBERTa等。第2组利用自回归式语言模型(LM)根据其前导tokens来预测当前token,包括GPT3。第3组是seq2seq模型,包括T5、MASS和BART等。

Tokenization

        在设计模板之后,对原始输入和设计的模板的字符化的特定实现可能很耗时并且容易出错。首先,在提示学习中,tokenization应该小心处理一些特定的信息,如实体索引、被mask的token,一些小的错误可能会导致严重的后果。此外,还应该处理tokenization之后的连接和截断问题。由于不同的PLMs可能有不同的tokenization策略,还应该考虑额外上下文处理细节中的不一致性

        本文专门为提示学习设计了tokenization模块极大地简化了过程。通过使用封装的数据处理APIs,用户可以使用可读的风格来设计模板,并方便地同时对输入和模板进行操作。基于PLMs的选择,OpenPrompt自动选择合适的tokenization,可以为用户节省大量处理提示相关数据的时间。

Templates 

        先前的工作设计了各种各样的模板,但是由于使用中需要很高的学习成本,因此为每个提示设计一个模板是不合理的。在OpenPrompt中,设计了一种模板语言来解决这一问题,用此模板语言可以在统一的范式下构造各种类型的模板。模板语言借鉴了python的字典语法。这样的设计同时保证了灵活性和清晰度。Figure 2中展示了一些模板示例。

Verbalizers 

         当PLMs预测到一个mask位置在词汇表上的概率分布的时候,表达器将提取标签词的logit,并将标签词的logit集成到相应的类中,从而负责损失计算。如Figure 3为定义情感分类语言表达器的一个简单方法。(也就是说,表达器用来将预测的标签词映射到相应的类)

         与模板类似,所有的语言表达器类也从具有必要属性和抽象方法的公共基类继承而来。除了手工构建的语言表达器,OpenPrompt中还实现了自动生成语言表达器、知识表达器。

PromptModel 

        在OpenPrompt中,使用了一个PromptModel对象来负责训练和推理,它包含一个PLM、一个Template对象和一个Verbalizer对象(可选)。用户可以灵活地组合这些模块并定义它们之间的高级交互。 PromptModel如Figure 6所示。

 Training

        提示学习的训练可分为两种策略:① 同时调整提示和PLM,这在低数据环境下是有效的;②只训练提示的参数,PLM保持不变。这两种策略都可以在OpenPrompt的Trainer模板中一键调用。

Evaluation 

        本文使用OpenPrompt来实现各种基线,并在相应的NLP任务上评估它们。

下面介绍使用OpenPrompt 的一个简单demo:

# step1:确定NLP任务,情感分析
import torch
from openprompt.data_utils import InputExample
#确定类别,即数据标签:positive,negative
classes = [ # There are two classes in Sentiment Analysis, one for negative and one for positive
    "negative",
    "positive"
]
#确定数据集
dataset = [ # For simplicity, there's only two examples
    # text_a is the input text of the data, some other datasets may have multiple input sentences in one example.
    InputExample(
        guid = 0,
        text_a = "Albert Einstein was one of the greatest intellects of his time.",
    ),
    InputExample(
        guid = 1,
        text_a = "The film was badly.",
    ),
]
# step 2确定PLMs
from openprompt.plms import load_plm
plm, tokenizer, model_config, WrapperClass = load_plm("bert", "PLMmodel/bert-base-cased")   #PLMs
#step3 定义模板
from openprompt.prompts import ManualTemplate   #人工构建模板
promptTemplate = ManualTemplate(
    text = '{"placeholder":"text_a"} It was {"mask"}',
    tokenizer = tokenizer,
)
#step4 答案映射
from openprompt.prompts import ManualVerbalizer #人工构建的语言表达器
promptVerbalizer = ManualVerbalizer(
    classes = classes,
    label_words = {
        "negative": ["bad"],
        "positive": ["good", "wonderful", "great"],
    },
    tokenizer = tokenizer,
)
#step 5 构造PromptModel,PLM、模板、verbalizer
from openprompt import PromptForClassification
promptModel = PromptForClassification(
    template = promptTemplate,
    plm = plm,
    verbalizer = promptVerbalizer,
)
#step 6 构造PromptDataLoader
from openprompt import PromptDataLoader

data_loader = PromptDataLoader(
    dataset=dataset,
    tokenizer=tokenizer,
    template=promptTemplate,
    tokenizer_wrapper_class=WrapperClass,
)
# step 7 预测
# making zero-shot inference using pretrained MLM with prompt
promptModel.eval()
with torch.no_grad():
    for batch in data_loader:
        logits = promptModel(batch)
        preds = torch.argmax(logits, dim=-1)
        print(classes[preds])
# predictions would be 1, 0 for classes 'positive', 'negative'

 输出结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink系列之Flink中Source_Transform_Sink整理和实战

title: Flink系列 二、Flink Source 整理和实战 Flink Source 是程序的数据源输入,可以通过 StreamExecutionEnvironment.addSource(sourceFunction) 来为你的程序添加一个 Source。 Flink 提供了大量的已经实现好的 source 方法,也可以自定义 source&…

译文 | A poor man‘s API

作者:Nicolas Frnkel 翻译:Sylvia https://blog.frankel.ch/poor-man-api/ 在 API 日渐流行的年代,越来越多的非技术人员也希望能从 API 的使用中获利,而创建一套成熟的 API 方案需要时间成本和金钱两方面的资源加持。在这个过程中…

2022re:Invent:亚马逊云科技拥有强大的云原生数据能力

在2022亚马逊云科技re:Invent全球大会上的第三天,Swami博士为大家带来了关于“数据与机器学习如何助力企业构建端到端的数据战略”的解读。亚马逊云科技拥有强大的云原生数据能力,用来帮助企业扩展其数据库和数据分析服务,并确保数据安全与数…

汽车电子电气架构演进驱动主机厂多重变化

已剪辑自: https://mp.weixin.qq.com/s/P56MaFODVc_eZ4JEOVJvfA 汽车电子电气架构(EEA,Electrical/Electronic Architecture)把汽车中的各类传感器、ECU(电子控制单元)、线束拓扑和电子电气分配系统整合在一起完成运算…

[附源码]计算机毕业设计JAVA校园求职与招聘系统

[附源码]计算机毕业设计JAVA校园求职与招聘系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myba…

【Matplotlib绘制图像大全】(二十一):Matplotlib为绘图添加注释

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

Maven 的安装与配置

文章目录Maven 简介一,下载Maven二,安装Maven三,配置Maven环境变量Maven 简介 Maven 项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之…

C/C++使用Windows的API实现共享内存以及同步

目录共享内存事件-Event实现思路创建方(服务端)连接方:进程同步:windows的APICreateFileMappingMapViewOfFileCreateEventWaitForSingleObjectCreateThreadOpenFileMapping通过共享内存实现进程间的交互服务端客户端结论共享内存 共享内存指 (shared me…

数据结构和算法之图的遍历

6.2 图的遍历 6.2.1 图的遍历——DFS 遍历:把图里面每个顶点都访问一遍而且不能有重复的访问 深度优先搜索(DFS) 当访问完了一个节点所有的灯后,一定原路返回对应着堆栈的出栈入栈的一个行为 深度优先搜索的算法描述 void DFS(Vertex V)//从迷宫…

Redis面试篇

文章目录1 Redis与Memcache的区别?2 Redis的单线程问题3 Redis的持久化方案由哪些?4 Redis的集群方式有哪些?5 Redis的常用数据类型有哪些?6 聊一下Redis事务机制7 Redis的Key过期策略参考资料:为什么需要内存回收&…

SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮!

一、导入elasticsearch依赖 在pom.xml里加入如下依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>非常重要&#xff1a;检查依赖版本是否…

【图像隐写】DWT数字水印嵌入+攻击+提取【含Matlab源码 1759期】

⛄一、DWT数字水印简介 1 引言 数字水印技术发展迅速&#xff0c;出现了各种水印算法&#xff0c;最低有效位(Least Significant Bit,LSB)数字水印技术是最早的空域水印添加算法&#xff0c;它原理简单且易实现&#xff0c;但鲁棒性差。变换域水印算法大大提高了水印的鲁棒性&…

【微信小程序】博客小程序,静态版本(三)设计和开发首页、个人关于页

【博客小程序】专栏 【微信小程序】博客小程序&#xff0c;静态版本&#xff08;一&#xff09;准备工作 【微信小程序】博客小程序&#xff0c;静态版本&#xff08;二&#xff09;引入 lin-ui 组件、设计和开发文章页 【微信小程序】博客小程序&#xff0c;静态版本&#…

模型推荐丨政务大数据项目案例模型分享

主要工具&#xff1a;Python 技术大类&#xff1a;自然语言处理 主要业务问题&#xff1a; 在社会治理上&#xff0c;政府部门一般通过群众的意见反馈、舆论情绪&#xff0c;掌握社会现状&#xff0c;做好舆情工作&#xff0c;以促进社会长治久安。微博作为有着大量活跃用户…

13 Igress,集群进出流量的总管

文章目录1. 前言2. 为什么要有 Ingress?2.1 Service 的缺点2.2 (Ingress)怎么解决Service 的缺点&#xff1f;3. 为什么要有 Ingress Controller 和 IngressClass?3.1 为什么要有 Ingress Controller&#xff1f;3.1.1 Ingress Controller3.1.1 Ingress Controller 常见公司3…

深入学习Linux内核(二)体系结构简析

Linux内核体系结构简析 图1 Linux系统层次结构 最上面是用户&#xff08;或应用程序&#xff09;空间。这是用户应用程序执行的地方。用户空间之下是内核空间&#xff0c;Linux 内核正是位于这里。GNU C Library &#xff08;glibc&#xff09;也在这里。它提供了连接内核的系…

Jitter

1、Jitter定义 定义1&#xff08;SONET规范&#xff09; 抖动可以定义为数字信号在重要时点上偏离理想时间位置的短期变化。 Long term jitter 测量由参考点滞后相当数量的Cycle&#xff08;500~1000&#xff09;后时钟的抖动值。该抖动参数也是时钟稳定性的一个重要指标&a…

如何清除电脑缓存?让电脑运行速度提升的有效方法

随着时间的流逝&#xff0c;电脑保存太多缓存文件&#xff0c;电脑的运行速度会越来越慢&#xff0c;甚至无法启动。当出现这种情况时&#xff0c;我们就需要对电脑进行清理。那么如何清除电脑缓存&#xff1f;今天就来给大家分享几个方法&#xff0c;让你的电脑运行速度快起来…

Spark SQL 与 Hive 的小文件调优

文章目录小文件危害表的缓存shuffle 分区数调整Spark SQL 客户端设置合并Hive 客户端处理小文件合并小文件危害 小文件会造成 nn 处理压力变大&#xff0c;大大降低了读取性能&#xff0c;整个 HDFS 文件系统访问缓慢&#xff0c;大量的小文件还会导致 nn 内存溢出&#xff0c…

DataX使用、同步MySQL数据到HDFS案例

文章目录4. DataX使用4.1 DataX使用概述4.1.1 DataX任务提交命令4.1.2 DataX配置文件格式4.2 同步MySQL数据到HDFS案例4.2.1 MySQLReader之TableMode4.2.1.1 编写配置文件4.2.1.1.1 创建配置文件base_province.json4.2.1.1.2 配置文件内容如下4.2.1.2 配置文件说明4.2.1.2.1 Re…