简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation)

这篇具有很好参考价值的文章主要介绍了简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[论文地址] [代码] [ICLR 22]

阅前须知:本博文可能有描述不准确/过度简化/出错的地方,仅供参考。


网络结构

简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation),划水
其中,原有模型的参数是直接冻结的,可训练参数只有额外引入的LoRA参数(由nn.Parameter实现)。


模型微调的本质

记网络原有预训练参数为 W 0 ∈ R d × k W_0 \in R^{d \times k} W0Rd×k。在新的下游任务微调后,参数变为 W ∈ R d × k W \in R^{d \times k} WRd×k。可以发现,参数的变化量 Δ W = W − W 0 \Delta W = W - W_0 ΔW=WW0。换而言之,有: W = W 0 + Δ W W=W_0+\Delta W W=W0+ΔW 也就是说,对模型微调,其实可以将原有参数 W 0 W_0 W0直接给冻结了,只学这个变化量 Δ W = W − W 0 \Delta W = W - W_0 ΔW=WW0即可。


为什么要进行低秩分解

LoRA文中指出,现有的预训练模型通常是过参数化的(the learned over-parametrized models in fact reside on a low intrinsic dimension),在对这些模型进行微调时,参数的更新主要在低维子空间中。换而言之,很多高维子空间的参数在微调前后根本就没动。基于这一点,微调所学的 Δ W \Delta W ΔW其实也就不需要那么高的维度(秩),我们可以将其降低到一个更低的维度进行优化。当然从这里也可以注意到,如果参数的更新也会大量发生在高维子空间中,此时进行低秩分解会遗漏信息,导致LoRA失效。


如何理解低维子空间/高维子空间特征

这里笔者给出一个可能不正确的类比。比如在计算机视觉中,无论是做分割,检测,医学等各种不同下游任务,都可以基于ImageNet上的预训练模型(如ResNet)进行微调。预训练模型中的纹理,边缘,轮廓等特征,一般是无论做哪种任务都需要的,那么这种任务无关特征就类似于上面所提到的高维子空间特征,在下游任务微调时基本上不发生变化。反之,对于一些下游任务中自有的先验特征(比如特有的光照条件,目标位置分布),则可以被视为上面所提到的低维子空间特征。模型想要刷点到SOTA则必须对这些任务相关特征进行有效的利用。


以数学形式描述低秩分解

LoRA将参数变化量矩阵 Δ W \Delta W ΔW分解成了两个低秩矩阵相乘,有: Δ W = B A \Delta W=BA ΔW=BA其中 B ∈ R d × r B \in R^{d \times r} BRd×r A ∈ R r × k A \in R^{r \times k} ARr×k。一般来说, r ≪ m i n ( d , k ) r \ll min(d, k) rmin(d,k)


为什么矩阵B被初始化为0,而矩阵A正常高斯初始化

这里讨论另外两种设置的缺点:

  • 如果B,A全都初始化为0,那么缺点与深度网络全0初始化一样,很容易导致梯度消失(因为此时初始所有神经元的功能都是等价的)。
  • 如果B,A全部高斯初始化,那么在网络训练刚开始就会有概率为得到一个过大的偏移值 Δ W \Delta W ΔW从而引入太多噪声,导致难以收敛。

因此,一部分初始为0,一部分正常初始化是为了在训练开始时维持网络的原有输出(初始偏移为0),但同时也保证在真正开始学习后能够更好的收敛。


低秩分解到底有多低

哪怕降到8也是高度可用的,甚至能降到1:
简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation),划水
注意这里r=64时性能甚至降低了。按照先前的结论来解释,这是因为参数的更新大多在低秩空间内;使用高秩矩阵允许对高维空间进行更新,反而可能会导致额外的非必要参数变化(引入了噪声)。


LoRA最终被插入在网络的哪些地方

只加在了Self Attention层的Q,K,V,O矩阵上,其余部分诸如MLP等位置则没有添加。当然,后续也有一些实验[1]表明,在其他任务中只添加在Q和K上会更好,如下图所示。因此这也可以算实际应用LoRA中一个可调节的点了。
简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation),划水
简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation),划水


LoRA与Adapter的区别

其实从结构上讲,更早出现的Adapter也是引入了少量可训练参数,并且也具有先降维再升维的"BottleNeck"型结构,如下所示:
简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation),划水
主要的区别个人认为有如下几点:

  • 插入位置。LoRA是以残差连接的形式"并联"在Transformer的Q,K,V,O矩阵上,而Adapter是插入在Feed-forward Layer后面。
  • 推理延迟。LoRA在训练完后其参数可以与原有预训练模型直接合并,变回单分支结构,不会引入额外的延迟;而Adapter由于引入了额外的串联网络层,因此会带来额外的延迟。
  • 参数存储。使用LoRA进行微调,在训练完毕后只需要保存LoRA本身的参数;而使用Adapter则要保存整个原有模型的参数。

LoRA参数如何与模型原有参数合并

简单理解的话就是乘法结合律, W 0 x + Δ W x = ( W 0 + Δ W ) x = W x W_0x+\Delta Wx = (W_0+\Delta W)x = Wx W0x+ΔWx=(W0+ΔW)x=Wx,也就是把LoRA参数矩阵加回原参数即可。


参考文献

[1] Customized Segment Anything Model for Medical Image Segmentation文章来源地址https://www.toymoban.com/news/detail-613960.html

到了这里,关于简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包