大语言模型LLM微调技术:P-Tuning

1 引言

Bert时代,我们常做预训练模型微调(Fine-tuning),即根据不同下游任务,引入各种辅助任务loss和垂直领域数据,将其添加到预训练模型中,以便让模型更加适配下游任务的方式。每个下游任务都存下整个预训练模型的副本,并且推理必须在单独的批次中执行。

那么能不能将所有自然语言处理的任务转换为语言模型任务?就是所有任务都可以被统一建模,任务描述与任务输入视为语言模型的历史上下文,而输出则为语言模型需要预测的未来信息。

因此,Prompt新范式被提出,无需要fine-tune,让预训练模型直接适应下游任务。Prompt方式更加依赖先验,而 fine-tuning 更加依赖后验。

2 P-tuning

P-tuning有两个版本:

  • 论文GPT Understands, Too[2]中的Prompt tuning,在本文行文过程中称为P-tuning v1

        GitHub 代码:https://github.com/THUDM/P-tuning

  • P-Tuning v2在论文《P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》中提出。

        GitHub代码:https://github.com/THUDM/P-tuning-v2

2.1 prefix-tuning

如果分析 P-tuning,那不得不提到prefix-tuning技术,相对于fine-tuning,在调节模型的过程中只优化一小段可学习的continuous task-specific vector(prefix)而不是整个模型的参数。

对于不同的任务和模型结构需要不同的prefix:

  • 在autoregressive LM 前添加prefix获得:

  • 在encoder和decoder之前添加prefixs获得:

    图片

 

2.2 P-tuning v1

主要结构是利用了一个prompt encoder(BiLSTM+MLP),将一些pseudo prompt先encode(离散token)再与input embedding进行拼接,同时利用LSTM进行 Reparamerization 加速训练,并引入少量自然语言提示的锚字符(Anchor,例如Britain)进一步提升效果。然后结合(capital,Britain)生成得到结果,再优化生成的encoder部分。

P-tuning v1有两个显著缺点:任务不通用和规模不通用

在一些复杂的自然语言理解NLU任务上效果很差,比如序列标注等;预训练模型的参数量不能小,仅在10B规模表现良好,而在稍小规模的模型(330M和2B)上表现不佳。

2.3 P-tuning v2

V2版本主要是基于P-tuning和prefix-tuning技术,引入Deep Prompt Encoding和Multi-task Learning等策略进行优化的。

  • 仅精调0.1%参数量,在330M到10B不同参数规模LM模型上,均取得和Fine-tuning相比肩的性能:

图片

  • 将Prompt tuning技术首次拓展至序列标注等复杂的NLU任务上,而P-tuning(v1)在此任务上无法运作:

图片

2.4 v1和v2框架对比:

图片

可以看到右侧的p-tuning v2中,将continuous prompt加在序列前端,并且每一层都加入可训练的prompts。在左图v1模型中,只将prompt插入input embedding中,会导致可训练的参数被句子的长度所限制。

v2变化

移除了Reparameterization,舍弃了词汇Mapping的Verbalizer的使用,重新利用CLS和字符标签,来增强通用性,这样可以适配到序列标注任务。此外,作者还引入了两项技术:

  • Deep Prompt Encoding

采用 Prefix-tuning 的做法,在输入前面的每层加入可微调的参数。使用无重参数化编码器对pseudo token,不再使用重参数化进行表征(如用于 prefix-tunning 的 MLP 和用于 P-tuning 的 LSTM),且不再替换pre-trained word embedding,取而代之的是直接对pseudo token对应的深层模型的参数进行微调。

  • Multi-task learning

基于多任务数据集的Prompt进行预训练,然后再适配到下游任务。对于pseudo token的continous prompt,随机初始化比较难以优化,因此采用multi-task方法同时训练多个数据集,共享continuous prompts去进行多任务预训练,可以让prompt有比较好的初始化。

3 大模型 p-tuning

ptuning v2论文已经证明在不同规模大小模型和不同NLP任务上的有效性,结合最近大模型涌现后的微调热,清华相关实验室对 ChatGLM-6B 模型做了基于 P-Tuning v2的微调。

