# LLM高效微调详解-从Adpter、PrefixTuning到LoRA_llm高效微调技术

一、背景

图片

目前NLP主流范式是在大量通用数据上进行预训练语言模型训练,然后再针对特定下游任务进行微调,达到领域适应(迁移学习)的目的。

图片Context Learning v.s. SFT

指令微调是预训练语言模型微调的主流范式,其目的是尽量让下游任务的形式尽量接近预训练任务。

从而减少下游任务和预训练任务之间的Gap, 实现预训练语言模型适应下游任务,而非下游任务去适应模型

图片

指令微调的效果要优于基于Zero/Few-shot的提示词工程的上下文学习。

但随着预训练语言模型进入LLM时代,其参数量愈发庞大。全量微调模型所有参数所需的显存早已水涨船高。

例如:

全参微调Qwen1.5-7B-Chat预估要2张80GB的A800,160GB显存 全参微调Qwen1.5-72B-Chat预估要20张80GB的A800,至少1600GB显存

而且,通常不同的下游任务还需要LLM的全量参数,对于算法服务部署来说简直是个灾难(当然,一种折衷做法就是全量微调后把增量参数进行SVD分解保存,推理时再合并参数 )。

图片

为了寻求一个不更新全部参数的廉价微调方案,之前一些预训练语言模型的高效微调(Parameter Efficient, PEFT)工作,要么插入一些参数或学习外部模块来适应新的下游任务。

图片

接下来将介绍如下4个PEFT方法(重点是主流的LoRA):

  • Adatper Tuning
  • Prompt Tuning
  • Prefix Tuning
  • LoRA

图片

二、参数高效微调
2.1 Adapter Tuning

Adapter Tuning试图在Transformer Layer的Self-Attetion+FFN之后插入一个先降维再升维的MLP (以及一层残差和LayerNormalization)来学习模型微调的知识。

图片

Adapter即插入的FF up + FF Down。

图片

在微调时,Transformer Layer原有的所有参数冻结,反向传播后仅更新Adapter参数。

缺点 :需要修改原有模型结构,同时还会增加模型参数量。

2.2 Promot Tuning

Prompt Tuning设计了一种prefix prompt方法,即在模型输入的token序列前添加前缀prompt token,而这个前缀prompt token的embedding是由网络学到。

Prompt Tuning可以看做token已经确定,但是embedding是可以学的。

它相当于仅用prompt token的embedding去适应下游任务,相比手工设计或挑选prompt,它是一种Soft的prompt(软提示)

给定个token组成的输入序列,其对应token embedding矩阵为,代表嵌入维度。

Soft-prompts对应参数,代表prompt的长度。

然后,将prompt拼接到输入前面,就能得到完整的模型输入。

图片

这个新的输入将会送入模型,以最大化交叉熵损失来最大化条件概率(Y|[P;X]),以拟合其标签token序列。

在针对下游任务微调时,Prompt Tuning将冻结原始LLM的参数,只学习独立的prompt token参数 (参数化的prompt token加上输入的token送入模型进行前向传播,反向传播只更新prompt token embedding的参数)。

在针对不同的下游任务微调时,就可以分别学习不同的Task Specifical的Prompt Token参数。

图片

  • Soft Prompt Tuning在模型增大时可以接近Model Tuning(fine-tuning)的效果
  • 离散Prompt Tuning(Prompt Design)基本不能达到Model Tuning的效果

图片

Promot Tuning方法的参数成本是,其中是提示长度,是token嵌入维度。

提示越短,必须调整的新参数就越少,那么调参的目标是就是找到表现仍然良好的最小prefix prompt长度。

2.3 Prefix-Tuning

图片

为了避免人为的离散Prompt选取优化,Prefix-Tuning提出可学习的Prefix Prompt。

图片

图片

Prefix-Tuning提出可学习的Prompt,即:

learns a sequence of prefixes that are prepended at every transformer layer

图片

Prefix tuning为层的Transformer Layer的每层多头注意力的键和值都配置了可学习的prefix vectors.

Two sets of prefix vectors , are concatenatedwith the original key and value

图片

图片

看到这里可以知道,Prefix-Tuning可以算是Promot Tuning的一个特例(Promot Tuning只在输入侧加入可学习的Prefix Prompt Token)

2.4 LoRA

为缓解该问题,LoRA(Low-Rank Adaption of LLMs),即LLMs的低秩适应,被提出用于高效参数微调。

LoRA的核心思想,是假设LLM在下游任务上微调得到的增量参数矩阵是低秩的,即是存在冗余参数的高维矩阵,但实际有效矩阵是更低维度的。

图片

相关论文表明训练学到的过度参数化的模型实际上存在于一个较低的内在维度上

类似于机器学习中的降维算法,假设高维数据实际是在低维的流形上一样

因此,将用两个更参数量更小的矩阵和 进行低秩近似。

其具体操作是,冻结了预训练的模型权重,并将可训练的LoRA秩分解矩阵注入到LLM的每个Transformer Decoder层中,从而大大减少了下游任务的可训练参数数量。

LoRA 方法的计算流程如下图:

图片

对于该权重的输入来说,输出为下式:

其中,为设预训练权重。初始化时,矩阵通过高斯函数初始化,矩阵为全零初始化,使得训练开始之前旁路对原模型不造成影响,即参数改变量为0。

对于使用LoRA的模型来说,由于可以将原权重与训练后权重合并,因此在推理时不存在额外的开销。

