大模型微调(面经总结)
持续更新中
- 一、LORA篇
- 1、介绍一下Lora的原理
- 2、LoRA 是为了解决什么问题提出的?哪些模型适合用 LoRA 微调?什么是低秩分解?
- **低秩分解:用小矩阵逼近大矩阵**
- 3、LoRA初始化
- 4、LoRA初始化秩 r 是怎么选的?为什么不选其他值?
- 📌 一般经验:
- 5、LoRA家族
- 5.1 LoRA+
- 4.2 VeRA
- 4.3 QLoRA
一、LORA篇
1、介绍一下Lora的原理
LoRA 是一种参数高效微调方法,其核心思想是将原始权重矩阵的更新限制在一个低秩空间内,从而显著减少训练参数量。
不同于传统微调,LoRA 将权重的更新项 Δ W \Delta W ΔW 表示为两个低秩矩阵 A ∈ R r × d A \in \mathbb{R}^{r \times d} A∈Rr×d 和 B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r 的乘积:
W ′ = W + Δ W = W + B A W' = W + \Delta W = W + BA W′=W+ΔW=W+BA
训练阶段只更新两个低秩矩阵 A A A 和 B B B ,原始模型权重 W W W 保持不变;
2、LoRA 是为了解决什么问题提出的?哪些模型适合用 LoRA 微调?什么是低秩分解?
- LoRA 的核心目标:降低大模型微调成本 参数量从 O ( d 2 ) O(d^2) O(d2) → O ( r d ) O(rd) O(rd)
- 适合含大量线性层的 Transformer 架构模型 比如注意力模块的
Q/K/V
投影矩阵、FFN前馈神经网络
等
低秩分解:用小矩阵逼近大矩阵
定义:低秩分解是将高维矩阵近似为两个低维矩阵的乘积,以降低表示复杂度。
数学形式:对于 d × d d \times d d×d 的高维矩阵 W W W,找到两个低维矩阵 A ∈ R r × d A \in \mathbb{R}^{r \times d} A∈Rr×d 和 B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r 的乘积,使得:
W ≈ B A W \approx BA W≈BA
- (A) 是 降维矩阵:将原始 d d d 维空间映射到 r r r 维子空间(提取关键特征)。
- (B) 是 升维矩阵:将 $r$ 维特征恢复到 d d d 维空间(重构原始空间的更新)。
- 优势:通过仅优化 (A) 和 (B) 的 2 r d 2rd 2rd 个参数(远小于 d 2 d^2 d2),即可近似表达 (W) 的主要变化,大幅减少计算量。
3、LoRA初始化
LoRA 的初始化通常遵循以下原则:
原始模型权重 W 不变
LoRA 的矩阵:
- A A A 通常使用正态分布初始化:
nn.Linear(..., bias=False)
默认初始化- B B B 通常初始化为 全零矩阵,这样一开始 Δ W = B A = 0 \Delta W = B A = 0 ΔW=BA=0,模型输出不会被扰动,保证收敛稳定性
如果A也初始化成0,这样都没法更新了。对于
对于 y = B A x y = B A x y=BAx:
- 对 B 的梯度: ∂ L ∂ B = ∂ L ∂ y ⋅ ( A x ) T \displaystyle \frac{\partial L}{\partial B} = \frac{\partial L}{\partial y} \cdot (A x)^T ∂B∂L=∂y∂L⋅(Ax)T
- 对 A 的梯度: ∂ L ∂ A = B T ⋅ ( ∂ L ∂ y ) ⋅ x T \displaystyle \frac{\partial L}{\partial A} = B^T \cdot \left( \frac{\partial L}{\partial y} \right) \cdot x^T ∂A∂L=BT⋅(∂y∂L)⋅xT
向量对矩阵求导规则:
如果:
- y = B z y = B z y=Bz
- B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r
- z ∈ R r z \in \mathbb{R}^{r} z∈Rr
则有:
∂ L ∂ B = ∂ L ∂ y ⋅ z T \frac{\partial L}{\partial B} = \frac{\partial L}{\partial y} \cdot z^T ∂B∂L=∂y∂L⋅zT
📌 这是矩阵微积分中经典的链式法则: - ∂ L ∂ y \frac{\partial L}{\partial y} ∂y∂L 是 d d d 维行向量(外层loss对每个输出的导数)
- z T z^T zT 是 1 × r 1 \times r 1×r 行向量
- 所以它们的乘积是一个 d × r d \times r d×r 的矩阵(和 B 同型)
4、LoRA初始化秩 r 是怎么选的?为什么不选其他值?
LoRA 中的秩 $r$ 是一个超参数,控制低秩矩阵的维度,通常选取值为 4、8、16、32、64,具体视模型规模和任务而定。
- 太小(如 r = 1 r=1 r=1):表达能力太弱,模型性能下降
- 太大(如 r = 512 r=512 r=512):虽然逼近能力强,但和原始 full fine-tune 差别不大,丧失了 LoRA 节省资源的意义
📌 一般经验:
模型规模 | 推荐 LoRA 秩 r |
---|---|
<100M 参数 | 4-8 |
100M-1B | 16 |
>1B 模型 | 32 或 64 |
5、LoRA家族
参考:LoRA及衍生
5.1 LoRA+
将矩阵 B 的学习率设置得比矩阵 A 的学习率高得多
4.2 VeRA
VeRA(Very Efficient Rank Adaptation)是一种改进版 LoRA 微调方法,它固定低秩矩阵 A 和 B(随机初始化后冻结,在所有层之间共享;),仅训练缩放向量 d 和 b,实现参数更少、适配性更强的微调。
等等
4.3 QLoRA
对LoRA进行量化