热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

预训练新范式提示学习(Prompttuning,Prefixtuning,Ptuning,PPT,SPoT)

「PromptTuning也许会是深度学习时代的FeatureEngineering问题,如何给各大任务设计合理的Prompts将会是很有意思的科学问题」–刘知远虽然

「Prompt Tuning也许会是深度学习时代的Feature Engineering问题,如何给各大任务设计合理的Prompts将会是很有意思的科学问题」–刘知远

虽然博主以前也看到了基于 Prompt-tuning 可以让GPT-3处理各种类型的任务,甚至拥有直接处理零样本和小样本学习能力。也整理过GPT,OpenAI CLIP,DALL-E 这些文章。但但但,没想到这个领域冲的好快,新范式、综述和应用都层出不穷,并且看到小伙伴的应用实验效果奇佳。便想重新整理一些文章,再重新认识一下Prompt-tuning!

在这里插入图片描述
GPT-3(Language Models are Few shot Learners)
众所周知GPT-3的优势在于它超级大大大大 ,可以针对特定任务来进行微调,即核心理念为:将所有自然语言处理的任务转换为语言模型任务。

所有任务都可以被统一建模,任务描述与任务输入视为语言模型的历史上下文,而输出则为语言模型需要预测的未来信息。即转变问题为根据文本的走向来 " 搞清楚 " 它们应该做什么事情,通过给模型一些提示(prompt),来让它根据任务直接学习。这种方法也被称为情境学习(in-context learning)或提示(prompting)。

Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing
然后直接来看大佬关于Prompt的综述。NLP技术的发展可分为4个阶段/范式,如下图。

  • 全监督学习(非神经网络)。仅在目标任务的输入输出样本数据集上训练特定任务模型,其严重依赖特征工程。
  • 全监督学习(神经网络)。使得特征学习与模型训练相结合,于是研究重点转向了架构工程,即通过设计一个网络架构(如CNN,RNN,Transformer)能够学习数据特征。
  • Pre-train,Fine-tune。先在大数据集上预训练,再根据特定任务对模型进行微调,以适应于不同的下游任务。在这种范式下,研究重点转向了目标工程,设计在预训练和微调阶段使用的训练目标(损失函数)。
  • Pre-train,Prompt,Predict。无需要fine-tune,让预训练模型直接适应下游任务。方便省事,不需要每个任务每套参数,突破数据约束。

在这里插入图片描述
具体“Prompt”的做法是,将人为的规则给到预训练模型,使模型可以更好地理解人的指令的一项技术,以便更好地利用预训练模型。例如,在文本情感分类任务中,输入为"I love this movie.",希望输出的是"positive/negative"中的一个标签。那么可以设置一个Prompt,形如:“The movie is ___”,然后让模型用来表示情感状态的答案(label),如positive/negative,甚至更细粒度一些的“fantastic”、“boring”等,将空补全作为输出。

Fine-tune和Prompt的区别?
prompting 更加依赖先验,而 fine-tuning 更加依赖后验。

  • Fine-tuning中:是预训练语言模型“迁就“各种下游任务。具体体现就是通过引入各种辅助任务loss,将其添加到预训练模型中,然后继续pre-training,以便让其更加适配下游任务,这个过程中,预训练语言模型做出了更多的牺牲。
  • Prompting中,是各种下游任务“迁就“预训练语言模型。具体体现也是上面介绍的,我们需要对不同任务进行重构,使得它达到适配预训练语言模型的效果,这个过程中,是下游任务做出了更多的牺牲。

这种方法的优点是给定一组合适的 prompt,以完全无监督的方式训练的单个 LM 就能够用于解决大量任务。然而该方法也存在一个问题——这种方法引入了 prompt 挖掘工程的必要性,即需要找出最合适的 prompt 来让 LM 解决面临的任务,即怎么做Prompt Engineering。

Fine-tune和Prompt的性能?
Prompt当然参数量要小很多啦。如下图是对于T5的两者对比图。

  • Fine-tune需要为每个下游任务都存下整个预训练模型的副本,并且推理必须在单独的批次中执行。
  • Prompt只需要为每个任务存储一个特定于下游任务的小单元,并使用原始的预先训练过的模型启用混合任务推理即可。

Fine-tune模型的每个副本都需要110亿个参数。而Prompt每个任务只需要20480个参数——减少超过5个数量级。
在这里插入图片描述

Prompt Engineering
主要目标是设计Prompt。比如 Overall it was a [z] movie,[z]是需要模型进行填充的空位,[z]的位置和数量决定了Prompt的类型。回顾一下CLIP就是使用的“A photo of a [z]”的prompt。

  • cloze prompt([z]在句中)。适合使用掩码 (Mask) LM 解决的任务。
  • prefix prompt([z]在句末)。适合有关生成的任务或使用标准自回归 LM 解决的任务,因为它们与模型从左到右的性质刚好吻合。

