lora本质是对大模型微调的方法,
nlp处理的一个重要例子是对一般领域数据的大模型对特定任务或领域的适应。当预训练大模型很大时,重新训练所有模型参数的微调变得不可太行,例如gpt3的175B。提出的lora采用低秩分解矩阵,冻结了预训练模型的权重,并将低秩分解矩阵注入到transformer的每一层,减少了训练参数量。
如上图所示们对于某个线性层而言,左边是模型原有的参数,在训练过程中是冻结不变的,右边是lora方法增加的低秩分解矩阵。训练过程中,优化器只优化右边这一部分的参数,两边的矩阵会共用一个模型的输入,分别进行计算,最后将两边的计算结果相加作为模块的输出。不同于之前的参数高效微调的adapter,adapter是在模块的后面接上一个mlp,对模块的计算结果进行一个后处理,而lora是和模块的计算并行的去做一个mlp,和原来的模块共用一个输入。
根据之前的一些工作,发现大模型其实是过参数化的, 有更小的一个内在维度,于是文章做了一个假设,模型在任务适配过程中,参数的改变量是低秩的,在训练过程中,lora单独去学习这个改变量,而不是去学习模型的参数,通过把最终训练得到的参数分解为原参数W0和该变量deltaW进行相加,论文假设deltaW是低秩的,把deltaW进一步拆分为低秩矩阵A和低秩矩阵B,如图1所示,而在推理的过程中,由于模型参数已经固定不再变动,这时候把模型的改变量直接放到模型里,这样在推理的计算过程中,就避免了一次额外的矩阵乘法开销。就是想repvgg重参数化这样的操作,推理是改变量是直接加到原路径中的。在切换不同推理任务时,只需要从模型参数里减去当前任务的该变量,再换上新任务的改变量即可。
理论上lora可以支持任何线性层,包括transformer中的4个attention矩阵和2个feed forward中的矩阵,论文旨在attention上做了实验,它限制总参数量不变的情况下观察是在attention其中一个矩阵上,放一个更高秩的lora,还是在多个attention的矩阵上,分别放置低秩一点的lora效果好?结论是把秩分散到多个矩阵上,效果会优于集中在单个上的效果。至于在一般任务上很小的秩就可以和很大秩的效果,这也证明了作者一开始做出的改变量低秩的假设。
初始化一开始右边为0,也就意味着模型优化的初始点就和原本的大模型能够保持一致,这一点和controlnet中的zero convolution是一致的。