ICML 2024|DoRA :Weight-Decomposed Low-Rank Adaptation权重分解低秩适应

ICML 2024|DoRA :Weight-Decomposed Low-Rank Adaptation权重分解低秩适应

文章目录

基本信息

在这里插入图片描述


在这里插入图片描述

0 论文摘要(Abstract)

DoRA(Weight-Decomposed Low-Rank Adaptation)是一种新型参数高效微调(PEFT)方法,旨在缩小LoRA与全微调(FT)之间的性能差距,同时保持无额外推理开销的优势。

实验背景

现有LoRA及其变体因无需额外推理成本而广泛应用,但与全微调相比仍存在精度差距,此前研究多将其归因于可训练参数有限。本文基于权重归一化思想,提出新颖的权重分解分析,将模型权重拆解为幅度(magnitude)和方向(direction)两个组件,揭示了LoRA与全微调的本质差异:LoRA的幅度和方向更新呈正相关的比例关系,缺乏精细调整能力;而全微调的更新模式更灵活,二者呈负相关,可实现独立的幅度或方向优化。

方法设计

DoRA借鉴该分析结果,对预训练权重进行幅度和方向分解并分别微调。针对方向组件参数规模大的问题,通过LoRA实现高效的方向更新,同时保持幅度组件的可训练性。该设计简化了LoRA需同时学习幅度和方向的复杂任务,提升了训练稳定性,且训练后可将分解组件合并回预训练权重,不增加推理延迟。此外,通过将方向组件的范数从梯度图中分离,DoRA大幅降低了训练内存开销(LLaMA微调中减少24.4%)。

实验结果

在多模态任务和不同模型骨干上,DoRA持续优于LoRA:常识推理任务中,LLaMA-7B/13B精度分别提升3.7%/1.0%,LLaMA3-8B提升4.4%;视觉指令微调(LLaVA-7B)提升0.6%;图像/视频-文本理解(VL-BART)分别提升0.9%/1.9%。DoRA还可与VeRA等LoRA变体兼容(如DVoRA),在减少参数的同时保持性能优势,且在训练数据量有限、秩设置多样的场景下均表现出强鲁棒性。此外,基于DoRA衍生的QDoRA在量化微调中超越QLoRA,在文本到图像生成任务中也展现出更优的个性化效果。

核心贡献

  1. 提出权重分解分析,揭示了LoRA与全微调的学习模式差异;
  2. 设计DoRA方法,在不增加推理开销的前提下实现接近全微调的学习能力;
  3. 在NLP、视觉-语言等多任务及LLM、LVLM等模型上验证了DoRA的优越性与兼容性。

1 引言(Introduction)

LoRA和FT展现出了明显不同的更新模式,各有优势,由此研究人员提出权重分解低秩适应(DoRA),DoRA在不同任务上均较LoRA有了提升
DoRA是一种新颖的参数高效微调方法(PEFT),融入了权重分解技术,在不增加LoRA推理延迟的情况下实现了与FT接近的学习能力。
灵感来源:借鉴权重归一化(Weight Normalization),将权重重参数化为 “幅度 + 方向”,分析 FT 与 LoRA 的更新模式差异。
DoRA 的核心设计:分解预训练权重为幅度和方向,用 LoRA 优化方向分量(解决方向参数规模大的问题),同时微调幅度分量,使学习模式更接近 FT。

DoRA 核心操作图

在这里插入图片描述


上图为本文所提DoRA方法的整体示意图
该方法将预训练权重分解为幅度(magnitude)和方向(direction)两个组件进行微调,具体通过DoRA对方向组件进行高效更新,“幅度” 描述权重的 “数值大小”,“方向” 描述权重在向量空间中的 “指向”。
图片解析:

在这里插入图片描述

分解(初始化)阶段:

把预训练好的权重拆分成幅度(工具的规格)和方向(工具的样式),其中方向部分初始为冻结状态(蓝色, Frozen),幅度部分是可以调整的可训练状态(绿色,Trainable)

适配阶段:

对 “方向” 部分进行调整,引入了新的可训练的增量( Δ V ΔV ΔV,就像给工具加个小配件),此时方向部分整体 V + Δ V V+ΔV V+ΔV变为可训练状态,通过梯度下降等优化方法更新其参数以适配目标任务。

合并阶段:

把调整后的幅度 m m m与方向 V + Δ V V+ΔV V+ΔV重新结合到新的权重 W ′ W' W′,用于模型在目标任务上的前向推理与后续训练。


2 相关工作(Related Works)

A d a p t e r − b a s e d Adapter-based Adapter−based:在冻结的预训练模型中插入额外可训练模块
P r o m p t − b a s e d Prompt-based Prompt−based:在输入中添加可训练软提示(soft tokens),仅微调提示向量
L o R A LoRA LoRA及其变体:用低秩矩阵近似权重更新,推理前可与预训练权重合并


3 LoRA与FT的模式分析( Pattern Analysis of LoRA and FT)

名词理解

  • 全量微调(FT,Full Fine-Tuning)
    为给训练模型“全面补课”,让已经学过通用知识的模型,针对具体任务打磨每一个“知识点”
    特点:模型的所有参数都会改,会根据具体任务调整每个参数的权重
    缺点:时间和金钱成本太高,易产生“灾难性遗忘”
  • 低秩适应(LoRA,Low-Rank Adaptation)
    特点:不更新所有参数,只针对模型适配下游任务需要调整的关键参数进行修改
    核心逻辑:用两个小矩阵的乘积代替大矩阵
    缺点:和全量微调比存在精度差距

LoRA数学原理与核心公式

