本篇博客针对LoRA: Low-Rank Adaptation of Large Language Models的提出背景和算法原理做了非常清晰简明的讲解,适用于想要快速了解一下LoRA底层方法的学习者。对于原文的实验和未来工作等部分的详细介绍在LoRA论文精读(下) Low-Rank Adaptation of Large Language Models-CSDN博客中,如有兴趣,可以再进一步阅读。
1. 提出背景
在NLP领域中,我们将大规模的预训练语言模型应用到下游任务主要需要通过微调(fine-tuning)来实现。而微调方法可以分为全参微调和低参微调。
全参微调方法在每一次微调时都会更新预训练模型的所有参数。随着预训练语言模型的规模越来越大,参数越来越多,全参微调需要的计算和存储资源越来越大,成为了一大挑战。
在此背景下,涌现了一些低参微调方法,主要是通过固定大部分参数,调整少量与模型任务相关的参数来提高模型表现效果。LoRA即为低参微调方法之一,它由微软团队在2021年提出,主要通过低秩适应(Low-Rank Adaptation)来实现,在和其他微调方法的baseline享有comparable的性能表现下大大对降低了计算等硬件资源的需求。
2. 算法原理
LoRA的主要算法原理就汇聚在下面这幅图中,下面我们对这幅图做具体介绍。
X为输入变量,长度为d,h为输出变量,长度也为d,图中左边的d*d维的矩阵是预训练权重矩阵,可以反映涵盖整个映射过程,全参微调则是对这d*d个参数全部进行更新。而LoRA方法则是对矩阵进行分解,根据之前的研究知道W在更新时只有一个低秩矩阵在发生变化,我们把这个在发生变化的部分ΔW分解为B*A,B初始为零矩阵,而A初始为一个随机正态分布的矩阵。这个过程用公式表示如下:
A是一个d*r维的矩阵,B是一个r*d维的矩阵,我们会使得r<<d。BAx表示先把1*d维的向量x通过A映射到1*r维再通过B映射回1*d维代表x的变化量,再加上原本的预训练的权重矩阵W0*x,得到最终的输出变量h。这样做大大减少了参数数量,从原来的d*d变成了2*r*d,从而降低了计算门槛。
那为什么要这么对A、B矩阵做初始化呢?原因如下:(1)B设置为0可以使训练初期,新增的部分对原始参数的影响为零,从而不会破坏预训练模型的初始性能(2)A初始正太分布可以在引入随机性的情况下进行有效传播,避免梯度消失或梯度爆炸(3)如果B和A全部初始化为零矩阵,很容易导致梯度消失;如果B和A全部正态分布初始化,那么在模型训练开始时,就容易得到一个过大的偏移值。
LoRA的主要贡献在原文中总结如下:
(1)预训练模型可以共享并用于构建多个小型LoRA模块,以完成不同的任务。我们可以冻结共享模型,通过替换图中的矩阵A和B,高效地切换任务,从而大幅降低存储需求和任务切换开销。
(2)LoRA使用自适应优化器时,可以将训练效率提高3倍以上,从而降低硬件入门门槛。这是因为我们不需要计算大多数参数的梯度或维护优化器状态。相反,我们仅优化少量低秩矩阵。
(3)我们简单的线性设计允许在部署时将可训练矩阵与冻结的权重合并,从而在设计上实现了与完全微调模型相同的无推理延迟。
(4)LoRA可以与之前的许多方法结合使用,例如前缀微调等。
原文链接:[2106.09685] LoRA: Low-Rank Adaptation of Large Language Models
标签:精读,训练,Language,Models,模型,微调,矩阵,Rank,LoRA From: https://blog.csdn.net/weixin_72032564/article/details/144314802