LLM微调 | Prefix-Tuning, Prompt-Tuning, P-tuning, P-tuning-v2

news2024/9/23 7:25:32

🔥 下面我只是分析讲解下这些方法的原理以及具体代码是怎么实现的,不对效果进行评价,毕竟不同任务不同数据集效果差别还是挺大的。

文章目录

  • 0、hard prompt & soft prompt区别
  • 1、Prefix-Tuning
  • 2、Prompt-Tuning
  • 3、P-tuning
  • 4、P-tuning-v2
  • 5、来看看adapter,lora,prefix-tuing&p-tuning-v2的结构上的区别:

0、hard prompt & soft prompt区别

  • hard prompt (离散):即人类写的自然语言式的prompt。
  • soft prompt (连续):可训练的权重,可以理解为伪prompt。【毕竟nn是连续的模型,在连续空间中优化离散的prompt, 难以优化到最佳效果。额也就是说所谓的hard prompt对于人类来说好理解,但模型不一定好理解,所以不妨丢给模型去学习处更好理解的prompt】

1、Prefix-Tuning

训练参数:prefix相关参数
在这里插入图片描述

  • 在生成任务中被提出。如上图所示,在每一层transformer层加入了prefix ,它是连续的可学习权重向量(即soft prompt),训练时冻结transformer,只训练prefix。
  • 所以,训练的参数是非常小的,不同类型的任务学习一个特定任务的prefix。

在这里插入图片描述
如上图所示:

  • 对于Decoder-only的GPT,prefix只加在句首。
  • 对于Encoder-Decoder的BART,不同的prefix同时加在编码器和解码器的开头。

Prefix 具体添加到模型的哪部分?
🔥 重点来了,虽然上面都是形式化的说,把prefix token加在句首,但实际实现时并不是这样的
✨ 我的理解:实际实现时,是将prefix权重向量和K, V矩阵拼接(类似past-key-value机制,但这里目的不是为了加快解码速度,因为p-tuning-v2是prefix-tuning的优化版,可以看看这里对p-tuning-v2的实际代码实现的理解【P-tuning-v2代码理解】)。通过self-attention将prefix的隐式含义编码在输出的特征中(即query维度里)。
在这里插入图片描述

2、Prompt-Tuning

训练参数:prompt相关参数
属于 prefix-tuning 的简化版。

在这里插入图片描述

它给每个任务定义了自己的Prompt,然后拼接到数据上作为输入,但只在输入层加入prompt tokens(可以是词表里没有使用的unused token,只对这些token的embedding更新),并且不需要加入 MLP 进行调整来解决难训练的问题。伪代码如下:

def soft_prompted_model(input_ids):
	x = Embed(input_ids)
	x = concat([soft_prompt, x], dim=seq)
	return model(x)

另外地,Prompt Tuning 还提出了 Prompt Ensembling(不是指上面那个图),也就是在一个批次(Batch)里同时训练同一个任务的不同 prompt(即采用多种不同方式询问同一个问题),这样相当于训练了不同模型,比模型集成的成本小多了。

3、P-tuning

