LoRA 的全称是 LoRA: Low-Rank Adaptation of Large Language Models,是一种以极低资源微调大模型的方法,其来自于论文 LoRA: Low-Rank Adaptation of Large Language Models ¹。
LoRA 的核心思想是冻结预训练的模型权重,并将可训练的秩分解矩阵注入 Transformer 架构的每一层,从而大大减少了下游任务的可训练参数数量。相比于完全微调,LoRA 可以节省显存、提高训练速度、减少推理延迟,并且保持或提升模型质量。
LoRA 可以应用于自回归模型(如 GPT 系列)和 Encoder-Decoder 模型(如 T5),并且可以与不同规模的预训练模型(如 RoBERTa, DeBERTa, GPT-2, GPT-3)兼容。
随着模型规模的不断扩大,模型会“涌现”出各种能力。特别是对大语言模型 (LLM) 来说,随着规模的扩大其在 zero-shot、常识推理等能力上会有大幅度的提高。
但是,大模型的微调成本和部署成本也非常高。例如,GPT-3 175B 模型微调需要 1.2TB 的显存。此外,若针对不同下游任务微调多个模型,那么就需要为每个下游任务保存一份模型权重,成本非常高。在某些场景下,甚至可能需要针对不同的用户微调不同的模型,那么模型微调和部署的成本将不可接受。
因此,如何降低大模型微调和部署成本,将是大模型商用的重要一环。
在 LoRA 方法提出之前,也有很多方法尝试解决大模型微调困境的问题。其中有两个主要的方向:
但是这两种方法都有局限性:
LoRA 为了更加参数高效,使用相对非常小的参数 Θ \Theta Θ 来表示任务相关的参数增量 Δ Φ = Δ Φ ( Θ ) \Delta\Phi=\Delta\Phi (\Theta) ΔΦ=ΔΦ(Θ) ,其中 ∣ Θ ∣ ≪ ∣ Φ 0 ∣ |\Theta|\ll |\Phi_0| ∣Θ∣≪∣Φ0∣ 。寻找 Δ Φ \Delta\Phi ΔΦ 的任务就变成对 Θ \Theta Θ 的优化:
max Θ ∑ ( x , y ) ∈ Z ∑ t = 1 ∣ y ∣ log ( p Φ 0 + Δ Φ ( Θ ) ( y t ∣ x , y < t ) ) \max_ {\Theta}\sum_ { (x,y)\in\mathcal {Z}}\sum_ {t=1}^ {|y|}\log (p_ {\Phi_0+\Delta\Phi (\Theta)} (y_t|x,y_ {
LoRA 将会使用低秩表示来编码 Δ Φ \Delta\Phi ΔΦ ,同时实现计算高效和存储高效。当预训练模型是 175B GPT-3,可训练参数 ∣ Θ ∣ |\Theta| ∣Θ∣ 可以小至 ∣ Φ 0 ∣ |\Phi_0| ∣Φ0∣ 的 0.01% 。
对于预训练权重矩阵 W 0 ∈ R d × k W_0\in\mathbb {R}^ {d\times k} W0∈Rd×k ,可以通过低秩分解来表示其更新 W 0 + Δ W = W 0 + B A , B ∈ R d × r , A ∈ R r × k W_0+\Delta W=W_0+BA,B\in\mathbb {R}^ {d\times r},A\in\mathbb {R}^ {r\times k} W0+ΔW=W0+BA,B∈Rd×r,A∈Rr×k 且秩 r ≪ min ( d , k ) r\ll\min (d,k) r≪min(d,k) 。在训练过程中, W 0 W_0 W0 被冻结且不接受梯度更新, A A A 和 B B B 则是可训练参数。注意, W 0 W_0 W0 和 Δ W = B A \Delta W=BA ΔW=BA 都会乘以相同的输入。对于 h = W 0 x h=W_0x h=W0x ,前向传播变为:
h = W 0 x + Δ W x = W 0 x + B A x h=W_0x+\Delta Wx=W_0x+BAx h=W0x+ΔWx=W0x+BAx
对矩阵 A A A 使用随机高斯初始化,对矩阵 B B B 使用 0 进行初始化,因此 Δ W = B A \Delta W=BA ΔW=BA 在训练的开始为 0。使用 α r \frac {\alpha} {r} rα 来缩放 Δ W x \Delta Wx ΔWx 。当使用 Adam 优化时,经过适当的缩放初始化,调优 α \alpha α 与调优学习率大致相同。
当进行部署时,以显式的计算和存储 W = W 0 + B A W=W_0+BA W=W0+BA ,并正常执行推理。 W 0 W_0 W0 和 B A BA BA 都是 R d × k \mathbb {R}^ {d\times k} Rd×k 。当需要转换至另一个下游任务,可以通过减去 B A BA BA 来恢复 W 0 W_0 W0 ,然后添加不同的 B ′ A ′ B'A' B′A′ 。
论文中使用了四种不同规模的预训练模型:RoBERTa-base, DeBERTa-base, GPT-2-medium, GPT-3-175B。其中前两种是 Encoder 模型,后两种是 Decoder 模型。
论文中使用了八个下游任务:SQuAD v1.1, SQuAD v2.0, CoQA, RACE, MNLI, SST-2, QQP, QNLI。其中前四个是机器阅读理解任务,后四个是 GLUE 任务。
论文中将 LoRA 与以下方法进行了比较:
论文中使用了两种评价指标:模型质量和推理时延。模型质量使用 F1 或者准确率来衡量。推理时延使用单个 GPU 上的推理时间来衡量。
论文中给出了各种方法在不同任务上的模型质量和推理时延的结果。这里只展示部分结果,完整结果可以参考原论文。
LoRA 在模型质量上与 full fine-tuning 相当或者更好,并且远超过其他方法。同时,LoRA 的推理时延与 full fine-tuning 和 freeze 相同,并且比 adapter 和 prefix-tuning 小很多。
论文中还对 LoRA 的一些性质和特点进行了分析和讨论,这里只简要介绍一些,完整内容可以参考原论文。
根据论文和网上的一些资料²³,我们可以总结出 LoRA 模型的一些优缺点:
LoRA 模型作为一种以极低资源微调大模型的方法,可以应用于以下一些场景:
论文中提供了一个开源的代码库,可以方便地将 LoRA 集成到 PyTorch 模型中,并提供了 RoBERTa, DeBERTa, 和 GPT-2 的实现和模型检查点。代码库的地址是:https://github.com/microsoft/LoRA
代码库中包含了以下几个部分:
代码库中还提供了一些使用说明和示例命令,可以参考 README.md 文件。
Source: Conversation with Bing, 2023/6/12
(1) 你真的会用LORA吗?超详细讲解LORA分层控制 - 知乎. https://zhuanlan.zhihu.com/p/621260240.
(2) LoRA 指南 - 知乎. https://zhuanlan.zhihu.com/p/600628691.
(3) 什么是LoRA模型,如何使用和训练LoRA模型?你想要的都在这!. https://zhuanlan.zhihu.com/p/624230991.
Source: Conversation with Bing, 2023/6/12
(1) LoRA: Low-Rank Adaptation of Large Language Models. https://arxiv.org/abs/2106.09685.
(2) 【自然语言处理】【大模型】极低资源微调大模型方法LoRA … https://zhuanlan.zhihu.com/p/618073170.
(3) 论文阅读:LORA-大型语言模型的低秩适应 - 知乎. https://zhuanlan.zhihu.com/p/611557340.
Q ′ = Q + Δ Q = Q + B Q A Q Q'=Q+\Delta Q=Q+B_QA_Q Q′=Q+ΔQ=Q+BQAQ
K ′ = K + Δ K = K + B K A K K'=K+\Delta K=K+B_KA_K K′=K+ΔK=K+BKAK
V ′ = V + Δ V = V + B V A V V'=V+\Delta V=V+B_VA_V V′=V+ΔV=V+BVAV
然后使用 Q ′ Q' Q′, K ′ K' K′, V ′ V' V′ 来计算自注意力的输出 Z Z Z。这样相当于在输入端增加了一个残差连接。
Z ′ = Z + Δ Z = Z + B A Z'=Z+\Delta Z=Z+BA Z′=Z+ΔZ=Z+BA
然后使用 Z ′ Z' Z′ 作为自注意力的输出。这样相当于在输出端增加了一个残差连接。
A = s o f t m a x ( Q K T d k ) + Δ A = s o f t m a x ( Q K T d k ) + B A A=\mathrm {softmax} (\frac {QK^T} {\sqrt {d_k}})+\Delta A=\mathrm {softmax} (\frac {QK^T} {\sqrt {d_k}})+BA A=softmax(dkQKT)+ΔA=softmax(dkQKT)+BA
然后使用 A A A 来计算自注意力的输出 Z Z Z。这样相当于在自注意力的中间增加了一个残差连接。
Source: Conversation with Bing, 2023/6/12
(1) Using LoRA for Efficient Stable Diffusion Fine-Tuning … https://huggingface.co/blog/lora.
(2) Picotest-J2101A Injection Transformer 10Hz - 45MHz. https://www.picotest.com/products_J2101A.html.
(3) GitHub - Blealtan/RWKV-LM-LoRA: RWKV is a RNN with … https://github.com/Blealtan/RWKV-LM-LoRA.
Q ′ = Q + a d a p t e r ( Q ) Q'=Q+\mathrm {adapter} (Q) Q′=Q+adapter(Q)
K ′ = K + a d a p t e r ( K ) K'=K+\mathrm {adapter} (K) K′=K+adapter(K)
V ′ = V + a d a p t e r ( V ) V'=V+\mathrm {adapter} (V) V′=V+adapter(V)
然后使用 Q ′ Q' Q′, K ′ K' K′, V ′ V' V′ 来计算自注意力的输出 Z Z Z。或者:
Z ′ = Z + a d a p t e r ( Z ) Z'=Z+\mathrm {adapter} (Z) Z′=Z+adapter(Z)
然后使用 Z ′ Z' Z′ 作为自注意力的输出。
¹: Houlsby, N., Giurgiu, A., Jastrzebski, S., Morrone, B., de Laroussilhe, Q., Gesmundo, A., … & Gelly, S. (2019). Parameter-efficient transfer learning for NLP. arXiv preprint arXiv:1902.00751.
²: Pfeiffer, J., Rücklé, A., Eger, S., & Gurevych, I. (2020). AdapterHub: A framework for adapting transformers. arXiv preprint arXiv:2007.07779.
Source: Conversation with Bing, 2023/6/12
(1) Compacter: Efficient Low-Rank Hypercomplex Adapter Layers. https://arxiv.org/abs/2106.04647.
(2) Parameter-Efficient Transfer Learning for NLP - arXiv.org. https://arxiv.org/pdf/1902.00751.pdf.
(3) Adapters for Generative and Seq2Seq Models in NLP. https://adapterhub.ml/blog/2021/04/adapters-for-generative-and-seq2seq-models-in-nlp/.
(4) Adapters: A Compact and Extensible Transfer Learning … https://medium.com/dair-ai/adapters-a-compact-and-extensible-transfer-learning-method-for-nlp-6d18c2399f62.
不会。LoRA 是不会引入推理时延的,因为 LoRA 不会改变预训练模型的结构和计算流程。具体来说,LoRA 只是在预训练模型的权重矩阵上加上一个低秩矩阵,而这个低秩矩阵可以在训练时就计算好,并且与原始权重矩阵相加,得到一个新的权重矩阵。这样,在推理时,就不需要额外的计算和通信,只需要使用新的权重矩阵进行原始 Transformer 层的计算即可。因此,LoRA 是不会引入推理时延的,这也是它与 adapter 的一个优势。
Source: Conversation with Bing, 2023/6/12
(1) Using LoRA for Efficient Stable Diffusion Fine-Tuning … https://huggingface.co/blog/lora.
(2) What is the difference between LoRa and LoRaWAN … https://www.techtarget.com/searchnetworking/answer/What-is-the-difference-between-LoRa-and-LoRaWAN.
(3) LoRA: Low-Rank Adaptation of Large Language Models. https://github.com/microsoft/LoRA.