Introduction
freeze the pre-trained model weights, inject trainable low-rank matrices into each layer, 从而只用训练很少的参数,就可以达到全参数微调一样的效果
特点
- significantly reduces total trainable parameters
- does not add any inference latency
because adapter weights can be merged with the base model - 可以给不同的 task 训练不同的 LoRA model
- 可以很方便的切换不同的 task
- 可以和其他的 parameter-efficient methods 方法一起使用
idea
论文 Armen Aghajanyan, Luke Zettlemoyer, and Sonal Gupta. Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. arXiv:2012.13255 [cs], December 2020.
证明了the pre-trained language models have a low “intrinsic dimension” and can still learn efficiently despite a random projection to a smaller subspace
所以作者 hypothesize the updates to the weights also have a low “intrinsic rank” during adaptation.
原理
h = W 0 x + Δ W x = W 0 x + B A x h=W_0 x + \Delta W x = W_0 x + BAx h=W0x+ΔWx=W0x+BAx
其中 B B B和 A A A为低秩矩阵,B 的 size ( d , r ) (d, r) (d,r), A 的 size ( r , k ) (r, k) (r,k), r < < m i n ( d , k ) r<<min(d, k) r<<min(d,k)
B A = Δ W BA=\Delta W BA=ΔW
Train
参数初始化
random Gaussian initialization for A, zero for B
目的是保留预训练知识
初始时 BA is zero, 这样可以保留预训练知识,不会改变预训练权重的初始化分布,如果直接将ΔW初始化为随机矩阵,那么预训练权重矩阵W_0的初始化分布就会被完全改变,模型很可能会失去预训练所学到的知识。
可以缓慢地从预训练模型开始,让适配矩阵ΔW逐渐学到下游任务所需的低秩特征变化
scale Δ W x \Delta Wx ΔWx
用 α / r α / r α/r 来缩放 Δ W x \Delta Wx ΔWx
作用
如果不进行缩放,当 r r r 变大时, Δ W ΔW ΔW的参数数量线性增长( r ∗ ( d + k ) r * (d+k) r∗(d+k)), Δ W x ΔWx ΔWx的大小也会快速增大。
而引入 α / r α / r α/r 后,当 r r r 增大时,学习到的 Δ W \Delta W ΔW 被等比例缩小, Δ W x \Delta Wx ΔWx 的大小可以大致保持不变。
调整 α 相当于调整学习率
如果不改变Adam的其他超参数设置,改变 α 只会按比例缩放 Δ W \Delta W ΔW 所有参数,相当于改变整体的初始学习率。
α 的精确值不太重要
作者 simply set α to the first r r r they try and do not tune it.
Inference
新的参数 B A BA BA 和原始的参数矩阵 W 0 W_0 W0 会在加载模型时先合并, W 0 ∗ x + B A ∗ x = ( W 0 + B A ) ∗ x W_0 * x + BA * x = (W_0 + BA) * x W0∗x+BA∗x=(W0+BA)∗x
推理时用的用的是已经合并过的参数
所以推理时的计算量和只用原始的参数矩阵是一样的
作用的参数
理论上可以应用于任何神经网络的参数
作者的研究中只选择了 transformer 中 self-attention 模块
一共涉及 4 个矩阵:
w
q
,
w
k
,
w
v
,
w
o
w_q, w_k, w_v, w_o
wq,wk,wv,wo
w q , w k , w v w_q, w_k, w_v wq,wk,wv 是各个 token 的 embedding 输入 self attention 时,要分别乘以 query、key、value 的矩阵
w o w_o wo 是多头的 attention 算完以后,乘以的一个矩阵
性能的节省
显存节省了2/3 ,在 r < < d m o d e l r << d_{model} r<<dmodel的情况下
在训练 GPT-3 175B 时显存从 1.2TB 降到了350GB
原参数W 和 BA 的参数对比
W 的 size需要是(d, k),一共 d ∗ k d*k d∗k 个参数
B 的 size (d, r), A 的 size (r, k),一共 d ∗ r + r ∗ k = r ∗ ( d + k ) d*r + r*k = r * (d+k) d∗r+r∗k=r∗(d+k)个参数
而 r < < M i n ( d , k ) r<<Min(d, k) r<<Min(d,k)
所以BA 的参数数量远小于 W
节省了模型存储的空间
With r = 4 and only the query and value projection matrices being adapted,存储空间节省了 10,000倍 (from 350GB to 35MB)
减少了训练时间
a 25% speedup during training on GPT-3 175B compared to full fine-tuning
超参数选择
固定可以训练的参数数量,应该把 adapter 应用在哪些 matrix 上?
作者的试验结论是应该用在多个矩阵上,而不是一个
假设固定 r 最多是 8,把 8 分配给任意一个矩阵,效果都不太好,效果最好的是给 4 个矩阵分别分配 2,其次是给 w_q 和 w_v 分别分配 4
r 决定了参数总数量
非常低的“intrinsic rank”
使用极低的rank(例如r=1)就能实现很好的性能
对于适配单个权重矩阵 W q W_q Wq来说,需要使用较大的rank(r=8)才能达到最佳性能。但是当同时适配 W q W_q Wq和 W v W_v Wv时,使用极低的rank(r=1或2)就能实现最佳结果。
提高rank并不一定提高性能,例如从r=4提升到r=64时,性能基本保持不变。这进一步支持适配矩阵具有低秩的结论。
实现
使用 huggingface 的包PEFT可以很容易实现
LoRA+PrefixEmbed
作者尝试了同时使用了两种方法
在一些任务上相比 LoRA有一点进步,在另一些任务上基本持平,可能是 LoRA 已经达到很高的水平了。
说明两种方法结合会起到促进作用,但是会有多大进步,并没有研究的很清楚
缺点
一个 batch 只能训练同一个任务,因为不同任务需要加载不同的 adapter
Δ W ΔW ΔW和 W W W的关系
ΔW与W有较强的相关性,而不是与一个随机矩阵相关。这表示ΔW放大了W中已经学习到的某些特征。
但是ΔW并没有重复W中前几个主要的奇异值方向,而是放大了W中没有被强调的某些方向。
放大比例非常大:例如当r=4时, ‖ Δ W q ‖ F ‖ΔWq‖F ‖ΔWq‖F 与 ‖ U W T W q V T ‖ F ‖UWT WqVT‖F ‖UWTWqVT‖F 的比值达到了21.5。
随着r的增加,ΔW学习到的方向与W前几个奇异值方向的重合度增加。这也解释了为什么使用较小的r就能获得足够的性能。
综上,适配矩阵ΔW可能放大了一些对下游任务很重要但是在预训练模型中没有被强调的特征。这可能揭示了适配预训练语言模型的本质机制。