写干货不易,点个赞再走吧!

由于预训练模型经过了预训练的学习,因此其本身已经拥有了一定的特征抽取(挖掘)能力,是个“三好学生”;而大规模预训练模型在此基础上由于参数量众多,因此结合大规模数据预训练后,其已经不仅仅是“三好学生”的程度,可谓是“大师”级别了。

大规模预训练模型的知识面比较广泛,我们可将其看作是“知识库”、“百科全书”。而知识的广度与深度在一定程度上是存在矛盾关系的,为了让其在实际应用中(某些领域)发挥出更好地表现,我们会要求它对某些领域的知识有更深的认知。

针对这些特定领域而提出的任务,叫作“下游任务”;相对地,模型在预训练学习时要解决的任务就叫作“上游任务”

上、下游任务之间通常存在一定的“隔阂”,即目标不一致。于是,我们通常会针对下游任务为模型重新设计目标函数,让模型在拥有广泛知识面的基础下对特定领域方面的知识进一步地学习,加深其在这方面知识的深度。这种做法,就是我们常说的 'fine-tune',中文叫作“微调”

之所以叫作微调,是因为这次的学习可能并不会大幅度地改变模型参数,亦或不需要改变模型的全量参数,而是仅仅训练头部(输出预测结果的部分)即可,所以这个词还是蛮形象的——“微微地调整”(你细品~)。

微调这种玩法已经玩很久了,时至当下2021年,它也该面临退役的情境了(遭嫌弃了..)。其实,退役与否非由其存在的时间长短决定,更多地是由它到底“好不好”来决定的,而这个好或不好的评估维度又包含多个方面,比如:可实施性(是否可行)、实施难度/代价(算力、空间、时间,甚至人力) 和 最终可达到的效果(模型的性能) 等等…

因此,它之所以会面临退役的问题,是因为它本身的缺陷已经日益显现出来了。然而,一个方法被贴上过时的标签,有一个必要条件就是有新的方法被提出来。而这个方法,就是本文的主角—— NLP领域最近异常火爆的“Prompt”!

虽然目前是在NLP领域开启了新篇章(其实多模态也已经有了许多相关工作,但还比较稚嫩,暂且不谈),但CW相信prompt在CV领域也有机会玩起来,因为我始终坚信CV和NLP最终会趋于统一的范式,从近年来Transformer在CV 界“大肆厮杀”就可感受到这种趋势。

如何看待NLP领域最近比较火的prompt,能否借鉴到CV领域? - 知乎

我偶像老子也告诉大家:“道生一,一生二,二生三,三生万物”。只有找到那个“一”,才是寻找到了本质,从而得到“道”。当然,这必然是个螺旋上升的过程,我们先要针对“万物”进行各种尝试,然后抵达“三”、接着是“二”、最终到“一”… 这是需要很多代人共同努力才能完成的,甚至可能永远不能完成,但这个过程却是有意义的,因为它在不断修正人类对世界的认知,同时也实实在在地影响着我们的实际生活。

不好意思,可能是 CW 有段时间没写文了,禁不住有点唠叨.. 接下来就开始讲下 prompt 的玩法。首先从它产生的背景与动机说起,然后结合例子介绍下它的概念,进而具体阐述它的方法,接着提出它当前面临的一些困难与挑战,最后谈谈自己的理解与总结

1.背景与动机:这可能是NLP的第四范式——Prompt

首先,回顾下NLP发展至今的范式(玩法):

I. 非神经网络时代的完全监督学习(Fully Supervised Learning, Non-Neural Network)

这时候还没有神经网络,大家都在玩特征工程(Feature Engineering)

II. 基于神经网络的完全监督学习(Fully Supervised Learning, Neural Network)

这时候有了神经网络,大家对其结构设计着了迷,大玩结构工程(Architecture Engineering)

III. 预训练 & 精调 (Pre-train & Fine-tune)

如 CW 在前言所说(别告诉我你没认真看),我们通常会为预训练模型设计针对下游任务的目标函数,这时候大家玩的是目标函数挖掘(Objective Engineering)

IV. 预训练、提示、预测(Pre-train, Prompt, Predict)

这是当下最in的玩法,而主要玩的东西就是Prompt挖掘

以上参考了刘鹏飞大佬的观点,也欢迎大家前去学习:近代自然语言处理技术发展的“第四范式” - 知乎

那么为何会有prompt这种新玩法呢?到底什么是prompt?如今在玩的prompt挖掘又是什么鬼?不急不急,接下来 CW 将为您逐一揭晓。

我们先来总结下 fine-tune 存在的一些问题:

