Home / 大语言模型 / LoRA:冻结大矩阵,只学习低秩改动

047 · LoRA:冻结大矩阵,只学习低秩改动

返回目录 · 上一篇:RoFormer · 下一篇:Codex

论文:Edward J. Hu等,LoRA: Low-Rank Adaptation of Large Language Models,2021年公开,ICLR 2022。原始论文。

先接住前作的问题

Adapters增加串行模块,Prefix-Tuning增加可读状态,二者节省任务参数却仍有执行代价。本篇是平行适配路线:在线性权重旁学可合并的低秩增量,追问任务变化是否只需少数方向。

五个前置概念

五个前置概念:矩阵秩衡量独立方向数;低秩分解用两个瘦矩阵表示更新;优化器状态是Adam等为每参数保存的历史统计;参数合并把线性增量提前加入权重;验证集选模选择适配配置而非提供无偏最终测试结论。

一、问题设定:任务改动能否限制在可合并的少数权重方向

全量微调要为原权重保存梯度与优化器状态,adapter增加推理模块,连续提示又占用上下文。LoRA把任务变化放进两个小矩阵的乘积,并可在部署前加回原线性矩阵;节省的是更新表示与任务检查点,完整骨干仍需运行。

论文的任务包括分类、表格描述、文本转SQL和对话摘要,均使用监督任务数据。没有新的RL奖励;LoRA是一种参数化方法,理论上可配合不同训练目标,但原文这些结果不能直接证明它在后来RL对齐中同样好。

原文主要研究注意力投影矩阵,冻结前馈模块。后来常见的“所有线性层都加LoRA”属于具体训练配方的扩展,不能倒灌成原始实验的统一设置。

二、推导低秩增量及非对称零初始化的梯度

设原矩阵 W0∈Rd×kW_0\in\mathbb R^{d\times k},定义:

W=W0+ΔW,ΔW=αrBA,B∈Rd×r,A∈Rr×k.W=W_0+\Delta W, \qquad \Delta W=\frac\alpha r BA, \qquad B\in\mathbb R^{d\times r},\quad A\in\mathbb R^{r\times k}.

rr 是秩上限,α\alpha 控制增量尺度。对输入 xx:

h=W0x+αrB(Ax).h=W_0x+\frac\alpha r B(Ax).

训练参数从 dkdk 变为 r(d+k)r(d+k)。低秩的是 ΔW\Delta W,原权重与合并后权重都不必低秩。LoRA也不是先完成全量微调再做SVD,而是从训练开始就在因子化空间优化。

原文将 AA 随机初始化、BB 初始化为零,使初始增量为零,保留预训练函数。如果两者都设零,链式求导会让两者初始梯度都为零,无法启动这条分支;只将一个因子置零可避免这一问题。

设训练样本为 (x,y)(x,y),任务损失仍是负对数似然或相应分类损失:

min⁡A,B  L(y,fW0+(α/r)BA(x)),W0固定.\min_{A,B}\;L\left(y,f_{W_0+(\alpha/r)BA}(x)\right), \qquad W_0\text{固定}.

所谓低“内在秩”是对有效更新的经验假设。论文用不同秩及子空间分析支持它在部分任务中的合理性,没有证明所有任务的最优更新都天然低秩。

为什么一边随机、一边为零

令输入为 xx、输出为 hh、冻结权重为 W0W_0,低秩因子为 A,BA,B,秩为 rr、缩放超参数为 α\alpha,损失为 ℓ\ell。记上游对输出的梯度为 g=∇hℓg=\nabla_h\ell,h=W0x+sBAxh=W_0x+sBAx,其中 s=α/rs=\alpha/r,则 ∇Bℓ=s g(Ax)⊤\nabla_B\ell=s\,g(Ax)^\top、∇Aℓ=s B⊤gx⊤\nabla_A\ell=s\,B^\top gx^\top。原初始化B=0、A随机使初始增量为零,但B仍能收到非零梯度;若A、B同时置零,两边梯度都为零,支路会卡住。这一对比比笼统说“零初始化更稳定”更能指导实现。

教学算例。 取秩1、x=(1,2)⊤,A=(1,0),B=(0,0)⊤,g=(3,4)⊤,s=1x=(1,2)^\top,A=(1,0),B=(0,0)^\top,g=(3,4)^\top,s=1。首步 Ax=1Ax=1,B梯度为 (3,4)⊤(3,4)^\top,A梯度为零;更新B后下一步A才通常开始学习。低秩约束落在增量BA上,不表示冻结的 W0W_0 本来低秩。

合并前后用同一输入核对权重方向

设输入列向量为x,低秩支路计算B(Ax),合并矩阵应加BA而不是AB。即使两者在方阵特例下尺寸都合法,数值通常也不同。用非方形A、B做测试更容易暴露顺序错误;再比较合并前后多个输入的输出,才能确认缩放系数与转置约定一起被正确保存。

教法联系:Sourab Mangrulkar、Sayak Paul的Parameter-Efficient Fine-Tuning。算例为本文自构。

三、冻结主权重、训练因子并核对合并结果

输入:预训练模型、目标线性层集合、秩 r、系数 alpha
冻结主模型
每个目标矩阵 W0:初始化 A 为随机值,B 为零
重复抽取任务样本:
  用 W0*x + (alpha/r)*B*(A*x) 进行前向计算
  计算正常任务损失
  反向传播,只更新 A、B 及明确声明的任务参数
按验证集选检查点,保存低秩因子与配置
单任务部署可合并:Wdeploy = W0 + (alpha/r)*B*A
输出:具有任务能力的完整模型,或可加载的任务增量

