【论文极速读】Prompt Tuning——一种高效的LLM模型下游任务适配方式

news2024/11/25 14:29:55
【论文极速读】Prompt Tuning——一种高效的LLM模型下游任务适配方式
FesianXu 20230928 at Baidu Search Team

前言

Prompt Tuning是一种PEFT方法(Parameter-Efficient FineTune),旨在以高效的方式对LLM模型进行下游任务适配,本文简要介绍Prompt Tuning方法,希望对读者有所帮助。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注明出处,谢谢。
∇ \nabla 联系方式:

e-mail: FesianXu@gmail.com

github: https://github.com/FesianXu

知乎专栏: 计算机视觉/计算机图形理论与应用(https://www.zhihu.com/column/c_1265262560611299328)

微信公众号:机器学习杂货铺3号店


众所周知,当前LLM是人工智能界的香饽饽,众多厂商和研究者都希望能够在LLM上进行应用推广和研究,这就难免需要对LLM进行下游任务的适配,最理想的情况当然是可以用私有数据,进行全网络端到端的微调。但是LLM现在参数量巨大,大部分都大于6B,有些甚至达到了100B以上,即便是端到端微调都需要大量的硬件资源。 PEFT(Parameter-Efficient FineTune)旨在最高效地引入参数,探索合适的训练方式,使得LLM适配下游任务的代价最小化,而本文提到的Prompt Tuning [1] 就是这样一个工作。

在介绍这个工作之前,我们得知道什么是prompt,关于prompt的内容之前在博文[2]中曾经介绍过,简单来说,就是用某种固定的模板或者范式,尝试去让LLM去适配下游任务,从在prompt中是否提供例子的角度上看,又可以分为one-shot prompt, few-shot prompt, zero-shot prompt等。但是,在文章[3]中提到过,不同的prompt模板对性能的影响巨大,如Fig 1.所示,我们也把这种prompt称之为硬提示词(hard-prompt)。既然有『硬』的,那么就肯定有『软』的prompt,soft-prompt指的是模型可以通过学习的方式去学习出prompt模板,经典工作包括P-Tuning [3], prefix prompt [4], soft prompt [5],以及本文将会介绍到的prompt tuning [1]。
different-prompt

Fig 1. 不同的prompt模板对性能影响巨大

如Fig 2.所示,在prompt tuning中,在原有hard prompt模板之前拼接了若干个可学习的token,我们用 P ∈ R p × d \mathbf{P} \in \mathbb{R}^{p \times d} PRp×d表示soft prompt部分,其中 p p p为拼接的token数量,用 X ∈ R n × d \mathbf{X} \in \mathbb{R}^{n \times d} XRn×d 表示hard prompt部分。那么,完整的prompt可表示为 [ P ; X ] ∈ R ( p + n ) × d [\mathbf{P};\mathbf{X}] \in \mathbb{R}^{(p+n) \times d} [P;X]R(p+n)×d,模型的目标既变为了 P ( Y ∣ [ P ; X ] ) P(\mathbf{Y}|[\mathbf{P};\mathbf{X}]) P(Y[P;X])。此时,LLM的参数和embedding层的参数都是设置为不可学习的 (❄),整个网络只有soft prompt层是可学习的(🔥),这意味着微调模型需要的内存和计算代价都大大减小了 1

prompt-tuning-frame

Fig 2. prompt tuning在原有hard-prompt模板之前,拼接了若干个可学习的token,并将其视为soft-prompt。

只需要设置不同的soft prompt就可以适配不同的下游任务了,如Fig 3. 所示,在模型参数量足够大( ≥ 10 B \ge 10B 10B)的时候,采用prompt tuning的效果足以比肩全参数微调,而且所需参数量只有后者的万分之一,是名副其实的参数高效(Parameter-Efficient)方法。而不管在什么尺度的模型下,prompt tuning的结果都要远远优于hard prompt design的结果,人工设计的prompt模板确实很难与模型自己学习出来的竞争。
performance-curve

Fig 3. (a)在10B以上的模型中,采用prompt tuning的结果可以和全模型端到端微调的结果持平,(b)而prompt tuning增加的参数量只有全模型端到端微调的万分之一。

此外,作者在论文中还进行了更多实验去验证prompt tuning的有效性和其他特性。第一个就是soft prompt所需要的长度,如Fig 4. (a)所示,在10B模型下,20-100个soft token是一个比较合适的数量,20个token能提供最大的性价比。如何初始化这些新增的soft token embedding也是一个指的思考的问题,作者尝试了随机均匀初始化,从词表的embedding中采样,以及对于分类任务而言,用label的类别embedding进行初始化,如Fig 4. (b) 所示,随机初始化在模型参数量不够的时候(< 10B)表现,不如从词表采样和label初始化的方法,但当模型参数量足够大时,随机初始化的效果能够达到最好,优于从词表中采样的方法。考虑到本文采用的LLM是T5,而T5是一个encoder-decoder的结构,在设计预训练任务的时候采用的是span corruption + 哨兵token的形式,如:

Origin: Thank you for inviting me to your party last week
Corrupted: Thank you for [X] me to your party [Y] week
Target: [X] inviting [Y] last [Z]

这样设计预训练任务能实现encoder-decoder架构的T5高效预训练,但是这意味着模型没有见过自然语言的输入(因为输入总是有哨兵token,比如[X]/[Y]等),为了实现T5到LM的适配,在本文中作者尝试对T5进行了LM Adaptation的后训练:继续T5的少量预训练,给定自然文本作为输入,尝试预测自然语言的输出,而不是带有哨兵token的文本。 此外,作者还尝试了所谓的Span Corruption + 哨兵的方法,指的是在原T5模型基础上,在应用到下游任务预测时候,都给拼接上哨兵token,以减少下游任务和预训练任务的gap。如Fig 4. (C)所示,无论采用多大尺度的模型,采用了LM Adaptation能带来持续的增益,而Span Corruption或者Span Corruption+Sentinel的方法,则只在10B模型的尺度上能有比较好的效果(然而仍然无法超越前者)。那么LM Adaptation需要进行多少step的训练合适呢?在Fig 4. (d)中,作者进行了若干尝试,结果表明越多step将会带来越多的收益,最终作者选定在100k step。
more-research-exp

Fig 4. 对prompt tuning不同设置的探索实验。

采用prompt tuning还有一个好处就是可以让多个下游任务复用同一个LLM模型。在模型微调中,对于每个下游任务都需要维护一套独立的模型,如Fig 5. 左图所示,而在prompt tuning中,则只需要维护一套静态的LLM模型,不同任务通过不同的soft prompt进行区分即可激发LLM的不同下游任务能力,如Fig 5. 右图所示,因为可以节省很多资源,这对于部署来说很友好。
multi-task-same-model

Fig 5. 采用prompt tuning的方式,可以很方便的用同一个模型覆盖多个下游任务,实现资源节省。

Reference

[1]. Lester, Brian, Rami Al-Rfou, and Noah Constant. “The power of scale for parameter-efficient prompt tuning.” arXiv preprint arXiv:2104.08691 (2021). aka Prompt Tuning.
[2]. https://blog.csdn.net/LoseInVain/article/details/130500648, 《增强型语言模型——走向通用智能的道路?!?》
[3]. Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, and Jie Tang. 2021. Gpt understands, too. arXiv:2103.10385. aka p-tuning
[4]. Li, Xiang Lisa, and Percy Liang. “Prefix-tuning: Optimizing continuous prompts for generation.” arXiv preprint arXiv:2101.00190 (2021). aka prefix tuning
[5]. Qin, Guanghui, and Jason Eisner. “Learning how to ask: Querying LMs with mixtures of soft prompts.” arXiv preprint arXiv:2104.06599 (2021). aka soft prompt
[6].


  1. 由于将LLM的参数设置成为了不可学习,因此在反向过程中很多参数并不需要在显存中维护。假设模型的参数量为X,那么常用的Adam优化器的两个动量就不需要维护了(减少2X),激活值通过重计算技术,已经缩减了绝大部分,并且梯度只需要传递到soft prompt部分,而不需要进行参数更新,因此梯度也可以不维护(减少X),因此所需显存减少了3X,并且减少了对参数更新的计算量。 ↩︎

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

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

相关文章

车联网时代,能链车联凭什么成为“关键先生”?

又到国庆长假&#xff0c;许多人开启远途旅行&#xff0c;高速路上一如既往的拥堵。在密密麻麻的汽车中&#xff0c;新能源汽车变得越来越多。 事实上&#xff0c;新能源汽车的热潮&#xff0c;已经成为不可抵挡的趋势。据中国乘联会的最新数据&#xff0c;今年中国新能源乘用…

USB TypeC接口说明

USB TypeC 拥有诸多优点:双面可插不担心正反、可做USB/雷电高速传输载体,支持 PD快充、音频设备、HDMI传输、调试模式等诸多功能。 市面上的其他USB接口和充电接口在逐步被TypeC替代,可以预见的是,TypeC作为一种多兼容性接口,其未来会具有非常长的生命周期。 本文主要介…

Eclipse环境基于HDFS的API进行开发

文章目录 IOUtils方式读取文件1.文件准备2.下载安装Eclipse3.打开eclipse&#xff0c;新建java项目&#xff0c;添加关于hadoop的一些包4.包内新建类进行开发5.利用打包的方式生成java jar包6.验证代码正确性 其它问题&#xff1a;Exception in thread “main“ java.lang.Unsu…

TouchGFX界面开发 | 添加触摸屏驱动

使用STM32CubeMX移植TouchGFX 一文中介绍了如何用TouchGFX点亮屏幕&#xff0c;但是此时屏幕还没有触摸的功能。下面将介绍如何添加触摸屏驱动到TouchGFX中 一、STM32CubeMX配置 在使用STM32CubeMX移植TouchGFX 文中的STM32CubeMX配置基础上&#xff0c;再激活一个定时器&…

Pikachu靶场——XXE 漏洞

文章目录 1. XXE1.1 查看系统文件内容1.2 查看PHP源代码1.3 查看开放端口1.4 探测内网主机 1. XXE 漏洞描述 XXE&#xff08;XML External Entity&#xff09;攻击是一种利用XML解析器漏洞的攻击。在这种攻击中&#xff0c;攻击者通过在XML文件中插入恶意实体来触发解析器加载…

自然语言处理(NLP)学习之与HanLP的初相识

目录 前言 一、自然语言处理基本知识 1、NLP类别 2、核心任务 二、Hanlp简要介绍 三、Hanlp云服务能力 1、全新云原生2.x 2、Python api调用 3、Go api调用 4、Java api调用 四、Hanlp native服务 1、本地开发 总结 前言 在ChatGPT的滚滚浪潮下&#xff0c;也伴随着人工智…

深入理解JavaScript中的事件冒泡与事件捕获

在JavaScript中&#xff0c;事件是交互式网页开发中的关键概念之一。了解事件冒泡和事件捕获是成为一名优秀的前端开发者所必需的技能之一。本文将深入探讨这两个概念&#xff0c;解释它们是如何工作的&#xff0c;以及如何在实际应用中使用它们来处理事件。 一.什么是事件冒泡…

No151.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

冲刺十五届蓝桥杯P0002 日期统计

文章目录 题目分析代码 题目 分析 需要明白一些概念&#xff0c;子序列、连续子序列。 1.子序列&#xff08;subsequence&#xff09;是指原始序列中按照相同顺序选择零个或多个元素而形成的序列。连续子序列&#xff08;subarray&#xff09;是指原始序列中相邻位置的元素构…

计算机网络之传输层

计算机网络 - 传输层 计算机网络 - 传输层 UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 可靠传输TCP 滑动窗口TCP 流量控制TCP 拥塞控制 1. 慢开始与拥塞避免2. 快重传与快恢复 网络层只把分组发送到目的主机&#xff0c;但是真正通信的并不是…

网络-OSI、TCP、浏览器URL、CDN

文章目录 前言一、OSI七层模型二、TCP/IP和UDPTCP三次握手四次挥手 三、 浏览器输入URLURLDNS查询TCP/IP连接浏览器缓存强缓存协商缓存断开连接 浏览器渲染 四、 CDN总结 前言 本文记录OSI七层参考模型&#xff0c;和TCP/IP基本介绍。 一、OSI七层模型 七层参考模型分别是&am…

【C++入门到精通】C++入门 —— set multiset (STL)

阅读导航 前言一、set简介二、std::set1. std::set简介2. std::set的使用- 基本使用- std::set的模板参数列表- std::set的构造函数- std::set的迭代器- std::set容量与元素访问函数 3. set的所有函数&#xff08;表&#xff09; 三、std::multiset1. std::multiset简介 四、st…

农产品经营小程序商城的作用是什么?

农场或拥有稳定货源的商家更适合做线上生鲜蔬果生意&#xff0c;近些年随着线上电商崛起&#xff0c;如何打通并且加深同城、到店、快递货品销售场景成为商家们需要思考的&#xff1b;微信是企业商家重要的营销平台&#xff0c;因此在微信卖货增长很重要&#xff0c;但想要完善…

【中国知名企业高管团队】系列22:滴滴

大家好&#xff01; 今天华研荟的走进中国知名企业高管团队系列带大家认识滴滴。 滴滴公司是出行领域的先行者&#xff0c;也是一个典型样本。通过滴滴公司的名字变迁我们可以感受到滴滴公司的业务发展&#xff0c;这也是整个出行行业公司的发展路径&#xff1a; 第一阶段&a…

神经辐射场(NeRF)2023最新论文及源代码合集

神经辐射场&#xff08;NeRF&#xff09;作为一种先进的计算机图形学技术&#xff0c;能够生成高质量的三维重建模型&#xff0c;在计算机图形学、计算机视觉、增强现实等领域都有着广泛的应用前景&#xff0c;因此&#xff0c;自2020年惊艳亮相后&#xff0c;神经辐射场也成为…

C理解(三):结构体,共用体,枚举

结构体 结构体元素访问本质是指针方式,依据元素在结构体中的偏移量和元素类型进行访问 元素占字节数和类型占字节数不同,导致结构体的元素偏移量要复杂,因此结构体需要对齐访问 结构体对齐规则 结构体本身应在在4字节对齐处&#xff08;占4个字节&#xff09; 每个元素都对其存…

二、MAVEN的安装和配置

二、MAVEN的安装和配置 1.官网下载&#xff1a;http://maven.apache.org/download.cgi 2.解压文件包 1.apache-maven-3.5.2-bin.zip 直接解压到指定安装路径。 2.apache-maven-3.5.2-src.zip maven源码包。 3.配置环境变量&#xff0c;类似jdk环境配置 1.创建M2_HOME环境变…

关于操作系统与内核科普

关于操作系统与内核科普 一.什么是操作系统 操作系统是管理计算机硬件与软件资源的计算机程序。它为计算机硬件和软件提供了一种中间层。 操作系统是一种软件&#xff0c;主要目的有三种&#xff1a; 一.管理计算机资源&#xff0c;这些资源包括CPU&#xff0c;内存&#xff0…

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。 这是刚启动Autodesk 2024产品就弹出的弹窗&#xff0c;重启之后启动还是有这个 一直阻止安装程序运行 出现问题的原因是安装包存在问题 使用正确的安装包即可解决这个问题 需要的朋友查看图片或者评伦取…

【剑指Offer】7.重建二叉树

题目 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出如下图所示。 提示: 1.vin.length pre.length 2.pre 和 vin 均无重复…