当前位置: 首页 > news >正文

大模型高效微调技术全面解析:从PEFT原理到实战应用

目录

1. 大语言模型与微调概述

1.1 大语言模型(LLM)简介

1.2 微调的必要性与挑战

2. 参数高效微调(PEFT)技术原理

2.1 PEFT概述

2.2 主要PEFT方法

2.2.1 适配器(Adapters)

2.2.2 LoRA(低秩自适应)

2.2.3 QLoRA(量化LoRA)

2.2.4 IA3(通过抑制和放大内部激活注入适配器)

2.2.5 P-Tuning与Prefix Tuning

2.2.6 Prompt Tuning

3. PEFT实战应用

3.1 环境准备

3.2 数据处理

3.3 模型配置与训练

3.4 模型保存与加载

3.5 模型合并与推理

4. 模型优化技术

4.1 量化技术

4.1.1 量化类型

4.1.2 量化技术比较

4.1.3 量化示例

4.2 知识蒸馏

4.3 模型剪枝

5. 微调策略选择指南

5.1 不同PEFT方法比较

5.2 如何选择微调方法

6. 常见问题与解决方案

6.1 微调中的常见问题

6.2 性能优化技巧

7. 未来发展方向

7.1 PEFT技术的演进

7.2 硬件适配优化

7.3 理论深入研究

8. 结论


1. 大语言模型与微调概述

1.1 大语言模型(LLM)简介

大语言模型(LLM)是非常庞大的深度学习模型,它们在大量数据上进行预训练。其底层的Transformer是一组神经网络,由具有自注意力能力的编码器和解码器组成。编码器和解码器从文本序列中提取含义,并理解其中单词和短语之间的关系。

Transformer神经网络架构允许使用非常大的模型,这些模型通常包含数千亿个参数。如此大规模的模型可以摄取大量数据,这些数据通常来自互联网,也可以来自如包含超过500亿个网页的Common Crawl,以及约有5700万页面的维基百科等来源。

1.2 微调的必要性与挑战

微调是指采用预训练的语言模型,并使用特定数据针对不同但相关的任务进行训练的过程。这个过程也被称为迁移学习。微调有助于我们通过调整预训练的大语言模型(LLM)的权重,使其更好地适应特定任务或领域,从而充分发挥这些模型的潜力。

然而,随着模型越来越大,例如拥有1760亿参数的BLOOM模型,在不花费数万美元的情况下对其进行微调几乎是不可能的。但有时为了获得更好的性能,使用这样的大型模型又几乎是必要的。这就促使了参数高效微调(PEFT)技术的出现。

2. 参数高效微调(PEFT)技术原理

2.1 PEFT概述

参数高效微调(PEFT,Parameter Efficient Fine-Tuning)是一种用于微调大型语言模型 (LLM) 的方法,与传统方法相比,它有效地降低了计算和内存需求。PEFT仅对模型参数的一小部分进行微调,同时冻结大部分预训练网络。这种策略减轻了大语言模型灾难性的遗忘,并显著降低了计算和存储成本。

PEFT方法在确定模型的哪些组件是可训练的方法上有所不同。有的会优先训练原始模型参数的选定部分。有的人则在不修改原始结构的情况下集成和训练较小的附加组件,例如适配器层。

2.2 主要PEFT方法

2.2.1 适配器(Adapters)

适配器是最早发布的参数高效微调技术之一。相关论文《Parameter-Efficient Transfer Learning for NLP》表明,我们可以在现有的Transformer架构上添加更多层,并且只对这些层进行微调,而不是对整个模型进行微调。

在Transformer架构中,适配器层添加在注意力堆栈和前馈堆栈之后。适配器层采用瓶颈架构,它将输入缩小到较小维度的表示,然后通过非线性激活函数,再将其放大到输入的维度。这确保了Transformer堆栈中的下一层能够接收适配器层生成的输出。

2.2.2 LoRA(低秩自适应)

LoRA(Low-Rank Adaptation)是一种与适配器层类似的策略,但它旨在进一步减少可训练参数的数量。它采用了更严谨的数学方法。

LoRA通过修改神经网络中可更新参数的训练和更新方式来工作。从数学角度解释,我们知道预训练神经网络的权重矩阵是满秩的,这意味着每个权重都是唯一的,不能通过组合其他权重得到。研究表明,当预训练语言模型针对新任务进行调整时,权重具有较低的"内在维度"。这意味着权重可以用更小的矩阵表示,即它具有较低的秩。

LoRA将权重更新矩阵分解为两个较小的矩阵(称为更新矩阵),从而加速大型模型的微调,并减少内存消耗。原始的权重矩阵保持冻结,不再接收任何进一步的调整。为了产生最终结果,同时使用原始和适应后的权重进行合并。

