LoRA 及其核心变体一览
在大模型时代全参数微调Full Fine-Tuning成本高昂。LoRA 及其变体让我们用极少的额外参数就能让预训练模型“学会新技能”。本文带你快速理清LoRA 是什么、加在哪里、以及哪些变体值得关注。一、LoRA 是什么LoRALow-Rank Adaptation低秩适应 是一种参数高效微调PEFT方法。其核心思想非常优雅不动预训练好的巨大权重矩阵 W而是在旁边加一个低秩的“旁路”来学习增量 ΔW数学表达y Wx ΔWx Wx BAxW冻结不参与训练省显存、防灾难性遗忘A ∈ ℝ^(r×d)降维矩阵通常用随机高斯初始化B ∈ ℝ^(d×r)升维矩阵初始化为 0r秩rank远小于原始维度 d因此可训练参数极少通常只有原模型的0.1%~1%推理时可选合并W W BA推理速度与原始模型完全一致无额外延迟。二、LoRA 放在哪里1. 核心插入位置线性投影层LoRA 不是加在激活函数或 LayerNorm 上而是加在线性变换Linear / Conv1D的权重矩阵旁边。在 Transformer 中最常加 LoRA 的地方是 Attention 机制的四个投影矩阵投影符号作用是否常用 LoRAQuery$W_q$生成查询向量✅Key$W_k$生成键向量✅Value$W_v$生成值向量✅Output$W_o$多头结果拼接后的融合输出✅为什么 Output 投影Wo也很关键多头注意力MHA计算出各个头的输出后需要拼接并通过 Wo 映射回模型隐藏维度。它负责“整合所有专家的意见”因此修改它可以直接影响整个注意力层的最终输出表达。2. 代码层面的插入方式伪代码给一个已有的 Linear 层“装上” LoRA# 伪代码给一个已有的 Linear 层“装上” LoRA class LoRALinear(nn.Module): def __init__(self, linear, rank8, alpha16): super().__init__() self.linear linear # 原始权重 W冻结 self.lora_A nn.Linear(linear.in_features, rank, biasFalse) self.lora_B nn.Linear(rank, linear.out_features, biasFalse) self.scaling alpha / rank def forward(self, x): # 原始路径 低秩旁路 return self.linear(x) self.lora_B(self.lora_A(x)) * self.scaling3. 常见配置建议最小可行配置只给 q_proj v_proj 加 LoRA很多论文验证足够更稳的配置q_proj k_proj v_proj o_proj 全加FFN 层可选一般效果提升有限除非任务特别需要三、LoRA 的重要变体LoRA 诞生后社区围绕“省显存、提效果、自适应秩、更好初始化”等方向衍生出许多变体。下面挑选 5 个工程中最常遇到、最值得了解的1. QLoRA —— 显存不够核心思路把基座模型权重量化为 4-bit NF4LoRA 适配器保持 BF16/FP16 训练。解决什么让 7B/13B/70B 模型在单张消费级显卡上也能微调。注意QLoRA 不是新的低秩算法而是“量化 LoRA”的组合。搭配建议QLoRA DoRA QDoRA兼顾省显存与效果。2. DoRAWeight-Decomposed LoRA—— 低秩核心思路把预训练权重拆成幅度magnitude和方向direction两部分幅度单独学一个标量向量方向用 LoRABA来更新。为什么好全参数微调主要改变方向DoRA 更贴近这一机制在相同 rank 下比原版LoRA 效果更接近全参微调。适用场景rank 较小如 r8但又不想掉点的时候。3. AdaLoRA —— 动态分配“预算核心思路不是所有层都值得用同样的 rank。AdaLoRA 用 SVD 风格的参数化在训练过程中自动剪枝不重要的奇异值给重要层分配更多秩。解决什么手动调 r8 还是 r32 很痛苦AdaLoRA 让总参数量固定但“好钢用在刀刃上”。代价实现稍复杂训练稳定性需要留意。4. PiSSA —— 更好的初始化收敛更快核心思路对原始权重 W0 做 SVD 分解用主奇异向量/奇异值来初始化 A 和 B而不是随机初始化 A、零初始化 B。 为什么好相当于让 LoRA 一上来就站在“主成分方向”上收敛速度明显加快最终效果也往往更好。 适合想从 LoRA 起步但嫌收敛慢、效果不稳的场景。5. LoRA —— 几乎零成本的加速技巧核心思路A 和 B 使用不同的学习率通常 B 的学习率设为 A 的若干倍。为什么有效A 负责降维、B 负责升维两者梯度特性不同分开调率能优化更新动态。 代价只改一行优化器配置不增加任何参数强烈建议默认尝试。四、变体怎么选你的痛点推荐方案一句话理由显卡只有 24G想微调 7B/13BQLoRA4-bit 量化基座显存直降rank 很小但效果掉得厉害DoRA分解幅度方向低秩下更强不知道该设 r8 还是 r32AdaLoRA自动分配秩不用拍脑袋训练 loss 降得慢、起点低PiSSASVD 初始化起步就在主成分上想白嫖一点收敛速度LoRA只改学习率零额外成本既要省显存又要好效果QDoRAQLoRA DoRA 叠加参考资料原版 LoRA 论文Hu et al., 2021、QLoRADettmers et al., 2023、DoRALiu et al., 2024、AdaLoRAZhang et al., 2023、PiSSAMeng et al., 2024