(以下 'PLM' 代表 Pre-trained Language Model,即预训练模型)

  • PLM 规模不断增大,对其进行 fine-tune 的硬件要求数据需求都在不断上涨;
  • 丰富多样的下游任务使得 PLM 在 fine-tune 阶段的目标设计非常繁琐复杂
  • 由于上、下游任务之间目标不一致,往往存在着“隔阂”,因此 PLM 无法直接适配下游任务,输入和输出之间存在结构偏差(structure bias),优化成本高

可以看到,fine-tune 是个问题多多的家伙,不是“好学生”。为了变得更加优秀,我们必须找个“三好学生”来做榜样,于是我们把目光转向了 prompt 这个家伙。

以上是当下需要攻克的难点,但请不要忘了我们的核心目标——让大规模PLM 更“好”地应对下游任务。这个“好”主要包含两方面:

  1. 首先,理所当然是要有更好的性能
  2. 同时,以更低的代价实现目标

于是,我们可以围绕着核心目标出发,在设计过程中结合以上需要攻克的难点去思考,那么,怎么做呢?

我偶像老子又告诉大家了:“反者,道之动”!

既然fine-tune这种玩法已经不太好玩下去了,那么就要走向反面,才能继续发展。Fine-tune是让预训练模型去适配下游任务,于是我们就应该反过来——让下游任务去适配预训练模型

具体一点,就是:将下游任务的输入建模成适配预训练模型处理的形式,从而更充分地利用预训练模型已有的知识、以更低的成本进行二次学习。

形象来看,犹如下图:

左边是fine-tune的玩法,右边则是prompt的玩法。

最后,综合前文提到的四个范式的“名片”一起来比较下:

2.概念与例子:Prompt是什么呢?

OK,背景和动机了解后,那么 prompt 到底是什么呢?

直观来解释,prompt 就是给预训练模型的一些线索和提示,让它更好地理解我们提出的问题(下游任务),这是比较intuitive的定义。

更technical地来说,prompt是这么一项技术:通过在输入端额外添加一些文本,从而更好地利用 PLM 已有的知识,进而更好地应对下游任务。

比如最常见的文本分类问题,输入:'I love this movie.',模型会输出:'positive' / 'negative'。然而,对于本身是做文本生成的 PLM,它是不懂得分类的,但我们可以对原始输入进行适当地转换,构造成适合它处理的方式,让它输出 'positive' / 'negative' 这些词,从而应用到文本分类这种下游任务。

具体来说,我们将 ‘I love this movie.’构造成:

‘I love this movie. Overall, it was a _____ movie.

其中,前面的虚下划线用于填入原始的输入文本,后面的实下划线则用于给模型预测答案文本,至于其余部分则作为提供给模型的线索。

于是,这个做文本生成的 PLM 就可能会预测出一些诸如 'fantastic', 'boring'.. 等等这些词汇作为答案。最终,我们再对这个模型的预测('fantastic', 'boring'.. 这些)结果映射到所需的答案空间,比如:

fantastic -> positive;

boring -> negative

这么一来,通过 prompt 的方式,就可以让原本做文本生成的PLM也可以handle文本分类任务了。怎样,很好玩有木有!?

对于输入文本的构建,更正经(数学)地描述如下:

将原始输入文本x送入函数f_{prompt}构造成 x^{'},即: x^{'}=f_{prompt}\left( x \right)