对于一些涉及多个输入的任务例如文本对分类,prompt 模板则必须包含至少两个输入的空间。人工设计模版或者自动化搜索模版一般是常用的方式。

在这里插入图片描述
Answer Engineering
与 prompt 工程相反,answer 工程的目的是搜索一个 answer 空间 Z 和一个到原始输出 Y 的映射,从而得到更细粒度的预测模型。比如把纯“positive”或“negative”的标签转变成选择恰当的词汇填空如“fantastic”,使情感分类任务转变为语言模型构建任务。下图是一些可参考的模版,当然此后的一些新方法都是想通过自动构建模版,以进一步释放语言模型潜能。

在这里插入图片描述
paper:https://arxiv.org/abs/2107.13586

在这里插入图片描述
Multi-prompt learning
多个prompt往往能提高效果,常见的集成方式如上图:

  • Ensemble。多个prompt,每个prompt都按照单prompt的方法并行进行,然后再把最终的结果汇总,可以通过加权或者投票的方式汇总多个单prompt的方法的结果。
  • Augmentation。增强的方式其实就是找一个跟当前问题相似的case,然后将这个case跟当前输入x‘一起输入,这种模型就可以根据那个case对x‘做出更精准的预测了。
  • Composition。同时利用多个prompt构建prompt函数,每个prompt负责一个子任务,把多个prompt的内容融合到一起,同时进行多个子任务的预测。例如关系抽取任务,有的prompt负责实体识别,有的prompt负责判断实体间的关系。
  • Decomposition。对于有多个预测值的任务,将原始的任务拆分程多个子任务,引入多个prompt,分别处理子任务,彼此隔离。也就是把多个预测值的任务拆分程多个单prompt任务去分别处理。

为什么Prompt会更有效?
实际上,prompt 可以看做是对预训练语言模型中已经记忆的知识的一种检索方式,由于 prompt 任务形式就是预训练任务,所以相比于 fine-tuning,当使用 prompt 形式向模型中输入样本时,预测时得到了“提示”,因此所需使用到的信息量是更多的。因为要用到更多的信息量,所以样本的类别分布在 prompt 视角之下都是稀疏的,这应该也是 prompt 在 few-shot 上效果显著的原因。

在这里插入图片描述
Prefix-Tuning: Optimizing Continuous Prompts for Generation
之前的工作如Prompting主要是人工设计模版或者自动化搜索模版(如上一篇综述所展示了很多模版)来进行预训练的,但人工设计的未知性比较影响模型性能+自动化搜索成本较高,为什么不从离散tokens转向连续的“soft prompt”呢?

因此prefix-tuning 的主要贡献是提出任务特定的trainable前缀prefix,这样直接为不同任务保存不同的前缀即可。如上图的下方,只需要不同任务设置不同的Prefix即可,因此实现上只需要存储一个大型transformer模型和多个学习的任务特定的prefix参数。

