LoRA
Low-Rank Adaptation of Large Language Models
https://arxiv.org/abs/2106.09685
背景
以往的一些结果(比如Exploring Universal Intrinsic Task Subspace via Prompt Tuning (opens new window))显示,尽管预训练模型的参数量很大,但每个下游任务对应的本征维度(Intrinsic Dimension)并不大,换句话说,理论上我们可以微调非常小的参数量,就能在下游任务取得不错的效果。因此,论文的作者认为权重更新的那部分参数矩阵尽管随机投影到较小的子空间,仍然可以有效的学习,可以理解为针对特定的下游任务这些权重矩阵就不要求满秩。
Intrinsic Dimension: 优化下游任务达到一定水平的子空间
现有微调大模型方法的不足:
- 推理延迟(inference latency): Adapter
- 无法与 fine-tuning 媲美
技术原理
原理
LoRA: LoRA 通过向预训练模型的每一层的权重矩阵中添加低秩矩阵来实现微调。即固定原始模型权重,然后定义两个低秩矩阵作为新增 weight 参与运算,并将两条链路的结果求和后作为本层的输出,而在微调时,只梯度下降新增的两个低秩矩阵。

以单个 Linear 层(
对矩阵
相对于 Adapter,LoRA 有个好处就是不会引入额外的推理延迟,因为前者相当于在原始模型结构上新增了一些结构(或者说 FLOPs) ,而对于 LoRA 而言
batch inputs 选择不同
梯度分析
多参数高效的微调实际上只是降低了显存需求,并没有降低计算量,LoRA 其实也不例外。为了认识到这一点,我们只需要观察
前向 | 梯度 | |
---|---|---|
全量微调 | ||
LoRA |
LoRA 显存占用少在哪里
预训练权重
相对于全局微调,这些高效微调技术为什么会使得训练的速度变快呢?
只更新了部分参数:比如 LoRA 原论文就选择只更新 Self Attention 的参数,实际使用时我们还可以选择只更新部分层的参数;
减少了通信时间:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间;
采用了各种低精度加速技术,如 FP16、FP8 或者 INT8 量化等。
所以总的来说,LoRA 在反向传播阶段计算复杂度还要多一些,只是需要梯度下降的参数少,所以节省显存,梯度下降的也快。
最后,关于
LoRA 优势
- 可以针对不同的下游任务构建小型 LoRA 模块,从而在共享预训练模型参数基础上有效地切换下游任务。
- LoRA 不需要计算梯度或维护大多数参数的优化器状态,训练更有效、硬件门槛更低。
- LoRA 使用简单的线性设计,在部署时将可训练矩阵与冻结权重合并,不存在推理延迟。LoRA 与其他方法正交,可以组合(prefix-tuning)。
实验
, , , (多头 attention),MLP 层的权重矩阵
同时调整

保证权重矩阵的种类的数量比起增加隐藏层维度

关于秩的选择,通常情况下,rank 为 4,8,16 即可。

为了使 LoRA 的效果尽可能接近最优,权重
LoRA+: Efficient Low Rank Adaptation of Large Models (opens new window)