2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models
Paper: https://arxiv.org/abs/2106.09685
Code: https://github.com/microsoft/LoRA
大型语言模型的LoRA低秩自适应
自然语言处理的一个重要范式包括对通用领域数据的大规模预训练和对特定任务或领域的适应。当预训练更大的模型时,完全微调(重新训练所有模型参数)变得不那么可行。以 GPT-3 175B 为例,部署微调模型的独立实例,每个实例都有 175B 参数,成本高得令人望而却步 因此, 作者提出了低秩自适应(Low-Rank Adaptation,简称LoRA),它冻结了预训练模型的权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层中,大大减少了下游任务的可训练参数数量。与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以将可训练参数的数量减少 10,000 倍,将 GPU 内存需求减少 3 倍。LoRA 在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 上的模型质量与微调相当或更好,尽管可训练参数更少、训练吞吐量更高,并且与适配器不同,没有额外的推理延迟。
LoRA用来降低大语言模型下游任务训练的算力及内存资源需求量,降低预训练大模型产品化落地的成本。
LoRA基本思想
- 在原始PLM旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的intrinsic rank。
- 训练的时候固定PLM的参数,只训练降维矩阵A与升维矩阵B。
- 而模型的输入输出维度不变,输出时将BA与PLM的参数叠加。用随机高斯分布初始化A,用0矩阵初始化B,保证训练的开始此旁路矩阵依然是0矩阵。
下面是参数的更新表示:
其中,预训练的矩阵为 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+B A, 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 < < m i n ( d , k ) r << min(d,k) r<<min(d,k)。
对于 h = W 0 x h=W_0x h=W0x ,它的前向计算变为:
h = W 0 x + Δ W x = W 0 x + B A x = ( W 0 + B A ) x h=W_0 x+\Delta W x=W_0 x+B A x=\left(W_0+B A\right) x h=W0x+ΔWx=W0x+BAx=(W0+BA)x
这种方式类似与残差连接,同时使用这个旁路的更新来模拟full finetuning的过程。