@0xSero: Highly recommended educational content. LoRA is one of the coolest things to dabble in, lets anyone fine tune models re…
摘要
本文详细介绍了 LoRA 及其变体(QLoRA、VeRA、DoRA)的原理,解释了如何通过低秩分解减少可训练参数,实现高效微调大型模型。
查看缓存全文
缓存时间: 2026/06/23 08:04
Highly recommended educational content. LoRA is one of the coolest things to dabble in, lets anyone fine tune models relatively cheap.
https://t.co/SLU3GF9R3z
TL;DR: LoRA 通过将权重更新分解为两个低秩矩阵,极大减少了可训练参数;QLoRA 用 4 位量化冻结模型,使 700 亿参数模型也能在单卡 48GB GPU 上微调;VeRA 共享随机方向并只训练缩放向量,参数更少;DoRA 分离方向和大小,行为更接近全参数微调。
背景:全参数微调的成本
现代 AI 模型规模极大,从大语言模型到图像生成、蛋白质结构预测,动辄数百亿参数。预训练模型虽通用,但常需适配法律、金融、医疗等特定领域。全参数微调——更新每个权重——极其昂贵。对于一个 700 亿参数的模型,仅权重在 16 位精度下就需要约 140 GB 空间。若每个任务都保存一个完整副本,存储很快变得难以管理。
参数高效适配(Parameter-Efficient Fine-Tuning,PEFT)应运而生,核心思想是在冻结大模型的同时,只训练少量新增参数。LoRA 是其中最流行的方法之一。
LoRA:低秩适配
为什么关注线性层?
Transformer 中大量计算集中在线性层:注意力中的 Query、Key、Value 投影,前馈网络中的扩展与收缩。这些层都执行 Y = W * X,其中 X 是输入,W 是权重矩阵,Y 是输出。
不直接微调所有独立权重,而是冻结原始权重矩阵 W₀,添加一个可训练的新矩阵 ΔW,作为任务特定的修正项。微调后可将 ΔW 与 W₀ 合并(W₀ + ΔW),推理时速度与原始模型一致。但这仍未解决核心问题——ΔW 依然很大。
低秩假设
关键洞察:任务可能只需模型在少数重要方向上移动,即 ΔW 具有低秩结构。
例如一个 6×6 矩阵(36 个数字),实际上列向量冗余:仅前两列 C₁、C₂ 是独立的,其余各列都是它们的线性组合。于是可将矩阵分解为 6×2 和 2×6 两个小矩阵,乘积与原矩阵相同。这里的“2”就是秩。
应用到权重更新上:不直接学习大的 ΔW,而是学习两个小矩阵 B(高大细长)和 A(矮小扁平),使 ΔW = B × A。这称为低秩适配(Low-Rank Adaptation, LoRA)。可训练参数数量锐减。实践中用 α / 秩 缩放更新强度,使改变秩时更新大小大致稳定,无需重调学习率。
直观解释:局部关联记忆
将 B 和 A 分解为行向量和列向量,则 ΔW 可写成向量外积的和。行向量 A₁、A₂ 相当于“键”,列向量 B₁、B₂ 相当于“值”。输入 X 与键的点积衡量对齐程度,若被激活,则加上对应的值。例如在医学文献上微调通用模型,A₁ 可能检测心脏病,B₁ 添加心脏病学知识;A₂ 检测糖尿病,B₂ 添加糖尿病知识。若输入与领域无关,匹配度低,修正接近零。因此 LoRA 像一种局部关联记忆——基础模型保留通用知识,LoRA 添加紧凑的任务特定记忆。不同任务可共享同一冻结主干,只替换适配器,甚至组合多个适配器并调整贡献。
初始化策略
训练开始时,适配器不应改变模型输出,否则会干扰预训练知识。若 B 和 A 都随机初始化,ΔY 通常不为零。理想情况是初始 ΔY = 0。
若 B 和 A 都设为 0,则梯度消失。于是:一个矩阵随机,另一个为零。LoRA 默认采用 随机 A、零 B。
- 随机 A 提供多样化的初始特征方向,零 B 确保初始修正为零。
- 第一步中 B 无梯度,A 开始学习;之后两者均可正常更新。
另一种方案(随机 B、零 A)也有效,但随机 A 能更早提供丰富特征。
LoRA+:不同的学习率
矩阵 A 将宽输入映射到少数维度(投影下),矩阵 B 将少数维度映射回完整输出空间(投影上)。两者尺度差异大,若使用相同学习率,B 往往训练不足。LoRA+ 为 A 分配较小学习率,为 B 分配较大学习率,使两矩阵以匹配速度学习,带来更快收敛和更好性能,且无需额外参数。
内存挑战与 QLoRA
即便 LoRA 可训练参数很少,基础模型本身仍占大量内存。例如 700 亿参数模型 16 位精度下 140 GB,而秩 64 的适配器(适配所有线性层)只有约 5.87 亿参数(不到 1%),16 位仅需 1.17 GB。但单卡放不下整个冻结模型。
量化 是解决方案:将冻结的预训练权重以低精度存储,计算时反量化到更高精度做矩阵乘法,只有适配器保持全精度可训练。这样整个微调可放进单张 48 GB GPU。这就是量化 LoRA(Quantized LoRA, QLoRA)。
4 位量化:NF4
以 4 位为例,只有 16 种编码。神经网络权重通常关于零对称,且零需精确表示。若使用对称的有符号整数(-8 到 7),可去掉 -8 以保证对称性(-7 到 7),零恰好被编码。但这样浪费了一个槽位。
更好的方法是用 分位数量化:针对零均值正态分布放置级别,使每个桶包含相等比例的权重。权重密集的零附近桶窄,尾部桶宽。保留所有 16 个非均匀级别。因 16 是偶数,没有级别恰好落在零,所以非对称构建:-1 到 0 有 8 个级别,0 到 1 有 9 个,两个半区都包含零,去除重复的零,正好 16 个级别。这称为 NormalFloat 4(NF4)。NF4 将 4 位预算花在最需要的地方,减少量化误差。
分块量化与双重量化
若对整个矩阵使用一个缩放因子 C,一个异常值会主导 C,压缩其他权重至微小范围。因此将权重分成小块,每块独立缩放(分块量化)。但每个块需存储一个缩放因子(32 位),若块大小 64,每参数额外 0.5 位。QLoRA 进一步将缩放因子量化为 8 位——称为双重量化。
综合分块 NF4 与双重量化,QLoRA 使得在单卡 48 GB GPU 上微调 700 亿参数模型成为现实。
VeRA:更极致的参数效率
LoRA 仍为每个适配层学习一对 B、A。VeRA 走得更远:使用一对随机初始化的矩阵,冻结并 在所有适配层之间共享。模型不再学习 B 和 A 中的条目,而是学习可训练的缩放向量,使每层单独调整。公式:ΔW = B · D · diag(d) · A,其中 D 和 d 是缩放对角矩阵。B 从零开始,D 从很小的可调常量开始。
例如输入维度 4096,秩 64,80 层适配:标准 LoRA 约 4200 万可训参数;VeRA 只训练缩放向量,约 33.3 万,少了 126 倍。VeRA 不学习新方向,而是学习如何使用一组共享的固定随机方向。
DoRA:分离方向与大小
LoRA 同时改变权重向量的方向和长度,但两者耦合。DoRA(Weight-Decomposed Low-Rank Adaptation)将每行分解为方向和大小:权重矩阵写为对角矩阵(大小)与单位方向矩阵的乘积。LoRA 风格更新专注于方向,同时独立学习大小参数。这种解耦使适配器行为更像全参数微调,而额外参数极少。
Source: YouTube 视频
相似文章
@jbhuang0604: LoRA, low-rank adaptation, is arguably the most popular parameter-efficient fine-tuning method for LLMs. But how does i…
LoRA(低秩适配)是LLM最流行的参数高效微调方法,视频介绍了LoRA及其变体(LoRA+、QLoRA、VeRA、DoRA)的工作原理。
LoRA 与权重衰减 (2023)
这篇博客文章探讨了LoRA与权重衰减的相互作用如何导致与全参微调不同的优化目标,其中权重被正则化到初始模型而不是零。它解释了对实践者的影响。
CARE-LoRA: 基于压缩激活重建的内存高效LoRA微调框架
CARE-LoRA提出了一种压缩激活重建框架,通过利用低秩投影来减少LoRA微调过程中的内存消耗。该方法在降低内存占用的同时,实现了具有竞争力的性能。
Hybrid-LoRA:桥接全微调与低秩适应的后训练方法
Hybrid-LoRA提出了一种框架,选择性地对一小部分模块进行全微调,同时对其他模块使用LoRA,在显著降低计算成本的同时实现了接近全微调的性能。实验表明,与现有参数高效基线方法相比,性能提升高达5.65%。
MoE$^2$-LoRA:当MoE模型遇上MoE风格的低秩适配
MoE2-LoRA 引入了一种双通道路由条件投影(Routing-Conditioned Projection)和一个全局 LoRA 专家池,以实现用于微调 MoE 模型的 MoE 风格低秩适配,在保留通用能力的同时取得了最先进的准确率。