基于prompting方法的直觉,作者认为具有适当的上下文可以在不改变参数的情况下来引导LM。因此作者给模型若干的字词作为提示,比如想让模型生成“Obama”,那可以在其常见的搭配前加上上下文(例如abama的名字Barack),那么LM就会把更高的可能性分配给想要的单词,就能自动生成一个模版。符号化表示可以有两种形式:

  • 对于自回归模型,加入前缀后的模型输入表示:z=[PREFIX;x;y]z=[PREFIX;x;y]z=[PREFIX;x;y]
  • 或者为编码器和编码器都添加prefix:z=[PREFIX;x;PREFIX′;y]z=[PREFIX;x;PREFIX';y]z=[PREFIX;x;PREFIX;y]

在这里插入图片描述
然后其他的不变,语言模型参数固定,只更新前缀参数。这种连续性的生成方法在后续的P-tuning中也持续被探索。

paper:https://arxiv.org/abs/2101.00190
code:https://github.com/XiangLi1999/PrefixTuning

GPT Understands, Too
P-tuning V1的动机和prefix-tuning是类似的,也是探索可学习的可微模版,主要贡献是首次提出了用连续空间搜索的 embedding 做 prompt。如这篇清华文章的题目“GPT Understands, Too”,代表着它的表现想颠覆一直以来“GPT只能做生成,不能做理解”的结论。

首先关于“什么是模版”,直观上模版就是由自然语言构成的前缀/后缀。比如人工定义的话会变成类似「The capital of Britain is [MASK]」这种形式,然后也可是「Britain’ capital is [MASK]」或者「[MASK] is the capital of Britain 」等等。通过这些模版才能使得下游任务跟预训练任务一致,这样才能更加充分地利用原始预训练模型。

而P-tuning的目标是:不关心模版长什么样, 只需要知道模版由哪些 token 组成,该插入到哪里,插入后能不能完成我们的下游任务,输出的候选空间是什么就可以了。即不关心模版的“自然语言”要求,它只是为了更好地实现“一致性”但不是必须的。因此P-tuning 的做法是用上下文 x (「Britain」)、目标 y(「[MASK]」) 和去组合成一个prompt模版 t (「The capital of … is …」)。如下图,
在这里插入图片描述
上下文指蓝色的“Britain”,目标是红色的“[MASK]”,橘色的区域是想生成的模版。左边的图a是离散化搜索的做法,不一定是最优的。右边的是P-tuning,它通过预训练的嵌入层将一组离散输入 token (即pseudo prompts)映射到embedding,然后结合(capital,Britain)生成得到结果,再优化生成的encoder部分。这种方法可以找到更好的连续 prompt,并通过下游损失函数对连续 prompt 进行优化。

离散 vs 连续
最早研究自动模版的工作,有些是挖掘实体关系,有些需要大量样本进行基于梯度搜索(如autoprompt),在离散空间下搜索的自然语言模版。也有梯度粗筛+代入模版精筛等等。而连续的Prefix-Tuning和P-tuning 放弃了“模版由自然语言构成”这一要求,从而将其变成了可以简单梯度下降求解的连续参数问题,效果还更好。可能prompt的关键在于它是怎么用的,不在于它由什么构成。

paper:https://arxiv.org/abs/2103.10385
code:https://github.com/THUDM/P-tuning

P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
P-tuning在一些复杂的自然语言理解NLU任务上效果很差(任务不通用)+预训练的参数量不能小(规模不通用)。因此V2版本主要是基于P-tuning和Prefix-tuning,引入Deep Prompt Encoding和Multi-task Learning等策略进行优化的。直接看模型图如下,左边是p-tuning的做法,右边是v2的改进。
在这里插入图片描述
对比起来主要的变动有:

  • Deep Prompt Encoding:采用 Prefix-tuning 的做法,在输入前面的每层加入可微调的参数。
  • 无重参数化编码器:对pseudo token,不再使用重参数化进行表征(如用于 prefix-tunning 的 MLP 和用于 P-tuning 的 LSTM),且不再替换pre-trained model word embedding,取而代之的是直接对pseudo token对应的深层模型的参数进行微调。
  • Multi-task learning:对于pseudo token的continous prompt,随机初始化比较难以优化,因此采用multi-task方法同时训练多个数据集,prefix continuous prompt共享。
  • 回到CLS:可以在[CLS]部分输出sentence-level class,以及每个token位置上输出token-level class,可以解决一些没有语义标签的问题。

paper:https://arxiv.org/abs/2110.07602
code:https://github.com/thudm/p-tuning-v2

在这里插入图片描述
OpenPrompt 工具包
Pipeline工具来了!先放link:

  • https://github.com/thunlp/OpenPrompt

PPT: Pre-trained Prompt Tuning for Few-shot Learning
虽然Prompt-tuning非常有效,其在较小预训练模型上、在Few-shot的场景下表现一般,且相比于Model-tuning,Prompt-tuning的收敛速度较慢,需要训练更多的步数。虽然可以通过初始化soft prompts解决,那既然如此,为什么不对prompts也进行预训练呢!

这篇文章提出PPT,对prompt的预训练方法是利用把所有的分类任务分成三类:单句分类任务、句对分类任务和多项选择分类任务。然后对每一类都设计了一个自监督预训练任务,然后用预训练任务的prompts去初始化下游任务的prompts。

  • https://arxiv.org/abs/2109.04332

SPoT: Better Frozen Model Adaptation through Soft Prompt Transfer
SPOT用一个或多个源任务训练的prompts来初始化目标任务的prompts。比较重要的是,实验结论中有如下几种方式组合比较好,

  • Best of top-k: 用top-k源任务的prompts逐个去初始化,然后选最好。
  • Top-k weighted average: 用top-k prompts的线性加权去初始化,权重是各个任务与目标任务的prompts的相似度。
  • Top-k multi-task mixture: 混合top-k源任务的数据进行训练,再用最后得到的prompt去初始化。

https://arxiv.org/abs/2110.07904

On Transferability of Prompt Tuning for Natural Language Understanding
补一篇衡量prompt相似度的文章,细节待补,先上结论:prompt的迁移性很重要,但并不是相似度越高就越好。
https://arxiv.org/abs/2111.06719


下一篇博文将继续整理Prompt在多模态预训练中的应用,

  • 多模态预训练中的Prompt(MANTIS,ActionCLIP,CPT,CoOp)
  • 多模态预训练中的Prompt(ALPRO,Frozen)

推荐阅读
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 本文将详细介绍如何在Webpack项目中安装和使用ECharts,包括全量引入和按需引入的方法,并提供一个柱状图的示例。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
author-avatar
江西理工大学-交通091班-李吉平
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有