跳到主要内容

LoRA 与 QLoRA

LoRA 参数更新对比图

本节定位

上一节已经把“为什么不是所有任务都该全量微调”讲清楚了。
这一节继续回答一个非常关键的问题:

如果不想重训整个模型,那到底该怎样低成本改它?

LoRA 和 QLoRA 正是最重要的两条现实答案。

学习目标

  • 理解 LoRA 的低秩增量直觉
  • 理解 QLoRA 在 LoRA 基础上又多做了什么
  • 看懂一个最小矩阵增量示意
  • 建立何时考虑 LoRA、何时考虑 QLoRA 的实用判断

先建立一张地图

LoRA / QLoRA 这节最适合新人的理解顺序不是“先记缩写”,而是先看清:

这节真正想解决的是:

  • LoRA 到底在省什么
  • QLoRA 又是在 LoRA 基础上多解决了什么

一个更适合新人的总类比

你可以把 LoRA / QLoRA 理解成:

  • 不重做整台机器,只换一个小但关键的模块

全量微调更像:

  • 把整台机器全部拆开重调

LoRA 更像:

  • 只加一个可训练的小改装件

QLoRA 则是在此基础上再进一步:

  • 先把原机器做得更省空间,再装这个改装件

一、为什么 LoRA 会变得这么重要?

因为全量微调在大模型上往往太贵:

  • 参数太多
  • 显存太高
  • 训练和保存成本都高

于是人们自然会问:

能不能不改整个模型,只改一小部分真正有用的东西?

LoRA 就是在回答这个问题。


二、LoRA 最核心的直觉是什么?

2.1 不直接改整个权重矩阵

假设原来的权重矩阵是:

W

LoRA 的思路是:

不直接训练 W,而是学习一个增量 ΔW

然后实际使用:

W + ΔW

2.2 为什么叫“低秩”?

因为这个增量不是直接学一个完整大矩阵,而通常写成:

ΔW = A @ B

其中:

  • AB 比原矩阵小很多

这就是“低秩”的核心来源。


三、一个最小 LoRA 矩阵示意

import torch

W = torch.randn(8, 8)
A = torch.randn(8, 2)
B = torch.randn(2, 8)

delta = A @ B
W_new = W + delta

print("W shape :", W.shape)
print("delta shape :", delta.shape)
print("W_new shape :", W_new.shape)

3.2 这段代码在教什么?

它在教你:

  • LoRA 不重训整个权重
  • 而是训练一个更小的增量结构

这就是它能省资源的根本原因。

3.3 一个很适合初学者先记的对比表

路线最值得先记住的核心动作
全量微调直接改原模型所有参数
LoRA学一个小增量矩阵
QLoRA学小增量 + 把基础模型量化

这个表很适合新人,因为它会把三个容易混掉的路线重新压缩成一句最关键的话。


四、为什么这能显著降低训练成本?

因为原始大矩阵如果全量训练,代价很高。
而低秩分解后的可训练部分小很多。

所以 LoRA 的核心工程价值可以先记成:

用更少的训练参数,换取足够好的任务适配能力。

这也是它为什么在实际项目中这么受欢迎。


五、QLoRA 又多解决了什么问题?

5.1 仅有 LoRA,为什么有时还不够?

即使只训练小增量参数,基础模型本体本身还是很大。
模型一加载进来,显存压力依然很高。

5.2 QLoRA 的关键点

它在 LoRA 的基础上又做了一步:

把基础模型量化到更低精度。

也就是说:

  • 基础模型更省内存
  • 增量适配层仍然可训练

5.3 一个最小直觉示意

config = {
"base_model_precision": "4bit",
"trainable_part": "LoRA adapters",
"goal": "在更低显存下做微调"
}

print(config)

这个示意最重要的意思是:

  • LoRA:主要省训练参数
  • QLoRA:在此基础上进一步省基础模型占用

5.4 再看一个最小“资源约束 -> 方案选择”示例

constraints = {
"gpu_memory_gb": 12,
"want_larger_model": True,
"task_boundary_clear": True,
}


def choose_peft_route(c):
if not c["task_boundary_clear"]:
return "先别急着微调,先把任务边界定清楚。"
if c["gpu_memory_gb"] <= 12 and c["want_larger_model"]:
return "优先考虑 QLoRA。"
return "可以先从 LoRA 开始。"


print(choose_peft_route(constraints))

这个示例很适合初学者,因为它会提醒你:

  • 先看约束
  • 再看方法

六、LoRA 和 QLoRA 分别更适合什么时候?

6.1 LoRA 更适合

  • 资源还可以
  • 不一定要把显存压到极限
  • 想先快速做参数高效微调

6.2 QLoRA 更适合

  • 显存很紧
  • 想在更小机器上跑更大模型

也就是说:

QLoRA 更像“资源受限场景下的现实工程方案”。

6.3 第一次做项目时,怎么选更稳?

一个够实用的判断顺序是:

  1. 如果资源还可以,先从 LoRA 开始
  2. 如果显存已经明显吃紧,再优先考虑 QLoRA
  3. 如果你还没想清任务边界,先别急着进微调细节

6.4 如果把它做成项目或方案,最值得展示什么

最值得展示的通常不是:

  • “我用了 LoRA/QLoRA”

而是:

  1. 你为什么没有选全量微调
  2. 你的资源约束是什么
  3. LoRA 或 QLoRA 分别解决了什么
  4. 这条路线在当前任务里为什么最现实

这样别人会更容易看出:

  • 你理解的是微调方案选择
  • 不只是知道几个缩写

七、为什么说它们改变了微调门槛?

在 LoRA / QLoRA 普及前,很多人一提大模型微调会直接想到:

  • 只有大团队能做
  • 机器要求极高

而它们的重要意义正在于:

把原本门槛很高的事情,拉到了更多团队和开发者可尝试的范围。

这不是小优化,而是工程可达性的变化。


八、最常见的误区

8.1 以为 LoRA / QLoRA 是“无代价增强”

它们很强,但并不是完全无代价。

8.2 以为上了 QLoRA 就不需要考虑资源了

只是更轻,不是无限轻。

8.3 只记方法名,不理解到底在改什么

真正要记住的是:

  • LoRA:学增量
  • QLoRA:学增量 + 基础模型量化

九、核心提醒

  • LoRA 的核心是“少改参数”
  • QLoRA 的核心是“少改参数 + 更省基础模型内存”
  • 这两者重要,不是因为名字新,而是因为它们让微调在现实里更可做

小结

这一节最重要的不是背缩写,而是理解:

LoRA 用更少参数去做任务适配,QLoRA 则在此基础上进一步把大模型微调的资源门槛压低。

它们之所以重要,不只是因为“方法新”,而是因为它们真的改变了大模型微调的现实可行性。


练习

  1. 用自己的话解释:为什么 LoRA 不是“重训整个矩阵”?
  2. 为什么说 QLoRA 的关键新增点在于基础模型量化?
  3. 如果你显存有限但又想试更大模型,为什么 QLoRA 往往更值得优先考虑?
  4. 用自己的话总结:LoRA 和全量微调最本质的差别是什么?