Prefix Tuning是指在输入序列前缀添加连续可微的软提示作为可训练参数。由于模型可接受的最大输入长度有限,随着软提示的参数量增多,实际输入序列的最大长度也会相应减小,影响模型性能。

三、适用范围

近来LLM主要是指,Decoder-Only架构的大规模预训练语言模型。

毕竟,同等参数规模和训练数据量,Encoder-Decoder架构的T5和Bart在生成任务熵,相比Decoder-Only架构并不具备优势。更不用说,Encoder-Only架构的BERT了。

但是,所有使用Transformer架构的算法都可以使用上述PEFT方法。

针对主流的Decoder Only的生成式因果语言模型,其训练范式具体是:

图片图片源自:《大规模语言模型:从理论到实践》

  • 预训练(Pretraining) :基于海量语料进行Transformer Decoder架构的自回归预训练,拟合语料序列的条件概率分布,从而压缩信息,最终学到一个具备长上下文建模能力的超大规模神经语言模型,即LLM
  • 有监督微调(Supervised Finetuning) :基于高质量的指令数据(用户输入的提示词 + 对应的理想输出结果)微调LLM,从而得到有监督微调模型(SFT模型)。SFT模型将具备初步的指令理解能力和上下文理解能力(预训练得到的LLM在指令微调的过程中被引导如何使用其学到的知识)进一步基于结果有排序指令样本,
  • 奖励建模(Reward Modeling) :奖励阶段试图构建一个文本质量对比模型(相当于一个Critor)。对同一个提示词,它将对SFT模型给出的多个不同输出的质量做排序。奖励模型可通过二分类模型,对输入的两个结果之间的优劣进行判断。
  • 强化学习(Reinforcement Learning) :强化学习阶段将根据给定的提示词样本数据,利用在前一阶段训练的奖励模型,给出SFT模型对用户提示词补全结果的质量评估,并与语言模型建模目标综合得到更好的效果。强化学习微调将在SFT模型基础上,它将使LLM生成的结果文本能获得更高的奖励。

除了预训练,增量预训练、有监督微调、有监督微调、奖励建模、强化学习阶段都可以采用PEFT方式。

图片

如果你对AI大模型应用感兴趣,这套大模型学习资料一定对你有用。

1.大模型应用学习大纲

AI大模型应用所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

2.从入门到精通全套视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
在这里插入图片描述
在这里插入图片描述

3.技术文档和电子书

整理了行业内PDF书籍、行业报告、文档,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

请添加图片描述

朋友们如果有需要全套资料包,可以点下面卡片获取,无偿分享!

### Qwen-14B-Chat 模型 SFT 阶段微调注意事项 在使用 `llamafactory-cli train` 命令对 Qwen-14B-Chat 进行监督微调(Supervised Fine-Tuning, SFT)时,需特别关注以下几个方面: #### 1. **CUDA 可见设备配置** 确保 GPU 设备分配合理。如果多卡并行训练,则需要通过 `CUDA_VISIBLE_DEVICES` 设置可见的 GPU 列表[^3]。例如,在八张显卡的情况下: ```bash CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 ``` #### 2. **YAML 文件路径验证** 确认 YAML 配置文件路径无误,并且该文件包含了完整的超参数定义。对于自定义路径 `/your/path/llm/LLaMA-Factory/examples/train_lora/qwen2vl_lora_sft_my20241112.yaml` 的情况,应检查以下几点: - 路径是否存在。 - YAML 文件中的字段是否正确填充,尤其是学习率 (`learning_rate`)、批量大小 (`batch_size`) 和最大序列长度 (`max_seq_length`) 等关键参数。 #### 3. **Python 环境一致性** 为了防止因依赖库版本不一致引发错误,建议按照指定方式创建独立 Python 环境[^2]。具体操作如下: ```bash conda create -n qwen-14b-chat python=3.10 -y conda activate qwen-14b-chat ``` 同时安装所需依赖包,通常可以通过运行项目根目录下的 `requirements.txt` 完成: ```bash pip install -r requirements.txt ``` #### 4. **LORA 微调相关参数** 低秩适应(LoRA技术能够显著降低内存消耗和计算成本。以下是几个重要 LoRA 参数及其作用说明: - **rank**: 控制矩阵分解后的维度,默认值一般设为8或16。 - **alpha**: 影响缩放因子的选择,推荐初始值与 rank 相同。 - **lora_dropout**: 添加随机失活机制以增强泛化能力,典型取值范围为0到0.1之间。 这些参数均应在 YAML 文件中明确定义。例如: ```yaml model: lora_rank: 16 lora_alpha: 16 lora_dropout: 0.05 ``` #### 5. **数据集准备** 高质量的数据源直接影响最终效果。因此要仔细校验输入 JSON 或 CSV 数据格式是否满足预期标准。另外还需注意样本分布均衡性和标注质量等问题。 --- ### 示例代码片段 下面展示了一个简单的脚本用于启动训练过程: ```python import os os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3,4,5,6,7" config_path = "/your/path/llm/LLaMA-Factory/examples/train_lora/qwen2vl_lora_sft_my20241112.yaml" command = f"CUDA_VISIBLE_DEVICES={os.getenv('CUDA_VISIBLE_DEVICES')} llamafactory-cli train {config_path}" print(f"Executing command:\n{command}") os.system(command) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值