Geeks_Z の Blog Geeks_Z の Blog
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)

Geeks_Z

AI小学生
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)
  • MLTutorials

  • Model

  • LLM

  • PEFT

    • 大模型微调
    • Adapter
    • Prefix tuning
    • Prompt-Tuning
    • P-tuning
    • LoRA
      • Low-Rank Adaptation of Large Language Models
      • 背景
      • 技术原理
        • 原理
        • 梯度分析
        • LoRA 显存占用少在哪里
      • LoRA 优势
      • 实验
      • References
    • LoRA变体
    • LoRAMoE
  • LoRA&MoE

  • Transformer

  • Mamba

  • PyTorch

  • CIL

  • 面试

  • AINotes
  • PEFT
Geeks_Z
2024-03-14
目录

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 参与运算,并将两条链路的结果求和后作为本层的输出,而在微调时,只梯度下降新增的两个低秩矩阵。

20240206105857

以单个 Linear 层(h=WX)举例,用公式表达就是假设原始预训练模型的权重为W0∈Rd×d, 两个低秩矩阵的 shape 为B∈Rd×r和A∈Rr×d,其中r<<d,并将 Linear 层的计算过程有原始h=W0X调整为

h=W0x+ΔWx=W0x+BAx

对矩阵A使用随机高斯初始化,对B使用零初始化, 保证在微调开始之前ΔWx=0。也可以使用αr作为缩放参数来调节ΔW, 通过调节缩放比例可以调节预训练模型与 LoRA 的加权占比。

相对于 Adapter,LoRA 有个好处就是不会引入额外的推理延迟,因为前者相当于在原始模型结构上新增了一些结构(或者说 FLOPs) ,而对于 LoRA 而言B×A的结果的 shape 与W0的 shape 是一致的,也就是说微调完成后是可以将结果直接累加到原始 weight 中的,即W=W0+αrBA,这样一来,在推理时微调前后的 FLOPs 的是一样的。

batch inputs 选择不同A、B的延迟问题:类增量学习中,不同的图片选择不同的专家,即选择不同的A、B

梯度分析

多参数高效的微调实际上只是降低了显存需求,并没有降低计算量,LoRA 其实也不例外。为了认识到这一点,我们只需要观察B,A的梯度:

∂L∂B=∂L∂hAT,∂L∂A=BT∂L∂h

L是损失函数,在训练过程中,求模型梯度是主要的计算量,如果全量更新,那么所用的梯度是∂L∂h,而 LoRA 所用的梯度则是∂L∂B和∂L∂A,它们是建立在全量更新的梯度∂L∂h基础上的,所以理论上 LoRA 的计算量比全量更新还大。

前向 梯度
全量微调 W0x 𝕕𝕕∂L∂W0=∂L∂hxT∈Rd×d
LoRA (W0+BA)x 𝕕𝕣𝕣𝕕∂L∂B=∂L∂h(Ax)T∈Rd×r∂L∂A=BT∂L∂hxT∈Rr×d

LoRA 显存占用少在哪里

预训练权重W0的梯度存储开销,实际就是 LoRA 能大大减少了显存占用的关键。 在 LoRA 训练时,W0 仍然会参与前向传播和反向传播,但是不会计算其对应梯度 ∂L∂W0 ,更不会更新其参数。因此,这一步不再需要计算和保存梯度 ∂L∂W0 ,以及更新 W0 。以 d=4096,r=16 为例,这部分减少的梯度显存占用粗略估计为: d∗d−2∗d∗r=1−2rd , 减少了 99.2187% 。

相对于全局微调,这些高效微调技术为什么会使得训练的速度变快呢?

  1. 只更新了部分参数:比如 LoRA 原论文就选择只更新 Self Attention 的参数,实际使用时我们还可以选择只更新部分层的参数;

  2. 减少了通信时间:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间;

  3. 采用了各种低精度加速技术,如 FP16、FP8 或者 INT8 量化等。

所以总的来说,LoRA 在反向传播阶段计算复杂度还要多一些,只是需要梯度下降的参数少,所以节省显存,梯度下降的也快。

最后,关于B和A这两个低秩矩阵的初始化问题,首先我们是需要BA的结果初始是 0,这样就能保证微调开始时新引入的低秩矩阵不会对最终结果造成影响,那么最直接的方式就是令其中一个低秩矩阵初始阶段为全零,另一个为非全零即可,两者不能都为全零,通过带上 LoRA 的梯度计算公式(2)如果和这两个低秩矩阵初始化都是全 0 那么两个矩阵的梯度都是 0,也就训不起来。

LoRA 优势

  1. 可以针对不同的下游任务构建小型 LoRA 模块,从而在共享预训练模型参数基础上有效地切换下游任务。
  2. LoRA 不需要计算梯度或维护大多数参数的优化器状态,训练更有效、硬件门槛更低。
  3. LoRA 使用简单的线性设计,在部署时将可训练矩阵与冻结权重合并,不存在推理延迟。LoRA 与其他方法正交,可以组合(prefix-tuning)。

实验

Wq,Wk,Wv,Wo(多头 attention),MLP 层的权重矩阵

同时调整Wq,Wv会产生最佳结果

保证权重矩阵的种类的数量比起增加隐藏层维度r更为重要,增加r并不一定能覆盖更加有意义的子空间

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

为了使 LoRA 的效果尽可能接近最优,权重B的学习率应该要大于权重A的学习率。

LoRA+: Efficient Low Rank Adaptation of Large Models (opens new window)

References

  • 深入浅出 LoRA (opens new window)
  • LLM 微调(Finetune) 技术--LoRA (opens new window)
  • 大模型参数高效微调技术原理综述(五)-LoRA、AdaLoRA、QLoRA (opens new window)
  • 梯度视角下的 LoRA:简介、分析、猜测及推广 (opens new window)
  • 配置不同的学习率,LoRA 还能再涨一点? (opens new window)
  • 大模型高效微调-LoRA 原理详解和训练过程深入分析 (opens new window)
#LoRA
上次更新: 2024/07/12, 15:43:54
P-tuning
LoRA变体

← P-tuning LoRA变体→

最近更新
01
EASE
07-12
02
GAN
07-11
03
VAE
07-11
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Geeks_Z | MIT License
京公网安备 11010802040735号 | 京ICP备2022029989号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式