from transformers import AutoModelForCausalLM
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType# 加载基础模型
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto", trust_remote_code=True)# 配置LoRA参数
peft_config = LoraConfig(
task_type=TaskType.CAUSAL_LM, # 任务类型为因果语言模型
inference_mode=False, # 非推理模式
r=8, # 低秩矩阵的维度
lora_alpha=32, # 低秩矩阵的缩放因子
lora_dropout=0.1, # LoRA层的dropout概率
target_modules=['query_key_value'] # 目标模块
)# 获取PEFT模型
model = get_peft_model(model, peft_config)
model.print_trainable_parameters() # 打印可训练参数数量
2.2.3 QLoRA(量化LoRA)

QLoRA是一种适用于大型语言模型(LLM)的高效微调方法,可显著减少内存使用,同时保持完整的16位微调性能。它通过将冻结的4位量化预训练语言模型的梯度反向传播到低秩适配器中来实现这一点。

QLoRA通过引入3个新概念来帮助减少内存使用:

  1. 4位Normal Float(NF4):一种新的数据类型,是保持16位性能水平的关键因素
  2. 双重量化:对4位NF量化过程中使用的量化常数进行量化的独特做法
  3. 分页优化器:管理内存使用的优化器
import torch
from peft import prepare_model_for_kbit_training, LoraConfig, get_peft_model
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfigmodel_id = "EleutherAI/gpt-neox-20b"# 配置4位量化参数
bnb_config = BitsAndBytesConfig(
load_in_4bit=True, # 加载4位量化模型
bnb_4bit_use_double_quant=True, # 使用双重量化
bnb_4bit_quant_type="nf4", # 使用NF4量化类型
bnb_4bit_compute_dtype=torch.bfloat16 # 计算时使用bfloat16
)# 加载量化模型
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map={"":0})
model.gradient_checkpointing_enable() # 启用梯度检查点以节省内存
model = prepare_model_for_kbit_training(model) # 准备模型进行k位训练# 配置LoRA参数
config = LoraConfig(
r=8, # 低秩矩阵的维度
lora_alpha=32, # 缩放因子
target_modules=["query_key_value"], # 目标模块
lora_dropout=0.05, # dropout概率
bias="none", # 不使用偏置
task_type="CAUSAL_LM" # 任务类型
)model = get_peft_model(model, config) # 获取PEFT模型
2.2.4 IA3(通过抑制和放大内部激活注入适配器)

IA3是一种基于适配器的技术,与LoRA有些相似。作者的目标是在避免上下文学习(ICL,in context learning或Few-Shot prompting)相关问题的同时,复制其优势。

IA3通过引入针对模型激活的缩放向量来工作。总共引入了3个向量,lv、ik和lff。这些向量分别针对注意力层中的值、键以及密集层中的非线性层。这些向量与模型中的默认值进行逐元素相乘。一旦注入,这些参数在训练过程中就会被学习,而模型的其余部分保持冻结。

from peft import IA3Config, TaskType# 配置IA3参数
peft_config = IA3Config(
task_type=TaskType.SEQ_CLS, # 序列分类任务
target_modules=["k_proj", "v_proj", "down_proj"], # 目标模块
feedforward_modules=["down_proj"] # 前馈模块
)
2.2.5 P-Tuning与Prefix Tuning

P-Tuning方法旨在优化传递给模型的提示的表示。P-Tuning通过为提示创建一个小型编码器网络来工作,该网络为传入的提示创建一个软提示。提示模板中使用的令牌是可训练和可学习的参数,这些被称为伪令牌。我们还添加了一个提示编码器,它帮助我们针对手头的特定任务更新伪令牌。

Prefix Tuning可以被视为P-Tuning的下一个版本。在P-Tuning中,我们只

http://www.xdnf.cn/news/557281.html

相关文章:

  • 项目进度延误,如何按时交付?
  • 预训练模型:深度学习的通用特征引擎
  • Greenplum数据库维护篇之常用操作指导
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(十八)
  • Windows逆向工程提升之IMAGE_DOS_HEADER
  • 定时任务延迟任务
  • linux内核编译学习笔记
  • Java异常处理与File类终极指南
  • 【基础知识】SPI协议的种类及异同
  • 数据库 1.0.1
  • DAY28类
  • MYSQL备份恢复知识:第四章:备份锁
  • 【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
  • MySQL中添加一个具有创建数据库权限的用户
  • Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程
  • C/C++ Select Poll Epoll 多路转接
  • python -> matplotlib简单用法
  • Unity3D仿星露谷物语开发47之砍树时落叶特效
  • Wan2.1 加速推理方法
  • 使用cursor自动生成前后端分离的web应用程序
  • ROS2 pkg 创建功能包
  • [ 计算机网络 ] 深入理解OSI七层模型
  • 经验过程简介与suprema的集中(Guntuboyina理论统计学笔记)
  • QT高DPI支持
  • linux之 pcie MSI-X中断编程
  • 自动化测试核心知识梳理与 Java 代码详解
  • 基于正点原子阿波罗F429开发板的LWIP应用(3)——Netbiosns功能
  • 嵌入式培训之系统编程(一)标准IO、文件操作
  • Liquid Wire 柔性应变传感器:金属凝胶导体 | 仿生肌肉长度监测 | 高精度动作控制
  • 特定领域 RAG中细调嵌入模型能否提升效果?