©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 其实也不例外。为了认识到这一点,我们