LoRA(Low-Rank Adaptation)通过低秩矩阵分解近似权重更新,在不增加推理延迟的前提下实现参数高效微调,核心公式如下:

  1. 权重更新总公式
    预训练权重矩阵 W 0 ∈ R d × k W_0 \in \mathbb{R}^{d \times k} W0​∈Rd×k( d d d为输出维度, k k k为输入维度),微调后的权重 W ′ W' W′由“预训练权重+低秩更新量”两部分构成:
    W ′ = W 0 + Δ W = W 0 + B A ‾ W' = W_0 + \Delta W = W_0 + \underline{BA} W′=W0​+ΔW=W0​+BA​
    W 0 在微调过程中保持不变, W_0在微调过程中保持不变, W0​在微调过程中保持不变, Δ W = B A \Delta W = BA ΔW=BA 为低秩更新量( B A ‾ \underline{BA} BA​ 表示可训练参数), B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r、 A ∈ R r × k A \in \mathbb{R}^{r \times k} A∈Rr×k 为低秩矩阵,且 r ≪ min ⁡ ( d , k ) r \ll \min(d,k) r≪min(d,k)(通常 r = 4 , 8 , 16 r=4,8,16 r=4,8,16)
    B初始值为零,BA初始值为零。
  2. 初始化策略
    为确保训练起始时无更新干扰,矩阵 A A A采用Kaiming均匀分布初始化,矩阵 B B B初始化为全零矩阵:
    A ∼ KaimingUniform ( ⋅ ) , B = 0 ⟹ Δ W ∣ t = 0 = 0 A \sim \text{KaimingUniform}(\cdot), \quad B = 0 \implies \Delta W\big|_{t=0} = 0 A∼KaimingUniform(⋅),B=0⟹ΔW​t=0​=0
  3. 表达能力与秩的关系
    当LoRA的秩 r r r趋近于预训练权重的固有秩 r ∗ r^* r∗时,其表达能力可接近全量微调(FT):
    lim ⁡ r → r ∗ E ( W 0 + B A ) = E ( W F T ) \lim_{r \to r^*} \mathcal{E}(W_0 + BA) = \mathcal{E}(W_{FT}) r→r∗lim​E(W0​+BA)=E(WFT​)
    其中, E ( ⋅ ) \mathcal{E}(\cdot) E(⋅) 表示模型在下游任务上的损失函数。

3.2 权重分解分析

LoRA可被视为全微调的一种通用近似,通过逐渐增加LoRA的秩,使其与预训练权重的值保持一致,能够达到与全微调相近的表达能力
先前研究:将两种方法的精度差一归因于可训练参数数量有限,未进行深入分析
研究人员得到的启发:权重归一化——将权重矩阵重新参数化重构为幅度与方向两个独立的部分——来研究LoRA和FT学习模式的差异
分析方法:考察 LoRA 和 FT 权重相对于预训练权重在幅度和方向上的更新,以揭示两者学习行为的根本差异。 W ∈ R d × k W \in \mathbb{R}^{d \times k} W∈Rd×k的权重分解可表述为:

W = m ⋅ V ∥ V ∥ c = ∥ W ∥ c ⋅ W ∥ W ∥ c W = m \cdot \frac{V}{\|V\|_c} = \|W\|_c \cdot \frac{W}{\|W\|_c} W=m⋅∥V∥c​V​=∥W∥c​⋅∥W∥c​W​

其中, m ∈ R 1 × k m \in \mathbb{R}^{1 \times k} m∈R1×k是幅度(大小)向量, V ∈ R d × k V \in \mathbb{R}^{d \times k} V∈Rd×k是方向矩阵, ∥ ⋅ ∥ c \|\cdot\|_c ∥⋅∥c​是矩阵各列的向量范数。这种分解确保 V ∥ V ∥ c \frac{V}{\|V\|_c} ∥V∥c​V​的每一列都是单位向量(仅反映方向,与大小无关),而 m m m中的相应标量表示该列的幅度大小。 ∥ W ∥ c \|W\|_c ∥W∥c​表示矩阵W按列的逐向量范数(即对每一列计算向量范数,反映该列的 “强弱程度”)

通俗理解
简单来说,这个公式就是把权重矩阵分解成“强弱程度” 和 “作用方向” 这两个独立的部分,方便我们分别研究它们的变化规律。
把权重更新的 “幅度 - 方向分解” 想象成给模型调整参数的 “操作拆解”,用通俗的方式解释如下: 假设模型的权重是一组 “调整工具”,要让模型适应新任务,就得调整这些工具。

  • 方向矩阵( V V V):可以理解成 “调整的方向”。比如你要把工具往东边挪、往西边调,这个 “东、西” 就是方向。这里通过 把每一列都变成 “单位向量”,就像把方向统一规范成 “标准朝向”,方便对比。
  • 幅度向量( m m m):可以理解成 “调整的力度”。方向确定了,是使劲调(幅度大)还是轻轻调(幅度小),就由 V ∥ V ∥ c \frac{V}{\|V\|_c} ∥V∥c​V​里的标量来决定。
  • 而 LoRA(低秩适应)和 FT(全微调)的区别,就体现在 怎么调整这些 “幅度” 和 “方向” 上:
    LoRA 是 “针对性微调”:只调整部分低秩的 “幅度 - 方向” 组合,就像给工具的某些关键部位小幅度、精准调整。
    FT 是 “全局大调整”:把所有权重的 “幅度” 和 “方向” 都重新调一遍,相当于把工具从头到脚彻底改造。 这种分解的目的,就是把两种方法 “调整模型参数” 的行为拆成 “往哪调(方向)” 和 “调多大劲(幅度)”,从而看清楚它们到底哪里不一样。

LoRA 精度有时不如 FT—— 它在 “精细调整” 上能力不足,比如想大幅调整方向的时候,没法同时灵活调整大小。
既然知道了问题,我们就提出了 DoRA 这个方法:
先把预训练权重拆成 “大小” 和 “方向” 两部分;
对 “方向” 部分再用 LoRA 来微调(因为方向部分参数多,LoRA 能保证高效);同时让 “大小” 部分也能微调。
简单来说,就是让 LoRA 专心搞 “方向调整”,把 “大小调整” 的灵活性也加上,这样就能让 LoRA 的学习模式更接近 FT,精度也能提升。