合并等价基于线性加法,推理时需关闭训练dropout并使用正确缩放与基础权重。若同时服务多个任务,预先合并一个任务并不能自动让同一矩阵处理其他任务;保留分支动态选择会改变性能取舍。

自构例子: 一个1024×1024投影有1048576个参数,秩8的两个因子共16384个参数,约为原矩阵的1/64。若模型只需增强少数与情感判断相关的方向,这种限制可能足够;若需要大幅改造所有语言表示,局部低秩调整可能不够。这里的维度与解释是教学构造,不是论文特定模型测得的有效秩。

四、按参数预算、目标投影与rank分别读对照

先在相同参数预算下看改哪些投影,再看rank;小分数差和跨论文引用不能当作统一单变量胜出。

项目 原文报告
模型 RoBERTa base/large、DeBERTa XXL、GPT-2 medium/large、GPT-3 175B
数据任务 GLUE理解任务,E2E/WebNLG/DART生成,WikiSQL、MNLI、SAMSum
GPT-2训练 附录D.3与表11:5 epoch、批量8、AdamW、学习率2×10⁻⁴、预热500步;Q/V秩4,alpha32
GPT-2解码 表11:beam10、长度惩罚按数据集设置;不是与所有引用基线完全相同的解码配方
GPT-3训练 附录D.4:2 epoch、批量128、权重衰减0.1;长度WikiSQL384、MNLI768、SAMSum2048
重复报告 GPT-2为3随机种子均值;175B只给任务典型标准差,而非每行独立误差条
特殊对照条件 表2带†运行匹配Adapter的长度128与初始化口径;其他微调基线可能先经MNLI适配
数据规模边界 任务数据集名称与版本应按原附录锁定;主结果表没有统一逐任务token消费量,不能假装严格等token

读表2。 先按 RoBERTa-base、RoBERTa-large 和 DeBERTa-XXL 分组,再比较可训练参数与各任务分数。带†的 Adapter 和 LoRA 运行匹配长度128及初始化口径;表内没有用一个平均分消除其他训练条件差异,因此不能把全部行都当作严格单变量对照。

LoRA与其他参数高效适配方法的GLUE成绩和可训练参数量
实验结果表摘引:Edward J. Hu等,2021,表2,PDF第6页;核对原文。原版权保留。

论文报告显存由1.2TB降到350GB、指定配置检查点由350GB降到35MB,并观察到175B训练约25%加速。它们分别衡量训练显存、增量存储和速度,三个倍率不同。35MB任务文件仍依赖大模型,不能独立运行。

证据一:表1,推理延迟。 GPT-2 medium在RTX8000上,批量1、长度128时,全量微调/合并LoRA前向平均19.8毫秒,两个Adapter变体23.9和25.8毫秒,100次计时。支持的是该硬件与形状下合并后的无额外分支开销,不是任何LoRA服务系统都永远零延迟。

证据二:表3,E2E生成。 GPT-2 medium的LoRA用0.35M任务参数达到BLEU70.4±0.1;引用的同参数量逐层前缀为69.7。GPT-2 large的LoRA为70.4±0.1,前缀70.3。后一个差距很小,且部分数据引用前作,不能把它描述为全面压倒性胜利。

证据三:表4,175B任务。 4.7M参数LoRA的MNLI-m为91.7,全量89.5,差2.2个百分点;SAMSum ROUGE-L为45.9对44.5。但WikiSQL为73.4对73.8,略低于全量,且该任务典型波动约±0.5。较大37.7M LoRA的WikiSQL为74.0,也不能将0.2差异夸成稳定优势。

证据四:表5,固定约18M参数预算。 只调Q、秩8的WikiSQL为70.4,同时调Q/V、各秩4为73.7。说明在此预算下,把自由度分配到哪些映射,可能比单纯增加某一矩阵的秩更重要。四种投影一起调也有竞争力,因此“只调Q/V是唯一最优”同样超出表格。

证据五:表6与§7.2。 Q/V秩1、8、64的WikiSQL分别为73.4、73.8、73.5,并非秩越高越好。原文脚注明确不期待小秩适用于所有任务,例如语言变化很大时可能需要更强更新。这个限制比把rank设成固定经验常数更值得记住。

五、增量低秩不压缩骨干,也不适合任意领域跨度

LoRA减少的是可训练状态,不消除前向激活、主模型权重或数据处理开销。秩小可能优化更容易,也可能欠拟合;秩大增加容量但不保证泛化。要区分“低秩约束足以完成该任务”和“所有全量微调梯度都低秩”,后者并未被前者证明。

六、把低秩更新与量化冻结骨干组合

低秩更新已缩小任务状态,冻结基座仍占显存。QLoRA直接接住这个瓶颈,把量化存储与高精度增量训练组合;检查时继续区分合并等价与重新量化误差。

自测与答案

1. LoRA是否假定预训练权重是低秩的?

不是。假设针对任务所需增量,W0W_0可以满秩,W0+BAW_0+BA也可以满秩。低秩因子只是限制可训练的改动方向,因此小检查点不代表小完整模型。

2. 为什么常见初始化是一个因子随机、另一个为零?

乘积为零确保初始模型保持预训练行为;随机因子又能让零因子得到非零梯度。若A和B都为零,双方梯度都含另一个零因子,训练无法启动。第一步随机因子的梯度可能为零,不妨碍另一个先更新。

3. 如果增大rank没有改善,该怎么判断原因?

先看训练损失是否仍下降、验证表现是否波动,再控制学习率、alpha、目标层与预算。可能是小秩已足够、额外容量过拟合,也可能优化配方不合适。表5提示改目标层集合也值得比较,不能仅凭一次rank曲线宣布任务真实内在秩。