需要微调的参数量减少到原来的 0.1%,结合模型量化和Gradient Checkpoint 等方法,最低只需要 7GB 显存即可运行了。

这里使用了两层MLP对Prefix做 Encode:

class PrefixEncoder(torch.nn.Module):
    """
    The torch.nn model to encode the prefix
    Input shape: (batch-size, prefix-length)
    Output shape: (batch-size, prefix-length, 2*layers*hidden)
    """
    
    def __init__(self, config):
        super().__init__()
        self.prefix_projection = config.prefix_projection
        if self.prefix_projection:
            # 这里!!
            self.embedding = torch.nn.Embedding(config.pre_seq_len, config.hidden_size)
            self.trans = torch.nn.Sequential(
                torch.nn.Linear(config.hidden_size, config.hidden_size),
                torch.nn.Tanh(),
                torch.nn.Linear(config.hidden_size, config.num_layers * config.hidden_size * 2)
            )
        else:
            self.embedding = torch.nn.Embedding(config.pre_seq_len, config.num_layers * config.hidden_size * 2)

    def forward(self, prefix: torch.Tensor):
        if self.prefix_projection:
            prefix_tokens = self.embedding(prefix)
            past_key_values = self.trans(prefix_tokens)
        else:
            past_key_values = self.embedding(prefix)
        return past_key_values

并在 ChatGLMModel class 中的 prompt 处调用:

并且传入到每一层中:

这时候,我们对照论文中的v2模型结构就更好理解了:

使用两层MLP对prompt做encode,添加到模型每一层,这部分的参数是可训练的,右侧蓝色部分是预训练模型的权重不做更新。

4 参考资料

[1]Prompt综述: https://dl.acm.org/doi/pdf/10.1145/3560815

[2]P-Tuning v1 论文: https://arxiv.org/pdf/2103.10385.pdf

[3]P-Tuning v2论文: https://arxiv.org/abs/2110.07602

[4]Prefix-Tuning: Optimizing Continuous Prompts for Generation: https://arxiv.org/abs/2101.00190

[5]PrefixTuning Code: https://github.com/XiangLi1999/PrefixTuning

[6]ChatGLM-6B: https://github.com/THUDM/ChatGLM-6B

[7]ChatGLM-6B PTuning: https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于华为ENSP模拟器-vlan划分网络

需求 不连外网的内网。需求隔离故障和隔离广播风暴,并要保证网络的连通。 解决方案使用三层交互机,设置vlan用于隔离网络,并在三层交互机为网关保证各个vlan之间的通讯。 实现 使用三层交互机,设置vlan用于隔离网络&#xff0…

广州怎么找工作哪里工作机会多

广州找工作上 吉鹿力招聘网 打开 吉鹿力招聘网 “注册账号”,然后输入个人基本信息,进行注册(可使用手机号注册,也可以使用邮箱注册)。 填写求职意向,基本信息点击“下一步”。 填写工作经历点击“下一步”…

【感知机】感知机(perceptron)学习算法的原始形式

感知机( perceptron )是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取1 和-1二值。感知机对应输入空间(特征空间)中将实例划分为正负两类的分离超平面,是一种判别模型。感知机是神经网络与支持向量机的基础…

湖南大学-算法设计与分析-2023期末考试【原题】

前言 21:00刚刚结束的考试,凭着回忆把题目重现出来了,在复习的时候根本找不到往年的试卷,希望这张回忆的试卷能帮助到下一届的同学。知道题目基本上就能做出来了,但是不知道是真的做不出来,我就不给答案了…

交换机02_共享式交换式

1、共享式网络 早期的以太网是共享式网络,它是由集线器(HUB)相连,由一个HUB相连了两台主机,形成一个冲突域也称广播域。 (1)相关名词解释 集线器 HUB中心的意思,集线器就是对接收…

域传送漏洞

DNS解析 当用户访问域名时浏览器解析首先会查看浏览器缓存是否有对应的ip,如果没有则会到本地host文件中查看是否有对应的ip,如果没用则会将域名发送给本地区的DNS服务器. DNS服务器分为递归服务器,根服务器,权威服务器 首先是递…

