查看原文
其他

梯度视角下的LoRA:简介、分析、猜测及推广

苏剑林 PaperWeekly 2023-09-02


©PaperWeekly 原创 · 作者 | 苏剑林

单位 | 追一科技

研究方向 | NLP、神经网络


随着 ChatGPT 及其平替的火热,各种参数高效(Parameter-Efficient)的微调方法也“水涨船高”,其中最流行的方案之一就是本文的主角 LoRA 了,它出自论文《LoRA: Low-Rank Adaptation of Large Language Models》[1]。LoRA 方法上比较简单直接,而且也有不少现成实现,不管是理解还是使用都很容易上手,所以本身也没太多值得细写的地方了。

然而,直接实现 LoRA 需要修改网络结构,这略微麻烦了些,同时 LoRA 给笔者的感觉是很像之前的优化器 AdaFactor [2],所以笔者的问题是:能否从优化器角度来分析和实现 LoRA 呢?本文就围绕此主题展开讨论。



方法简介

以往的一些结果(比如《Exploring Universal Intrinsic Task Subspace via Prompt Tuning》[3])显示,尽管预训练模型的参数量很大,但每个下游任务对应的本征维度(Intrinsic Dimension)并不大,换句话说,理论上我们可以微调非常小的参数量,就能在下游任务取得不错的效果。

LoRA 借鉴了上述结果,提出对于预训练的参数矩阵 ,我们不去直接微调 ,而是对增量做低秩分解假设:

其中  之一用全零初始化, 固定不变,优化器只优化 。由于本征维度很小的结论,所以  我们可以取得很小,很多时候我们甚至可以直接取 1。所以说,LoRA 是一种参数高效的微调方法,至少被优化的参数量大大降低了。



梯度分析
正如《Ladder Side-Tuning:预训练模型的“过墙梯”》所提到的,很多参数高效的微调实际上只是降低了显存需求,并没有降低计算量,LoRA 其实也不例外。为了认识到这一点,我们只需要观察  的梯度:


这里  是损失函数,并且约定参数的 shape 跟其梯度的 shape 一致。在训练过程中,求模型梯度是主要的计算量,如果全量更新,那么所用的梯度是 ,而 LoRA 所用的梯度则是  和 ,它们是建立在全量更新的梯度  基础上的,所以理论上 LoRA 的计算量比全量更新还大。
那为什么实际使用时 LoRA 的训练速度也会变快呢?有如下几个原因:
1. 只更新了部分参数:比如LoRA原论文就选择只更新Self Attention的参数,实际使用时我们还可以选择只更新部分层的参数; 2. 减少了通信时间:由于更新的参数量变少了,所以(尤其是多卡训练时)要传输的数据量也变少了,从而减少了传输时间; 

3. 采用了各种低精度加速技术,如FP16、FP8或者INT8量化等。



这三部分原因确实能加快训练速度,然而它们并不是 LoRA 所独有的,事实上几乎都有参数高效方法都具有这些特点。LoRA 的优点是它的低秩分解很直观,在不少场景下跟全量微调的效果一致,以及在预测阶段可以直接把  合并成单个矩阵从而不增加推理成本。



优化视角

事实上,梯度(2)也告诉了我们如何从优化器角度来实现 LoRA。优化器可以直接获取到全量梯度 ,然后我们只需要按照公式(2)对梯度进行投影,就得到  的梯度,接着就可以按照常规的优化器实现  的更新了。
假如优化器是 SGD,那么就是

如果是 Adam 之类的带滑动变量的优化器,则只需要滑动投影后的梯度,因此是降低了优化器的参数量,节省了一定的显存。模型越大,这部分参数所占的显存比例也就越大。
LoRA 约定  或  之一使用全零初始化,这是为了保证初始状态模型跟预训练一致,但同时也带来了不对称问题(一个全零,一个非全零)。事实上, 都使用非全零初始化也是可以的,只需要事先将预训练权重减去  就行了,或者等价地说,将  参数化为:

这样同时保持了初始状态一致,同时允许  都用非全零初始化,增强了对称性。



随机投影

如果我们将 SGD 场景下的更新量  展开,结果将是

假设  项是可以忽略的高阶项,那么就剩下

从这个角度来看,相比全量微调的 SGD,LoRA 就是用括号中的结果替代了全量的梯度 
简单起见,接下来我们只关心  的情形,留意到在上式中, 时刻的投影向量  是依赖于  的,如果我们将它们换成不依赖于  的随机向量(每步训练都重新随机生成),那么会发生什么呢?我们考虑 ,其中 ,那么更新量就变为

可以证明的是

这里的  分别指  的单位矩阵。因此,跟“零阶梯度”类似,在平均意义下,这种每步都重新初始化的 LoRA 事实上等价于满秩的 SGD。然而,真要按照这个方式实现的话,其速度甚至可能比满秩的 SGD 都要慢,所以它的目的不是提速,而是希望能缓解灾难遗忘问题——通过对单个(batch)样本使用低秩矩阵(而不是满秩)更新量的方式,减少对整个模型权重的影响。当然,这只是猜测,实际效果如何,笔者还没有实验过。

一个变体

同样还是先只考虑  的情形,LoRA 相当于假设了 ,我们能不能做其他低秩分解假设呢?比如 ?写成矩阵形式就是

其中  分别指  的全 1 矩阵。容易求出它的梯度是:

其实就是原本梯度的行求和与列求和。相比原版 LoRA,这个加性分解有两个优点:1)加比乘计算量更低,梯度形式也更简单;2)UV 的秩一定是 1,但是  的秩可能是 2,如果秩代表了模型能力的话,那也就是说同样的参数量,加性的表达能力可能还更强。至于具体效果如何,后面笔者用到 LoRA 的时候,再做对比实验吧。
那么,加性分解能不能推广到  的情形呢?自然是可以的,但稍微有些技巧。这里约定  都能被  整除,那么我们只需要将参数化方式改为

这里的  分别指  的分块矩阵,每一块则是  的单位阵。这个形式说白了,就是分别将  看成是  的分块矩阵,然后套用  的思路来操作。



文章小结


本文介绍了从梯度角度来理解 LoRA,除了基本的介绍外,还包含了笔者的一些猜测和推广,供读者参考。

参考文献

[1] https://arxiv.org/abs/2106.09685

[2] https://kexue.fm/archives/7302

[3] https://arxiv.org/abs/2110.07867



更多阅读



#投 稿 通 道#

 让你的文字被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。


📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算


📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿


△长按添加PaperWeekly小编



🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧



·
·

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存