从矩阵到秩:理解大模型参数与 LoRA 微调
在学习大模型、Transformer 和参数高效微调时,经常会遇到三个概念:
- 矩阵是什么?
- 矩阵的秩(Rank)是什么意思?
- LoRA 和 DoRA 为什么都与低秩矩阵有关?
这些概念并不只是数学知识,它们直接决定了模型如何表示信息、如何进行参数更新,以及为什么 LoRA 能够减少微调成本。
一、矩阵:模型中的“信息变换器”
在机器学习中,矩阵可以理解为一个信息变换器。
一个线性层通常表示为:
y=Wx+b y=Wx+b y=Wx+b
其中:
- (x):输入向量;
- (W):参数矩阵;
- (b):偏置;
- (y):输出向量。
例如:
W=[2001] W= \begin{bmatrix} 2&0\\ 0&1 \end{bmatrix} W=[2001]
它会将:
x=[x1x2] x= \begin{bmatrix} x_1\\ x_2 \end{bmatrix} x=[x1x2]
变换为:
Wx=[2x1x2] Wx= \begin{bmatrix} 2x_1\\ x_2 \end{bmatrix} Wx=[2x1x2]
这表示:
- 第一个特征被放大 2 倍;
- 第二个特征保持不变。
因此,矩阵可以完成:
- 特征放大;
- 特征缩小;
- 不同特征混合;
- 空间旋转;
- 维度压缩;
- 信息投影。
二、大模型为什么大量使用矩阵?
Transformer 中最核心的计算,基本都离不开矩阵。
以 Attention 为例:
Q=XWQ Q=XW_Q Q=XWQ
K=XWK K=XW_K K=XWK
V=XWV V=XW_V V=XWV
其中:
- (X):输入 token 的向量表示;
- (W_Q):Query 参数矩阵;
- (W_K):Key 参数矩阵;
- (W_V):Value 参数矩阵。
Feed-Forward Network 同样是矩阵变换:
H=σ(XW1+b1) H=\sigma(XW_1+b_1) H=σ(XW1+b1)
Y=HW2+b2 Y=HW_2+b_2 Y=HW2+b2
因此,Transformer 可以简单理解为:
Token 向量
↓
矩阵变换
↓
Attention / FFN
↓
新的 Token 表示
模型训练的本质,就是不断调整这些矩阵中的参数。
三、矩阵的 Rank 是什么?
矩阵的 Rank,也叫矩阵的秩,可以理解为:
矩阵中真正独立的信息方向或变化模式的数量。
例如:
A=[1224] A= \begin{bmatrix} 1&2\\ 2&4 \end{bmatrix} A=[1224]
第二行是第一行的 2 倍:
[2,4]=2[1,2] [2,4]=2[1,2] [2,4]=2[1,2]
因此,第二行没有提供新的独立方向:
rank(A)=1 rank(A)=1 rank(A)=1
虽然矩阵中有 4 个数字,但真正独立的信息只有一个方向。
再看:
B=[1001] B= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix} B=[1001]
它的两行和两列都相互独立:
rank(B)=2 rank(B)=2 rank(B)=2
四、Rank 的几何含义
矩阵也可以看成一种空间变换。
因此:
- Rank=2:保留两个独立方向;
- Rank=1:只保留一个有效方向;
- Rank=0:没有有效变化。
所以 Rank 也可以理解为:
矩阵变换之后,信息保留下来的有效维度。
五、矩阵大小和 Rank 不是一回事
一个 (n\times n) 的矩阵拥有:
n2 n^2 n2
个参数,但它的 Rank 最大只有:
n n n
例如:
| 项目 | 含义 |
|---|---|
| 矩阵大小 | (10000\times10000) |
| 参数数量 | 1 亿 |
| 最大 Rank | 10000 |
| Rank 的含义 | 独立信息方向数量 |
因此:
参数很多,不代表信息方向同样多。
对于任意 (n\times n) 矩阵:
0≤rank(W)≤n 0\leq rank(W)\leq n 0≤rank(W)≤n
所以一个 (n\times n) 的矩阵完全可能满足:
rank(W)<n rank(W)<n rank(W)<n
六、Rank=1 的矩阵能表达什么?
Rank=1 的矩阵可以写成两个向量的外积:
A=uvT A=uv^T A=uvT
例如:
u=[12],v=[34] u= \begin{bmatrix} 1\\ 2 \end{bmatrix}, \quad v= \begin{bmatrix} 3&4 \end{bmatrix} u=[12],v=[34]
那么:
A=uvT=[3468] A=uv^T= \begin{bmatrix} 3&4\\ 6&8 \end{bmatrix} A=uvT=[3648]
矩阵中的 4 个位置都发生了变化,但第二行是第一行的 2 倍。
这说明:
Rank=1 并不是只能修改一个参数,而是所有变化必须共享同一种模式。
七、为什么 Rank=1 不能表达所有变化?
假设我们想要:
ΔW=[100−1] \Delta W= \begin{bmatrix} 1&0\\ 0&-1 \end{bmatrix} ΔW=[100−1]
这个变化表示:
- 左上角增加 1;
- 右下角减少 1;
- 其他位置不变。
这是两个相互独立的变化方向,因此:
rank(ΔW)=2 rank(\Delta W)=2 rank(ΔW)=2
如果使用 Rank=1 的矩阵,就无法精确表达它,只能得到一个近似结果。
所以:
- Rank=1:只能表达一个主要变化模式;
- Rank=2:可以表达两个独立变化模式;
- Rank=8:可以组合八个基础变化方向。
注意:
Rank=8 不是只能修改 8 个参数,而是所有参数变化都由 8 个基础方向组合而来。
八、矩阵分解可以是精确的,也可以是近似的
矩阵分解不一定只能近似。
如果目标矩阵的 Rank 不超过分解使用的 Rank,就可以精确表示:
ΔW=BA \Delta W=BA ΔW=BA
如果目标矩阵的 Rank 大于分解使用的 Rank,则只能近似:
ΔW≈BA \Delta W\approx BA ΔW≈BA
例如,目标矩阵的 Rank 是 2:
| 分解 Rank | 结果 |
|---|---|
| (r=1) | 只能近似 |
| (r=2) | 可以精确表示 |
| (r>2) | 也可以精确表示,但可能存在冗余 |
因此,低秩分解的核心是:
用较少的独立方向,表示一个可能更复杂的矩阵。
九、LoRA:用低秩矩阵表示参数更新
LoRA 的基本公式是:
W′=W+ΔW W'=W+\Delta W W′=W+ΔW
LoRA 不直接训练完整的 (\Delta W),而是将它表示为:
ΔW=BA \Delta W=BA ΔW=BA
因此:
W′=W+BA W'=W+BA W′=W+BA
其中:
- (W):原始模型参数,保持冻结;
- (A,B):可训练的小矩阵;
- (r):LoRA 的 Rank。
十、LoRA 为什么能减少参数?
假设原始矩阵为:
W∈R4096×4096 W\in\mathbb{R}^{4096\times4096} W∈R4096×4096
如果直接训练完整更新矩阵,需要:
4096×4096≈16.8 million 4096\times4096\approx16.8\text{ million} 4096×4096≈16.8 million
个参数。
如果使用 LoRA,并设置:
r=8 r=8 r=8
那么只需训练:
4096×8+8×4096=65,536 4096\times8+8\times4096=65,536 4096×8+8×4096=65,536
个参数。
对比:
| 方法 | 可训练参数量 |
|---|---|
| 全量微调 | 约 1680 万 |
| LoRA,(r=8) | 约 6.5 万 |
因此,LoRA 具有:
- 显存占用低;
- 训练速度快;
- 参数量少;
- Adapter 易于保存;
- 多个任务可以共享基础模型。
十一、LoRA 中 Rank 小意味着什么?
LoRA 的 (r) 不是“只能学习 (r) 个参数”,而是:
最多使用 (r) 个基础变化方向。
例如:
如果任务只需要一个主要变化模式,(r=1) 可能就够。
如果任务同时涉及:
- 中文语义;
- 代码保护;
- JSON 结构;
- 工具调用;
- 专业术语;
- 风格变化;
这些变化可能更加独立,就需要更大的 Rank,或者直接使用全量微调。
十二、LoRA 的问题是什么?
LoRA 直接使用:
ΔW=BA \Delta W=BA ΔW=BA
但实际权重变化通常包含两部分:
- 权重大小变化;
- 权重方向变化。
可以把权重想象成一个箭头:
- 箭头长度:权重大小;
- 箭头方向:权重方向。
例如:
原始权重:长度 10,方向 30°
微调权重:长度 12,方向 35°
这包含两种变化:
长度:10 → 12
方向:30° → 35°
LoRA 需要用同一个低秩更新同时学习这两种变化。
当 Rank 较小或训练数据较少时,不同变化可能争夺有限的低秩表达空间:
一个更新方向同时负责:
- 增强某些特征
- 改变某些语义方向
- 保留某些结构信息
这可能导致:
- 某些变化学得不充分;
- 不同任务之间互相干扰;
- 在训练数据上有效,但泛化不稳定。
十三、DoRA:将大小和方向分开学习
DoRA 的核心思想是:
将权重大小和权重方向拆开学习。
它将权重表示为:
W=mV∥V∥ W=m\frac{V}{\|V\|} W=m∥V∥V
其中:
- (m):权重大小;
- (V/|V|):权重方向。
微调后的权重可以写成:
W′=m′W+BA∥W+BA∥ W'=m'\frac{W+BA}{\|W+BA\|} W′=m′∥W+BA∥W+BA
其中:
- (m’):单独训练的大小参数;
- (BA):使用 LoRA 学习方向变化。
可以简单理解为:
LoRA:
一个补丁同时负责“改变大小”和“改变方向”
DoRA:
一个模块负责“改变大小”
一个 LoRA 模块负责“改变方向”
十四、LoRA 和 DoRA 的区别
| 对比项 | LoRA | DoRA |
|---|---|---|
| 基本公式 | (W’=W+BA) | (W’=m’\frac{W+BA}{|W+BA|}) |
| 学习内容 | 整体权重变化 | 权重大小与方向 |
| 参数量 | 少 | 略多 |
| 训练复杂度 | 较低 | 略高 |
| 工程成熟度 | 很高 | 相对较低 |
| 适合定位 | 默认高效微调 | LoRA 的增强方案 |
DoRA 的优化点是:
减少“大小变化”和“方向变化”之间的相互干扰,使模型能够更细致地学习参数变化。
但 DoRA 并不意味着:
- 一定比 LoRA 好;
- 一定不会遗忘;
- 一定降低显存;
- 可以替代高质量训练数据。
十五、如何选择全量微调、LoRA、QLoRA 和 DoRA?
一般建议:
| 方法 | 适用场景 |
|---|---|
| 全量微调 | 模型较小、数据充足、追求效果上限 |
| LoRA | 通用生产首选 |
| QLoRA | 显存不足时使用 |
| DoRA | LoRA 效果不足时尝试 |
| QDoRA | 量化模型上使用 DoRA |
十六、如何增强新能力又保留原始能力?
如果只使用新领域数据进行全量微调,可能出现灾难性遗忘。
例如:
中文能力提升
英文能力下降
代码能力下降
原始领域泛化能力下降
更稳妥的方式是:
方案一:使用独立 Adapter
基础模型
├── 中文 Adapter
├── 英文 Adapter
└── 代码 Adapter
根据请求语言和任务类型选择不同 Adapter。
方案二:混合新旧数据
训练数据同时包含:
新领域数据 + 原始能力数据 + 多领域数据
损失函数可以表示为:
L=λLnew+(1−λ)Loriginal L=\lambda L_{\text{new}}+(1-\lambda)L_{\text{original}} L=λLnew+(1−λ)Loriginal
这样模型在学习新能力的同时,也会复习原始能力。
方案三:建立回归评测集
需要分别评估:
- 新领域任务效果;
- 原始任务效果;
- 不同语言表现;
- 代码能力;
- 工具调用能力;
- 推理延迟;
- 显存和训练成本。
十七、最终总结
矩阵是大模型进行特征变换和信息传递的基本工具。
Rank 表示矩阵中真正独立的信息方向数量,也可以理解为矩阵变换后保留下来的有效维度。
LoRA 的核心是:
W′=W+BA W'=W+BA W′=W+BA
它假设:
ΔW=W′−W \Delta W=W'-W ΔW=W′−W
可以用较低的 Rank 近似表示。
DoRA 则进一步将权重变化拆成:
权重大小变化
+
权重方向变化
从而减少两类变化之间的相互干扰。
可以用一句话概括:
矩阵负责变换信息,Rank 表示独立信息方向,LoRA 用低秩矩阵高效学习任务变化,DoRA 则把权重大小和方向分开学习。
更多推荐
所有评论(0)