prompt你到底行不行?

12489f410d169ce62723068ea41792a1.png

文 | 马杀鸡三明治
源 | 知乎

很久之前老板下任务要试试prompt这个大风,但是玩完后发现太菜了所以连文章都没写,刚好今天工作比较闲就来写写了。

先上结论,连续prompt为运用大模型提供了一种思路,其实这种思路早就见过不少了。。。

离散prompt才是最佳的姿势,但是存在人工设计模板带来变数的问题。

所以prompt真的不太行。

不想看细节的可以直接看总结

prompt三阶段为:

  1. 第一阶段离散prompt

  2. 第二阶段,连续prompt

  3. 第三阶段,pretrain阶段和下游阶段统一任务类型(T5,zeroprompt)

这里的第三阶段是个人看法。

为什么要prompt

prompt本意在于下游任务使用模型的时候,尽可能与预训练模型pretrain阶段的任务保持一致。

我们现在用BERT的方式大多数为finetune,这会有以下两点弊端:

1.finetune存在上下游阶段任务不一致的问题,fintune对BERT原来的结构破坏严重
2.下游任务通过标注数据驱动,finetune到一个位置,而finetune任务语言上的意义并没有告知给模型。

我们看这两个弊端,本质上我们是在做出选择,是精确的finetune还是泛化能力很强的MLM。

针对这两点弊端做出改进,主要就是pretrain阶段和下游任务阶段能尽可能一致,这样才能发挥出MLM的能力。但是这个过程必定有人为因素,这个过程也就是第一阶段的离散prompt

第一步,构造prompt。

第二步,构造MAKS token映射。

为此衍生出autopromptsoft prompt连续prompt等方法,

接下来我们具体聊聊这两个劣势

1.finetune存在上下游阶段任务不一致的问题,fintune对BERT原来的结构破坏严重

看第一点,pretrain阶段学习最主要的任务是MLM,那么我们下游使用能否也是用MLM?这就是prompt最开始的思路。问题在于怎么让下游变成MLM任务。

如任务情感分类,x = 我很累 y=负面

第一步,构造prompt

那么我们可以这样加入prompt,prompt = 我感觉很[MASK]

于是可以得到给BERT的token为

[CLS]我很累,感觉很[MASK][SEP]

第二步,构造MAKS token映射

即MASK预测的token应该怎么样映射到标签,比如负面可能的token候选有:难受,坏,烦

这样我们就能让上下游一致了。

2.finetune任务语言上的意义并没有告知给模型

我们知道BERT是一个语言模型,但是finetune却让他数据驱动参数变化,而不是先跟他表明这个任务是干嘛。所以你会发现prompt就是在使用语言的通顺,因为pretrain阶段的语料也是通顺的语料,所以我们构建prompt希望句子X和prompt接起来是一个通顺的话,这样上下游就更一致了。

为了让拼起来的话通顺,我们就会结合场景设计prompt比如上面那个案例使用的prompt=感觉很[MASK],当然也可以promp=心情很[MASK]。

有了上面的思路prompt按阶段开始变种,第一阶段是离散prompt,后来出现连续prompt。

第一阶段,离散prompt

Pattern-Exploiting Training

其实就是我们最开始说的prompt方法,

第一步,构造prompt

那么我们可以这样加入prompt,prompt = 我感觉很[MASK]

于是可以得到给BERT的token为

[CLS]我很累,感觉很[MASK][SEP]

第二步,构造MAKS token映射

即MASK预测的token应该怎么样映射到标签,比如负面可能的token候选有:难受,坏,烦

但是这里面两步都涉及人为因素。所以有人做出了改进,自然是围绕如何去除人工设计,也就是“构造prompt”,“MAKS token映射”。

其实在我看来这才是prompt的优势所在,但是这个优势又带来了劣势,因为有人实验发现prompt的几个字都能导致模型效果的较大的变化。

AutoPrompt

为了去除人工设计带来的变数,autoprompt针对自动“构造prompt”,自动选择“MAKS token映射”,做出方案。

第一步,构造prompt

选择loss下降最大的prompt token,注意到这里的loss怎么计算呢,这一步我们要先给定mask映射词。

这两步骤其实有冲突,先有鸡还是先有蛋。。。论文的做法是先用假的prompt喂进去求出mask映射,也就是:

[CLS] {sentence} [T] [T] [T] [MASK]. [SEP]

然后再用得到的mask映射用数据驱动选择T。

第二步,构造MAKS token映射

step1,使用上下文的MASK tokenoutput embedding作为x,与label训练一个logistic,可以理解为logistic得分高的向量他就更能表示label

step2,使用上下文MASK tokenoutput tokenembdding给打分函数,取得分top-k

太多细节可以看论文,这个方法和finetune差距也有10个点的出入,注意到这里的robertalarge的,效果比base的BERT好,原因就是因为largemlm能力更强,在做MRC任务也知道tinybase的差距还有baselarge的差距。模型参数量越大MLM能力越强。

ae8d1d5f84ee3c62410df37aeb3674db.png

第二阶段,连续prompt

这个阶段prompt开始变味道了,基本思路就是把之前离散的prompt token换成连续的prompt token,怎么换呢。

