PiSSA(Principal Singular Values and Singular Vectors Adaptation)
一句话:用
的主奇异成分来初始化可训练的 、 ,把剩下的次要成分冻结成残差矩阵;于是你从一开始就在微调"权重里最重要的方向",而不是从零增量慢慢学起。(PiSSA: Principal Singular Values and Singular Vectors Adaptation of Large Language Models, 2024) 提出年份:2024(arXiv 2024-04) · 机构/团队:Peking University · 会议/来源:NeurIPS 2024(Spotlight) / arXiv:2404.02948
前置阅读:LoRA
直觉与动机
LoRA 默认
更重要的是,LoRA 的初始增量与
PiSSA 换了个角度:既然
方法与公式
对每个目标权重
取前
可训练的
于是
前向计算与 LoRA 同形
关键工程细节——残差不是
快速初始化。 对大模型每一层都做完整 SVD 代价不小,PiSSA 用随机化 SVD(randomized SVD)只求前

图源:Meng et al., PiSSA: Principal Singular Values and Singular Vectors Adaptation of Large Language Models, arXiv:2404.02948(用于学习注解,版权归原作者)
与 baseline 对比
| 维度 | LoRA | PiSSA |
|---|---|---|
| 冻结部分 | 完整 | 残差 |
| 初始增量 | ||
| 初期收敛 | 慢(从零启动) | 更快 |
| 最终效果 | 基线 | 论文报告优于 LoRA |
| 初始化成本 | 零 | 一次(随机化)SVD,秒级 |
| 合并回基座 |
实现要点
import torch
def pissa_init(W0, r):
# 随机化/截断 SVD 取前 r 个主成分
U, S, Vh = torch.linalg.svd(W0.float(), full_matrices=False)
Ur, Sr, Vhr = U[:, :r], S[:r], Vh[:r, :]
sqrt_S = torch.diag(Sr.sqrt())
B = Ur @ sqrt_S # d x r
A = sqrt_S @ Vhr # r x k
W_res = W0 - B @ A # 冻结残差(= 次要奇异成分之和)
return A, B, W_res
# 前向:注意冻结的是 W_res,不是 W0
# h = x @ W_res.T + (x @ A.T) @ B.T实现注意:SVD 要在 fp32 下做以保证数值精度;得到的 peft 通过 LoraConfig(init_lora_weights="pissa") 直接支持,并提供把 PiSSA 残差转回标准 LoRA 格式的转换工具,方便复用 LoRA 的部署链路。
调参与实践经验
- 与 LoRA/DoRA 横向对比。 PiSSA 的主要增益在"更快收敛 + 略好的最终质量",本质来自更好的初始化;它和 DoRA(幅值/方向解耦)、LoRA+(学习率比)解决的是不同子问题,必要时可组合。若只追求实现简单,PiSSA 是性价比很高的"换初始化即用"改进。
- 与 QLoRA 结合(QPiSSA)。 PiSSA 把主成分(数值大、对量化误差最敏感)放进不量化的可训练
,只对残差 做 4-bit 量化。由于残差去掉了主成分、奇异谱更平、动态范围更小,量化误差显著低于直接量化整个 。这使 PiSSA + 量化的精度损失明显优于朴素 QLoRA,是 PiSSA 一个很实用的卖点。 - 合并陷阱再强调。 上线前务必确认合并用的是
。把残差误当成 是最常见的复现错误,会导致主成分被叠加两次、模型行为异常。 - rank 选择。 与 LoRA 类似,
越大主成分覆盖越全、初始增量越接近 的低秩近似;但 PiSSA 的优势主要体现在中小 rank 下"初始化质量"带来的差距,rank 极大时与 LoRA 的差距会收窄。
参考文献
- Meng et al., 2024. PiSSA: Principal Singular Values and Singular Vectors Adaptation of Large Language Models. arXiv:2404.02948
- Hu et al., 2021. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685