【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Docker-compose使用全解 一)

Docker-compose使用全解 Compose介绍Compose的作用和职能 Compose和Docker兼容性安装docker-compose添加可执行权限 Docker Compose常用配置imagebuildcontext上下文指定镜像名args构建环境变量 commanddepends_onports特殊映射关系 volumesenvironment Docker Compose命令详解…

牧云主机管理助手 —— 一款免费且便捷的服务器运维工具

牧云主机管理助手 —— 一款免费且便捷的服务器运维工具 在日常运维工作中,服务器管理是一项至关重要的任务。对于许多企业和个人而言,这往往意味着需要投入大量的时间和精力。然而在一些运维工具的帮助下,服务器运维工作也可以变得高效快捷…

pytest conftest定义一个fixtrue获取测试环境地址

方便全局切换地址 pytest.fixture() def config():data {测试环境: {A环境: 127.0.0.1,B环境: 127.0.0.2,C环境: 127.0.0.3,D环境: 127.0.0.4},}return data.get(测试环境, {}).get(A环境)import pytestdef test_case001(config):url http://str(config):8080/api/user/logi…

RocketMQ5.0消息过滤

前言 消费者订阅了某个主题后,RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息,可通过设置过滤条件在 Broker 端进行过滤,只获取到需要关注的消息子集,避免接收到大量无效的消息。 以电商交易场景为例…

Vue3 结合typescript 组合式函数(2)

安装axios:npm install axios 1、hooks文件夹下新建useURLLoader 在APP.VUE中使用useURLLoader 使用Dog API 2、使用对象中的属性,必须使用toRefs,否则Reactive响应失效 3、使用泛型 结果:

爬虫如何获取免费代理IP(二)

89ip代理爬取代码实现 一、代码实现 import requests import time import random from fake_useragent import UserAgent from lxml import etree import os import csv""" 89ip代理爬取 """class IPSipder(object):def __init__(self):self.u…

【损失函数】Quantile Loss 分位数损失

1、介绍 Quantile Loss(分位数损失)是用于回归问题的一种损失函数,它允许我们对不同分位数的预测误差赋予不同的权重。这对于处理不同置信水平的预测非常有用,例如在风险管理等领域。 当我们需要对区间预测而不单是点预测时 分位…

ArkTS语言应用开发入门指南与简单案例解析

文章目录 前言创建项目及其介绍简单案例学习本文总结问答回顾-学习前言 在前几节课中,我们已经了解了ArkTS语言的特点以及其基本语法。现在,我们将正式利用ArkTS来进行应用开发。本节课将通过一个快速入门案例,让大家熟悉开发工具的用法,并介绍UI的基础概念。 创建项目及…

5分钟理解什么是多模态

大家好,我是董董灿。 大模型越来越多了,大模型下沉的行业也越来越多。前几周一个在电厂工作的老哥发消息问我:大模型中所谓的多模态是什么意思? 我当时大概跟他解释了一下。 其实在人工智能领域,我们经常会听到&quo…

力扣hot100 对称二叉树 递归 队列

👨‍🏫 题目地址 👨‍🏫 参考思路 递归的难点在于:找到可以递归的点 为什么很多人觉得递归一看就会,一写就废。 或者说是自己写无法写出来,关键就是你对递归理解的深不深。 对于此题&#xf…

Java后端开发——Spring实验

文章目录 Java后端开发——Spring实验一、Spring入门1.创建项目,Spring依赖包。2.创建JavaBean:HelloSpring3.编写applicationContext.xml配置文件4.测试:启动Spring,获取Hello示例。 二、Spring基于XML装配实验1.创建JavaBean类&…

requests库中Session对象超时解决过程

引言 在使用Python进行网络请求时,requests库是一个非常常用的工具。它提供了Session对象来管理和持久化参数,例如cookies、headers等。但是,对于一些需要长时间运行的请求,我们需要设置超时时间来避免长时间等待或者无限期阻塞的…

互联网加竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 Yolov安全帽佩戴检测 危险区域进入检测 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖&am…

Java学习——设计模式——结构型模式2

结构型模式 结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能。 包括: 1…