之前离散prompt的是以token喂给bert的,比如前面那个情感分类的prompt=“我感觉[MASK]”,是以token为单位给bert的,那连续prompt就是把这些token替换成embedding,直接把通过了bert emebdding层的prompt token的向量替换成可训练参数,并且冻结整个BERT,只训练3*768这个矩阵。比如我这里token emebdding维度为3*768(我感觉,三个字)那么可训练参数就是3*768,就是这么回事,那具体还有些骚操作可以玩:

1,比如这里的3*768,那能不能20*768呢,这个也是个不可控的东西可以做实验。

2,能不能给BERT每层encoder整上3*768呢,意味着每层的encoder通过self attention把每层的3*768的信息交互进模型。

3,可不可以不用[MASK]映射了,我直接使用CLS来分类。

以上讲的3点都是P-tuning v2的做法,至于P-tuning v2之前的玩法就不多说了,花样没有P-tuning v2多,但是P-tuning v2的效果在large模型上是接近finetune的,而且你不需要训练太多参数就可以撬动一些大模型了,包括Prefix-tuning也说了他们不需要训练太多参数就可以撬动一些大模型了,但是这个玩法不是早就有了吗,现在打着prompt的旗号又能水是吧。

此外,P-tuning v2,prompt token长度对实验的影响还挺大的,而且跟任务具有一定相关性,表现很不稳定。论文也没做few-shot实验,效果待定。没有说base模型的效果。

其实看到这里你会发现prompt已经变味了,严格来说根本不是什么prompt了,这种构建可训练向量去控制模型的方法也不稀奇,而去除 [MASK]映射换成CLS来分类就更加有fintune那感觉了。由于我没自己去跑跑,但是可以看到都是负面评论居多,太多负面评价了,不列举了。

b0d5dd18404538c16621697ccf906c84.png

第三阶段,pretrain阶段和下游阶段统一任务类型(T5,zeroprompt)

最后一提T5zeroprompt。

T5google使用ender-decoder结构做的一个大模型,T5把pretrain阶段任务和下游阶段任务统一了,都做seq2seq任务,或者论文里说的text2text任务。

zeroprompt,把各种场景和不同的任务类型(分类,翻译,阅读理解,近似句得分等)数据,以人工设计prompt的方式训练,得到一个超级无敌prompt模型,其实本质上也是统一了pretrain阶段任务和下游阶段任务,都做MLM,不同的是zeroprompt为了适应新的任务场景需要一套算法来自动prompt,而T5通过固定引导词配对任务类型,直接decode出答案。

对比两者,T5直接重新设计pretrain阶段任务,和下游阶段任务保持一致,而zeroprompt本质上也是用了自动prompt的方法,但是把中文任务数据都跑了个遍,达到了中文prompt一统。

总结

prompt从最开始的人工设计模板,到自动prompt再到连续prompt,逐渐变的畸形。

最开始的人工设计模板就是为了利用好BERTpretrain阶段学习到的MLM能力然后用在下游,但是人工设计模型存在不稳定的问题,自动prompt效果又很差。

于是连续prompt开始表演,连续prompt已经没有prompt的味道了,把prompt弄成向量,通过训练希望模型能自己得到好的prompt向量,其实就是在finetune

所以prompt行不行,目前来看不如finetune。但是他具有一定的few shot能力,特别是离散prompt。在一些简单的任务是可以直接用离散prompt的方式做到few shot,这其实是利用BERTpretrain阶段学习到的能力,但是一旦任务过难,那few shot效果会很差,远不如标几条数据finetune一下。这里就是涉及到泛化和精准,你想要一定的泛化性,那就一定牺牲了精准。

最后zeropromptT5,基本是把prompt的东西都玩完了,其实就是pretrain阶段和下游阶段是否一致的问题。

330edecd0cabc60d777bcecf08332514.png后台回复关键词【入群

加入卖萌屋NLP、CV与搜推广求职讨论群

后台回复关键词【顶会

获取ACL、CIKM等各大顶会论文集!

e4b4b5a2f71a7db75adb2bd2fe87045d.gif

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

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

相关文章

LeetCode 1323. 6 和 9 组成的最大数字

1. 题目 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。 请返回你可以得到的最大数字。 示例 1: 输入:num 9669 输出:9969 解释: 改变第一位数字…

Spring Cloud实战小贴士:Zuul统一异常处理(二)

在前几天发布的《Spring Cloud实战小贴士:Zuul统一异常处理(一)》一文中,我们详细说明了当Zuul的过滤器中抛出异常时会发生客户端没有返回任何内容的问题以及针对这个问题的两种解决方案:一种是通过在各个阶段的过滤器…

论文浅尝 | Explainable Link Prediction in Knowledge Hypergraphs

笔记整理:陈子睿,天津大学硕士论文链接:https://dl.acm.org/doi/10.1145/3511808.3557316动机知识超图链接预测已被认为是各种知识使能下游应用的关键问题。然而,大多数现有方法主要以黑盒方式执行链接预测,它们学习实…

吴恩达入驻知乎,涨粉秒过万!知乎首答:如何系统学习机器学习