训练参数:模型本身的参数+soft prompt相关参数
可简单理解为p-tuning是prompt-tuning的改进。
对于离散的hard prompt,改变其中的某几个词,结果差异非常大。而连续的soft prompt则可在连续空间中构造和优化。 范式:soft+hard prompt。【如右图图中橙色Pi token即为soft(即pseudo token,可以是词表中的 [unused*] token)而capital为hard。】`
在这里插入图片描述

具体地:

  • 使用Bi-LSTM对模板中的pseudo token序列进行特征抽取。
  • 加上一些anchor token即hard可优化效果。

前向流程:

  • 1、初始化一个模板:The capital of [X] is [mask]
  • 2、替换输入:[X]处替换为输入“Britain”,即预测Britain的首都
  • 3、挑选模板中的一个或多个token作为soft prompt
  • 4、将所有的soft prompt 送入LSTM,获得每个soft prompt的隐状态向量h
  • 5、将模板送入Bert的embedding layer,所有soft token embedding (用h代替)和其他非soft token经过bert嵌入层的embedding拼接传入后面的bert-encder ,然后预测mask。

补充知识:

  • 苏剑林认为,LSTM是为了帮助模版的几个token(某种程度上)更贴近自然语言,但这并不一定要用LSTM生成,而且就算用LSTM生成也不一定达到这一点。更自然的方法是在训练下游任务的时候,不仅仅预测下游任务的目标token(如例子中的“新闻”),还应该同时做其他token的预测。
  • 具体来说,如果是MLM模型,那么也随机mask掉其他的一些token来预测;如果是LM模型,则预测完整的序列,而不单单是目标词。因为模型都是经过自然语言预训练的,增加训练目标后重构的序列也会更贴近自然语言的效果。苏神测试发现,效果确实有所提升。

4、P-tuning-v2

训练参数:prompt相关参数
属于 p-tuing的deep版,可以说就是Prefix Tuning,但做了些优化。
在这里插入图片描述
动机:

  • 缺乏规模通用性:Fail to work well on small models
  • 缺乏任务普遍性:Fail to work well on hard NLU tasks

方法:

  • 具体实现就类似prefix-tuning了,也是通过注入新的kv矩阵拼接到原kv矩阵中来代替说将prompt token拼接到句子的头部,类似past-key-value机制,但这里目的不是为了加快解码速度【P-tuning-v2代码理解】。
  • 缺少深度提示优化。 prompt-tuning和p-tuning仅在transformer的 第一层加入soft prompt,p-tuning v2 提出 Deep Prompt Tuning的方法,在transformer 的每一层之前都加入了soft prompt。
  • 这样一来,更多可学习的参数,深层结构中的Prompt能给模型预测带来更直接的影响。

对prefix-tuning的优化:

  • 移除重参数化的编码器: 以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning中的MLP、P-Tuning中的LSTM))。在 P-tuning v2 中,作者发现重参数化的改进很小,尤其是对于较小的模型;同时对于某些NLU任务,使用MLP会降低性能

  • 不同任务采用不同的提示长度: 提示长度在P-Tuning v2中起着关键作用,不同的NLU任务会在不同的提示长度下达到其最佳性能。通常,简单的分类任务(情感分析等)偏好较短的提示(小于20个令牌);困难的序列标注任务(阅读理解等)则偏好较长的提示(大约100个令牌)

  • 引入多任务学习: 先在多任务的Prompt上进行预训练,然后再适配下游任务。多任务可以提供更好的初始化来进一步提升性能

  • 回归传统的分类标签范式: P-Tuning v2回归传统的CLS标签分类范式,采用随机初始化的分类头(Classification Head)应用于tokens之上,以增强通用性,可以适配到序列标注任务。

5、来看看adapter,lora,prefix-tuing&p-tuning-v2的结构上的区别:

  • adapter是对每个transformer block增加了额外的权重。
  • lora是对每一层的qv权重矩阵Wq, Wv增加了lora权重(图中是qk,不妨碍理解,lora论文实验测试出的最佳组合是qv)。推理时可以直接加到原权重上,就没有额外权重了。
  • prefix-tuning&p-tuning-v2则是对每一层K, V矩阵操作,也是通过注入新的kv矩阵拼接到原kv矩阵中来代替说将prompt token拼接到句子的头部,类似past-key-value机制,但这里目的不是为了加快解码速度【P-tuning-v2代码理解】。
    在这里插入图片描述

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

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

相关文章

【C++】stack | queue | priority_queue的模拟实现

stack&queue的模拟实现 stack 与 queue 作为容器适配器&#xff0c;都默认选择了 deque 作为其底层容器。 #pragma once #include <deque> using namespace std;namespace zs {template<class T, class Container deque<T>>class stack{public:void p…

【Java基础教程】(四十四)IO篇 · 上:File类、字节流与字符流,分析字节输出流、字节输入流、字符输出流和字符输入流的区别~

Java基础教程之IO操作 上 &#x1f539;本节学习目标1️⃣ 文件操作类&#xff1a;File2️⃣ 字节流与字符流2.1 字节输出流&#xff1a;OutputStream2.2 字节输入流&#xff1a;InputStream2.3 字符输出流&#xff1a;Writer2.4 字符输入流&#xff1a;Reader2.5 字节流与字符…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(15)-Fiddler弱网测试,知否知否,应是必知必会

1.简介 现在这个时代已经属于流量时代&#xff0c;用户对于App或者小程序之类的操作界面的数据和交互的要求也越来越高。对于测试人员弱网测试也是需要考验自己专业技术能力的一种技能。一个合格的测试人员&#xff0c;需要额外关注的场景就远不止断网、网络故障等情况了。还要…

grid map学习笔记2之grid map的一些常规定义和功能包说明

文章目录 0 引言1 常规定义1.1 单层grid map1.2 多层grid map1.3 迭代器类别1.4 移动grid map的位置 2 功能包2.1 grid_map_rviz_plugin2.2 grid_map_sdf2.3 grid_map_visualization2.3.1 订阅的主题2.3.2 发布的主题 2.4 grid_map_filters 0 引言 grid map学习笔记1已成功在U…

数据结构:复习笔记

目录 前言1. 数据结构绪论1.1 数据结构的概念及分类1.1.1 知识点提要1.1.2 选择判断与简答归纳1.1.3 算法编程题 1.2 算法设计与算法分析1.2.1 知识点提要1.2.2 选择判断与简答归纳1.2.3 算法编程题 2. 线性表2.1 线性表的概念2.1.1 知识点提要2.1.2 选择判断与简答归纳2.1.3 算…

【yolov8+人/车流量统计】yolov8案例的追踪case,业务化可以变成计数

文章目录 前言修改点PreprocessInference 另一种方法&#xff0c;work了。一个难点&#xff0c;它走到了这里 业务化修改总结 前言 之前写个yolov8的一个试用版&#xff0c;【深度学习】Yolov8追踪从0到1, 这要是做计数啥的,简单的一批&#xff0c;一套工程化的代码&#xff0…

abp vnext指定版本下载

在本地环境没有达到最新的开发环境时可能无法下载abp vnext的最新版本&#xff0c;我们应该指定下载符合本地开发环境的abp版本&#xff0c;下面一起看一下&#xff1a; 首先查看本地电脑的开发环境版本&#xff1a; cmd dotnet --version dotnet --list-version ABP VNext和…

师从美国四院院士|遗传学老师赴哥伦比亚大学访问交流

H老师为省公派访学&#xff0c;目标为美国知名高校&#xff0c;最终我们获得了哥伦比亚大学的邀请函&#xff0c;导师是美国科学院院士、美国艺术与科学院院士、美国微生物学院院士、美国科学促进会会士等四个学会的院士&#xff0c;堪称学术界的超级大牛。 H老师背景&#xff…

Spark性能调优指南来了!

1、什么是Spark Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Spark Core&#xff1a;实现了Spark的基本功能&#xff0c;包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed Dat…

【Ansible 的脚本 --- playbook 剧本】

目录 一、playbook 剧本介绍二、示例1、运行playbook2、定义、引用变量 三、使用playbook部署lnmp集群 一、playbook 剧本介绍 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在…

从多个基础CMS中学习代码审计

代码审计 概念 什么是代码审计&#xff1f; 代码审计是在一个编程中对源代码旨在发现错误、安全漏洞或违反编程约定的项目。 说人话就是找它这些代码中可能存在问题的地方&#xff0c;然后看它是否真的存在漏洞。(博主小白&#xff0c;可能存在问题&#xff0c;请见谅) 分类…

ScrumMaster认证培训(CSM)记录篇-Leangoo领歌

前不久参加了Leangoo领歌CSM认证公开班&#xff0c;简单记录下我的学习之旅 当初选课程时也很是纠结&#xff0c;最终选择了Leangoo领歌&#xff0c;Leangoo领歌是Scrum中文网旗下的一款敏捷研发管理工具。 Leangoo领歌由Scrum中文网资深的敏捷顾问团队和敏捷研发团队经过近十…

Python scipy Moudle 中的 optimize 方法

Python scipy Moudle 中的 optimize 方法 scipy Moudle 中的 optimize 方法 minimize 最小化一个函数 它提供了多种算法&#xff0c;如 BFGS、Nelder-Mead、Powell 可选参数 fun&#xff1a;要最小化的目标函数x0&#xff1a;函数的初始猜测值。可以是一个数组或列表metho…

Python入门一

目录&#xff1a; python基本操作python基本数据类型python字符串基本操作python的运算符python控制流-判断python控制流-循环python常用数据结构-列表python常用数据结构-元组python常用数据结构-集合python常用数据结构-字典python函数python函数进阶与参数处理pythonlambda…

【7.31】C++编写7254是一个不寻常的数,可以表示为7254 = 39 x 186,这个式子中1~9每个数字正好出现一次

题目题干 7254是一个不寻常的数&#xff0c;因为它可以表示为7254 39 x 186&#xff0c;这个式子中1~9每个数字正好出现一次&#xff0c;输出所有这样的不同的式子&#xff08;乘数交换被认为是相同的式子&#xff09;。结果小的先输出&#xff1b;结果相同的&#xff0c;较小…

IPsec VPN小实验

IPSec 是什么&#xff1a; IPSec是一个框架&#xff0c;它不是具体指某个协议&#xff0c;而是定义了一个框架&#xff0c;由各种协议组和协商而成。该框架涉及到的主要有加密算法、验证算法、封装协议、封装模式、密钥有效期等等。 IPSecVPN建立的前提&#xff1a;要想在两个…

【性能测试】性能测试的概念、策略、指标

一、性能测试的概念 1.1 什么是性能 - 时间&#xff1a;系统处理用户请求的响应时间 -资源&#xff1a;系统运行过程中&#xff0c;系统资源的消耗情况 1.2 什么是性能测试 使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程 …

适配器模式与装饰器模式对比分析:优雅解决软件设计中的复杂性

适配器模式与装饰器模式对比分析&#xff1a;优雅解决软件设计中的复杂性 在软件设计中&#xff0c;我们常常面临着需要将不同接口或类协调工作的情况&#xff0c;同时还要满足灵活性和可扩展性的需求。为了应对这些挑战&#xff0c;适配器模式和装饰器模式应运而生&#xff0c…

12-4_Qt 5.9 C++开发指南_创建和使用共享库

文章目录 1. 创建共享库2. 使用共享库2.1 共享库的调用方式2.2 隐式链接调用共享库2.3 显式链接调用共享库 1. 创建共享库 除了静态库&#xff0c;Qt 还可以创建共享库&#xff0c;也就是 Windows 平台上的动态链接库。动态链接库项目编译后生成 DLL 文件&#xff0c;DLL 文件…

【机器学习】Overfitting and Regularization

Overfitting and Regularization 1. 过拟合添加正则化2. 具有正则化的损失函数2.1 正则化线性回归的损失函数2.2 正则化逻辑回归的损失函数 3. 具有正则化的梯度下降3.1 使用正则化计算梯度&#xff08;线性回归 / 逻辑回归&#xff09;3.2 正则化线性回归的梯度函数3.3 正则化…