W W W和 W F T W_{FT} WFT​之间的幅度和方向变化可定义如下:
Δ M F T = ∑ n = 1 k ∣ m F T n − m 0 n ∣ k \Delta M_{FT} = \frac{\sum_{n=1}^{k} \left| m_{FT}^{n} - m_0^{n} \right|}{k} ΔMFT​=k∑n=1k​∣mFTn​−m0n​∣​
可以理解为“平均差异有多大
把训练后的每个权重块 m F T n m_{FT}^{n} mFTn​和原来的权重块 m 0 p m_{0}^{p} m0p​的差异做求和运算,再除以数量k,得到的就是权重整体变化的平均幅度。
Δ D F T = ∑ n = 1 k ( 1 − cos ⁡ ( V F T n , W 0 n ) ) k \Delta D_{FT} = \frac{\sum_{n=1}^{k} \left( 1 - \cos\left( V_{FT}^{n}, W_0^{n} \right) \right)}{k} ΔDFT​=k∑n=1k​(1−cos(VFTn​,W0n​))​
可以理解为 “方向差异有多大
“余弦相似度”( c o s cos cos)能衡量两个权重块的 “方向是否一致”。1减去这个相似度,再求平均,得到的就是权重变化的平均方向差异 。

  • 研究人员用这两个公式,分别从 “幅度” 和 “方向” 两个角度,对比了不同方法(Sung 的方法和 LoRA)在模型权重上的变化,以此来分析哪种方法的训练效果更优。
    -得出结论:LoRA缺乏进行更细微调整的细致能力;不擅长在进行较大幅度改变的同时执行细微的方向变化,同时学习幅度与方向是一个挑战——引出下文提出LoRA的变体——DoRA!

4 方法(Method)

4.1 权重矩阵低秩适应
权重分解低秩适应(DoRA)将预训练权重分解为幅度分量和方向分量,因方向分量参数较多进一步使用LoRA进行分解。(LoRA仅专注于方向适应,简化)
DoRA与权重归一化的不同点是:权重归一化从头开始训练两个组件,而DoRA开始于预训练权重,避免了初始化敏感问题
DoRA的公式:
W ′ = m ⋅ V + Δ V ∥ V + Δ V ∥ F = m ⋅ W 0 + B Δ A ∥ W 0 + B Δ A ∥ F W' = m \cdot \frac{V + \Delta V}{\|V + \Delta V\|_F} = m \cdot \frac{W_0 + B \Delta A}{\|W_0 + B \Delta A\|_F} W′=m⋅∥V+ΔV∥F​V+ΔV​=m⋅∥W0​+BΔA∥F​W0​+BΔA​

DoRA 解决了模型初始化的问题。它先把预训练的权重 W 0 W_0 W0​初始化为两个低秩矩阵 B B B和 A A A的乘积,并将 m = ∥ W 0 ∣ ∣ m={\|W_0||} m=∥W0​∣∣作为可训练的标量参数,通过类似 LoRA 的方式更新方向。
Δ V \Delta V ΔV是由矩阵 B B B和 A A A的增量相乘得到的方向更新。简单来说,就是先拆分预训练权重,再通过可训练参数调整,最后规范权重得到新结果。

在这里插入图片描述

这张图展示了三种模型微调方法(FT、LoRA、DoRA)在查询矩阵(query matrices)上的 更新幅度(ΔM)和更新方向(ΔD)*在不同层(layers 1-6)和中间训练步骤(intermediate steps、final step)的变化情况。

  • 子图(a):FT(全微调)
    横轴为更新方向(ΔD),纵轴为更新幅度(ΔM)。可以看到,随着更新方向ΔD的增大,更新幅度ΔM呈下降趋势。不同颜色代表不同层,不同标记代表不同训练步骤,说明全微调时各层查询矩阵的更新幅度和方向存在一定的关联,且不同层、不同训练步骤的更新特征有差异。
  • 子图(b):LoRA(低秩适应)
    横轴ΔD增大时,纵轴ΔM呈明显上升趋势。这表明LoRA方法下,查询矩阵的更新方向变化与更新幅度变化呈正相关,且相比FT,LoRA的更新幅度整体更高(纵轴范围更大),说明LoRA在查询矩阵上的更新模式与全微调有显著区别,更倾向于大的幅度伴随大的方向变化。
  • 子图©:DoRA
    横轴ΔD增大时,纵轴ΔM呈下降趋势,与FT的趋势类似但数值范围不同。这说明DoRA在查询矩阵的更新幅度和方向的关联模式上,和全微调有一定共性,但具体的数值表现(如幅度的大小范围)有所差异。

综上,这张图通过对比FT、LoRA、DoRA三种方法在查询矩阵更新上的幅度和方向关系,揭示了不同微调方法在模型参数更新模式上的差异,有助于理解它们在训练过程中对模型参数调整的不同特点。

DoRA 在微调时倾向于对预训练权重进行反向调整,其学习模式更接近全量微调,因此具备更优的学习能力。

4.2 DoRA的梯度分析

