1.lora是什么?
lora是Low-Rank Adaptation的缩写,是微软的Hu等人于2021年挂在ArXiv上(后又发表在ICLR2022上)的一篇论文《LoRA: Low-Rank Adaptation of Large Language Models》中提出的,通俗来讲,是一种降低模型可训练参数,又尽量不损失模型表现的大模型微调方法。为什么时隔两年,lora又突然火了一把呢?这一切都要感谢ChatGPT。ChatGPT大火为什么会带动大家学习lora的热情?想要解释清楚lora存在的意义,就得先从介绍大模型之“大”入手。
2.大模型到底“大”在哪?
对于有较少机会接触深度学习模型的人来说,可能比较难理解大模型到底大在哪里。大模型其实主要大在参数量级上。像ChatGPT等模型,动辄十亿、百亿甚至千亿级别的参数量。如果想直接快速地get到“参数”的意思,其实只要对McCulloch and Pitts等提出的简单神经元模型有个基本概念就行(如果想较为详细地学习,建议参考周志华老师的《机器学习》中的深度学习相关的章节)。简单神经元是将人类的大脑神经突触联接的结构抽象成一个个下图中的单元,xx表示接受的刺激,yy表示单元的输出,而ww就表示每种刺激对当前单元的刺激权重,θtheta表示刺激达到一个什么阈值才会产生输出,从而传递信号给下个单元。
图1 简单神经元模型(图片来自周志华的《机器学习》)
深度学习模型的基本组成可以抽象为简单神经元,其中每个神经元包含一定数量的参数,如上图所示的连接权重(w0w_0至wnw_n)和阈值(θtheta)。这些参数的总数为n+1n+1。参数的具体取值决定了神经元如何根据输入产生对应的输出,因此对模型的性能至关重要。理论上,参数数量越多,模型的学习能力相对越强。以ChatGPT等大型模型为例,当模型的参数量达到一定水平(如百亿级或更高)时,通过选择适当的模型结构和采用恰当的训练策略,这些模型能够表现出类似人类的能力,一定程度上证实了参数量对模型表现的影响。
那么,为什么模型参数不能无限增大呢?因为硬件资源是有限的,尤其是显存。例如,ChatGPT等大型语言模型通常具有数百亿的参数量,全参数量训练需要数百GB的显存。对于显卡资源有限的公司或个人,想要微调一个适合自己需求的大模型,可能会遇到显存不足的问题。因此,lora等轻量化微调方法受到了关注,以解决显存不足的挑战。
3. lora是怎么做到轻量化微调的?
lora的作者是被Aghajanyan等人2020年的工作《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》所启发。Aghajanyan等人提出了一个观点:预训练模型在特定任务上微调时具有较低的内在维度。在这里,“维度”指的是参数矩阵的维数,而“内在维度”描述了在达到一定精度水平时,解决由目标函数定义的优化问题所需的最小维数。简单来说,这意味着在特定子任务上训练预训练模型时,仅通过较少参数的微调便可以实现在当前子任务上达到全量微调90%以上的性能。于是,lora的作者们大胆假设:模型自适应微调的时候,更新的参数矩阵也有着较低的内在维度。对于一个预训练模型的参数矩阵W0∈Rd×kW_0in R^{dtimes k},ΔW∈Rd×kDelta Win R^{dtimes k}表示特定任务微调后,发生变化的参数矩阵。由于ΔWDelta W内在维度较低(矩阵的秩较低,即low-rank,点题了),又可以被表示成BABA,其中B∈Rd×r,A∈Rr×kBin R^{dtimes r},Ain R^{rtimes k},r≪min(d,k)rll min(d,k),rr可视为秩的大小。所以,在特定任务微调时,不需要全量参数微调,只要更新ΔWDelta W 就可以了。
图2 lora结构图(图来自lora原论文)
h=W0x+ΔWx=W0x+BAxh=W_0x+Delta Wx=W_0x+BAx
为什么更新ΔWDelta W 只需要更新较少的参数呢?举例来说,假设d=k=100,r=1d=k=100,r=1,W0W_0的参数量为10000个,而ΔWDelta W 的参数量只有200个,是原来的1/501/50,参数下降的十分显著。作者也在摘要中明确表示,他们采用lora方法微调,相比于GPT-3全量参数微调,可训练参数下降了10000倍,GPU显存需求下降了3倍,而lora微调后的效果,在特定任务上甚至可以媲美全量微调的模型。
这里为什么一直强调特定任务呢?因为lora基于的假设就是在特定任务上微调时,更新的参数矩阵具有较低的内在维度。可以把lora想象成一个特定能力的装备,而预训练模型是游戏角色本身。在预训练模型(游戏角色)的基础上,特定lora(装备)可以增强对于某一特定任务的表现,但是在其他不相关任务上该lora模块并不会起到作用。如果想同时在多个任务上有媲美全量参数微调模型的表现的话,就得需要针对不同的任务训练不同的ΔWDelta W模块(多个装备),最后整合在一起。但是,如果想模型(游戏角色)本身整体变强大,还是全量参数微调更合适。
4.lora是唯一的轻量化微调方法吗?
不是。在lora出现之前,已有两类轻量化参数微调方法:Adapter方法和Prefix tuning方法。与Adapter方法相比,lora不引入额外的模型层,微调后的ΔWDelta W模块只要与预训练模型的W0W_0相加即可,因此不会导致推理时间增加;而与Prefix tuning方法相比,lora的训练过程相对更为简便。此外,与Prefix tuning不同,lora无需增加额外的前缀表示,因此不会降低模型本身所支持的输入长度。这些优势使得lora成为一种颇具吸引力的轻量化微调方法。
lora在论文中也与其他两种方法进行了对比,实验结果如下:
图3 在不同的可训练参数量下,各种轻量化模型方法与全量微调表现的对比情况(图来自lora原论文)
如图所示,相比另外两种方法,Lora方法在不同的可训练参数量下,模型表现相对较好的基础上,表现更加稳定。
延伸阅读推荐
论文本身-LoRA: Low-Rank Adaptation of Large Language Models
原理理解-苏剑林-梯度视角下的LoRA:简介、分析、猜测及推广
代码实践-Huggingface-使用 LoRA 和 Hugging Face 高效训练大语言模型