位置: IT常识 - 正文

openprompt使用记录:分类,生成案例(openprop教程)

编辑:rootadmin
openprompt使用记录:分类,生成案例 openprompt使用记录:分类,生成案例从安装到使用

推荐整理分享openprompt使用记录:分类,生成案例(openprop教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opentemp,openmp教程,openmp怎么用,openmp怎么用,openproj使用教程,openproj,openmp怎么用,openproj使用教程,内容如对您有帮助,希望把文章链接给更多的朋友!

官方提供了两种安装方式,我们直接使用git即可。这议严格按照官方教程(参考资料1)来,顺序不能错,有些网上教程版本较旧,没有中间那句,会导致很多依赖库的缺失。同时,在使用的过程中,发现了一些接口与 hugggingface 的版本依赖有关。建议安装之前修改 rwquirements.txt,规定其版本,或者安装后手动降低版本。

transformers==4.20.1

安装过程就是pip install那些,清华大学镜像停止了anaconda支持,所以会中断很多次,解决方案可以看(参考资料2),但是其实就一直暴力重装就行。

git clone https://github.com/thunlp/OpenPrompt.gitcd OpenPromptpip install -r requirements.txtpython setup.py install

下载后在目录中新建文件夹可以看到整个项目结构,这里从实用性的角度出发,我们主要关注两个红色框框里的即可,主要就是通过跑tutorial里的程序,来逐渐熟悉这个框架。注意tutorial很多代码默认的方式是从磁盘读数据集,需要改一下,改成相对目录,或者利用datasets中下载脚本进行下载,否则会报错。

如果需要了解架构和组织原理,可以参考原论文(参考资料3,4,5)。

这里建议跑里面的实例程序和自己程序之前,先跑官方给的sample,参考资料1里的那个。直接在当前目录创建sample.py即可。这里跟着官方sample演示分类,生成各一个实例。

分类(参考资料6)第一步:确定NLP任务

确定NLP任务也就是需要确定输出标签以及数据集。这里的输出标签指的是下游任务的输出,也就是y。本例只有两个类别,表示情感正向的positive,和情感负向的negative。

# 第一步:确定NLP任务(简单起见以情感分析作为例子)import torchfrom openprompt.data_utils import InputExample# 1. 确定类别:也就是确定数据标签,本例只有两个类别,表示情感正向的positive,和情感负向的negativeclasses = [ "negative", "positive"]# 2.确定数据集:为了简单起见,这里只有两个例子text_a是数据的输入文本,一些其他数据集可能在一个例子中有多个输入句子dataset = [ 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 made.", ), InputExample( guid = 2, text_a = "That is wonderful.", ),]第二步:确定预训练语言模型

这里加载的是一个训练好的bert语言模型,返回模型、分词器、模型参数、对应模型的包装器。这里需要提一点,因为我们直接只用预训练模型,所以上一步只有测试数据没有训练数据。否则需要加入 label = 作为标签。

# 第二步:定义预训练语言模型(PLMs)作为主干。from openprompt.plms import load_plmplm, tokenizer, model_config, WrapperClass = load_plm("bert", "bert-base-cased") # 这里选择的预训练语言模型是bert第三步:定义模板

这一块对应就是模板工程中的问题了,模板可以从txt中读取构建,也可以直接像下面这样定义。本例采用的格式是 [x],It was [Z],x对应代码中的text_a,应填入输入语句。Z对于mask,是LM的预测结果。

# 第三步:定义模板。from openprompt.prompts import ManualTemplatepromptTemplate = ManualTemplate( text = '{"placeholder":"text_a"} It was {"mask"}', tokenizer = tokenizer,)

关于这里的key值,可能比较奇怪的一点是论文中提到的 meta 究竟是什么,为什么在具体使用的时候是用的placeholder呢?这里文档中也没有给出详细明确的解释,但是通过源码可以看出来,InputExample 类默认有三个可填充的参数,text_a,text_b和meta,前两者都是一个str,而后者是一个dict,解释为An optional dictionary to store arbitrary extra information for the example。所以,当我们的主要句子可以使用前两者表示的时候,是无需用meta 的。

第四步:答案映射

这一块对应的是答案工程,在这个例子中把消极类投射到单词bad,把积极类投射到单词good, wonderful, great。

# 第四步:定义Verbalizer是另一个重要的# Verbalizer将原始标签投射到一组lable单词中。在这个例子中把消极类投射到单词bad,把积极类投射到单词good, wonderful, greatfrom openprompt.prompts import ManualVerbalizerpromptVerbalizer = ManualVerbalizer( classes = classes, label_words = { "negative": ["bad"], "positive": ["good", "wonderful", "great"], }, tokenizer = tokenizer,)第五步:构造PromptModel

promptModel有三个对象,分别是:PLM, Prompt, Verbalizer,分别对应Prompt研究重点中的三个部分:如何选择语言模型(第二步),如何定义模板(第三步),如何把答案映射至标签(第四步)。

# 第五步:将它们合并到PromptModel中# 给定任务,现在我们有一个PLM、一个模板和一个Verbalizer,我们将它们合并到PromptModel中。# 请注意,尽管示例简单地组合了三个模块,但实际上可以在它们之间定义一些复杂的交互。from openprompt import PromptForClassificationpromptModel = PromptForClassification( template = promptTemplate, plm = plm, verbalizer = promptVerbalizer,)第六步:构造PromptDataLoade

与数据加载和数据处理相关的内容,PromptDataLoader基本上是pytorch Dataloader的prompt版本,它还包括一个Tokenizer、一个Template和一个TokenizerWrapper,返回可迭代训练/测试的数据集。这里还可以定义如batch_size,max_seq_length等超参数。

# 第六步:定义DataLoaderfrom openprompt import PromptDataLoaderdata_loader = PromptDataLoader( dataset=dataset, tokenizer=tokenizer, template=promptTemplate, tokenizer_wrapper_class=WrapperClass,)第七步:预测

在上述过程中,没有用任何训练数据对Bert进行调整,就实现了零样本的情感分类。传入数据loader和model,使用类似基于Pytorch的其他机器学习一样完成训练和测试即可。

# 第七步:训练和预测:完成了!我们可以像Pytorch中的其他过程一样进行训练和推理。# making zero-shot inference using pretrained MLM(masked language model) with promptpromptModel.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'

经过了上面的项目,我们简单总结一下:在openprompt中,我们的工作就是将DataLoader处理为PromptDataLoader,Model处理为PromptModel,其余的训练,测试就均和pytorch接口融洽了。

openprompt使用记录:分类,生成案例(openprop教程)

下面梳理细节,看一下数据在其中究竟是如何流动并组合的。

首先是DataLoader,他需要的输入是key-value形式的data,template,tokenizer 和 tokenizer_wrapper_class(下图绿色框框标注),以及一些超参数。(参考资料7,8)

然后考虑PromptModel,他需要的输入是plm,template 和 verbalizer 以及一些超参数。不同于数据的每步处理,这里我们无需关注模型究竟是如何组织的,而更关注如何使用该模型。

生成

生成相比分类麻烦一些,主要是因为其运用了huggingface库函数中的一些接口(注意版本依赖)。这里我们需要先做一个工作:安装nltk的依赖(参考资料9),防止某些包找不到。

下面将通过一个简单的,但更接近实际应用的生成案例,带领大家对openprompt做更深入的了解。该案例使用的是webnlg数据集(参考资料10),由三元组(实体和它们之间的关系)以及自然语言文本形式的相应事实组成。这里我们加载数据集,并加载预训练模型t5。

import torchfrom openprompt.data_utils.conditional_generation_dataset import WebNLGProcessordataset = {}dataset['train'] = WebNLGProcessor().get_train_examples("./datasets/CondGen/webnlg_2017/")dataset['test'] = WebNLGProcessor().get_test_examples("./datasets/CondGen/webnlg_2017/")# load a pretrained model, its tokenizer, its config, and its TokenzerWrapper by one functionfrom openprompt.plms import load_plmplm, tokenizer, model_config, WrapperClass = load_plm("t5", "t5-base")

数据的具体组成为json格式,我们可以直接使用openprompt中提供的库函数 get_train_examples ,加载该数据集并进行InputExample的转化,最终得到的形式如下:

可以看到,我们要利用 text_a 中的信息去生成 tgt_text。很自然的可以定义模板如下(这里是否使用eos是无关紧要的):

from openprompt.prompts import ManualTemplatemytemplate = ManualTemplate(tokenizer=tokenizer, text=' {"placeholder":"text_a"} {"special": "<eos>"} {"mask"} ')

然而,这里将介绍另外一种更适合 预训练模型+微调 范式的Template,这是支持T5和其他编码器 - 解码器模型的实现,只要它们的块允许注入,就可以在不接触代码库的情况下进行微调。不过需要注意一点是, However, it may fail to work when used in DataParallel model. Please use it using single gpu or model-parallel training.,不过在官方仓库中的issue中,给出了解决方案(参考资料11),在使用并行训练时候可以参考。

from openprompt.prompts.prefix_tuning_template import PrefixTuningTemplatemytemplate = PrefixTuningTemplate(model=plm, tokenizer=tokenizer, text=' {"placeholder":"text_a"} {"special": "<eos>"} {"mask"} ', using_decoder_past_key_values=True)

下面进行DataLoader的包装,普通参数不再进行解释,只需要注意predict_eos_token,如果自己使用的数据集中,或者定义的模板最后不包含结束符,需要确保传递predict_eos_token=True,否则模型可能无法停止生成。

from openprompt import PromptDataLoadertrain_dataloader = PromptDataLoader(dataset=dataset["train"], template=mytemplate, tokenizer=tokenizer, tokenizer_wrapper_class=WrapperClass, max_seq_length=256, decoder_max_length=256, batch_size=5,shuffle=True, teacher_forcing=True, predict_eos_token=True, truncate_method="head")test_dataloader = PromptDataLoader(dataset=dataset["test"], template=mytemplate, tokenizer=tokenizer, tokenizer_wrapper_class=WrapperClass, max_seq_length=256, decoder_max_length=256, batch_size=5,shuffle=False, teacher_forcing=False, predict_eos_token=True, truncate_method="head")

最后定义模型,相比 PromptForClassification 而言,PromptForGeneration 多了生成相关的方法和 gen_config参数。

# load the pipeline model PromptForGeneration.from openprompt import PromptForGenerationprompt_model = PromptForGeneration(plm=plm,template=mytemplate, freeze_plm=False, tokenizer=tokenizer, plm_eval_mode=False)

这里想详细介绍一下除去模板,分词和预训练模型三者之外的两个超参数,他们的开关与否往往影响着超参数的数量,以及,是否能正常的运行起来你的模型,也是在实验过程中如果不了解,经常犯的一个错误(参考资料12)。我查阅了源码,将其放在这里,进行区分。

if freeze_plm: for param in self.plm.parameters(): param.requires_grad = Falseif plm_eval_mode: self.plm.eval() for param in self.plm.parameters(): param.requires_grad = False

我们需要了解的是(参考资料13),pytorch中,对于model的eval方法主要是针对某些在train和predict两个阶段会有不同参数的层。比如Dropout层和BN层。使用 plm.eval() 使得这些层的参数固定不变,而对变量 torch.autograd.Variable(tensor,requires_grad=True or False) 进行参数设置,是指定的要不要更新这个参数,也就是要不要通过梯度(迭代)来更新。关于pytorch中计算梯度的具体信息,感兴趣可以看参考资料1,有很详尽的介绍。

回到这里,无论设置 freeze_plm 还是 plm_eval_mode 为True,都会导致使用 ManualTemplate 定义的模板无法训练,而 PrefixTuningTemplate 则不存在这种问题。

在我们定义好DataLoader和PromptModel后,可以仿照pytorch中的训练流程进行训练和测试即可。源码中还使用了如梯度裁剪,学习率decay和 warmup等技巧,这里为了突出重点,只给出训练代码:

for epoch in range(3): prompt_model.train() for step, inputs in enumerate(train_dataloader): if use_cuda: inputs = inputs.cuda() global_step +=1 loss = prompt_model(inputs) loss.backward() tot_loss += loss.item() optimizer.step() optimizer.zero_grad() if global_step %50 ==0: print("Epoch {}, global_step {} average loss: {} lr: {}".format(epoch, global_step, (tot_loss-log_loss)/50, scheduler.get_last_lr()[0]), flush=True) log_loss = tot_loss

模型训练好后,我们可以使用他来生成,并进行评估:

from openprompt.utils.metrics import generation_metric# Define evaluate functiondef evaluate(prompt_model, dataloader): generated_sentence = [] groundtruth_sentence = [] prompt_model.eval() for step, inputs in enumerate(dataloader): if use_cuda: inputs = inputs.cuda() _, output_sentence = prompt_model.generate(inputs, **generation_arguments) generated_sentence.extend(output_sentence) groundtruth_sentence.extend(inputs['tgt_text']) score = generation_metric(generated_sentence, groundtruth_sentence, "sentence_bleu") print("test_score", score, flush=True) return generated_sentence

可以简单看一下生成效果,每句话的第一行为生成的,后面为多个标准答案。

参考资料GitHub - thunlp/OpenPrompt: An Open-Source Framework for Prompt-Learning.解决pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool_禅心001的博客-CSDN博客[2111.01998] OpenPrompt: An Open-source Framework for Prompt-learning (arxiv.org)OpenPrompt阅读笔记 - 知乎 (zhihu.com)OpenPrompt原论文阅读 - 知乎 (zhihu.com)【踩坑记录】OpenPrompt工具包如何使用?_vector<>的博客-CSDN博客openprompt结合源码讲解:如何加载自己的数据集 - 知乎 (zhihu.com)openprompt结合源码讲解:建立dataloader - 知乎 (zhihu.com)NLTK:Resource punkt not found. Please use the NLTK Downloader to obtain the resource_PleaseBrave的博客-CSDN博客|带代码的论文 (paperswithcode.com)使用多个GPU训练出现如下错误 · Issue #152 · thunlp/OpenPrompt (github.com)关于PrefixTuningTemplate更改后报错的问题 · Issue #198 · thunlp/OpenPrompt (github.com)pytorch中的model.eval()与volatile=True与requires_grad=False_两只蜡笔的小新的博客-CSDN博客PyTorch 的 Autograd_AlanBupt的博客-CSDN博客
本文链接地址:https://www.jiuchutong.com/zhishi/300787.html 转载请保留说明!

上一篇:ES6 --- 解构赋值(数组,对象,函数)使用详解(es6解构赋值对象)

下一篇:React中使用Redux (二) - 通过react-redux库连接React和Redux(react redux reducer)

  • 华为手机支付宝健康码怎么添加到桌面(华为手机支付宝双开)

    华为手机支付宝健康码怎么添加到桌面(华为手机支付宝双开)

  • 华为m5和m5青春版的区别(华为m5和m5青春版哪个值得入手)

    华为m5和m5青春版的区别(华为m5和m5青春版哪个值得入手)

  • ipv4的地址格式由多少个字节组成(ipv4的地址格式由多少个二进制组成)

    ipv4的地址格式由多少个字节组成(ipv4的地址格式由多少个二进制组成)

  • 微信登不上去了,里面的钱怎么办(微信登不上去了怎么注销账号)

    微信登不上去了,里面的钱怎么办(微信登不上去了怎么注销账号)

  • 苹果可以私密相册吗(苹果私密相册怎么设置密码)

    苹果可以私密相册吗(苹果私密相册怎么设置密码)

  • 蜂鸟众包注销后还可以注册吗(蜂鸟众包注销后注册不了)

    蜂鸟众包注销后还可以注册吗(蜂鸟众包注销后注册不了)

  • 如何将视频设置为手机壁纸(如何将视频设置为闹钟铃声)

    如何将视频设置为手机壁纸(如何将视频设置为闹钟铃声)

  • 三星语音助手bixby能改名字吗(三星语音助手bixby粤语)

    三星语音助手bixby能改名字吗(三星语音助手bixby粤语)

  • 红米note5支持18w快充吗(红米note5支持5g网络吗)

    红米note5支持18w快充吗(红米note5支持5g网络吗)

  • 宽带有5g吗(宽带网络有5g吗)

    宽带有5g吗(宽带网络有5g吗)

  • 主属性和主码的区别(主属性与主码)

    主属性和主码的区别(主属性与主码)

  • 光猫lan灯闪烁无法上网

    光猫lan灯闪烁无法上网

  • 手机步数原理(手机的步数是根据什么测定的)

    手机步数原理(手机的步数是根据什么测定的)

  • 登录Windows系统之后看到的主屏幕区域是(电脑windows登陆)

    登录Windows系统之后看到的主屏幕区域是(电脑windows登陆)

  • iphone xr支持多少瓦快充(iphonexr支持多少瓦充电)

    iphone xr支持多少瓦快充(iphonexr支持多少瓦充电)

  • 趣头条在哪看我的订单(2020年趣头条怎么了)

    趣头条在哪看我的订单(2020年趣头条怎么了)

  • 淘宝菜鸟驿站怎么加盟(淘宝菜鸟驿站怎么看身份码)

    淘宝菜鸟驿站怎么加盟(淘宝菜鸟驿站怎么看身份码)

  • 如何查找电话记录(如何查找电话记录内容)

    如何查找电话记录(如何查找电话记录内容)

  • 抖音如何升级(抖音如何升级荣誉等级)

    抖音如何升级(抖音如何升级荣誉等级)

  • 快手动态在哪里看(快手动态在哪里找2022)

    快手动态在哪里看(快手动态在哪里找2022)

  • 5g网络需要换笔记本吗(5g网络需要换wifi吗)

    5g网络需要换笔记本吗(5g网络需要换wifi吗)

  • 360安全浏览器如何设置兼容模式(360安全浏览器如何彻底卸载)

    360安全浏览器如何设置兼容模式(360安全浏览器如何彻底卸载)

  • 一台主机如何连接两个显示器(一台主机如何连接两个显示器接线)

    一台主机如何连接两个显示器(一台主机如何连接两个显示器接线)

  • 虎牙直播如何赚钱(虎牙直播如何赚取银豆)

    虎牙直播如何赚钱(虎牙直播如何赚取银豆)

  • JS逆向 webpack解密(auto.js 逆向)

    JS逆向 webpack解密(auto.js 逆向)

  • ifcfg命令  配置网络接口(ifconfig命令配置地址)

    ifcfg命令 配置网络接口(ifconfig命令配置地址)

  • 未达起征点的增值税怎么做账
  • 抵扣进项税怎么做凭证
  • 出让土地缴纳的契税怎么账务处理
  • 消防公司支付劳务费会计处理
  • 社保如何会计处理
  • 财产租赁个人所得税
  • 公司注销公告怎么发布
  • 付给其他公司的利息怎么做账
  • 研发支出费用化支出包括哪些
  • 增值税普通发票和专用发票有什么区别
  • 企业所得税怎么征收几个点
  • 职工死去还有工资吗
  • 冲红的电子发票要怎么处理
  • 航空公司按照一次性收费
  • 交强险是不是只要有发票就可以报销
  • 无租使用房产协议
  • 废旧物资收购价目表
  • 应收账款收不回来了怎么销账
  • linuxnl
  • 计提个人社保会计分录实操
  • c盘appdata怎么清理
  • win10任务栏图标怎么变大
  • 苹果手机id被锁定什么意思
  • 暂估成本跨月账务处理
  • 劳务费费用
  • 苹果多屏协同win10
  • 微软win11预览版
  • 其他应付款转资本公积股东决议
  • 资产处置损益要写明细账吗
  • ccf noi指导教师认证考核
  • 用chatgpt写insar地质灾害的论文,重复率只有1.8%,chatgpt4.0写论文不是梦
  • imu模型
  • php 错误和异常处理
  • python爬虫中数据接口的含义
  • 现代服务印花税税率
  • 固定资产实收资本按照什么入账
  • 收取的水电费怎么入账
  • 小型微利企业的认定标准2023年
  • 淘宝企业店必须绑定对公账户吗
  • phpcms怎么样
  • 公司的现金收入包括
  • 税务机关代开的增值税发票要加盖发票专用章吗?
  • 借款合同印花税优惠政策
  • 延期付款利息收入要交增值税吗
  • 存货的期末余额是账面余额吗
  • 医院绿化方案
  • 主营业务收入如何做分录
  • 异地学校
  • 房地产公司房屋租赁管理办法
  • 无发票费用可以入账吗
  • 出口产品开票注意事项
  • 票已收到、款未付会计分录
  • 工程施工借款如何做会计分录
  • 总公司中标走子公司账户违法吗
  • 对公账户如何转钱进去
  • win7激活失败提示错误代码0x80072F8F
  • Windows Server 2008系统10个意外惊喜
  • centos sync
  • fedora win10
  • openbsd 6.9
  • WinCtlAdAlt.exe - WinCtlAdAlt是什么进程
  • pm是什么软件的缩写
  • win10移动版和win10区别
  • linux vi中查找内容
  • python的idle打不开解决办法
  • npm yarn命令对比
  • android深度探索(卷1):hal与驱动开发
  • 按钮控件有几种类型
  • javascript基础教程教材答案
  • jquery 购物车
  • 安卓打包安装程序apk
  • jquery实例
  • 装修时候需要交什么费
  • 水利建设基金的税率
  • 晋城兰花集团招聘
  • 货车可申请停保吗
  • 微众银行企业金融客服电话多少
  • steam 申请
  • 小微企业企业所得税率
  • 房地产的土地增值税怎么交
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设