由上面的公式可推导出损失函数 L L L对幅值 m m m和方向更新后向量 V ′ V' V′的梯度,具体如下:
∇ V ′ L ∝ ( I − V ′ V ′ T ∥ V ′ ∥ F 2 ) ∇ W ′ L \nabla_{V'} L \propto \left( I - \frac{V' V'^T}{\|V'\|_F^2} \right) \nabla_{W'} L ∇V′​L∝(I−∥V′∥F2​V′V′T​)∇W′​L
∇ V ′ L = m ∥ V ′ ∥ c ( I − V ′ V ′ T ∥ V ′ ∥ c 2 ) ∇ W ′ L \nabla_{V'} \mathcal{L} = \frac{m}{\|V'\|_c} \left( I - \frac{V' V'^T}{\|V'\|_c^2} \right) \nabla_{W'} \mathcal{L} ∇V′​L=∥V′∥c​m​(I−∥V′∥c2​V′V′T​)∇W′​L
权重梯度 ∇ W ′ L \nabla_{W'} L ∇W′​L会经过两个处理:一是被 m ∥ V ′ ∥ c \frac{m}{\|V'\|_c} ∥V′∥c​m​缩放,二是被投影到远离当前权重矩阵的方向。这两个作用共同使梯度的协方差矩阵更接近单位矩阵,对优化过程是有利的.

∇ m L = ∇ W ′ L ⋅ V ′ ∥ V ′ ∥ c \nabla_{m} \mathcal{L} = \frac{\nabla_{W'} \mathcal{L} \cdot V'}{\|V'\|_c} ∇m​L=∥V′∥c​∇W′​L⋅V′​
创新点:通过权重分解,将幅值和方向调整解耦,让 LoRA 专注方向的低秩微调,同时放开幅值的可调性,从而提升微调的精细度和效率

  • DoRA 方法核心逻辑
    可以把预训练模型的权重想象成 “一支军队”:“幅值” 是军队的 “兵力强度”,“方向” 是军队的 “进攻路线”。之前的 LoRA 方法要同时调整 “兵力强度” 和 “进攻路线”,就像一个指挥官同时指挥两项复杂任务,容易顾此失彼 —— 比如想微调路线时,兵力也会跟着按比例变化,没法做到 “路线小改、兵力大调整” 或反过来。
    DoRA 的思路是 “分工协作”:让 LoRA 专门负责调整 “进攻路线”(方向),同时单独留出一个可调整的 “兵力控制器”(幅值向量)。这样一来,两个任务互不干扰,指挥官能更精准地优化 —— 比如可以只把路线微调一点,同时大幅加强兵力;或者路线改得很多,兵力只微调。而且 DoRA 的 “初始兵力和路线” 是从预训练模型继承来的,不用从零开始,避免了 “刚组建的军队没经验” 的问题(即权重归一化的初始化敏感问题)。
    另外,DoRA 在推理时能把调整后的 “兵力和路线” 重新合并成原来的权重格式,就像任务结束后军队恢复成标准编制,不会增加额外的 “指挥成本”(推理延迟)。
  • DoRA 学习模式的优势
    全微调(FT)之所以效果好,是因为预训练模型已经有了 “丰富的作战经验”(大量知识),面对新任务时,往往只需要 “要么微调路线,要么调整兵力”,不用两者都大改 —— 比如面对小任务,可能只需要加强兵力,路线稍作调整就行。这种 “一增一减” 的模式,在数据上就表现为 “方向差异( Δ D ΔD ΔD)和幅值差异( Δ M ΔM ΔM)负相关”(负斜率)。
    而 LoRA 因为要同时调两者,只能做到 “路线改多少,兵力也按比例改多少”(正相关,正斜率),灵活性差。DoRA 通过分工,也能实现 FT 那种 “一增一减” 的灵活调整:比如方向改得少(ΔD 小),幅值就能改得多(ΔM 大),反之亦然。从数据上看,DoRA 和 FT 的 ΔD 与 ΔM 都是负相关,而 LoRA 是强正相关,这说明 DoRA 学到了 FT 的 “灵活作战思路”。
  • 梯度分析的通俗理解
    “梯度” 可以理解为 “指挥官的调整指令”—— 告诉军队 “兵力该加多少、路线该改多少”。DoRA 的梯度计算有两个关键作用:
    一是 “校准指令强度”:把指令按当前的 “兵力强度”( m m m)和 “路线合理性”( ∣ ∣ V ′ ∣ ∣ c ||V'||_c ∣∣V′∣∣c​)缩放,避免指令太激进或太保守,让调整更平稳;
    二是 “避免重复调整”:把指令投影到 “远离当前路线” 的方向,防止在同一个方向上反复微调,提升优化效率。
    这种校准后的指令,会让 “路线调整”( Δ V ΔV ΔV)的学习更稳定,不会像 LoRA 那样 “路线和兵力乱同步”。而且从指令逻辑上能直接看出:路线改得少的场景,兵力调整指令会更强;路线改得多的场景,兵力调整指令会更弱 —— 这正好解释了 DoRA 为什么会呈现负斜率的学习模式。
    总结
  • 权重分解低秩适应(DoRA)
    一种参数高效微调(PEFT)方法,核心是将预训练权重矩阵分解为幅值分量(列向量的范数,反映权重的 “强度”)和方向分量(归一化后的列向量,反映权重的 “特征捕捉方向”),并采用 “分工优化” 策略:通过 LoRA 对方向分量进行低秩微调(控制参数规模),同时将幅值分量设为独立可训练向量(提升调整灵活性)。其优势在于:规避权重归一化的初始化敏感性(从预训练权重初始化),实现与全微调(FT)相似的学习模式,且推理时可与预训练权重合并,无额外延迟。
  • 幅值差异( Δ M ΔM ΔM)与方向差异
    ( Δ D ΔD ΔD)
    Δ M ΔM ΔM:衡量微调后权重与预训练权重在幅值分量上的平均差异,计算公式为 “各列幅值绝对差的平均值”,反映权重 “强度调整的整体幅度”;
    Δ D ΔD ΔD:衡量微调后权重与预训练权重在方向分量上的平均差异,通过 “1 减去各列余弦相似度” 的平均值计算(余弦相似度越接近 1,方向越一致),反映权重 “特征捕捉方向的偏离程度”。
    两者的相关性是判断学习模式的关键指标:FT 与 DoRA 呈负相关(灵活调整,一增一减),LoRA 呈强正相关(同步比例调整,灵活性差)。
  • 梯度投影与缩放
    DoRA 梯度计算中的两个核心操作,用于优化方向分量( Δ V ΔV ΔV)的学习:
    缩放:通过 m ∥ V ′ ∥ c \frac{m}{\|V'\|_c} ∥V′∥c​m​对权重梯度
    ∇ W ′ L \nabla_{W'} L ∇W′​L进行缩放,使梯度强度与当前幅值、方向的 “合理性” 匹配,避免优化震荡;
    投影:通过
    将梯度投影到方向分量的正交空间,消除冗余梯度(避免在当前方向上重复更新),使方向调整更高效。这两个操作共同使梯度协方差矩阵接近单位矩阵,提升优化稳定性与收敛速度。
  • 学习模式的定量表征
    通过( Δ D , Δ M ΔD,ΔM ΔD,ΔM)的回归斜率与相关系数定量区分不同微调方法的学习特征:
    LoRA:正斜率( Δ D ΔD ΔD 与 Δ M ΔM ΔM正相关,相关系数≈0.83),表现为 “方向与幅值同步比例更新”,调整粒度粗;
    FT 与 DoRA:负斜率( Δ D ΔD ΔD与 Δ M ΔM ΔM负相关,相关系数分别为 - 0.62 和 - 0.31),表现为 “方向与幅值互补灵活更新”,调整粒度细,更适配下游任务对权重的精细需求。
    DoRA 能够调整学习模式,摆脱 LoRA 的正斜率模式,更接近 FT 的学习模式

4.3 训练开销的降低

  1. 核心问题:在标准 LoRA公式中,更新后权重 W W W与权重增量的梯度具有一致性;而 DoRA 将低秩适应定向于方向分量,导致低秩更新的梯度与 W ′ W' W′的梯度产生差异(如公式 6 所示),该差异在反向传播过程中引发额外内存开销。
  2. 优化策略:在 DoRA 的训练开销优化中,需将 ∥ V + Δ V ∥ c \|V + \Delta V\|_c ∥V+ΔV∥c​ 视为常数以降低内存消耗。视为常数,使其从梯度计算图中分离(即反向传播时不接收梯度)。此修改下,幅值分量 m m m的梯度保持不变,方向分量 V ′ V' V′的梯度被重新定义为: ∇ V L = m C ∇ W ′ L \nabla_V \mathcal{L} = \frac{m}{C} \nabla_{W'} \mathcal{L} ∇V​L=Cm​∇W′​L(其中 C = ∥ V ′ ∥ c C = \|V'\|_c C=∥V′∥c​)。
  3. 效果验证:通过对 LLaMA-7B 和 VL-BART 模型的消融实验表明,该优化可使 LLaMA 微调时训练内存降低约 24.4%,VL-BART 降低约 12.4%;且精度损失极小 ——VL-BART 精度完全不变,LLaMA 精度仅较未修改版本下降 0.2。
  4. 后续应用:因该优化在内存节省与精度保持间实现高效平衡,后续所有 DoRA 相关实验均采用此调整策略

5 实验(Experiments)

常识推理任务
单模态拓展到多模态
消融实验

结论:无论微调训练样本数量多少、秩的取值如何变化,DoRA 的性能均优于 LoRA

5.1 常识推理

常识推理任务包含 8 个子任务,每个子任务都有预先定义好的训练集和测试集。将这 8 个子任务的训练集合并构建最终的训练集,并在每个子任务各自的测试集上进行评估。
为确保对比的公平性,研究人员最初按照 LoRA 的配置对 DoRA 模型进行微调:保持秩(rank)参数一致,仅调整学习率。

在这里插入图片描述

实验表格说明:
这张表格展示了不同大语言模型(LLaMA 7B/13B、LLaMA2 7B、LLaMA3 8B)在采用各种参数高效微调(PEFT)方法后,在八个常识推理数据集上的准确率对比,可从以下几个维度解读:

1. 模型与PEFT方法的性能差异

  • 不同PEFT方法(Prefix、Series、Parallel、LoRA、DoRA、DoRAⁱ)对同一模型的性能提升效果不同。例如,LLaMA-7B采用DoRA(Ours)时,在多个数据集(如HellaSwag、ARC-e、OBQA等)的表现优于LoRA、Prefix等方法,平均准确率(Avg.)达到78.4,是该模型下PEFT方法中的最优表现。
  • 不同模型规模的性能差距明显。如LLaMA-13B的整体表现优于LLaMA-7B,LLaMA3-8B在多数数据集上又优于LLaMA2-7B,体现了模型规模对常识推理能力的影响;同时结合PEFT方法后,大模型的性能优势进一步凸显。

2. DoRA方法的优势

  • 无论是DoRA还是其调整版本DoRAⁱ(秩减半),在多个模型(LLaMA-7B/13B、LLaMA2-7B、LLaMA3-8B)上的表现都较为突出,平均准确率往往高于LoRA等其他PEFT方法。例如,LLaMA3-8B采用DoRA(Ours)时平均准确率达到85.2,是该模型组中PEFT方法的最优结果,甚至接近ChatGPT的77.0(需注意ChatGPT是闭源大模型,架构与训练目标不同)。

3. 参数量占比与性能的权衡

  • PEFT方法的参数量占比# Params (%)较低(如DoRAⁱ普遍在0.35-0.43%左右),但能带来显著的性能提升,体现了参数高效微调在“少参数量消耗,高性能提升”上的优势。例如,LLaMA-7B的DoRAⁱ参数量占比仅0.43%,平均准确率却达到77.5,接近ChatGPT的77.0,说明该方法在效率与效果上的平衡较好。

4. 数据集与任务的普适性

  • 表格覆盖了多种常识推理任务数据集(BoolQ、PIQA、SIQA、HellaSwag、WinoGrande、ARC-e、ARC-c、OBQA),DoRA在这些不同类型的常识推理任务上均表现出稳定的优势,说明其在常识推理场景下的普适性较强。

综上,这张表格清晰地对比了不同大语言模型在采用各类PEFT方法后的常识推理能力,突出了DoRA系列方法在参数效率和性能表现上的双重优势,同时也展示了模型规模、PEFT方法对常识推理任务的影响,为选择常识推理场景下的大模型微调策略提供了数据支撑。

5.2 图像/视频-文本理解(多模态微调)

在这里插入图片描述

Table 2(图像 - 文本多任务评估)

  • 参数量占比:LoRA 和 DoRA 的参数量占比仅约 5.9%,远低于全微调(FT)的 100%,体现了参数高效微调的 “低参量消耗” 优势。
  • 参数量占比:LoRA(5.17%)和 DoRA(5.19%)的参数量占比远低于全微调(100%),同样体现参数高效性。
  • 性能表现:DoRA 的平均准确率(85.4)超过 LoRA 的 83.5,且在 TVQA(76.3)、How2QA(74.1)、TVC(45.8)、YC2C(145.4)的表现均优于 LoRA,部分任务(如 TVQA)甚至与全微调性能持平。
    核心结论
    在以 VL-BART 为骨干的多模态(图像 - 文本、视频 - 文本)任务中,DoRA 在参数量占比远低于全微调的前提下,性能表现优于 LoRA,且接近或达到全微调的水平,证明了 DoRA 在多模态参数高效微调场景下的有效性,实现了 “低参量消耗” 与 “高性能表现” 的平衡。

性能表现:DoRA 在平均准确率(Avg.)上达到 77.4,超过 LoRA 的 76.5,且接近全微调的 77.3;在具体任务中,DoRA 在 VQA (65.8)、GQA(54.7)、NVLR (73.1)、COCO Caption(115.9)的表现均优于 LoRA,部分指标接近甚至超过全微调。

在这里插入图片描述


Table 3(视频 - 文本多任务评估)

5.3 视觉指令微调

在这里插入图片描述

实验结论
从表中可以观察到,LoRA 的平均准确率已经超过了全微调(FT),这可能意味着全微调(FT)存在过拟合问题。由于 DoRA 的设计初衷是提升 LoRA 的性能,使其更接近全微调(FT)的水平,因此在全微调(FT)性能不如 LoRA 的场景下,DoRA 相对 LoRA 的性能提升幅度,可能不会像在其他 “全微调(FT)通常优于 LoRA” 的实验中那样显著。尽管如此,DoRA 仍然表现仍优于LoRA和全微调(FT):相较于LoRA,平均性能提升0.7%;相较于FT,平均性能提升1.1%。

5.4 DoRA与其他LoRA变体的兼容性

在这里插入图片描述

W的变化量通过不同的 LoRA 变体进行调整。对于 DoRA,引入的增量方向更新V的变化量这一概念同样可替换为其他 LoRA 变体。
DVoRA融合了DoRA的优势特质,得分与 LoRA 相当甚至更高,但参数数量明显更少
无论训练样本如何,DoRA相较于LoRA和VeRA都能持续提升性能。

在这里插入图片描述


使用不同数量的 Alpaca 训练样本对 LLaMA2-7B 模型进行微调后,该模型在 MT-Bench 基准测试中的性能表现。
研究人员在图 3 中可视化了各方法在 LLaMA2-7B 模型上的平均性能,在附录的图 7 中可视化了各方法在 LLaMA-7B 模型上的平均性能。结果显示,在所有训练样本量设置下,DoRA 始终优于 LoRA,DVoRA 始终优于 VeRA。例如,当使用 7000 条训练样本时,DoRA 相较于 LoRA 的性能提升幅度为 0.3,DVoRA 相较于 VeRA 的性能提升幅度为 0.33;即便将样本量减少至 1000 条,DoRA 仍能以 0.29 的优势领先 LoRA,DVoRA 仍能以 0.22 的优势领先 VeRA。这表明,无论训练样本量大小,我们提出的方法(DoRA 和 DVoRA)相较于 LoRA 和 VeRA,均能持续提升模型性能。

5.5 DoRA在不同秩设置下的鲁棒性

在这里插入图片描述


在常识推理任务中,不同秩(rank)设置下,LoRA 与 DoRA 方法对 LLaMA-7B 模型微调后的平均准确率。

在这里插入图片描述


研究表明,在所有秩配置下,DoRA的性能始终超过LoRA。值得注意的是,当秩低于8时,性能差距会扩大,此时对于 ( r = 8 ) (r=8) (r=8),LoRA的平均准确率降至40.74%;对于 ( r = 4 ) (r=4) (r=4),其平均准确率为39.49%。相比之下,对于 ( r = 8 ) (r=8) (r=8),DoRA保持着77.96%的显著准确率;对于 ( r = 4 ) (r=4) (r=4),其准确率为61.89%。这表明,无论秩设置如何,DoRA都具有更强的稳健性,且性能始终优于LoRA

5.6 调优粒度分析

DoRA可以仅通过更新特定模块的幅度和方向分量,来减少可训练参数的数量


6 更广泛的影响(Broader Impacts)

6.1 QDoRA:对QLoRA的增强

在这里插入图片描述


在 Orca-Math 数据集(Mitra 等人,2024)上,LLaMA2-7B/LLaMA3-8B 模型分别采用 QDoRA、QLoRA 与全微调(FT)方法后的准确率对比。

为了进一步较低微调的内存需求,QDoRA建议将预训练模型量化为4位,并在冻结的低位骨干网络之上对LoRA进行微调
QDoRA能够有效地将QLoRA的参数效率与全微调更精细的优化相结合——QDoRA具有很大潜力,通过大幅降低微调大型语言模型的GPU内存需求给开源社区带来极大益处。

6.2 文本到图像生成

DoRA相对于LoRA的优势能够延伸至图像生成任务中


7 结论(Conclusion)

研究人员首先进行了一种新颖的权重分解分析,以揭示LoRA和FT之间不同的学习模式。基于这些见解,我们提出了DoRA——一种与LoRA及其变体兼容的微调方法,其学习行为与FT更为相似。在各种微调任务和模型架构上,DoRA的性能始终优于LoRA。具体而言,DoRA在常识推理和视觉指令调优任务上比LoRA有所改进。此外,在Alpaca指令调优任务上,DoRA与VeRA也表现出兼容性。而且,DoRA可以被视为LoRA的一种无成本替代方案,因为其分解后的幅度和方向分量在训练后可以合并回预训练权重中,确保没有额外的推理开销。对于未来的工作,希望能探索DoRA在语言和视觉之外领域的通用性,特别是在音频领域。


论文代码分析及创新点

classLinear(nn.Linear, LoraLayer):# Lora implemented in a dense layerdef__init__( self, in_features:int,#输入维度 out_features:int,#输出维度 r:int=0, lora_alpha:int=1,#LoRA的缩放因子 lora_dropout:float=0.0, fan_in_fan_out:bool=False,# Set this to True if the layer to replace stores weight like (fan_in, fan_out) merge_weights:bool=True, Wdecompose:bool=False,#是否仅微调幅度->DoRA完整模式 dora_simple:bool=True,#是否使用简化模式(节省内存)**kwargs,): nn.Linear.__init__(self, in_features, out_features,**kwargs)#初始化标准线性层(预训练权重 W) LoraLayer.__init__(self, r=r, lora_alpha=lora_alpha, lora_dropout=lora_dropout, merge_weights=merge_weights)#初始化 LoRA 层基类(设置 r、alpha、dropout 等) self.weight_m_wdecomp = nn.Linear(1,out_features,bias=False)# self.weight_m_wdecomp.weight # shape: out_features, 1 #定义可学习的幅度向量 m,形状为 (out_features, 1) 每个输出神经元对应一个幅度标量 self.fan_in_fan_out = fan_in_fan_out self.Wdecompose = Wdecompose # whether to tune only the magnitude component of Wdecompose or not self.dora_simple = dora_simple # whether to use dora simple to save up GPU memoryif self.Wdecompose ==False:#Wdecompose=False 时创建 LoRA 矩阵用于方向更新if r >0: self.lora_A = nn.Linear(in_features, r, bias=False) self.lora_B = nn.Linear(r, out_features, bias=False)#分解成两个低秩矩阵 self.scaling = self.lora_alpha / self.r #LoRA 的缩放# Freezing the pre-trained weight matrix self.weight.requires_grad =False#冻结预训练权重 self.reset_parameters()#初始化可训练参数if fan_in_fan_out:#处理权重矩阵的转置 self.weight.data = self.weight.data.T defreset_parameters(self): nn.Linear.reset_parameters(self)#初始化基础线性层ifhasattr(self,"lora_A"):# initialize A the same way as the default for nn.Linear and B to zero nn.init.kaiming_uniform_(self.lora_A.weight, a=math.sqrt(5))#lora_A使用kaiming初始化 nn.init.zeros_(self.lora_B.weight)#lora_B初始化为零,保证训练开始时不改变输出deftrain(self, mode:bool=True):#训练模式切换 nn.Linear.train(self, mode)if self.Wdecompose ==False: self.lora_A.train(mode) self.lora_B.train(mode) self.weight_m_wdecomp.train(mode)ifnot mode and self.merge_weights andnot self.merged:#判断是否执行权重合并(not mode:从训练模式切换为评估模式 self.merge_weights:启用了权重合并 not self.merged:尚未合并过)# Merge the weights and mark itif self.Wdecompose:#判断是否为仅幅度模式(仅微调幅度,不更新方向) norm_scale =( self.weight_m_wdecomp.weight /(torch.linalg.norm(self.weight,dim=1)).unsqueeze(1))#数学分解: # self.weight_m_wdecomp.weight:形状 (out_features, 1),可学习幅度 m # torch.linalg.norm(self.weight, dim=1):每行 L2 范数,形状 (out_features,),原始幅度 ||W|| # unsqueeze(1):变为 (out_features, 1) # norm_scale = m / ||W||:缩放比例 weight = norm_scale * self.weight #更新权重矩阵为 W' = norm_scale × W 保持方向不变,按学习到的幅度缩放 self.weight.data.copy_(weight.detach())else:if self.r >0:#完整的DoRA模式 new_weight_v = self.weight + transpose(self.lora_B.weight @ self.lora_A.weight, fan_in_fan_out=self.fan_in_fan_out)* self.scaling #第一步:计算更新后的方向向量 new_weight_v = W + transpose(BA) * scaling=W+ΔW#self.lora_B.weight @ self.lora_A.weight即上文中LoRA 更新的 ΔW = BA#* self.scaling:应用 LoRA 缩放因子(lora_alpha / r) ,控制更新强度# LoRA 的权重更新公式为:ΔW = (lora_alpha / r) × (B × A) weight =( self.weight_m_wdecomp.weight /(torch.linalg.norm(new_weight_v,dim=1)).unsqueeze(1))* new_weight_v #第二步:计算幅度缩放并应用#weight = (m / ||new_weight_v||) * new_weight_v#torch.linalg.norm(new_weight_v, dim=1):计算更新后方向的每行 L2 范数 #m / ||new_weight_v||:归一化幅度比例 将学习到的幅度 m 应用到更新后的方向 self.weight.data.copy_(weight.detach())#第三步:更新权重,将合并后的权重写回 self.merged =True#标记已合并,避免重复合并elif self.merge_weights and self.merged:raise NotImplementedError #如果已合并但尝试再次合并,抛出异常#完成之后的DoRA公式:W_final = (m / ||W + ΔW||) × (W + ΔW),既通过LoRA更新了方向,又调整了幅度(可学习的m),实现了DoRA的权重分解适配#创新点;只训练幅度参数和低秩LoRA矩阵,参数量远小于全量微调;可以单独调整幅度或同时调整幅度和方向;评估时合并到原始权重,推理时无需额外计算defeval(self):#将模块及其子模块设置为评估模式 nn.Linear.eval(self)#设置基础线性层为evalif self.Wdecompose ==False:#若为完整DoRA(非仅幅度),将LoRA的A,B设置为eval self.lora_A.eval() self.lora_B.eval() self.weight_m_wdecomp.eval()#将可学习的幅度设置为evaldefforward(self, x: torch.Tensor): previous_dtype = self.weight.dtype if self.disable_adapters:raise NotImplementedError elif self.Wdecompose andnot self.merged:#仅幅度模式 norm_scale = self.weight_m_wdecomp.weight.view(-1)/(torch.linalg.norm(self.weight,dim=1))#norm_scale = m / ||W||:可学习幅度 m 与原始权重每行 L2 范数的比值 org_result =(F.linear(x, transpose(self.weight, self.fan_in_fan_out)))#org_result = W × x:原始权重输出 result = org_result +(norm_scale-1)*(F.linear(self.lora_dropout(x), transpose(self.weight, self.fan_in_fan_out)))#result = org_result + (norm_scale-1) × W × dropout(x):等价于 (m/||W||) × W × x,仅调整幅度,方向不变ifnot self.bias isNone: result += self.bias.view(1,-1).expand_as(result)elif self.r >0andnot self.merged:#完整DoRA模式 new_weight_v = self.weight +(self.lora_B.weight @ self.lora_A.weight)* self.scaling #第一步:计算更新后的方向向量 new_weight_v = W + (B @ A) * scaling = W + ΔWif self.dora_simple: norm_scale = self.weight_m_wdecomp.weight.view(-1)/(torch.linalg.norm(new_weight_v,dim=1)).detach()#对范数使用.detach()节省内存else: norm_scale = self.weight_m_wdecomp.weight.view(-1)/(torch.linalg.norm(new_weight_v,dim=1))#第二步:计算幅度缩放比例 norm_scale = m / ||new_weight_v|| org_result =(F.linear(x, transpose(self.weight, self.fan_in_fan_out)))#第三步:构建前向传播结果 452行是原始输出(上面) org_result = W × x dropout_x = self.lora_dropout(x)#456行是幅度调整项 (norm_scale - 1) × W × dropout(x)等价于 (m/||new_weight_v|| - 1) × W × x,调整原始权重的幅度 result = org_result +(norm_scale-1)*(F.linear(dropout_x, transpose(self.weight, self.fan_in_fan_out)))ifnot self.bias isNone: result += self.bias.view(1,-1).expand_as(result)#461行是方向更新项 norm_scale × (B(A(dropout_x))) × scaling 等价于 (m/||new_weight_v||) × ΔW × x,应用方向更新并缩放幅度 result +=( norm_scale *(self.lora_B(self.lora_A(dropout_x.to(self.lora_A.weight.dtype)))))* self.scaling #数学等价形式:result = W×x + (m/||W+ΔW|| - 1)×W×x + (m/||W+ΔW||)×ΔW×x# = (m/||W+ΔW||) × (W + ΔW) × x# = (m/||new_weight_v||) × new_weight_v × x#此乃 DoRA 公式:W_final = (m / ||V||) × V,其中 V = W + ΔW#创新点:分解式更新,将权重分解为方向和幅度分别更新;内存优化,对范数使用了.detach()减少显存;增量计算,通过org_result + (norm_scale-1) × ... 实现增量更新,而非直接计算完整权重else: result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias)#权重已合并或未启用 DoRA,直接使用标准线性层if result.dtype != previous_dtype: result = result.to(previous_dtype)#类型一致性检查和转换,确保输出dtype与输入权重一致return result #输出最终结果#DoRA 的核心实现在 Linear 类(338-473行),包含: # 1. 权重分解:W = m × V,其中 m 为可学习幅度,V 为方向向量 # 2. 方向更新:通过 LoRA 更新 V = W + ΔW,其中 ΔW = (B @ A) × scaling # 3. 幅度学习:通过 weight_m_wdecomp 学习幅度参数 m # 4. 最终公式:W_final = (m / ||W + ΔW||) × (W + ΔW)

Read more

Axum: Rust 好用的 Web 框架

Axum: Rust 好用的 Web 框架

Axum 是 Rust 生态中基于 Tokio 异步运行时和 Tower 中间件体系打造的高性能 Web 框架,以“类型安全、无宏入侵、轻量高效”为核心优势,广泛应用于云原生、微服务、API 网关等场景。它摒弃了传统 Web 框架的宏魔法,完全依赖 Rust 的类型系统实现路由匹配、请求解析、响应处理,兼顾了开发效率与运行性能。 本文将从环境搭建、核心概念、路由设计、请求处理、中间件开发到生产级实战,全方位拆解 Axum 的使用技巧,每个知识点均配套可运行的示例代码,帮助开发者从入门到精通,快速构建高性能的 Rust Web 应用。 一、环境准备与项目初始化 1.1 前置条件 * 安装 Rust 环境:

5分钟部署Meta-Llama-3-8B-Instruct,vLLM+Open-WebUI打造智能对话应用

5分钟部署Meta-Llama-3-8B-Instruct,vLLM+Open-WebUI打造智能对话应用 1. 快速上手:为什么选择 Meta-Llama-3-8B-Instruct? 你是否也遇到过这样的问题:想本地跑一个大模型做对话系统,但显存不够、部署复杂、界面难用?今天这篇文章就是为你准备的。 我们聚焦 Meta-Llama-3-8B-Instruct —— 这是 Meta 在 2024 年 4 月推出的中等规模指令微调模型,参数量为 80 亿,专为高质量对话和任务执行优化。它不仅支持 8k 上下文长度,还能在单张消费级显卡(如 RTX 3060)上流畅运行,尤其适合英文场景下的智能助手、代码辅助、内容生成等应用。 更重要的是,通过 vLLM + Open-WebUI 的组合,我们可以实现: * 高性能推理(vLLM 提供 PagedAttention 和连续批处理) * 友好交互界面(Open-WebUI

告别“打字机”:Generative UI 如何重塑 AI 时代的前端交互?

告别“打字机”:Generative UI 如何重塑 AI 时代的前端交互?

自从大语言模型(LLM)爆发以来,前端开发者接到了无数“给系统加个 AI 对话框”的需求。我们熟练地接入 API,处理流式(Streaming)响应,看着文字像打字机一样一个个蹦出来。 但这真的是 AI 时代前端交互的终点吗? 想象一下这个场景:用户问“帮我对比一下苹果和微软的近期股价”。传统的聊天机器人只能吐出一堆干瘪的文字,或者勉强渲染一个 Markdown 表格。但作为一名前端工程师,你的组件库里明明躺着精美的 Echarts K线图、带有交互提示的卡片和丝滑的动画。 为什么我们不能让大模型直接“生成”一个可交互的 React 或 Vue 组件呢?答案是:可以。这就是目前前端领域最具颠覆性的范式——Generative UI(生成式 UI)。 什么是 Generative UI? Generative UI 是指结合 AI