LORA:大模型轻量级微调

  最近大模型高效微调成为业界关注的焦点,如何通过轻量微调变成各个不同领域的专业模型,成为讨论的热点。今天我们介绍一种轻量级的微调方法:LORA。

  LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

  随着 ChatGPT 的爆火,很多机构都开源了自己的大模型,比如清华的 ChatGLM-6B/ChatGLM-10B/ChatGLM-130B,HuggingFace 的 BLOOM-176B。当然还有很多没有开源的,比如 OpenAI 的 ChatGPT/GPT-4,百度的文心一言,谷歌的 PLAM-540B,华为的盘古大模型,阿里的通义千问,等等。

  图1:清华开源的ChatGLM-130B大模型这些大公司或者研究机构,都是有足够资源的来开发大模型,但是对于一般的小公司或者个人来说,要想开发自己的大模型几乎不可能,要知道像 ChatGPT 这样的大模型,一次训练的成本就在上千亿美元。

  那么那些小公司或者个人,又怎么能够利用这些开源的大模型,在自己的数据上继续训练,从而应用于自己的业务场景?有没有低成本的方法微调大模型?

  答案是有的。目前主流的方法包括2019年 Houlsby N 等人提出的 Adapter Tuning,2021年微软提出的 LORA,斯坦福提出的 Prefix-Tuning,谷歌提出的 Prompt Tuning,2022年清华提出的 P-tuning v2。

  这些方法都有各自的特点,从个人使用情况来说,LORA 的效果会好于其它几种方法。其它方法都有各自的一些问题:

  Adapter Tuning 增加了模型层数,引入了额外的推理延迟Prefix-Tuning 难于训练,且预留给 Prompt 的序列挤占了下游任务的输入序列空间,影响模型性能P-tuning v2 很容易导致旧知识遗忘,微调之后的模型,在之前的问题上表现明显变差基于上述背景,LORA 得益于前人的一些关于内在维度(intrinsic dimension)的发现:

  模型是过参数化的,它们有更小的内在维度,模型主要依赖于这个低的内在维度(low intrinsic dimension)去做任务适配。假设模型在任务适配过程中权重的改变量是低秩(low rank)的,由此提出低秩自适应(LoRA)方法。

  LoRA 允许我们通过优化适应过程中密集层变化的秩分解矩阵,来间接训练神经网络中的一些密集层,同时保持预先训练的权重不变。

  接下来我们介绍下细节。

  LoRA 的思想很简单:

  在原始 PLM (Pre-trained Language Model) 旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的。训练的时候固定 PLM 的参数,只训练降维矩阵 A 与升维矩阵 B 。而模型的输入输出维度不变,输出时将 BA 与 PLM 的参数叠加。用随机高斯分布初始化 A ,用 0 矩阵初始化 B ,保证训练的开始此旁路矩阵依然是 0 矩阵。假设要在下游任务微调一个预训练语言模型(如 GPT-3),则需要更新预训练模型参数,公式表示如下:

  W_0+\Delta W\tag1 W_0 是预训练模型初始化的参数, \Delta W 就是需要更新的参数。如果是全参数微调,则它的参数量 =W_0 (如果是 GPT-3,则 \Delta W\approx 175\text{B} )。从这可以看出要全参数微调大语言模型,代价是非常高的。

  而对于 LORA 来说,只需要微调 \Delta W

  具体来看,假设预训练的矩阵为 W_0\in \mathbb{R}^{d\times k} ,它的更新可表示为:

  W_0+\Delta W=W_0+BA,B\in\mathbb{R}^{d\times r},A\in \mathbb{R}^{r\times k}\tag1 其中秩 r\ll \text{min}\left( d,k \right)

  在 LoRA 的训练过程中, W_0 是固定不变的,只有 AB 是训练参数。

  在前向过程中, W_0\Delta W 都会乘以相同的输入 x ,最后相加:

  h=W_0x+\Delta W x=W_0x+BAx\tag3LORA 的这种思想有点类似于残差连接,同时使用这个旁路的更新来模拟 Full Fine-Tuning的过程。并且,Full Fine-Tuning可以被看做是 LoRA 的特例(当 r 等于 k 时)。

  在推理过程中,LoRA 也几乎未引入额外的 Inference Latency,只需要计算 W=W_0+\Delta W 即可。

  LoRA 与 Transformer 的结合也很简单,仅在 QKV Attention 的计算中增加一个旁路。

  下面是在各个任务上的效果:

  MNLI、SST-2 、MRPC、CoLA、QNLI、QQP、RTE、STS-B表示各项任务:

  MNLI(Multi-Genre Natural Language Inference):该任务是一个自然语言推理任务,要求模型根据给定的前提和假设来判断它们之间的关系(蕴含、中立或矛盾)。数据集中包含来自不同文体(新闻、文学等)的句子对。SST-2(Stanford Sentiment Treebank):该任务是一个情感分析任务,要求模型判断给定句子的情感是正面还是负面。MRPC(Microsoft Research Paraphrase Corpus):该任务是一个语义相似度任务,要求模型判断给定句子对是否具有语义相似性。CoLA(Corpus of Linguistic Acceptability):该任务是一个语言可接受性任务,要求模型判断给定句子是否符合语法规则和语言习惯。QNLI(Question NLI):该任务是一个自然语言推理任务,要求模型根据给定的问题和前提,判断问题是否可以从前提中推导出来。QQP(Quora Question Pairs):该任务是一个语义相似度任务,要求模型判断给定问题对是否具有语义相似性。RTE(Recognizing Textual Entailment):该任务是一个自然语言推理任务,要求模型根据给定的前提和假设来判断它们之间的关系(蕴含或不蕴含)。STS-B(Semantic Textual Similarity Benchmark):该任务是一个语义相似度任务,要求模型判断给定句子对是否具有语义相似性,但是与MRPC不同的是,STS-B中的句子对具有连续的语义相似性等级。可以看到 LORA 相比其它微调方法,可训练参数最少,但是整体上效果最好。

  结论:

  参数量较全参数微调(Fine-Tuning)显著降低,参数量和现有高效参数微调方法持平或更低。性能优于其它参数高效微调方法,和全参数微调(Fine-Tuning)基本持平甚至更高。和前面内容理解的结论基本一致,LORA 参数量更少,但是性能和全参数微调相当。

  备注:

  2E NLG Challenge(End-to-End Natural Language Generation Challenge)是一个年度举办的自然语言生成比赛。该比赛旨在推动和促进自然语言生成技术的发展,并为该领域的研究人员和从业者提供一个交流和展示的平台。比赛的任务是将给定的结构化数据转换为自然语言文本。比赛的数据集包括不同领域(如餐饮、酒店、娱乐等)的数据,其中包括用于描述餐厅、酒店等的数据,例如名称、地址、菜单、评论等。比赛的评估标准是BLEU(Bilingual Evaluation Understudy),它是一种常用于机器翻译和自然语言生成任务的评估指标。除此之外,评估还包括生成文本的流畅性、可读性和准确性等方面的考虑。E2E NLG Challenge为研究人员和从业者提供了一个展示自然语言生成技术的平台,并促进了该领域的研究和发展。该比赛已经成为自然语言生成领域中备受关注的比赛之一。前面 ROBbase 和 GPT-2 都是参数量比较小的模型,而在大模型 GPT-3 175B 上,LORA 也取得了不错的效果(见上图)。

  当增加微调方法的可训练参数量时,其它微调方法都出现了性能下降的现象,只有 LORA 的性能保持了稳定,见下图:

  结论:

  LORA 相比其它微调方法,增加参数量不会导致性能的下降。性能上与全参数微调持平甚至超过。实验结果显示,对于一般的任务, r=1,2,4,8 就足够了。而一些领域差距比较大的任务可能需要更大的 r

  同时,增加 r 值变大并不能提升微调的效果,这可能是因为参数量增加需要更多的语料。

  目前 LORA 已经被 HuggingFace 集成在了 PEFT(Parameter-Efficient Fine-Tuning) 代码库里。

  使用也非常简单,比如我们使用 LORA 微调 BigScience 机器翻译模型:

  模型微调好之后,加载也非常简单,只需要额外加载 LORA 参数:

  在前面我们介绍了,用随机高斯分布初始化 A ,用 0 矩阵初始化 B ,矩阵 A 为什么不也用0初始化?

  这主要是因为如果矩阵 A 也用0初始化,那么矩阵 B 梯度就始终为0,无法更新参数,导致 \triangle W=BA=0 。这里简单推理一下。

  对于 h=W_0x+BAx ,设 h^{\left( 2 \right)} =BAx ,则:

  h^{\left( 2 \right)}_i=\sum_jz_{i,j}x_j=\sum_j\left( \sum_kB_{i,k}A_{k,j} \right)x_j \tag4

  因此:

  \frac{\partial h^{\left( 2 \right)}_i}{\partial B_{i,k}}=\frac{\partial h^{\left( 2 \right)}_i}{\partial B_{i,k}}=\sum_jA_{k,j}x_j \tag5如果矩阵 A 也用0初始化,那么上面的梯度就变成了0。所以矩阵 A 不能用0初始化。

  同样,我们看一下矩阵 B 初始化0的影响。

  由于矩阵 B 的参数会发生更新,而 A 矩阵又不是0矩阵,因此后面 \triangle W=BA\ne0 ,所以矩阵 B 可以用0初始化。

  基于大模型的内在低秩特性,增加旁路矩阵来模拟全参数微调,LoRA 通过简单有效的方案来达成轻量微调的目的。它的应用自不必提,可以将现在的各种大模型通过轻量微调变成各个不同领域的专业模型。

  此外,考虑 OpenAI 对 GPT 模型的认知,GPT 的本质是对训练数据的有效压缩,从而发现数据内部的逻辑与联系,LoRA 的思想与之有相通之处,原模型虽大,但起核心作用的参数是低秩的,通过增加旁路,达到四两拨千斤的效果。

  LoRA: Low-Rank Adaptation of Large Language Models 简读

  我是阿豪啊:LoRA论文回顾

  Johnson7788:LoRA:大型语言模型的低秩适配器

  小虎AI珏爷:论文阅读:LORA-大型语言模型的低秩适应

  通用 AI 模型参数量越来越高,模型大小的标准是否正在发生变化?多大才算大模型?

  https://github.com/huggingface/peft

  https://arxiv.org/pdf/2106.09685.pdf

  最近将专栏相关内容收录在我的新书「推荐系统技术原理与实践」中,这本书系统性地整理、介绍了专栏中所有的重点内容,欢迎订阅,谢谢知友们的支持!

  《推荐系统技术原理与实践(异步图书出品)》(文亮)【摘要 书评 试读】- 京东图书