文 | 卖萌酱大家好,我是卖萌酱。昨天在知乎timeline上刷到一个问题:虽然卖萌酱已经不需要系统学习机器学习了,但无意间发现最高赞的id竟然叫“吴恩达”??好家伙,看了看回答日期,是4月8号。戳进去…

学术会议|第六届知识图谱论坛CNCC-知识图谱赋能大数据大算力

CNCC2022将于12月8日至10日在贵州省贵阳市国际生态会议中心举办,今年CNCC技术论坛数量达到122个,内容涵盖了“计算行业、人工智能、云计算、教育、安全”等30个方向。本文特别介绍将于12月9日举行的【第六届知识图谱论坛-知识图谱赋能大数据大算力】。报…

LeetCode 第 18 场双周赛(188/587,前32%)

文章目录1. 比赛结果2. 题目LeetCode 1331. 数组序号转换 easyLeetCode 1328. 破坏回文串 mediumLeetCode 1329. 将矩阵按对角线排序 mediumLeetCode 1330. 翻转子数组得到最大的数组值 hard1. 比赛结果 做出来了1, 2, 3题,第4题提交超时 2. 题目 LeetCode 1331.…

Spring Cloud实战小贴士:Zuul统一异常处理(一)

在上一篇《Spring Cloud源码分析(四)Zuul:核心过滤器》一文中,我们详细介绍了Spring Cloud Zuul中自己实现的一些核心过滤器,以及这些过滤器在请求生命周期中的不同作用。我们会发现在这些核心过滤器中并没有实现error…

ACL’22 | 为大模型定制的数据增强方法FlipDA,屠榜六大NLU 数据集

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

技术动态 | 面向可解释性的知识图谱推理研究

导读:本次演讲的主题是面向可解释性的知识图谱推理研究,报告分为以下 5 个部分:研究背景前沿进展研究动机近期研究研究展望分享嘉宾|万国佳 武汉大学 计算机学院 博士后编辑整理|xiaomei出品平台|DataFunTa…

LeetCode 1332. 删除回文子序列

1. 题目 给你一个字符串 s,它仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符(字符串为空)的最小删除次数。 「子序列」定义:如果一个字符串可以通过删除原字符…

Spring Cloud源码分析(四)Zuul:核心过滤器

通过之前发布的《Spring Cloud构建微服务架构(五)服务网关》一文,相信大家对于Spring Cloud Zuul已经有了一个基础的认识。通过前文的介绍,我们对于Zuul的第一印象通常是这样的:它包含了对请求的路由和过滤两个功能&am…

预训练再次跨界!百度提出ERNIE-GeoL,地理位置-语言联合预训练!

源 | 百度NLP本文介绍『文心大模型』的一项最新工作:“地理位置-语言”预训练模型ERNIE-GeoL。论文链接:https://arxiv.org/abs/2203.09127实践中的观察近年来,预训练模型在自然语言处理、视觉等多个领域都取得了显著效果。基于预训练模型&am…

LeetCode 1333. 餐厅过滤器(Lambda排序)

1. 题目 给你一个餐馆信息数组 restaurants,其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。 其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false,如果为 true …

Spring Cloud实战小贴士:Zuul处理Cookie和重定向

由于我们在之前所有的入门教程中,对于HTTP请求都采用了简单的接口实现。而实际使用过程中,我们的HTTP请求要复杂的多,比如当我们将Spring Cloud Zuul作为API网关接入网站类应用时,往往都会碰到下面这两个非常常见的问题&#xff1…

论文浅尝 | Language Models (Mostly) Know What They Know

笔记整理:程思源、梁孝转,浙江大学在读硕士,研究方向为知识图谱的表示学习,自然语言处理,预训练对于一个语言模型,我们最终希望得到一个“诚实”的人工智能系统,即语言模型需要准确并且忠实地评…

百度AI技术盛宴来了!大咖齐聚解读CV/NLP/跨模态大模型技术!

随着人工智能步入工业大生产阶段,AI大模型正在加速走出实验室,在全球范围内逐步实现产业落地应用的突破。自2020年至今,越来越多的科技巨头和科研机构参与其中。去年12月,百度发布了全球首个知识增强千亿级大模型——鹏城-百度文心…

Spring Cloud实战小贴士:健康检查

今天在博客的交流区收到一条不错的问题,拿出来给大家分享一下。具体问题如下: 因为项目里面用到了redis集群,但并不是用spring boot的配置方式,启动后项目健康检查老是检查redis的时候状态为down,导致注册到eureka后项…

恕我直言,你的模型可能并没看懂 prompt 在说啥

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

开源开放 | 区域供冷供热系统及空调系统知识图谱

OpenKG地址:http://openkg.cn/dataset/less开放许可协议:CC BY-SA 4.0 (署名相似共享)贡献者:浙江大学(赵阳,李婷婷,章超波)1、背景区域供冷供热系统及空调系统领域涉及知…

LeetCode 1334. 阈值距离内邻居最少的城市(最短路径Dijkstra)

1. 题目 有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。 返回能通过某些路径到达其他城市数目最少、且…