0%
URL
TL;DR
- 本文提出一种梯度低秩映射方法,和
LoRA
思想类似,但支持全参数优化,无需冻结模型也无需额外的训练参数,只需在梯度更新时进行低秩映射,从而在训练时节省显存。
- 由于优化器状态是大模型微调过程中的主要显存消耗,因此本算法本质是在优化器中记录梯度矩阵的低秩近似,从而减少显存消耗。
Algorithm
总体流程
- 计算参数的梯度 G∈Rm×n
- 计算梯度的低秩近似(通常用
SVD
奇异值分解法), G≈UVT,U∈Rm×r,V∈Rn×r
- 记录低秩近似的优化器状态信息,例如:
- U 和 V
- U 和 V 的动量信息
- U 和 V 的二阶动量信息
- 将低秩近似的梯度 UVT 合并变成近似的梯度 G′,并用 G′ 更新参数
- 由于梯度具有一定程度的稳定性,为了节省奇异值分解带来的损失,U 和 V 不会在每次迭代中都重新计算,而是每隔 T 次迭代更新一次
用公式表述
- 分解梯度 G 为 U 和 V 的乘积
- G∈Rm×n
- U,Σ,VT=SVD(G)
- U∈Rm×m,V∈Rn×n,Σ∈Rm
- r 是低秩近似的秩
- Ur=U[:,:r],Vr=V[:,:r],Ur∈Rm×r,Vr∈Rn×r
- Ur=UrΣ
- G′=UrVrT
- 记录优化器状态信息,以
Adam
优化器为例
- mtU=β1mt−1U+(1−β1)Ur , mtV=β1mt−1V+(1−β1)Vr
- vtU=β2vt−1U+(1−β2)Ur2 , vtV=β2vt−1V+(1−β2)Vr2
- mtU=mtU/(1−β1t) , mtV=mtV/(1−β1t)
- vtU=vtU/(1−β2t) , vtV=vtV/(1−β2t)
- 计算低秩近似梯度并更新参数
- G′=U×vtV+ϵmtV+V×vtU+ϵmtU
- Θ←Θ−ηG′
- Θ 是模型参数,η 是学习率
- 更新分解矩阵 U 和 V
- 每隔 T 次迭代更新一次,也就是说 G 和 U 与 V 可能不是同一个时间步的,G 是当前时间步的梯度,而 U 和 V 是之前更新的
- U,Σ,VT=SVD(G)
- Ur=U[:,:r],Vr=V[:,:r],Ur∈Rm×r,Vr∈Rn×r
- 正交化和秩调整(可选)
- 为了保持 U 和 V 各自的正交性,可以对 U 和 V 分别进行正交化处理
- UTU=I,VTV=I
- 动态调整秩 r 以适应训练过程中的梯度变化
Thought
- 听上去很像
LoRA
,终究是效果和显存占用的平衡问题。
- 大模型微调能改的东西不多,所以传统机器学习用到的一些算法又可以在大模型炒炒冷饭了…