LoRA以及其变体
一、LoRA 基本概念
LoRA,全称为 Low-Rank Adaptation,中文通常称为 低秩适配。它是一种面向大模型微调的参数高效方法,核心思想是:冻结原始大模型参数,只在部分线性层旁边加入少量可训练的低秩矩阵,用这些小矩阵来学习任务相关的参数增量。
在普通全量微调中,模型会直接更新原始权重:
W=W0+ΔW W = W_0 + \Delta W W=W0+ΔW
其中 W_0 是预训练模型原始权重,\Delta W 是微调过程中学习到的参数变化。
LoRA 不直接学习完整的 \Delta W,而是将它近似分解为两个低秩矩阵:
ΔW=BA \Delta W = BA ΔW=BA
因此前向传播可以写成:
h=W0x+BAx h = W_0x + BAx h=W0x+BAx
其中:
W_0:原始预训练权重,训练时冻结;
A:降维矩阵;
B:升维矩阵;
r:低秩维度,通常远小于原始特征维度;
BA:LoRA 学到的低秩参数更新。
可以直观理解为:大模型主体不动,只训练一个很小的“任务适配补丁”。
二、LoRA 的优势与局限
- LoRA 的优势
LoRA 的主要优点包括:
第一,可训练参数量少。 由于只训练低秩矩阵 (A) 和 (B),相比全量微调,参数量大幅减少。
第二,显存占用低。 原始模型参数被冻结,不需要为全部参数保存梯度和优化器状态,因此训练显存压力更小。
第三,适合大模型微调。 对于大语言模型、多模态大模型等参数量很大的模型,LoRA 可以用较低成本完成任务适配。
第四,推理效率较高。 LoRA 的权重更新可以在推理前合并回原始权重中,因此不会明显增加推理延迟。
- LoRA 的局限
LoRA 也存在一些问题:
第一,单一 LoRA 分支表达能力有限。 如果一个模型需要同时适应多个任务、多个领域或多种数据分布,一个固定 LoRA 分支可能不足以表达所有差异。
第二,持续学习中容易发生灾难性遗忘。 当任务按顺序到来时,模型学习新任务可能会破坏旧任务知识。
第三,任务之间可能相互干扰。 如果不同任务共用同一个 LoRA 参数空间,任务特有知识可能会混在一起,导致性能下降。
因此,后续很多工作都尝试对 LoRA 进行扩展,例如引入专家机制、动态路由、参数冻结、方向幅度解耦等。
三、持续学习中的 rehearsal-free 概念
在持续学习中,模型不是一次性学习所有数据,而是按任务顺序学习。例如:
任务1:学习类别 A、B
任务2:学习类别 C、D
任务3:学习类别 E、F
模型学习新任务时,可能忘记旧任务,这种现象称为 灾难性遗忘。
一种常见解决方法是 rehearsal / replay,即旧样本回放。模型在学习新任务时,会保存一部分旧任务样本,并将旧样本和新任务样本混合训练。
而 rehearsal-free 指的是:
不保存旧任务的原始样本,也不在训练新任务时使用旧样本回放。
也就是说,模型只能依靠当前任务数据,以及结构设计、参数冻结、正则约束、知识蒸馏或参数隔离等方式来减少遗忘。
rehearsal-free 的优点是节省存储空间,也适合隐私敏感场景,例如医疗数据、用户数据等不能长期保存的任务。但它的难点也很明显:没有旧样本帮助模型复习,因此更容易遗忘,对算法设计要求更高。
四、HydraLoRA:面向异构数据的多专家 LoRA
- 研究动机
普通 LoRA 使用一个统一的低秩分支来适配所有数据。但在复杂数据场景中,不同样本可能来自不同子领域,例如问答、代码、数学、医学、法律等。如果所有数据共用一个 LoRA 分支,不同领域之间容易互相干扰。
HydraLoRA 的目标是:让 LoRA 能够更好地适应复杂异构数据。
- 核心思想
HydraLoRA 采用一种非对称 LoRA 架构:
共享 A 矩阵
多个 B 专家
普通多专家 LoRA 可能是:
专家1:A1 + B1
专家2:A2 + B2
专家3:A3 + B3
而 HydraLoRA 更像是:
共享 A
├── B1
├── B2
├── B3
└── …
也就是说,所有专家共享同一个 (A),但拥有不同的 (B)。
- 技术特点
HydraLoRA 的主要特点包括:
第一,共享 A 学习共性信息。 不同任务或数据子领域之间可能存在共同的底层适配方向,因此用共享 (A) 来学习通用表示。
第二,多个 B 学习差异信息。 不同 (B) 专家负责学习不同子领域或隐含任务的差异。
第三,通过路由器动态选择专家。 模型根据输入样本自动判断应该调用哪些 (B) 专家,而不是固定使用一个 LoRA。
- 总结
HydraLoRA 的关键词是:
异构数据
共享 A
多个 B 专家
动态路由
参数高效微调
它主要解决的是:普通 LoRA 在复杂多领域数据上表达能力不足的问题。
五、BranchLoRA:面向多模态持续指令微调的分支 LoRA
- 研究动机
BranchLoRA 主要用于 多模态持续指令微调。在这种场景下,模型会连续学习多个图文任务,例如视觉问答、图像描述、OCR 理解、图文定位等。
如果直接用普通 LoRA 或 MoE-LoRA,容易出现两个问题:
第一,参数冗余。 多个 LoRA 专家如果各自拥有完整的 (A) 和 (B),参数量会变大。
第二,灾难性遗忘。 模型学习新任务时,可能会修改旧任务依赖的 LoRA 参数,从而遗忘旧任务。
- 核心结构
BranchLoRA 的结构与 HydraLoRA 类似,也采用:
共享 A
多个 B 分支
可以理解为:
共享 A 矩阵 = 树干
多个 B 矩阵 = 分支专家
因此它的结构可以写成:
ΔW=BiA \Delta W = B_iA ΔW=BiA
或者多个专家加权组合:
ΔW=∑igi(x)BiA \Delta W = \sum_i g_i(x)B_iA ΔW=i∑gi(x)BiA
其中 g_i(x) 是路由器给出的专家权重。
- 专家池机制
BranchLoRA 不是每来一个任务就一定新增一个 (B) 专家,而是通常预先设置一个专家池。
例如论文实验中可以设置:
专家池:B1, B2, B3, …, B8
当一个任务到来时,router 会从专家池中选择最相关的 top-k 个专家参与训练和推理。例如:
任务1 → 选择 B1、B3
任务2 → 选择 B2、B4
这说明 BranchLoRA 不是简单的:
任务1 新增 B1
任务2 新增 B2
任务3 新增 B3
而是在已有专家池中进行选择、复用和冻结。
- 冻结机制
BranchLoRA 的重要设计是 tuning-freezing 机制。
当一个任务训练结束后,模型会统计该任务中最常被激活的 top-k 个专家,并将这些专家冻结。被冻结的专家用于保存当前任务知识,后续任务训练时不再更新它们。
例如:
任务1 训练后:
B1 冻结
B3 冻结
B2 可训练
B4 可训练
当任务2到来时:
B1、B3 可以被调用,但不更新
B2、B4 可以继续训练,用来学习新任务
需要注意的是:
没有被当前任务选中的专家,一般不会被冻结,它们仍然可以留给后续任务继续训练。
因此,冻结的是 当前任务最依赖的专家,不是所有已有专家。
- 专家数量与存储问题
专家数量越多,存储空间确实越大。但是 BranchLoRA 通过共享 (A) 减少了参数冗余。
完整 MoE-LoRA 需要:
A1 + B1
A2 + B2
A3 + B3
…
BranchLoRA 只需要:
共享 A
B1
B2
B3
…
因此专家数增加时,只主要增加多个 (B) 分支,而不是同时增加多个 (A) 和 (B)。
此外,每次输入只激活 top-k 个专家,并不会使用全部专家参与计算。冻结专家虽然仍然需要存储,但不再需要保存梯度和优化器状态,因此训练显存压力会降低。
- 总结
BranchLoRA 的关键词是:
共享 A
多 B 分支
top-k 专家选择
任务后冻结
抗灾难性遗忘
多模态持续指令微调
它主要解决的是:多模态持续学习中的参数冗余和灾难性遗忘问题。
六、D-MoLE:动态课程 LoRA 专家混合
- 研究动机
D-MoLE 全称为 Dynamic Mixture of Curriculum LoRA Experts,主要用于 持续多模态指令微调。
它关注的问题与 BranchLoRA 类似,但重点不同。BranchLoRA 更关注专家结构内部如何共享、冻结和路由,而 D-MoLE 更关注:
LoRA 专家应该放在哪些层?
不同模态应该如何平衡训练?
不同任务是否需要不同的模型容量?
2. 主要问题
D-MoLE 认为持续多模态学习中存在两个重要问题:
第一,任务结构冲突。 不同任务依赖的模型层不同。例如,有些任务更依赖视觉编码器,有些任务更依赖语言模型,有些任务更依赖跨模态对齐模块。如果所有任务都在相同位置加 LoRA,可能无法适应不同任务需求。
第二,模态不平衡。 多模态模型包含视觉模块和语言模块。不同任务对视觉和文本的依赖程度不同。如果训练时某一模态更新过强,另一模态更新不足,模型性能会受到影响。
- 核心改进
D-MoLE 的主要改进包括:
第一,动态分配 LoRA 专家。 它不是固定在所有层都加入相同 LoRA,而是根据任务需求动态选择在哪些层放置 LoRA experts。
第二,layer-wise routing。 不同输入在不同层可以路由到不同 LoRA 专家,使得专家选择更加细粒度。
第三,基于梯度的跨模态课程学习。 它根据不同模态的训练难度和梯度信息,调整视觉模块与语言模块的更新比例,从而缓解模态不平衡问题。
- 总结
D-MoLE 的关键词是:
动态 LoRA 专家
层级路由
课程学习
模态平衡
持续多模态指令微调
它主要解决的是:不同任务需要不同结构、不同模态更新不平衡的问题。
七、SD-LoRA:方向与幅度解耦的 LoRA
- 研究动机
SD-LoRA 主要用于 类别增量学习。类别增量学习中,模型会不断学习新类别,但测试时需要识别所有已经学过的类别。
例如:
阶段1:学习猫、狗
阶段2:学习汽车、飞机
阶段3:学习苹果、香蕉
模型在学习新类别时,不能忘记旧类别。
- 核心思想
SD-LoRA 认为,LoRA 学到的参数更新不仅有“方向”,还有“幅度”。
普通 LoRA:
ΔW=BA \Delta W = BA ΔW=BA
SD-LoRA 将其理解为:
ΔW=∣ΔW∣⋅ΔW∣ΔW∣ \Delta W = |\Delta W| \cdot \frac{\Delta W}{|\Delta W|} ΔW=∣ΔW∣⋅∣ΔW∣ΔW
其中:
\frac{\Delta W}{|\Delta W|}:表示更新方向;
|\Delta W|:表示更新幅度。
它认为在持续学习中,方向和幅度不应该完全耦合在一起学习,而应该进行解耦。
- 作用机制
SD-LoRA 会保留旧任务学习到的方向,同时为新任务增加新的方向,并通过可学习的幅度系数来平衡旧知识和新知识。
可以理解为:
旧任务方向:保留
新任务方向:新增
不同方向的重要性:通过幅度系数调整
这样可以在不使用旧样本回放的情况下,尽量保持旧任务性能。
- 技术特点
SD-LoRA 的主要特点包括:
第一,方向-幅度解耦。 它不只是简单增加 LoRA 参数,而是从参数更新的几何角度分析 LoRA 的变化。
第二,rehearsal-free。 它不需要保存旧任务原始样本。
第三,不依赖任务选择器。 一些持续学习方法推理时需要知道当前样本属于哪个任务,而 SD-LoRA 更强调最终模型可以直接用于推理。
- 总结
SD-LoRA 的关键词是:
类别增量学习
方向-幅度解耦
rehearsal-free
抗灾难性遗忘
无需任务选择器
它主要解决的是:类别增量学习中如何在不保存旧样本的情况下减少遗忘。
八、四种 LoRA 改进方法对比
方法 应用场景 核心结构 主要解决问题 关键特点
HydraLoRA 异构数据高效微调 共享 A,多 B 专家 普通 LoRA 难以适应复杂多领域数据 多专家、动态路由、自动适应子领域
BranchLoRA 多模态持续指令微调 共享 A,多 B 分支,任务后冻结 多任务持续学习中的遗忘与参数冗余 top-k 专家选择、冻结旧专家、任务路由
D-MoLE 持续多模态指令微调 动态 LoRA 专家分配 不同任务结构需求不同,模态更新不平衡 层级专家、课程学习、模态平衡
SD-LoRA 类别增量学习 方向-幅度解耦 不使用旧样本时的灾难性遗忘 rehearsal-free、旧方向保留、新方向扩展
九、几个容易混淆的问题
- BranchLoRA 是每来一个任务就新增一个 B 专家吗?
不是。
BranchLoRA 更准确的做法是:预先设置一个 B 专家池,每个任务通过 router 从专家池中选择 top-k 个专家使用。任务结束后,将该任务最常使用的专家冻结。
- 没有被当前任务使用的 B 专家会被冻结吗?
一般不会。
被冻结的是当前任务中最重要、最常被激活的专家。没有被选为 top-k 的专家通常仍然保持可训练状态,留给后续任务使用。
- 专家数量多了会不会占存储?
会。
但是 BranchLoRA 和 HydraLoRA 通过共享 (A) 矩阵,只保留多个 (B) 专家,减少了完整 MoE-LoRA 中多个 (A+B) 专家带来的参数冗余。
- BranchLoRA 和 HydraLoRA 有什么区别?
二者结构上都使用“共享 A + 多 B 专家”,但应用目标不同。
HydraLoRA 主要面向 复杂异构数据微调,强调自动发现数据内部的多个隐含子领域。
BranchLoRA 主要面向 持续多模态指令微调,强调通过专家冻结和任务路由来减少灾难性遗忘。
- D-MoLE 和 BranchLoRA 有什么区别?
二者都用于多模态持续指令微调,但关注重点不同。
BranchLoRA 更关注专家结构本身:共享、分支、冻结和复用。
D-MoLE 更关注 LoRA 专家在模型不同层的动态分配,以及视觉和语言模态之间的训练平衡。
- SD-LoRA 和前三者有什么不同?
SD-LoRA 不是主要针对多模态指令微调,而是针对类别增量学习。
它不强调专家路由,而是从 LoRA 参数更新本身出发,将更新分成方向和幅度,通过保留旧方向、增加新方向、调整幅度来减少遗忘。
十、总体总结
LoRA 是一种高效的大模型微调方法,它通过冻结原始权重、训练低秩矩阵 (A) 和 (B),用较少参数实现任务适配。它适合大模型场景,但在持续学习、多任务学习和异构数据场景中,普通 LoRA 容易受到表达能力不足、任务干扰和灾难性遗忘等问题的限制。
围绕这些问题,不同方法提出了不同改进方向:
HydraLoRA 通过共享 (A)、多个 (B) 专家和动态路由,让 LoRA 更适合复杂异构数据。
BranchLoRA 在共享 (A)、多个 (B) 分支的基础上,引入任务后冻结机制和任务路由,用于缓解多模态持续指令微调中的灾难性遗忘。
D-MoLE 进一步从模型层级和模态平衡角度出发,根据不同任务动态分配 LoRA experts,并通过课程学习平衡视觉和语言模块的更新。
SD-LoRA 则从 LoRA 参数更新的几何角度出发,将更新解耦为方向和幅度,用于 rehearsal-free 类别增量学习。
因此,可以将这几种方法理解为 LoRA 在不同问题场景下的扩展:
LoRA:基础低秩适配
HydraLoRA:面向异构数据的多专家 LoRA
BranchLoRA:面向持续多模态学习的冻结分支 LoRA
D-MoLE:面向持续多模态学习的动态课程专家 LoRA
SD-LoRA:面向类别增量学习的方向-幅度解耦 LoRA
从技术发展趋势来看,LoRA 已经不再只是一个简单的参数高效微调工具,而是在持续学习、多模态学习、专家混合、任务路由、抗遗忘等方向上不断扩展,逐渐成为大模型高效适配和长期学习中的重要基础模块。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)