深蓝黑背景封面。左上角标注「知识延伸 · 微调方法」,右上角圆角胶囊写「Day 03 · 11-30」。左侧是一棵改进谱系树:中心基座卡写「LoRA 基座:冻结 W₀,低秩增量 ΔW = B·A,秩 r」,从基座向右分出三条支线连接三张变体卡——QLoRA 卡标注「底座再压缩:冻结底座量化成 4-bit NF4,显存再降一个量级」;AdaLoRA 卡标注「秩按需分配:ΔW = P·Λ·Q,按重要性给每层分秩」;DoRA 卡标注「拆解权重:W = 幅度 m × 方向矩阵,方向交给 LoRA 微调」。左下注释写「共同前提:三者都保留低秩支路 B·A,动的是底座存储、秩的分配与权重的分解方式」。右侧大标题「QLoRA、AdaLoRA、DoRA LoRA 家族都改了什么」,副标题「三条改进线:更省显存 · 更聪明的秩 · 更像全参的形态」,小注「改法不同,目标一致:以更低成本逼近全参微调」。 图 1:本文封面,LoRA 家族的三条改进支线。

这个系列另有一篇真题解析专门讲 LoRA 秩 r 的选取权衡,本篇换个主轴:把 LoRA 家族里三个最有代表性的变体——QLoRA、AdaLoRA、DoRA——摆在一起,讲清它们各自针对什么问题、动了哪一刀、实际选型怎么取舍。三者都保留 LoRA 的低秩支路,改的分别是底座的存储方式、秩的分配方式和权重的分解方式。

先回顾基座:LoRA 做了什么。

LoRA 冻结预训练权重 W₀,在旁边并联一条低秩增量支路 ΔW = B·A:A 降维、B 升维,训练只更新这两个小矩阵,参数量从全量的 d×d 降到 r×(d_in + d_out)。训完把 B·A 加回 W₀ 合并,推理不引入任何额外延迟。这套设计简单有效,但留下三个没解决的问题:底座权重仍要全精度驻留显存;所有层用同一个秩,不管各层重要性差异;低秩更新的学习形态与全参微调仍有差距。三个变体恰好各补一个洞。

QLoRA:把底座冻成 4 bit,显存再降一个量级。

2023 年发表的 QLoRA(arXiv:2305.14314)瞄准显存。LoRA 训练参数虽少,底座权重却要以 16 位精度完整放在显卡里,65B 级别模型光底座就要上百 GB。QLoRA 把冻结底座量化到 4 bit 存储,计算时临时反量化回高精度参与前向与梯度回传,LoRA 支路本身保持全精度。为支撑这个思路,论文引入三项技术:4-bit NormalFloat(NF4),一种对正态分布权重在信息论意义上最优的数据类型;双重量化,把量化常数再量化一次,平均每参数再省约 0.37 bit;分页优化器,把显存峰值转移到 CPU 内存。效果是单张 48GB 显卡就能微调 65B 模型,且保持 16 位微调的任务性能。代价同样明确:反量化带来额外计算,训练比纯 LoRA 慢。

AdaLoRA:秩不再一刀切,跟着重要性走。

LoRA 给每个权重矩阵配同样的秩,隐含假设是各层对增量的需求一样大——这个假设并不成立。2023 年发表的 AdaLoRA(arXiv:2303.10512)把增量改写成奇异值分解的形式 ΔW = P·Λ·Q:对角阵 Λ 上的每个奇异值都可以看作一条独立的信息通道,P、Q 保持近似正交。训练时按重要性分数给奇异值排序,剪掉贡献小的 σ 释放预算,再把省下的秩动态分配给更需要的层。同一总预算下,关键层拿高秩捕捉任务特定的精细信息,冗余层压到低秩防止过拟合。论文的实验显示,这种按重要性分配预算的做法在低预算场景下改善尤其明显。

DoRA:把权重拆成幅度 × 方向,学得更像全参。

2024 年发表的 DoRA(arXiv:2402.09353)从一个分析出发:先用权重分解的方法对比全参微调与 LoRA 的学习动态,发现两者在幅度与方向上的更新模式存在系统性差异。DoRA 据此把预训练权重拆成幅度向量 m 与方向矩阵两个组件,幅度单独学习,方向上的微调交给 LoRA 完成。这样学习能力和训练稳定性都更接近全参微调,低秩下的精度损失更小,而且增量仍可合并回权重,不增加推理开销。代价是方向分量需要归一化,训练与合并的计算比纯 LoRA 略重。

选型与组合。

三个变体回答三个不同的问题,可以按瓶颈对号入座:显存是硬约束、想在小卡上微调大模型,选 QLoRA;任务预算紧张且层间重要性悬殊,用 AdaLoRA 把秩花在刀刃上;数据充足、低秩也想逼近全参效果,上 DoRA。它们之间并非互斥——量化底座与权重分解彼此正交,工程上常见「4-bit 底座 + 方向分解」这类组合。需要记住的共同前提是:三者都没有动低秩支路这个核心,改的是它周围的存储、分配与形态。

深蓝黑背景概念图。顶部小字「概念图 · LoRA 变体改进谱系」,主标题「同一条低秩支路,三处不同的手术」。全图分三个横排面板,每个面板左侧是机制小图、右侧是四条要点:第一面板「QLoRA — 把底座冻成 4 bit」,小图画一张 FP16 底座宽条经箭头压成 4-bit NF4 窄条、虚线回头箭头标注「计算时临时反量化」、下方注「LoRA 支路保持全精度」,要点为 4-bit NF4 存储加计算时反量化、双重量化每参数再省约 0.37 bit、分页优化器把显存峰值转移到 CPU 内存、收益是单张显卡也能微调 65B 级模型;第二面板「AdaLoRA — 秩跟着重要性走」,小图画 ΔW = P·Λ·Q 三块矩阵,对角阵 Λ 上 σ1、σ2 保留、σ3 被打叉剪掉,要点为 SVD 形式参数化增量且 P、Q 保持近似正交、按重要性分数给奇异值排序剪掉贡献小的 σ、省下的秩预算动态分给更需要的层、收益是同预算下关键层高秩冗余层低秩;第三面板「DoRA — 把权重拆成幅度 × 方向」,小图画权重 W 拆成「幅度 m」横条与「方向 V+ΔW」矩阵、ΔW 标注由 LoRA 产生,要点为 W = m · (V / ‖V‖) 幅度与方向解耦、幅度向量 m 单独学习而方向微调交给 LoRA、学习动态更接近全参微调故低秩下精度损失更小、代价是方向需归一化、训练与合并略多于纯 LoRA。底部选型条写「显存是瓶颈 → QLoRA | 层间重要性悬殊 → AdaLoRA | 低秩也要逼近全参效果 → DoRA」。 图 2:三个变体的机制、要点与选型对照。

一句话收尾。

QLoRA 改底座的存储,AdaLoRA 改秩的分配,DoRA 改权重的分解——三次手术部位不同,目标一致:以更低成本逼近全参微调。理解变体的最好方式不是背特性列表,而是先想清楚 LoRA 基座留下了哪个洞。你在实际微调里用过哪个变体?显存、效果、训练速度三项里你最常妥协的是哪一项?欢迎聊聊。