LLM低成本微调方法

LLM日益流行,已经渗透到各个领域,比如生物医学,但是模型的规模导致微调LLM对普通用户不够友好,因此,我们需要借助一些低成本方法,通过更新少量参数也达到与LLM全参数更新一样的效果。这里介绍三种主流方法:冻结,P-tuning,QLoRA。

冻结
Freeze是冻结的意思,Freeze方法指的是参数冻结,对原始模型的大部分参数进行冻结,仅训练少部分的参数,这样就可以大大减少显存的占用,从而完成对大模型的微调。这是一种比较简单微调方法,由于冻结的参数是大部分,微调的参数是少部分,因此在代码中只需要设置需要微调的层的参数即可,比如:

for name, param in model.named_parameters():if not any(pn in name for pn in ["layers.26", "layers.25", "layers.24", "layers.23"]):param.requires_grad = False

P-tuning
P-tuning分为P-tuning v1和P-tuning v2。首先了解prefix-tuning(prefix-tuning:Optimizing Continuous Prompts for Generation),指的是在微调模型的过程中只优化加入的一小段可学习的向量(virtual tokens,即Prefix),而不需要优化整个模型的参数(训练的时候只更新Prefix部分的参数,而LLM中的其他部分参数固定)。prefix-tuning可以理解为在输入信息中添加额外的prompt,这个prompt是通过学习获得的。

可以了解soft prompt和hard prompt:

  • hard prompt等同于discrete prompt,离散prompt是一个实际的文本字符串(自然语言,人工可读),通常由中文或英文词汇组成;
  • soft prompt等同于continuous prompt,连续prompt通常是在向量空间优化出来的提示,通过梯度搜索之类的方式进行优化。

在离散的prompts中,提示语的变化对模型最终的性能特别敏感,加一个词、少一个词或者变动位置都会造成比较大的变化。成本比较高,并且效果不太好,连续的prompts将具有更好的鲁棒性,显然Prefix Tuning属于Soft prompt。
fig1

  • Model Tuning对每个任务都进行全参数微调。Prompt tuning给每个任务都定义了自己的Prompt(可学习的向量),拼接到数据上作为输入,上图只在输入层加入prompt tokens。混合任务的训练可以提高prompt的鲁棒性。

在P-tuning v1中,使用virtual tokens替换hard prompt中的离散tokens,使用BiLSTM+MLP对virtual tokens编码得到连续prompts。P-Tuning v2在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,这带来两个方面的好处:1.更多可学习的参数可以提高表现,2.加入到更深层结构中的Prompt能给模型预测带来更直接的影响。

QLoRA
LoRA需要回顾 LLaMA-7B微调记录-Alpaca-LoRA,LoRA 的最大优势是速度更快,使用的内存更少:

  • 计算效率:由于LoRA只需要计算和优化低秩矩阵,因此它的计算效率比完全微调更高。
  • 通信效率:在多卡训练中,通信效率通常是一个瓶颈。由于LoRA只需要通信低秩矩阵的参数,因此它的通信效率比完全微调更高。通常,LoRA可以将硬件门槛降低3倍。

QLoRA的核心如下:

  • 4bit NormalFloat(NF4):对于正态分布权重而言,这是一种信息理论上最优的数据类型,该数据类型对正态分布数据产生比 4 bit整数和 4bit 浮点数更好的结果。
  • 双量化(Double Quantization):对第一次量化后的那些常量再进行一次量化,减少存储空间。
  • 分页优化器(Paged Optimizers):使用NVIDIA统一内存特性,该特性可以在GPU偶尔OOM的情况下,进行CPU和GPU之间自动分页到分页的传输,以实现无错误的 GPU 处理。该功能的工作方式类似于 CPU 内存和磁盘之间的常规内存分页。使用此功能为优化器状态(Optimizer)分配分页内存,然后在 GPU 内存不足时将其自动卸载到 CPU 内存,并在优化器更新步骤需要时将其加载回 GPU 内存。
  • 增加Adapter:4-bit的NormalFloat与Double Quantization,节省了很多空间,但带来了性能损失,因此通过插入更多adapter来弥补这种性能损失。在LoRA中,一般会选择在query和value的全连接层处插入adapter。而QLoRA则在所有全连接层处都插入了adapter,增加了训练参数,弥补精度带来的性能损失。

微调经验
对于模型大小的选择:

  • 一般情况下,参数越大效果越好,资源允许推荐选择30B以上模型;
  • 参数多量化低的模型要优于参数低量化高的模型,举例 :33B-fb4 模型要优于 13b-fb16 模型。

数据处理:

  • 在数据处理过程中,可能面临各种类型的数据,PDF,Word,HTML,code文件等等,对于这种不同类型的数据需要都处理成文本,同时还过滤掉一些干扰项或乱码的数据。
  • 对于空的文档或文档长度低于100进行过滤,进一步减少噪音。
  • LLaMA模型的词表大小是32K,其主要针对英语进行训练,对多语种支持不是特别理想,如果要考虑其他语种,还需要扩展词汇表,并进行预训练。

灾难性遗忘问题:

  • 如果采用LoRA训练出现遗忘时,可以将 lora_rank调大,如从8调到64 ( 原因是与原模型数据领域相差较大的话,需要更大的秩)。
  • 复习:跟人一样,在预训练或微调时,回看之前训练的数据。还可以专门把特征图存起来,量化以后放在一个类似于记忆库的地方,之后在新任务上训练的时候从这个记忆库里重构出记忆和新数据一起训练。
  • 尝试调小学习率,如chatglm学习率改到2e-4,但训练速度会慢很多。

来自:https://blog.csdn.net/dzysunshine/article/details/131590701

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

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

