四种主流LLM微调方法详解:Full-tuning、Freeze-tuning、LoRA和QLoRA
本文源自AI
本文详细介绍一下大模型微调中的四种主要方法:Full Fine-tuning (全量微调) 、Freeze (冻结微调) 、LoRA (低秩适应) 和 QLoRA (量化低秩适应) 。它们都是为了在特定任务上提升预训练大模型性能,同时力求在计算资源、时间和效果之间取得平衡。
1. Full Fine-tuning (全量微调)
核心思想: 最直接、最“暴力”的方法。更新整个预训练模型的所有参数。模型在目标任务的数据集上进行训练,反向传播会更新每一层的权重。
工作原理:
加载预训练好的大模型。
在目标任务数据集上训练。
计算损失,通过反向传播更新模型所有权重参数。
保存整个更新后的模型。
优点:
潜力最佳效果: 理论上能最大程度地适应新任务,发挥模型全部潜力,通常能达到微调方法中的最佳性能(尤其在数据充足时)。
缺点:
资源消耗巨大: 需要存储和更新整个模型的梯度、优化器状态和参数副本。显存(GPU Memory)和算力(GPU/TPU)需求极高。
训练时间长: 更新所有参数导致训练速度慢。
灾难性遗忘风险: 过度微调可能损害模型在预训练阶段获得的基础通用知识。
存储成本高: 每个微调任务都需要保存一份完整的大模型副本。
适用场景:
数据量非常大。
目标任务与预训练任务差异较大。
计算资源(显存、多卡、时间)极其充足。
追求极致性能,不计成本。
2. Freeze (冻结微调 / Freeze-tuning / Partial Fine-tuning)
核心思想: 只更新模型的一部分参数,冻结(不更新)其余大部分参数。 通常选择冻结底层(负责基础通用特征)或高层(负责特定任务特征)的部分层。
工作原理:
加载预训练好的大模型。
冻结指定层(如Transformer的前N层或后M层)的参数(设置
requires_grad=False)。在目标任务数据集上训练,仅更新未冻结层的参数。
保存整个模型(包含冻结和未冻结部分)。
优点:
显著降低资源消耗: 只需要计算和存储部分层的梯度、优化器状态,显存和算力需求远低于Full Fine-tuning。
训练速度更快: 更新的参数少。
减少遗忘风险: 冻结层保留了预训练知识,降低了灾难性遗忘的可能性。
缺点:
效果可能受限: 性能通常低于Full Fine-tuning,因为模型的大部分能力被“锁住”了。效果高度依赖于选择冻结哪些层(需要经验或实验)。
灵活性较低: 对模型结构的修改是“硬性”的(冻结/不冻结)。
适用场景:
目标任务与预训练任务有一定相关性(可利用预训练的底层或高层特征)。
计算资源有限(显存较小或单卡)。
数据量相对较少。
需要快速实验或部署。
对最终性能要求不是极致。
3. LoRA (Low-Rank Adaptation - 低秩适应)
核心思想: 在模型的特定层(通常是Attention模块)旁边添加轻量级的“旁路”适配器模块,只训练这些适配器,冻结原始模型权重。 适配器由两个低秩矩阵构成(降维矩阵A和升维矩阵B),其乘积
BA近似代表原始权重W在任务适配过程中需要的更新量ΔW。工作原理 (
ΔW = BA, 秩r远小于原维度):加载预训练好的大模型,冻结其所有权重
W。在选定的层(如
q_proj,v_proj)旁,注入可训练的LoRA适配器模块(包含矩阵A和B)。前向传播时,该层的输出变为
h = Wx + BAx。在目标任务数据集上训练,仅更新
A和B的参数。推理时,可将
BA合并回原始权重W(W' = W + BA),不增加额外延迟;也可保留分离形式。
优点:
极高的参数效率: 新增参数量极小(通常只有原模型的
0.1% - 1%),r是控制大小的关键超参数。大幅降低显存和存储开销: 只需要存储和优化适配器参数 (
A,B) 的梯度和优化器状态。训练显存 ≈ 推理显存 + 适配器参数相关开销。训练速度快: 更新参数少。
减少遗忘风险: 原始模型权重冻结。
模块化与可插拔: 训练好的LoRA适配器可以像插件一样加载/卸载,轻松切换不同任务。合并后无额外开销。
效果接近Full: 在很多任务上能达到接近Full Fine-tuning的效果。
缺点:
理论峰值略低于Full: 低秩近似可能无法完美捕捉所有必要的更新。
需要选择注入位置和秩
r: 效果对r和注入层敏感,需要调参。推理延迟(未合并时): 如果保持分离,前向计算需要额外计算
BAx。
适用场景:
最广泛的适用性: 在效果和效率之间取得了极佳的平衡,是当前最主流的微调方法。
计算资源有限(单卡、显存较小)。
需要快速迭代多个任务。
需要节省存储空间(只存小LoRA模块)。
大多数中等数据量任务。
4. QLoRA (Quantized LoRA - 量化低秩适应)
核心思想: LoRA的“升级版”,核心创新在于使用量化技术进一步压缩原始模型权重,将LoRA适配器应用于量化后的模型上,实现极致的显存节省。
关键技术创新:
4-bit NormalFloat (NF4) 量化: 将原始模型权重
W量化为4位精度存储(通常还使用双重量化进一步压缩量化常数)。这是显存节省的最大来源。分页优化器: 利用NVIDIA统一内存特性,在GPU显存不足时将优化器状态(如动量)自动换出到CPU RAM,避免OOM。
LoRA适配器: 与标准LoRA一样,在量化后的模型特定层旁注入可训练的低秩适配器
A和B。
工作原理:
将预训练模型加载到GPU显存中,并立即量化为4-bit NF4格式。原始高精度权重 (
W_float) 在训练中不保存。前向传播和反向传播时:
反量化: 按需将4-bit权重块反量化回计算精度(通常是16-bit BrainFloat, bf16) 进行计算。
计算LoRA:
h = dequantize(W_4bit)x + BAx。梯度计算: 梯度仅作用于LoRA参数
A和B。
优化器更新时,只更新
A和B(bf16精度)。使用分页优化器管理其状态。训练完成后,可以将LoRA适配器
BA合并回反量化后的高精度模型权重 (W_float' = dequantize(W_4bit) + BA) 得到最终模型。
优点:
极致的显存节省: 是LoRA显存需求的进一步大幅降低。核心在于4-bit量化模型权重。可以在单张消费级GPU(如24GB显存的RTX 4090)上微调数十亿参数模型(如33B)。
保持效果: 通过反量化到高精度进行计算,QLoRA在多项基准测试中被证明可以达到接近16-bit全精度微调(包括Full和LoRA)的性能水平。
继承了LoRA的参数效率等优点。
缺点:
计算略有开销: 反量化操作引入少量额外计算。
量化可能引入微小误差: 虽然反量化后计算精度高,但4-bit存储本身是信息有损的(尽管NF4设计得很好)。
实现更复杂。
适用场景:
资源极度受限: 显存非常小(如单卡16GB/24GB)但仍想微调大模型(7B, 13B, 甚至33B)。
在资源有限的设备(边缘设备)上探索大模型微调的可能性。
需要最大程度节省训练成本。
总结与对比 (哪种方法适合我?)
选择建议:
资源无限,追求极致? ➡️ Full Fine-tuning
资源紧张,任务简单/与预训练相关? ➡️ Freeze (快速尝试)
资源有限,希望效果好且高效通用? ➡️ LoRA (首选推荐)
资源极度紧张(如单卡24GB以下),还想微调大模型? ➡️ QLoRA (救命稻草)
希望这个详细的介绍能帮助你理解这些核心的微调方法及其适用场景!