赞
踩
这篇文章是微软在21年的一篇文章,不过我了解得比较晚,最近才发现有这个工作,就匆匆地扫了眼里面的内容。
如前所述,这篇文章是21年的一个工作了,当时应该是GPT3刚出,LLM的影响力还没有那么大,主流的范式还是使用大数据进行预训练之后在小数据集上进行finetune。
因此,针对大模型的finetune优化还是一个非常关键的问题,尤其当参数量巨大而普遍使用的GPU显存并没有那么大的时候,如何在不损失模型效果的情况下缩小模型以及加速推理就是一个巨大的问题。
而这篇文章就是在这里进行了一些讨论,给出了一个名为LoRA的方法,优化了模型finetune,具体来说就是通过LoRA的方式在不损伤模型效果的前提下缩减了模型的参数总量,从而大幅缩减了模型finetune所需的内存,提升finetune的速度。
下面,我们就来看一下LoRA的具体方法设计以及对应的实验效果考察。
LoRA的整体思路个人觉得还是非常巧妙的。
众所周知,finetune的本质是在小的特定数据集下对预训练大模型的参数进行微调,使得其能够在保留大数据预训练的只是前提下,在特定的小数据集当中获得更好的表现。因此,finetune的本质就是对模型增加一个微扰,使得其收敛到一个更适合于某特定任务的局部最优点。
而LoRA的核心思路就是,直接freeze模型的全部参数,然后额外给模型增加一个扰动的module,来模拟finetune之后参数改变的效果。如此一来,只要这些扰动的module参数量够小且推理够快,就不会影响模型整体的inference成本,且可以大幅地缩减模型finetune的开销,因为我们只需要训练极小量的一部分参数即可。
我们给出文中的LoRA结构示意图如下:
对应的数学公式如下:
h = W 0 ⋅ x + Δ W ⋅ x = W 0 ⋅ x + B A x h = W_0 \cdot x + \Delta W \cdot x = W_0 \cdot x + BAx h=W0⋅x+ΔW⋅x=W0⋅x+BAx
其中,关于这里扰动部分的设计,也就是公式中的 Δ W \Delta W ΔW的设计,文中应该是借鉴了Adapter的设计思路,也就是先将输入向量投影到一个较小维度( r r r)的向量当中,再恢复到原始的维度( d d d),从而即可将计算复杂度从 O ( d 2 ) O(d^2) O(d2)降低至 O ( r d ) O(rd) O(rd)。
给出LoRA模型带来的推理速度的变化如下表所示:
可以看到:
下面,我们来看一下文中的实验以及对应的实验结果。
首先,文中在Bert系列模型以及GPT系列模型当中分别考察了一下LoRA的模型效果。
给出以Roberta以及DeBerta为代表的Bert系列模型上LoRA的效果表现如下:
可以看到:
同样的,我们给出GPT2与GPT3上的模型效果如下:
可以看到:
最后,文中还给出了LoRA策略对于参数量的可扩展性,也就是说,对于不同量级的参数,LoRA策略是否一直有效。
可以看到:
除了上述基本的效果考察之外,文中还对LoRA具体的生效机制进行了考察,具体来说包括:
下面,我们来具体看一下这些内容。
首先,文中考察了以下在限制LoRA额外增加的参数总量的情况下,如何对扰动进行分配可以获得最好的效果,得到结果如下:
可以看到:
然后,确定了添加方式之后,文中还考察了以下放缩比例对模型效果的影响,得到结果如下:
可以看到:
为了进一步说明上述结论,文中还给出了 r = 8 r=8 r=8以及 r = 64 r=64 r=64时矩阵的相似度比较如下:
可以看到:
更进一步地,文中还考察了两次训练后参数的相似度以及其和未经过训练的随机初始化参数的相似度结果如下:
可以看到:
最后,文中还考察了一下LoRA的扰动项带来的扰动量级与原始矩阵的对比,得到结果如下:
可以看到:
综上,我们可以看到:
这个问题在当前LLM盛行且越来越巨大化的趋势下就显得尤为重要了,尽管现在工作中暂时还不需要对大模型进行finetune,不过有这些知识储备终归还是有备无患了。
毕竟书到用时方恨少,事非经过不知难,加油,頑張れ!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。