就上述提到的例子来说,这里x就是 'I love this movie.',而 x^{'} 就是:

'I love this movie. Overall, it was a _____ movie.'

函数f_{prompt}主要实施的操作是:使用一个“模板”,这个模板通常是一段文字描述,并且留出两个空位 [X] 和 [Z] ,其中 [X] 填入原始的输入文本,[Z] 则预留给模型填入预测答案。

还是拿以上的例子来说,函数f_{prompt}构建的模板就是:

[X] , Overall, it was a [Z] movie.

其中,[X] 是 'I love this movie.'。于是,模型就会根据这段描述在 [Z] 位置上预测出文本,答案可能是 'fantastic' 或者 'boring' 之类的,具体和模型的表现相关。

至此,你或许会问:除了文本分类,其它 NLP 任务上可以用 prompt 来玩吗?

当然!毕竟是被称为新范式的家伙,怎可能这么弱~喏,一些常见的例子可参考下图:

3.设计与方法:Prompt怎么玩?

Prompt作为一种新范式,有它独特的玩法,这部分来讲讲它的游戏规则。

PLM Choice

当然,无论怎么玩,模型还是得有的,而且选择与下游任务更适配的预训练模型 会更有利,也就是模型本身的处理形式与下游任务形式更贴近的就会更好。

Prompt Construction

这部分对应上一节提到的模板构建,也就是怎样构建合适的模板为预训练模型提供更好的提示,从而更好地激发它利用学到的知识,可谓是 prompt 游戏环节的重中之重。

Prediction

这个貌似有点废话,模型确定了,输入形式也构造好了,总该干活(预测)了吧~

Label -> Answer Mapping

前文也提到过,预训练模型的预测输出可能并非是下游任务所需要的形式,因此我们通常还需要构建预测结果与下游任务标签的映射关系。

(你们:咦..似乎还少了点什么?CW:少了训练对不对!你们:哦哦,对哦!)

Training Strategies

虽说prompt这种范式能够更好地利用模型已学到的知识,但终归还是要训练的,这样才能加深模型关于下游任务知识的深度。那么,在prompt这种玩法中,模型是怎样训练的呢?

这里涉及到多种多样的训练策略,可以从两个维度来归纳:

· 从数据的视角来看

根据下游任务数据集的规模,可以分为zero-shot, few-shot 以及full-data,根据不同数据集规模选择不同的训练策略是值得考虑的一件事情。

· 从参数的视角来看

PLM 可以是frozen或是tuned的,同时prompt构建的模板(简称prompt)也可以是可学习的(而并非是 hand-craft、 不可学习的),它可以是embedding vector 的形式。当然,如上述所示的那些例子般,在最传统的玩法中,prompt 模板都是固定的自然语言描述,本身是不可学习的。

以上两个维度通常需要互相结合考虑来选择合适的训练策略,比如:在 few-shot场景,通常就比较适合fix住PLM、仅对prompt进行tuning(如果是可学习的prompt);而在zero-shot场景,你甚至可以将prompt也fix住;然而,当下游任务拥有大量数据时,仅仅tune prompt可能会欠拟合(毕竟 prompt 的参数量也就那么点儿~),这时候将PLM一起tune就会比较合适。

4.困难与挑战:Prompt好像很麻烦

现在,大家对prompt应该有个基本了解了。但是,读完上一节的内容,不少朋友应该会觉得prompt这种玩法还是挺麻烦的,有点回归到上世纪构造特征工程的感觉,尤以构建prompt 模板和标签与预测之间的映射为重。

并且,不少大佬经过实验发现,模型对于自然语言形式的prompt模板十分敏感,模型对于拥有相同语义但表述形式不同的模板会有很大差异的表现,这同时也可预知到模型对于噪声也会异常敏感,毕竟大规模PLM参数量巨多,拟合能力贼6…因此,精心设计prompt模板似乎成了一门艺术。

另外,标签与预测之间的映射也同样重要,这直接决定了PLM是否能handle下游任务,所以在这方面也需要我们花不少心思。

当前,针对这两部分已经有了各种各样的做法(由于本文主要作为对prompt的概述,因此不详细介绍),花里胡哨的paper也不少,但至今仍没有一个比较通用且简洁的方式,路漫漫其修远兮…

5.理解与总结

啰嗦了这么多,最后 CW 就从几方面来谈谈自己对 prompt 的理解,作为本文的总结。

首先,prompt是将输入文本建模成适合预训练模型处理的方式,相比于fine-tune 那种强行让模型去适配另一种形式的任务,在下游任务上的学习成本更低、同时更能充分地利用模型已学到的知识。

其次,由于prompt的做法是将下游任务转换成预训练任务的方式,这在很大程度上消除了两者之间的“隔阂”,“归根溯本”。

再者,prompt的做法可以看作是“考验”模型,有种知识检索的feel:给出具体问题和相关提示,看你能否答对,答错了就继续学习!

另外,由于大规模预训练模型本身已学到了非常丰富的知识,可被看作是一个巨大的“百科全书”,因此输入样本的每个类别分布在其中应当是比较稀疏的(毕竟在 PLM 的知识库里,预训练时类别和样本众多,通常不会有哪类样本在其中占据特别大的优势),从而有handle类别不均衡以及few-shot、zero-shot 的潜力。

最后,从本质上来看,prompt更加依赖先验,这种玩法能够生效在很大程度上依赖于预训练模型已经学到了非常丰富的语料知识。


作者:CW

还在 Fine-tune 大规模预训练模型? 该了解下最新玩法 Prompt-tuning啦相关推荐

  1. 「悟道」来了!大规模预训练模型交流论坛开启报名

    2020年10月以来,智源研究院已组建了清华大学唐杰教授领衔,由来自北大.清华.人大.中科院等单位的80余人的AI科学家组成的"悟道"联合攻关团队,开展"文源" ...

  2. 中文版GPT-3来了?智源研究院发布清源 CPM —— 以中文为核心的大规模预训练模型...

    清源 CPM(Chinese Pretrained Models)是北京智源人工智能研究院和清华大学研究团队合作开展的大规模预训练模型开源计划,清源计划是以中文为核心的大规模预训练模型.首期开源内容包 ...

  3. 中文版GPT-3来了?智源、清华发布清源 CPM——以中文为核心的大规模预训练模型

    2020-11-18 23:43:21 清源 CPM(Chinese Pretrained Models)是北京智源人工智能研究院和清华大学研究团队合作开展的大规模预训练模型开源计划,清源计划是以中文 ...

  4. 交互式多模型_26亿参数,智源、清华开源中文大规模预训练模型

    近日,北京智源人工智能研究院和清华大学研究团队联合发布了以中文为核心的大规模预训练语言模型 CPM-LM,参数规模达 26 亿,预训练中文数据规模 100 GB. 26亿参数,智源.清华开源中文大规模 ...

  5. 达摩院李雅亮:大规模预训练模型的压缩和蒸馏

    作者 | 李雅亮博士 阿里巴巴 来源 | DataFunTalk 导读:本次分享的主题为大规模预训练模型的压缩和蒸馏,主要是从自动机器学习的角度,介绍大规模预训练模型的压缩和蒸馏.将介绍阿里巴巴达摩院 ...

  6. 200+页综述!阐述大规模预训练模型机遇与风险

    来源 | 机器之心 在一篇 200 多页的论文中,Percy Liang.李飞飞等斯坦福研究者系统阐述了大规模预训练模型背后的机遇与风险.他们还给这些模型取了一个统一的名字-- Foundation ...

  7. 2021智源大会AI TIME|大规模预训练模型离通用人工智能还有多远?

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 6月1日,人工智能领域内行盛会"北京智源大会"如约而至.当天上午,北京市副市长靳伟.科技部战略规划司司长许倞出席并致 ...

  8. 【2021 第五届“达观杯” 基于大规模预训练模型的风险事件标签识别】1 初赛Rank12的总结与分析

    目录 相关链接 1 赛题分析 2 引言 3 方案 3.1 传统DL方案 3.2 预训练方案 4 提分技巧 5 加快训练 6 总结和反思 7 参考资料 相关链接 [2021 第五届"达观杯&q ...

  9. 2021 第五届“达观杯” 基于大规模预训练模型的风险事件标签识别】3 Bert和Nezha方案

    目录 相关链接 1 引言 2 NEZHA方案 2.1 预训练 2.2 微调 3 Bert 方案 3.1 预训练 3.2 微调 3 模型融合和TTA测试集数据增强 4 总结和反思 5 参考资料 相关链接 ...

最新文章

  1. [网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及防御机理
  2. Java SimpleTimeZone setEndRule()方法与示例
  3. IDEA2020安装
  4. AndroidManifest.xml文件详解(uses-sdk)
  5. SQL SERVER 数据库概括
  6. 数据-第18课-栈与递归
  7. 嵌入式linux指纹识别项目,基于嵌入式应用平台的指纹识别系统设计
  8. 如何在线压缩图片?电脑怎么缩小图片kb大小?
  9. 信而泰ALPS 用户管理——网络测试仪实操
  10. 高手支招:免费拥有QQ魔法表情(转)
  11. python文件加密
  12. 【91xcz】五方法助你轻松实现win8系统关机操作
  13. POI之Excel单元格样式
  14. 干货精选 | 迅雷链再度亮相“魔都”上海,性能与安全兼得的区块链为何备受关注?...
  15. 欲罢不能 推荐,刷屏时代如何摆脱行为上瘾
  16. Appium+Android+Python,关闭广告
  17. iPhone帮帮忙(全彩)
  18. 海淀区第九届单片机竞赛获奖名单_2014年北京市中小学生单片机获奖名单-获奖名单...
  19. 解决Windows10电脑时间不同步或无法更新问题
  20. iOS ksyhttpcache音视频缓存

热门文章

  1. 没有第三个变量的前提下交换两个变量_JavaScript 交换值的方法,你能想到几种?
  2. open函数返回-1_记录学习python的第3天-递归函数/文件操作
  3. linux 日志按大小切割_linux下nohup日志切割方案
  4. java jdbc pr_Java JDBC学习笔记
  5. vue之vue-router跳转
  6. python库--pandas--MultiIndex
  7. node平台的安装与搭建
  8. HTML5----热区(在图片img上第一超链接选区)
  9. 重读《从菜鸟到测试架构师》--黑色的盒子里有什么(中)
  10. [深入React] 1. 开发环境搭建