大模型高效微调DoRA:LoRA升级版技术
将预训练权重分解为幅度和方向两个独立部分,仅对方向施加低秩更新,幅度单独调整,从而实现更精细的模型微调。相比LoRA,DoRA在保持参数高效的同时,提升了学习能力与控制精度,在常识推理、视觉指令调整等任务中表现更优,且推理成本未增加。
在模型微调这件事上,学术界一直在试图找到一个平衡点——既要足够灵活,又要尽量节省参数。这也就解释了为什么像LoRA这类方法会受到如此多的关注。但即便LoRA已经足够优秀,它仍然存在一些结构性上的局限。而DoRA的出现,一定程度上补上了这个缺口。

DoRA的全称是Weight-Decomposed Low-Rank Adaptation。它最大的突破点在于:把预训练权重拆成了“幅度”和“方向”两个独立的部分,然后只对方向部分施加LoRA更新,幅度则单独调整。这样一来,模型在微调时的学习过程就被拆解得更精细——就像调节音量(幅度)和调音色(方向)分成了两个旋钮,可以分别微调。
LoRA回顾
要理解DoRA,先得清楚LoRA到底做了什么。简单来说,LoRA就是用一个低秩分解来近似大矩阵的更新——把一个大权重矩阵拆成两个小矩阵的乘积。
看段代码会更直观:
import torch
import torch.nn as nn
import torch.nn.functional as F
class LoRALayer(nn.Module):
def __init__(self, in_dim, out_dim, rank, alpha):
super().__init__()
std_dev = 1 / torch.sqrt(torch.tensor(rank).float())
self.A = nn.Parameter(torch.randn(in_dim, rank) * std_dev)
self.B = nn.Parameter(torch.zeros(rank, out_dim))
self.alpha = alpha
def forward(self, x):
x = self.alpha * torch.matmul(torch.matmul(x, self.A), self.B)
return x
class LinearWithLoRAMerged(nn.Module):
def __init__(self, linear, rank, alpha):
super().__init__()
self.linear = linear
self.lora = LoRALayer(linear.in_features, linear.out_features, rank, alpha)
def forward(self, x):
lora = torch.matmul(self.lora.A, self.lora.B)
combined_weight = self.linear.weight + self.lora.alpha * lora.T
return F.linear(x, combined_weight, self.linear.bias)
看上去很简洁对吧?但就是这种“拆小再合”的思路,大幅降低了全量微调的计算成本。
DoRA
DoRA的核心组成可以拆成以下几个层次:
权重分解:将每个预训练权重矩阵先分解成幅度向量(magnitude)和方向矩阵(direction)。这里的关键在于,分解后的两个组件在微调时可以各司其职。
幅度和方向分别调整:幅度决定权重整体的大小,方向决定权重的走向。DoRA对这两部分独立调整,互不干扰。
方向更新用LoRA:在更新方向部分时,DoRA沿用了LoRA的低秩适配手段,只更新方向相关的参数。
混合权重构建:最终的权重由调整后的幅度m和经过LoRA更新的方向V组合而成:W' = m * (V + ∆V) / ||V + ∆V||c。
模块选择策略:在微调过程中,DoRA并不是对所有模块都一视同仁。比如对QKV模块,它同时调整幅度和方向;而对MLP等线性层,则只微调幅度。这种粒度控制,既提升了性能,又减少了参与训练的参数数量。
综合来看,DoRA通过权重分解和定向低秩适配,在保持全量微调学习能力的同时,还做到了参数效率的优化。从NLP到跨模态任务,它的表现普遍优于传统LoRA。
具体实现上,代码也不复杂:
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(0)
class DoRALayer(nn.Module):
def __init__(self, d_in, d_out, rank=4, weight=None, bias=None):
super().__init__()
if weight is not None:
self.weight = nn.Parameter(weight, requires_grad=False)
else:
self.weight = nn.Parameter(torch.Tensor(d_out, d_in), requires_grad=False)
if bias is not None:
self.bias = nn.Parameter(bias, requires_grad=False)
else:
self.bias = nn.Parameter(torch.Tensor(d_out), requires_grad=False)
self.m = nn.Parameter(self.weight.norm(p=2, dim=0, keepdim=True))
std_dev = 1 / torch.sqrt(torch.tensor(rank).float())
self.lora_A = nn.Parameter(torch.randn(d_out, rank) * std_dev)
self.lora_B = nn.Parameter(torch.zeros(rank, d_in))
def forward(self, x):
lora = torch.matmul(self.lora_A, self.lora_B)
adapted = self.weight + lora
column_norm = adapted.norm(p=2, dim=0, keepdim=True)
norm_adapted = adapted / column_norm
calc_weights = self.m * norm_adapted
return F.linear(x, calc_weights, self.bias)
DoRA相比LoRA的优势
聊完原理,我们来看看DoRA在实际表现中到底比LoRA好在哪里。根据已有的实验数据,在常识推理、视觉指令调整、图像/视频文本理解等下游任务中,微调LLaMA、LLaVA、VL-BART等模型时,DoRA几乎全面优于LoRA。
具体优势可以归纳为四点:
更精准的控制:把权重拆成幅度和方向后,模型可以针对任务需求做更细颗粒度的适配。
学习能力更强:这种分解策略放大了模型在微调阶段的可塑性,无论是小模型还是大模型,DoRA的表现都更接近全参数微调。
维持高效性:虽然策略上做了创新,但并没有带来额外的推理成本——本质还是低秩更新的路子。
训练更稳定:通过将权重分解并单独对方向做低秩适应,DoRA有效抑制了过拟合和训练过程的不稳定因素。
说到底,DoRA并不是碘伏性的方法论创新,而是在LoRA这条被验证过的路径上做了一个非常巧妙的结构优化。正是这种“再精细一点”的思维,让它在兼顾效率的同时,把性能又往前推了一步。
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:大模型高效微调DoRA:LoRA升级版技术要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点面壁智能聚焦端侧AI,不拼参数大小,而是通过知识密度提升与模型风洞技术,将大模型压缩至手机、汽车等设备。其MiniCPM以2B参数超越同期8B对手。CTO曾国洋22岁主导训练中国首个大语言模型CPM-1。端侧AI追求“默契系统”,在用户开口前预判需求,已在吉利、上汽大众等车型落地应用。
印度IT巨头HCLTech投资最高350亿卢比建设AI数据中心,容量可扩展至50MW,提供从设计到运营的端到端服务,旨在满足政府及企业日益增长的算力需求,抢占印度快速增长的数据中心市场,并推动AI基础设施布局。
小米具身机器人在汽车工厂自攻螺母上件工站实现双侧作业成功率98%,接近人工水平。同时在新工站分别达到90%成功率,从单一操作拓展至多工站协同,验证了具身智能在复杂工业环境的落地能力。
全球AI行业正迎来新的财富格局,DeepSeek创始人梁文锋凭借其公司的迅猛发展,个人财富急剧膨胀,一举超越多位硅谷知名人物,成为全球AI公司领域的新首富。以下将详细解析其身价飙升背后的关键因素及公司发展历程。 一、身价飙升至360亿美元,超越多位AI大佬 根据最新彭博亿万富豪指数,DeepSeek
- 日榜
- 周榜
- 月榜
热点快看