相关文章

改善神经网络——优化算法(mini-batch、动量梯度下降法、Adam优化算法)

改善神经网络——优化算法 梯度下降Mini-batch 梯度下降(Mini-batch Gradient Descent)指数加权平均包含动量的梯度下降RMSprop算法Adam算法 优化算法可以使神经网络运行的更快,机器学习的应用是一个高度依赖经验的过程,伴随着大量…

解锁Spring AOP的神秘面纱

目录 Spring AOP的组成组成部分与常用注解举例理解 Spring AOP的实现添加 Spring AOP 框架⽀持定义切⾯和切点定义通知切点表达式说明 Spring AOP 实现原理JDK动态代理CGLIB动态代理 Spring AOP作为Spring框架的核心模块,为我们提供了一种优雅的方式来处理横切关注点…

版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)

目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA,Git项目搭建 1、本地仓库搭建 1)创建一个新项目 2)打开终端,在当前目录新建一个Git代码库 3)忽略文件 …

3. 爬取自己CSDN博客列表(自动方式)(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录 步骤打开谷歌浏览器输入网址按F12进入调试界面点击网络,清除历史消息按F5刷新页面找到接口(community/home-api/v1/get-business-list)接口解读 撰写代码获取博客列表先明确返回信息格式json字段解读 Apipost测试接口编写python代码…

03_缓存双写一致性

03——缓存双写一致性 一、缓存双写一致性 如果redis中有数据,需要和数据库中的值相同如果redis中无数据,数据库中的值要是最新值,且准备回写redis 缓存按照操作来分,可以分为两种: 只读缓存 读写缓存 同步直写操作…

【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发,需要用到集列表,也就是SetList这个控件,然而网上相关的资料和范例实在是太少,有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG(NX)二次开发 BlockUI 集列表使用方法》&#xff0…

K8S deployment挂载

Deployment部署文件 apiVersion: apps/v1 kind: Deployment metadata:annotations:deployment.kubernetes.io/revision: "1"kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"apps/v1","kind":"Deployment&qu…

Redis从基础到进阶篇(一)

目录 一、了解NoSql 1.1 什么是Nosql 1.2 为什么要使用NoSql 1.3 NoSql数据库的优势 1.4 常见的NoSql产品 1.5 各产品的区别 二、Redis介绍 2.1什么是Redis 2.2 Redis优势 2.3 Redis应用场景 2.4 Redis下载 三、Linux下安装Redis 3.1 环境准备 3.2 Redis的…

JDK8知识点梳理

JDK8知识点梳理 一、lambda表达式1.标准格式2.实现原理3.省略模式4.前提条件 二、函数式接口1.函数式接口:FunctionalInterface2.接口默认方法3.接口静态方法4.供给型接口:Supplier5.消费型接口:Consumer6.消费供给型接口:Functio…

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析 文章目录 孤注一掷——基于文心Ernie-3.0大模型的影评情感分析写在前面一、数据直观可视化1.1 各评价所占人数1.2 词云可视化 二、数据处理2.1 清洗数据2.2 划分数据集2.3 加载数据2.4 展示数据 三、RNIE 3.0文心大模型3.1 …

stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)

说明:这个buzzer的额定电压需要改为3V,否则不会叫,源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…

linkis 1.1.1 报错 No plugin found spark-2.4.8, please check your configuration

按照官方教程设置,但是仍然报错 Caused by: java.util.concurrent.ExecutionException: LinkisException{errCode70063, descNo plugin found spark-2.4.8, please check your configuration, iphadoop0004, port9103, serviceKindlinkis-cg-engineplugin} 这个时候,我们首先检…

excel逻辑函数篇1

1、AND(logical1,[logical2],…):用于测试所有条件是否均为TRUE 检查所有参数均为true,如果是则返回true 2、OR(logical1,[logical2],…):用于测试是否有为TRUE的条件 如果任意参数值为true,即返回true;只有当所有参数…

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云 serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版,是全Serverless架构的云原生数据库 前言 体验了一下腾讯云刚出的TDSQL-C Serverless,使用…

【idea】社区版idea运行Tomcat

使用 Smart Tomcat插件 配置运行:

通过LD_PRELOAD绕过disable_functions

LD_PRELOAD LD_PRELOAD是Linux/Unix系统的一个环境变量,它可以影响程序的运行时的链接,它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖系统的函数…

【NOIP】标题统计

author:&Carlton tags:模拟,字符串 topic:【NOIP】标题统计 language:C website:P5015 [NOIP2018 普及组] 标题统计 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) date:2023年8月20日…

Rust语法:所有权引用生命周期

文章目录 所有权垃圾回收管理内存手动管理内存Rust的所有权所有权转移函数所有权传递 引用与借用可变与不可变引用 生命周期悬垂引用函数生命周期声明结构体的生命周期声明Rust生命周期的自行推断生命周期约束静态生命周期 所有权 垃圾回收管理内存 Python,Java这…

Cesium加载ArcGIS Server4490且orgin -400 400的切片服务

Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时,默认只支持wgs84的4326坐标系,不支持CGCS2000的4490坐标系。 如果是ArcGIS发布的4490坐标系的切片服务,如果原点在orgin X: -180.0Y: 90.0的情况下,我们可…

【最新可用】VMware中ubuntu与主机window之间使用共享文件夹传输大文件

一、VMware设置共享文件夹 (1)虚拟机关机情况下,创建一个共享文件夹 (2)ubuntu中挂载共享文件夹 1、如果之前已经挂载 hgfs,先取消挂载 sudo umount /mnt/hgfs2、重新使用以下命令挂载 sudo /usr/bin/vmh…