论文:
《LORA: Low-Rank Adaptation of Large Language Models》
自然语言处理中的许多应用依赖于将一个大型的 pre-trained
语言模型适配到多个下游任务中。这种适配通常通过微调来完成,它会更新 pre-trained
模型中的所有参数。微调的一个主要缺点是,新模型的参数数量和原始模型一样多。随着每几个月就会训练出更大的模型,这对于 GPT-2
或 RoBERTa large
来说只是“不方便”,而对于拥有 175B
可训练参数的 GPT-3
来说则成为了一个关键的部署挑战。
许多研究试图通过仅适配部分参数、或学习新的外部模块来缓解这一问题。这样,我们只需要为每个任务存储和加载一小部分 task-specific
的参数,再加上存储和加载 pretrained
模型,从而在部署时极大地提升了运行效率。然而,现有的技术通常通过扩展模型深度来引入 inference latency
、或减少模型可用的序列长度。更重要的是,这些方法通常无法匹配 fine-tuning baselines
,在效率和模型质量之间存在权衡。
我们受到 《Measuring the Intrinsic Dimension of Objective Landscapes》
、《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》
的启发,它们表明:学到的 over-parametrized
的模型实际上处于 low intrinsic dimension
上。我们假设模型适配过程中的 weights’ change
也具有低的 "intrinsic rank"
,这导致了我们提出的低秩适配(Low-Rank Adaptation: LORA
)方法。如 Figure 1
所示,LORA
允许我们通过优化适配过程中 dense layers’ change
的 rank decomposition
矩阵,来间接地训练神经网络中的某些dense layers
,同时保持 pre-trained weights
固定。以 GPT-3 175B
为例,我们展示即使 full rank
(即 Figure 1
中的 12288
,一个非常低的秩(即 Figure 1
中的 1
或 2
)也已足够,这使得 LORA
在存储和计算上都非常高效。
LORA
具有几个关键优势:
一个 pre-trained
模型可以被共享,并用于构建许多不同任务的小的 LORA
模块。我们可以冻结 shared model
,并通过替换Figure 1
中的矩阵
当使用自适应优化器时,LORA
使训练更高效,最多可将硬件门槛降低 3
倍,因为我们不需要计算或维护大多数参数的梯度或 optimizer states
。相反,我们只优化被注入的小得多的低秩矩阵。
我们简单的线性设计允许我们在部署时将 trainable
矩阵与固定权重合并,通过构造,与 fully fine-tuned model
相比不会引入任何 inference latency
。
LORA
与许多以前的方法正交,可以与其中许多方法(如,prefix-tuning
)组合使用。我们在附录 E
中给出了一个示例。
术语和约定:我们频繁引用 Transformer
架构并使用其维度的传统术语:
我们把 Transformer
层的输入和输出维度大小称为
我们用 query/key/value/output
投影矩阵。
我们用 pre-trained
权重矩阵,accumulated gradient update
)。
我们用 LORA
模块的秩(rank
)。
我们遵循 Transformer
和 GPT-3
设置的约定,使用 Adam
优化器,使用 Transformer
的 MLP
前馈网络维度为
相关工作:
Transformer
语言模型:Transformer
是一个 sequence-to-sequence
的架构,它大量使用了自注意力。GPT-1
将其应用于自回归语言建模,使用 Transformer encoders
的堆叠。自那时起,基于 Transformer
的语言模型在 NLP
中占据主导地位,在许多任务上实现了 SOTA
。BERT
和 GPT-2
代表了一个新范式:两者都是在大量文本上预训练的大型 Transformer
语言模型,通过在通用领域数据上预训练之后再在任务特定数据上的微调,这相比直接在任务特定数据上训练可以获得显著的性能提升。训练更大的 Transformer
通常会导致更好的性能,这仍然是一个活跃的研究方向。GPT-3
是迄今为止训练的最大的单个Transformer
语言模型,拥有 175B
参数。
Prompt Engineering and Fine-Tuning
:尽管 GPT-3 175B
可以仅通过几个额外的训练样本来适配其行为,但结果高度依赖于input prompt
。这需要一种经验丰富的 prompt composing
和 prompt formatting
艺术,从而最大化模型在期望任务上的表现,这称为 prompt engineering
或 prompt hacking
。
微调对在通用领域上 pre-trained
的模型进行特定任务的重新训练(BERT
、 GPT-1
)。人们提出了其变体,包括仅学习一部分参数(BERT
),但是实践者们通常会重新训练所有参数以最大化下游性能。然而,GPT-3 175B
的巨大规模使得通常的微调方式具有挑战,因为与预训练相同的内存占用造成了巨大的 checkpoint
,以及由此带来的高硬件门槛。
Parameter-Efficient Adaptation
:许多人提出在神经网络的现有层之间插入 adapter layers
(《Parameter-Efficient Transfer Learning for NLP》
、《Learning multiple visual domains with residual adapters》
、《Exploring versatile generative language model via parameter-efficient transfer learning》
)。我们的方法使用类似的 bottleneck
结构来对 weights update
施加低秩约束。关键的功能性的差异在于,我们学到的权重可以在推理期间与 main weights
合并,因此不会引入任何延迟,这与 adapter layers
的情况不同。
adapter
的一个同期扩展是 COMPACTER
(《Compacter: Efficient low-rank hypercomplex adapter layers》
),它本质上是参数化 adapter layers
,使用具有某些 predetermined
的权重共享方案的 Kronecker products
。类似地,将 LORA
与其他 tensor product-based
积的方法相结合,可能会潜在地改善其参数效率,我们留待未来研究。
近期,许多研究提出优化 input word embeddings
以代替微调,这类似于 prompt engineering
的连续可微分推广。我们在实验部分包括与 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
的比较。然而,这类方法只能通过在 prompts
中使用更多 special tokens
来扩展,这会占用 task tokens
可用的序列长度。
Low-Rank Structures in Deep Learning
:低秩结构在机器学习中很常见。许多机器学习问题具有某些内在的低秩结构。此外,众所周知,对于许多深度学习任务,特别是那些拥有大量过度参数化(over-parametrized
)的神经网络,学到的神经网络在训练后会具有低秩特性(《Generalization guarantees for neural networks via harnessing the low-rank structure of the jacobian》
)。
一些先前的工作甚至在训练原始神经网络时明确地施加低秩约束;但是,据我们所知,这些工作都没有考虑 frozen model
的 low-rank update
以适配下游任务。在理论文献中,已经知道当底层的 concept class
具有某些低秩结构时,神经网络会优于其他经典学习方法,包括相应的(有限宽度)的 neural tangent kernels
。《How adversarial training performs robustdeep learning》
中的另一个理论结果表明:low-rank adaptations
对于对抗训练是有用的。总之,我们认为所提出的low-rank adaptation update
是有充分理论依据的。
尽管我们的 proposal
与 training objective
无关,但我们将语言建模作为用例。下面简要描述了语言建模问题,具体而言,是给定一个 task-specific prompt
的条件下,最大化条件概率。
假设我们有一个 pre-trained
自回归语言模型 Transformer
架构的 GPT
。考虑将这个pre-trained
模型适配到下游的条件文本生成(conditional text generation
)任务,如摘要、机器阅读理解(machine reading comprehension: MRC
)、natural language to SQL: NL2SQL
。每个下游任务由 context-target pairs
的训练数据集表示:tokens
序列。例如:
在 NL2SQL
中,query
,SQL command
。
对于摘要任务,
在 full fine-tuning
期间,模型被初始化为 pre-trained
权重 conditional language modeling objective
:
其中:token
;tokenn
的序列。
这里是对数似然(而不是损失函数),因此需要最大化。
full fine-tuning
的一个主要缺点是,对于每个下游任务,我们学习一组不同的 parameter update
pre-trained
模型很大(如 GPT-3
的参数数量 175B
),存储和部署许多独立的 fine-tuned models
实例可能具有挑战性,甚至不可行。
在本文中,我们采用一种更加 parameter-efficient
的方法,其中 task-specific
的参数增量
在后续章节中,我们提出使用 low-rank representation
来编码 pre-trained
模型是 GPT-3 175B
时,可训练参数数量 0.01%
。
我们要解决的问题并非全新。自迁移学习出现以来,数十项工作已经试图使 model adaptation
更加参数高效和计算高效。参考 ”相关工作“ 部分,可以看到一些著名的相关工作。以 language modeling
为例,有两种优秀的策略用于高效的适配:添加 adapter layers
、或优化 input layer activations
。但是,这两种策略在大型的、以及延迟敏感的生产环境中都有局限性。
Adapter Layers Introduce Inference Latency
:adapters
有许多变体。我们关注 《Parameter-Efficient Transfer Learning for NLP》
的原始设计,每个 Transformer block
有两个 adapter layers
;以及 《Exploring versatile generative language model via parameter-efficient transfer learning》
的更近期设计,每个 block
仅有一个 adapter layer
,但具有额外的 LayerNorm
。尽管可以通过裁剪 layers
、或利用多任务设置来减少整体延迟(《Adapterdrop: On the efficiency of adapters in transformers》
、《Adapter-fusion: Non-destructive task composition for transfer learning》
),但是没有直接的方法可以绕过 adapter layers
中的额外计算。这似乎不是问题,因为 adapter layers
通过具有小的 bottleneck
维度来被设计为参数很少(有时是原始模型的 <1%
),这限制了它们可以添加的 FLOPs
。但是,大型神经网络依赖硬件并行性来保持低延迟,而 adapter layers
必须串行地处理。这在 batch size
通常为 1
的在线推理设置中会造成区别。在没有模型并行的通用场景中,例如在单 GPU
上运行 GPT-2 medium
的推理,即使使用了非常小的 bottleneck
维度,当使用 adapters
时,我们也看到显著的延迟增加(Table 1
)。
当我们需要 shard
模型时,这个问题会变得更糟,如 《Megatron-lm: Training multi-billion parameter language models using model parallelism》
、《Gshard: Scaling giant models with conditional computation and automatic sharding》
所做,因为额外的深度需要更多的 synchronous GPU operations
,如 AllReduce
和 Broadcast
,除非我们冗余地存储 adapter parameters
多次。
Directly Optimizing the Prompt is Hard
:prefix tuning
(《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
)代表的另一方向面临着不同的挑战。我们观察到,prefix tuning
难以优化,其性能随着可训练参数的变化是非单调的,这确认了原论文中的类似观察。更本质的是,保留一部分序列长度用于适配,这必然减少了处理下游任务的可用序列长度;我们怀疑这使得与其他方法相比,tuning the prompt
的性能更差。我们将对任务性能的研究推迟到实验章节。
我们描述 LORA
的简单设计及其实际效益。这里概述的原则适用于深度学习模型中的任何 dense layers
,尽管我们的实验仅关注Transformer
语言模型中的某些权重。
神经网络包含许多执行矩阵乘法的 dense layers
。这些层中的权重矩阵通常是满秩(full-rank
)的。在适配特定任务时,《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》
显示 pre-trained
语言模型具有低的 "instrisic dimension"
,即使是随机投影到一个较小的子空间,也仍可进行有效学习。受此启发,我们假设 weight's updates
在适配过程中也具有低的 "intrinsic rank"
。对于 pre-trained
权重矩阵
其中:
在训练期间,
我们在 Figure 1
中展示重参数化(reparametrization
)。我们对 Adam
优化时,调优 initialization
。因此,我们简单地将
这里
的含义是:根据 。因此, 和 都是超参数, 的作用类似于学习率。 作者在
上调优了一组超参数,并固定 为其中尝试的第一个 而不调优 。这是为了减少超参数调优的复杂性。
A Generalization of Full Fine-tuning
:更一般的微调形式允许 pre-trained parameters
的子集。进一步地,在适配期间 LORA
不要求 accumulated gradient update
具有满秩。这意味着将 LORA
应用于所有权重矩阵并训练所有偏置,通过将 LORA
秩的 pre-trained
权重矩阵的秩,我们大致恢复 full fine-tuning
的表达能力。换句话说,随着我们增加可训练参数的数量,训练 LORA
大致收敛于训练原始模型;而 adapter-based
的方法收敛于 MLP
、prefix-based
的方法收敛于一个无法处理长输入序列的模型。
No Additional Inference Latency
:在生产中部署时,我们可以显式地计算并存储 fine-tuned
模型相比,这保证了我们不会引入任何额外的推理延迟。
即:
即可切换不同的下游任务。
原则上,我们可以将 LORA
应用于神经网络中的任何权重子集,从而减少可训练参数的数量。在 Transformer
架构中,在自注意力模块中有四个权重矩阵(MLP
模块中有两个权重矩阵。我们将 MLP
模块(所以在下游任务中不训练它们),这对简单性和参数效率都有好处。我们在后续章节中进一步研究适配 Transformer
中不同类型的注意力权重矩阵的效果。我们将 MLP
层、LayerNorm
层、以及偏置的实验研究留待未来工作。
实际效益和局限性:最显著的好处来自于内存和存储使用的减少。对于用 Adam
训练的大型 Transformer
,如果 2/3
的 VRAM
使用,因为我们不需要存储 frozen parameters
的 optimizer states
。在 GPT-3 175B
上,我们将训练期间的 VRAM
消耗从 1.2TB
降低到 350GB
。 当 query
投影矩阵和 value
投影矩阵时, checkpoint size
大约减少了 10000
倍(从 350GB
到 35MB
)。 这使我们可以用更少的 GPU
进行训练,并避免 I/O
瓶颈。
另一个好处是,我们只需交换LORA
权重,而不是所有参数,就能以更低的成本在部署任务时进行切换。这允许在存储 pre-trained
权重(在 VRAM
中)的机器上动态地创建和切换许多定制化的模型。 与 full fine-tuning
相比,我们还观察到在 GPT-3 175B
上的训练加速了 25%
,因为我们不需要计算绝大多数参数的梯度。
LORA
也有其局限性。 例如,如果选择吸收 batch
不同任务(具有不同的 batch
中的样本动态地选择要使用的 LORA
模块。
我们在 RoBERTa
、DeBERTa
和 GPT-2
上评估了 LORA
的下游任务性能,然后再扩展到 GPT-3 175B
。我们的实验涵盖了从自然语言理解(natural language understanding: NLU
)到自然语言生成(natural language generation: NLG
)的广泛任务。具体来说,我们在 GLUE benchmark
上评估了 RoBERTa
和DeBERTa
。我们在 GPT-2
上遵循 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
的设置进行直接比较,并添加了 WikiSQ
(自然语言到 SQL query
)和 SAMSum
(对话摘要)用于 GPT-3
上的大规模实验。参见附录C
以了解我们使用的数据集的更多细节。我们在所有实验中都使用了 NVIDIA Tesla V100
。
baselines
:为了与其他基线进行广泛比较,我们尽可能复制了先前工作中使用的设置,并在可能的情况下复用他们报告的结果。但是,这意味着一些基线可能只出现在某些实验中。
Fine-Tuning (FT)
:是一种常见的适配方法。在微调期间,模型被初始化为 pre-trained
的权重和偏置,所有的模型参数都经历梯度更新。一个简单的变体是只更新某些层而冻结其他层。我们包括 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
在GPT-2
上报告的一个这样的基线,它只适配最后两层(
Bias-only or BitFit
:是一种基线,其中我们只训练偏置向量而冻结其他所有内容。当代,这个基线也被 BitFit
(《Bitfit: Simple parameter-efficient fine-tuning for transformer-based masked language-models》
)研究过。
Prefix-embedding tuning (PreEmbed)
:在 input tokens
中插入 special tokens
。这些 special tokens
具有可训练的 word embeddings
,通常不在模型词表中。放置这些 special tokens
的位置会影响性能。我们关注 "prefixing"
,即在输入的前面添加这样的 special tokens
;也关注 "infixing"
,即输入后面追加 special tokens
。两者都在《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
中讨论过。我们使用 prefix tokens
数量和 infix tokens
数量。可训练参数的数量为
Prefix-layer tuning (PreLayer)
:是 prefix-embedding tuning
的扩展。我们不仅学习某些 special tokens
的 word embeddings
(或等效地,activations after the embedding layer
),而且学习 activations after every Transformer layer
。 previous layers
计算而来的激活被可训练的激活替换。结果,可训练参数数量为 Transformer
层数。
Adapter tuning
:《Parameter-Efficient Transfer Learning for NLP》
所提出的,在自注意力模块(和 MLP
模块)与后续残差连接之间插入 adapter layers
。一个 adapter layer
中有两个带偏置的全连接层,这两个全连接层之间有一个非线性激活。我们称之为
最近,《Exploring versatile generative language model via parameter-efficient transfer learning》
提出了一个更高效的设计,其中 adapter layer
仅应用于 MLP
模块之后和 LayerNorm
之后。我们称之为 《Adapterfusion: Non-destructive task composition for transfer learning》
提出的另一种设计非常相似,我们称之为
我们还包括另一个基线 AdapterDrop
(《Adapterdrop: On the efficiency of adapters in transfor》
),它删除一些 adapter layers
以获得更高的效率,记做
我们尽可能引用先前工作中的数据以最大化我们比较的基线数量;它们位于第一列中用 *
标记的行中。在所有情况下,我们有 adapter layers
的层数,LayerNorm
的数量(例如,在
LORA
:在现有权重矩阵旁并行地添加低秩分解矩阵的 trainable pairs
。如前所述,出于简单考虑,我们在大多数实验中仅将 LORA
应用于 LORA
的权重矩阵的数量。
RoBERTa base/large
:RoBERTa
优化了 BERT
最初提出的预训练配方,在不引入更多可训练参数的情况下提升了后者的任务性能。尽管近年来 RoBERTa
在 GLUE
等 NLP
排行榜上被更大的模型超过,但它仍然是一个流行的、有竞争力的 pre-trained
模型。我们从 HuggingFace Transformers
库获取 pre-trained RoBERTa base (125M)
和 RoBERTa large (355M)
,并评估不同 efficient adaptation
方法在 GLUE
任务上的性能。我们还根据他们的设置复制了 《Parameter-Efficient Transfer Learning for NLP》
和 《Adapterfusion: Non-destructive task composition for transfer learning》
的工作。为了确保公平比较,我们在与 adapters
比较时,在如何评估 LORA
上做了两个关键更改:
首先,我们对所有任务使用相同的 batch size
,序列长度为 128
以匹配 adapter baselines
。
其次,我们将模型初始化为 pre-trained
模型从而用于 MRPC
、RTE
和 STS-B
,而不是像 fine-tuning baseline
那样已经在 MNLI
上适配好的模型。
遵循 《Parameter-Efficient Transfer Learning for NLP》
更严格设置的 runs
用 Table 2
所示(前三部分)。附录 D.1
节详细介绍了所使用的超参数。
DeBERTa XXL
:DeBERTa
是最近的 BERT
变体之一,它以更大的规模进行了训练,在 GLUE
和 SuperGLUE
等 benchmarks
中表现非常有竞争力。我们评估 LORA
是否仍然可以在 GLUE
上匹配 fine-tuned DeBERTa XXL (1.5B)
的性能。结果如 Table 2
最后一部分所示。附录 D.2
节详细介绍了所使用的超参数。
GPT-2 medium/large
:在展示 LORA
可以在自然语言理解任务上成为 full fine-tuning
的有竞争替代方案之后,我们希望回答LORA
是否仍然在 NLG
模型上也占优势,例如 GPT-2 medium
和 GPT-2 large
。我们使我们的设置尽可能接近 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
的设置,以进行直接比较。由于版面限制,我们在本节中仅展示 E2E NLG Challenge
数据集上的结果(见 Table 3
。第 F.1
节给出了 WebNLG
和 DART
的结果。第 D.3
节列出了使用的超参数。
扩展到 GPT-3 175B
:作为 LORA
的最终压力测试,我们扩展到拥有 175B
参数的 GPT-3
。由于训练成本很高,对于给定的任务,我们仅报告在不同随机种子上的典型标准差,而不是为每个随机数提供一个标准差。第 D.4
节详细介绍了所使用的超参数。
如 Table 4
所示,LORA
与 fine-tuning baseline
的性能相当或更好。请注意,并非所有方法都会从有更多可训练参数中受益,如 Figure 2
所示。当使用超过 256 special tokens
进行 prefix-embedding tuning
、或超过 32 special tokens
进行 prefix-layer tuning
时,我们观察到显著的性能下降。这证实了 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》
的类似观察。尽管本文不打算深入研究这种现象,但我们怀疑使用更多 special tokens
会使输入分布进一步偏离 pre-training data distribution
。另外,我们在第 F.3
节中研究了不同适配方法在数据量少的情况下的表现。
鉴于 LORA
的经验证据优势,我们希望进一步解释从下游任务中学到的 low-rank adaptation
的属性。请注意,低秩结构不仅降低了硬件准入门槛,从而允许我们并行运行多个实验,而且还更好地解释了 update weights
与 pre-trained weights
的相关性。我们将研究重点放在 GPT-3 175B
上,在这里我们实现了最大程度的可训练参数减少(高达 10000
倍),而不对任务性能产生不利影响。
我们进行了一系列实证研究,以回答以下问题:
1)
:在参数预算约束下,我们应该适配 pre-trained Transformer
中的哪些权重矩阵以最大化下游性能??
2)
: "optimal" adaptation matrix
rank-deficient
?如果是,实践中什么秩比较好?
3)
:
我们认为我们对问题 2)
和 3)
的回答可以阐明使用 pre-trained
语言模型进行下游任务的基本原理,这是 NLP
中的一个关键话题。
在给定的有限的参数预算下,我们应该适配哪些类型的权重矩阵从而获得下游任务的最佳性能?如前所述,我们目前只考虑自注意力模块中的权重矩阵。在 GPT-3 175B
上,我们设置参数预算为 18M
(如果以 FP16
存储约为 35MB
),这对应于 96
层。结果如 Table 5
所示。
请注意,将所有参数预算放在 rank
来适配单个权重相比,适配更多个的权重矩阵更可取。
我们将注意力转向秩
Table 6
显示,令人惊讶的是,即使 LORA
的表现也具有竞争力(相对于仅仅适配 update matrix
"intrinsic rank"
。为进一步支持这一发现,我们检查了不同 low-rank adaptation matrix
就足够了。
似乎是
越小越好,同时配合尽可能多类型的 weights update
(如)。
不同 pre-trained
模型学到 adaptation matrix
。我们执行奇异值分解并获得 right-singular unitary
矩阵 Grassmann distance
的归一化子空间相似度来测量这个量(参见附录 G
的更正式讨论):
其中:top-i singular vectors
。
[0,1]
之间,其中 1
表示子空间完全重叠、0
表示完全分离。参见 Figure 3
,其中 48
层(共 96
层),但结论对其他层也成立,如第 H.1
节所示。
从 Figure 3
我们可以得到一个重要观察:对于 top singular vector
的方向重叠显著,而其他 singular vector
不重叠。 具体来说,对于 0.5
。对于 GPT-3
下游任务中的表现相当不错。
由于 pre-trained
模型学习的,Figure 3
表明 top singular-vector
方向是最有用的,而其他方向可能主要包含训练过程中累积的随机噪声。因此,adaptation matrix
确实可以具有非常低的秩。
不同随机种子之间的子空间相似度:我们通过绘制两个 Figure 4
所示。"intrinsic rank"
,因为对于 runs
学到了更多 common singular value directions
,这与我们在 Table 6
中的经验观察一致。作为比较,我们还绘制了两个随机高斯矩阵,它们之间没有共享任何奇异值方向。
我们进一步研究 top singular directions
中?此外,与 adapting pre-trained language models
阐明底层的机制。
为了回答这些问题,我们通过计算 left/right singular-vector matrix
。 然后,我们比较 Frobenius
范数。 作为比较,我们还通过用 top r singular vectors
、或随机矩阵,来替换
从 Table 7
我们可以得出几点结论:
首先,与随机矩阵相比,
其次,top singular directions
,而是放大了
第三,放大因子相当大:对 6.91/0.32 = 21.5
。 第 H.4
节解释了为什么
我们在第 H.3
节中还提供了一个可视化,展示了随着从 top singular directions
,相关性(correlation
)是如何改变的。这表明 low-rank adaptation matrix
可能放大了 general pre-training model
中学到的、但没有强调的 specific downstream tasks
的重要特征。
未来工作有许多方向:
LORA
可以与其他 efficient adaptation
方法相结合,可能提供正交的改进。
微调或 LORA
背后的机制还不清楚:预训练中学到的特征如何转化为下游任务的良好表现?我们认为 LORA
比 full fine-tuning
更容易回答这个问题。
我们主要依赖启发式方法来选择权重矩阵来应用 LORA
。是否有更原则的方法来进行选择?
最后,rank-deficien
表明:rank-deficien
,这也可以作为未来工作的灵感来源。
论文:
《QLORA: Efficient Finetuning of Quantized LLMs》
大语言模型(large language models: LLMs
)的微调是提高其性能的高效方法,从而可以增加或删除期望的或不期望的行为。然而,非常大模型的微调代价昂贵;LLaMA 65B
模型的常规 16-bit finetuning
需要超过 780GB
的 GPU
内存。尽管最近的量化方法可以减少 LLM
的内存占用(《LLM.int8(): 8-bit matrix multiplication for transformers at scale》
、《The case for 4-bit precision: k-bit inference scaling laws》
、《Gptq: Accurate post-training quantization for generative pre-trained transformers》
、《Smoothquant: Accurate and efficien tpost-training quantization for large language models》
),但这些技术仅适用于推理,在训练期间会崩溃(《Stable and low-precision training for large-scale vision-language models》
)。
我们首次证明了可以对 4-bit
量化的模型进行微调而不降低任何性能。我们的方法 QLORA
使用一种新颖的 high-precision
技术从而将 pretrained
模型量化为 4-bit
,然后添加少量可学习的 Low-rank Adapter weights
(《LORA:Low-rank adaptation of large language models》
),这些Low-rank Adapter weights
通过 quantized weights
来反向传播梯度进行调优。
QLORA
将 65B
参数模型的微调平均内存需求从 >780GB
的 GPU
内存降低到 < 48GB
,与 16-bit fully finetuned baseline
相比,运行时性能或预测性能没有降低。这标志着 LLM
微调的可访问性发生了重大变化:现在可以在单个 GPU
上微调迄今为止公开发布的最大模型。使用 QLORA
,我们训练了 Guanaco
模型系列,这是在Vicuna benchmark
中表现第二好的模型,达到了 ChatGPT
性能水平的 97.8%
,同时在单个消费级 GPU
上训练不到 12
小时;使用单个专业 GPU
训练超过 24
小时,我们用最大的模型实现了ChatGPT
性能的 99.3%
,基本上在 Vicuna benchmark
中填补了与 ChatGPT
的差距。部署时,我们最小的 Guanaco
模型(7B
参数)只需要 5GB
内存,并在 Vicuna benchmark
中比 26GB
的 Alpaca
模型超出 20%
(Tabke 6
)。
QLORA
引入了多项创新,旨在降低内存使用而不牺牲性能:
(1)
:4-bit NormalFloat
,一种信息理论最优的量化数据类型(quantization data type
)从而用于正态分布数据,其经验结果优于 4-bit Integers
和 4-bit Floats
。
(2)
:Double Quantization
,一种用于对 quantization constants
再次进行量化的方法,平均每个参数节省约 0.37 bits
(对于 65B
模型约 3 GB
)。
(3)
:Paged Optimizers
,使用 NVIDIA unified memory
从而避免 gradient checkpointing memory
尖峰,其中这些尖峰发生在当处理具有长序列长度的 mini-batch
时。
我们将这些贡献组合成一个更好的 tuned LORA
方法,其中 tuned LORA
包含每个网络层的adapters
,从而避免了先前工作中看到的几乎所有的 accuracy tradeoffs
。
QLORA
的效率使我们能够在模型规模上对指令微调(instruction finetuning
)的和聊天机器人(chatbot
)的性能进行深入的研究,由于内存开销而使用常规微调无法实现这种研究。 因此,我们在多个指令微调数据集、模型架构、以及 80M ~ 65B
参数之间的模型规模上训练了超过 1000
个模型。 除了展示 QLORA
恢复了16-bit
性能、以及训练了 SOTA
的聊天机器人 Guanaco
之外,我们还分析了模型趋势:
首先,我们发现数据质量比数据集大小更重要。例如,一个 9k
样本数据集(OASST1
)在聊天机器人性能上胜过一个 450k
样本数据集(FLAN v2
,子采样之后的),即使两者都旨在支持 instruction following generalization
。
其次,我们表明强大的 Massive Multitask Language Understanding
(MMLU
)benchmark
性能并不意味着强大的 Vicuna chatbot benchmark
性能;反之亦然。换句话说,对于给定的任务,数据集的适用性(suitability
)比大小更重要。
此外,我们还提供了聊天机器人的广泛性能分析,其中使用人类标注员和 GPT-4
进行评估。 我们使用 tournament-style benchmarking
,其中在比赛中,模型之间进行竞争从而针对给定的 prompt
产生最佳响应。一次比赛( match
)中的获胜者由 GPT-4
或人类标注员来判断。 tournament
结果汇总为 Elo
分数,这决定了聊天机器人性能的排名。我们发现:GPT-4
和人类评估在 tournaments
中对模型性能排名高度一致,但我们也发现存在强烈分歧的实例。因此,我们强调 model-based evaluation
虽然提供了比 human-annotation
廉价的替代方案,但也存在其不确定性。
我们声明,我们的 chatbot benchmark
得到了 Guanaco
模型的定性分析的结果。我们的分析强调了成功案例和失败案例,这些案例未被 quantitative benchmarks
所捕获。
我们发布所有带有人类标注和 GPT-4
注释的 model generations
,以方便进一步研究。我们开源代码库和 CUDA kernels
,并将我们的方法集成到 Hugging Face transformers stack
中,使其易于所有人访问。我们发布了针对 7/13/33/65B
大小模型在 8
个不同的 instruction following datasets
上训练的 adapters
集合,总共发布了 32
个开源的 finetuned
的模型。
相关工作:
大型语言模型的量化:LLM
的量化主要集中在推理时的量化上。
保持 16-bit LLM
质量的主要方法是:管理 outlier features
(例如 SmoothQuant
和 LLM.int8()
);而其他方法使用更复杂的分组方法(《nuqmm: Quantized matmul for efficient inference of large-scale generative language models》
、《Zeroquant: Efficient and affordable post-training quantization for large-scale transformers》
)。
有损量化(lossy quantization
)方法研究常规 rounding
的权衡(《The case for 4-bit precision: k-bit inference scaling laws》
、《Glm-130b: An open bilingual pre-trained model》
、《Efficiently scaling transformer inference》
)或如何优化 rounding decisions
以提高量化精度(quantization precision
)(《Gptq: Accurate post-training quantization for generative pre-trained transformers》
)。
除了我们的工作,SwitchBack layer
(《Stable and low-precision training for large-scale vision-language models 》
)是唯一在超过 1B
参数规模上研究通过 quantized weights
来反向传播的工作。
Finetuning with Adapters
:虽然我们使用 Low-rank Adapters: LORA
(《LORA: Low-rank adaptation of large language models》
),但人们还提出了许多其他 Parameter Efficient FineTuning: PEFT
方法,例如 prompt tuning
(《Learning how to ask: Querying lms with mixtures of soft prompts》
、《The power of scale for parameter-efficient prompt tuning》
、Prefix-Tuning
)、调优 embedding layer inputs
(《Input-tuning: Adapting unfamiliar inputs to frozen pretrained models》
)、 调优 hidden states
(IA3
)(《Few-shot parameter-efficient fine-tuning is better and cheaper than in-context learning》
)、添加 full layers
(《Parameter-efficient transfer learning for nlp》
)、调优 biases
(Bitfit
)、基于 Fisher
信息来学习权重上的 mask
(《Training neural networks with fixed sparse masks》
)、以及方法的组合(《Compacter: Efficient low-rank hypercomplex adapter layers》
)。
在我们的工作中,我们表明 LORA adapters
能够达到 full 16-bit finetuning
的性能。 我们留待未来的工作来探索其他 PEFT
方法的 tradeoffs
。
指令微调:为了帮助 pretrained LLM
遵循 prompt
中提供的指令,指令微调使用各种数据源的 input-output pairs
来微调pretrained LLM
,以便在将给定的输入作为 prompt
的情况下生成输出。方法和数据集包括 MetaICL
、MetaTuning
、InstructGPT
、FLAN
、PromptSource
、Super-NaturalInstructions
、Self-instruct
、UnnaturalInstructions
、OPT-IML
、UnifiedSKG
、OIG/Chip2
、Alpaca
、Vicuna
、Koala
和 Self-instruct-GPT-4
。
聊天机器人:许多 instruction following models
被构建为基于对话的聊天机器人,通常使用来 Reinforcement Learning from Human Feedback: RLHF
(《Deep reinforcement learning from human preferences 》
)、或从现有模型生成数据以使用 AI model feedback
进行训练(RLAIF
)(《Constitutional ai: Harmlessness from ai feedback》
)。方法和数据集包括:Anthropic-HH
、Open Assistant
、LaMDA
和Sparrow
。
我们不使用强化学习,但我们最好的模型 Guanaco
是在为 RLHF
训练而设计的 Open Assistant
数据集上的多轮聊天交互中微调的。对于使用 GPT-4
而不是代价高昂的人工标注来评估聊天机器人方法,人们已经开发了方法 《Vicuna: An open-source chatbot impressing gpt-4 with 90%*chatgpt quality》
、《Instruction tuning with gpt-4》
。我们通过关注一个更可靠的评估设置来改进这种方法。
Block-wise k-bit Quantization
:量化是将 input
从包含更多信息的 representation
离散化为包含更少信息的 representation
的过程。 它通常意味着将更多 bits
的数据类型转换为较少bits
,例如从 32-bit floats
转换为 8-bit Integers
。为了确保使用 low-bit data type
的全部范围,通常通过 input elements
的 absolute maximum
进行标准化,从而将 input data type
重新缩放为 target data type
范围。例如,将 32-bit Floating Point (FP32)
的张量量化为范围为[−127,127]
的 Int8
张量:
其中:quantization constant
)或量化比例(quantization scale
)。
反量化(dequantization
)是逆过程:
这种方法的问题是:如果 input
张量中出现大幅值(即异常值 outlier)
),则 quantization bins
(某些 bit combinations
)的利用不是很好,即:在某些 bins
中没有或几乎没有数值被量化。为了防止异常值问题,一种常见方法是将 input
张量分块成 blocks
,每个 block
独立地被量且每个 block
都有自己的量化常数
首先,我们将 input
张量 block
,这是通过 flatten
输入张量并切片成 block
来实现。
然后,我们使用 block
进行量化,从而创建quantized tensor
和
Low-rank Adapters
:Low-rank Adapter: LORA
(《LORA:Low-rank adaptation of large language models》
)微调是一种通过使用少量可训练参数(通常称为 adapters
)来减少内存需求的方法,而 full model parameters
保持固定。在随机梯度下降期间,梯度通过 fixed pretrained model weights
传递到 adapter
从而优化损失函数。LORA
通过额外的 factorized projection
增强了线性投影。给定一个投影 LORA
计算:
其中:
通常有
。
Memory Requirement of Parameter-Efficient Finetuning
:一个重要的讨论点是:LORA
在训练期间的内存需求,以 adapters
的数量和尺寸两方面来考虑。由于 LORA
的内存占用非常小,我们可以使用更多的 adapters
来提高性能,而不会显着增加总内存使用量。尽管 LORA
被设计为 Parameter Efficient Finetuning: PEFT
方法,但 LLM
微调的大部分内存占用来自 activation gradients
,而不是来自 learned LORA parameters
。对于在 FLAN v2
上以 batch size = 1
训练的 7B LLaMA
模型,LORA
权重相当于通常使用的原始模型权重数量的 0.2%
;LORA input gradients
的内存占用为 567 MB
,而 LORA
参数仅占用 26 MB
。 使用 gradient checkpointing
后(《Training deep nets with sublinear memory cost》
),input gradients
减少到每个序列平均 18 MB
,比所有 LORA
权重的总和更加 memory intensive
。相比之下,4-bit base model
消耗 5048 MB
内存。这表明 gradient checkpointing
很重要,但也表明极度减少 LORA
参数量只带来很小的内存收益。这意味着我们可以使用更多 adapters
而不会显着增加总训练内存占用(详细内存分解见附录 G
)。如后文所述,这对恢复 full 16-bit precision
性能至关重要。
即,我们可以放心地使用大量的
adapters
。
下图:QLORA
用不同 LLaMA base models
来训练时的内存占用。
QLORA
通过我们提出的两种技术,4-bit NormalFloat: NF4
量化以及 Double Quantization
,来实现 high-fidelity 4-bit finetuning
。此外,我们引入了Paged Optimizers
,以防止 gradient checkpointing
期间的内存尖峰导致的 out-of-memory errors
,其中 out-of-memory errors
使得传统上在单台机器上对大模型进行微调变得困难。
QLORA
具有一种低精度存储数据类型(low-precision storage data type
),在我们的例子中通常为 4 bit
;以及一种低精度计算数据类型,通常为 BFloat16
。实际上,这意味着每当使用 QLORA weight tensor
时,我们将张量 dequantize
为 BFloat16
,然后以 16-bit
来执行矩阵乘法。
注意:数据的存储精度和计算精度不同。采用更高精度来计算,可以减少精度溢出的发生。
现在我们按顺序讨论 QLORA
的组成部分,然后是 QLORA
的正式定义。
NormalFloat: NF
数据类型建立在 Quantile Quantization
(《8-bit optimizers via block-wise quantization》
)的基础上,这是一种信息理论最优的数据类型(information-theoretically optimal data type
),确保每个 quantization bin
中都有相等数量的值,这些 bins
中的值从 input
张量分配而来。Quantile Quantization
的工作原理是:通过经验累积分布函数(empirical cumulative distribution function
)估计 input
张量的分位数。
quantile quantization
的主要局限性在于 quantile estimation
是昂贵的。 因此,会使用 SRAM quantiles
(《8-bit optimizers via block-wise quantization》
)等快速分位数近似算法来估计它们。由于这些 quantile estimation
计算法的近似性质,对于异常值,该数据类型存在较大的量化误差(quantization errors
),而异常值通常是量化过程中最重要的值。
当 input
张量来自一个分布,而这个分布被固定到一个 quantization constant
时,可以避免昂贵的 quantile estimates
和近似误差。在这种情况下,input
张量具有相同的 quantiles
,使精确的 quantile estimation
在计算上可行。
由于 pretrained
的神经网络权重通常具有均值为零、标准差为 F
),我们可以通过缩放 a single fixed distribution
)。对于我们的数据类型,我们设定强制(arbitrary
)的范围 [−1,1]
。 因此,对于数据类型和神经网络权重,分位数(quantiles
)都需要被归一化到这个范围内。
针对均值为零、标准差为 [−1,1]
内的正态分布,信息理论上最优的数据类型计算如下:
(1)
:估计理论正态分布 k-bit quantile quantization data type
。
(2)
:获取此数据类型并将其值归一化到 [−1,1]
范围内。
参考后面的
NFk
数据类型的确切值。
(3)
:通过 absolute maximum
重新缩放将输入权重张量归一化到 [−1,1]
范围内进行量化。
一旦权重范围和数据类型范围匹配,我们就可以像往常一样进行量化。第 (3)
步相当于重新缩放权重张量的标准差以匹配 k-bit data type
的标准差。
更正式地,如下所示,我们估计数据类型的
其中:quantile function
)。
对于 symmetric k-bit quantization
存在的一个问题是,这种方法无法精确表示零,这对于零误差地 quantize padding
和表达其他零值元素是一项重要特性。为了确保 0
的 discrete zeropoint
,并使用所有 bits
来用于 k-bit datatype
,我们创建一个非对称的数据类型,通过估计分位数
对于 negative part
,
对于 positive part
,
然后我们统一这些
我们将结果数据类型称为 k-bit NormalFloat: NFk
,在每个 quantization bin
中它具有相等的、预期数量的值,因为从信息论上讲,该数据类型对以零为中心的正态分布数据是最优的。此数据类型的确切值可在附录 E
中找到。
The exact values of the NF4 data type are as follows:
[-1.0, -0.6961928009986877, -0.5250730514526367, -0.39491748809814453,
-0.28444138169288635, -0.18477343022823334, -0.09105003625154495, 0.0,
0.07958029955625534, 0.16093020141124725, 0.24611230194568634, 0.33791524171829224,
0.44070982933044434, 0.5626170039176941, 0.7229568362236023, 1.0]
这个数据类型一共
16
个数值,可以用4bit
来表示。任意浮点数落在哪个区间就用对应的整数来表示。这个区间对任意的input tensor
都是固定的。
我们引入了 Double Quantization: DQ
,即对 quantization constants
进行量化以进一步节省内存。 尽管精确的 4-bit quantization
需要较小的 blocksize
(《The case for 4-bit precision: k-bit inference scaling laws》
),但它也带来相当大的内存开销。例如,针对 32-bit
常量以及 block size = 64
,quantization constants
平均每个参数添加 32/64 = 0.5 bits
。 Double Quantization
有助于减少quantization constants
的内存占用。
更具体地说,Double Quantization
将 first quantization
的 quantization constants
second quantization
的输入。这第二步生成 quantized quantization constants
second level of quantization constants
second quantization
使用 8-bit Floats
,blocksize = 256
,因为未观察到 8-bit quantization
的性能下降,与 《The case for 4-bit precision: k-bit inference scaling laws》
的结果一致。由于 symmetric quantization
)。平均而言,对于 blocksize = 64
,此量化将每个参数的quantization constants
内存占用从 32/64 = 0.5 bits
减少到 8/64 + 32/(64*256) = 0.127 bits
,减少了每个参数 0.373 bits
。
从
量化到 ,量化常数为 。为什么第二步的下标为 1
、第一步的下标为2
?这是因为dequantization
过程第一步需要利用来获得 :
使用 NVIDIA unified memory
功能,该功能在 GPU
偶尔内存不足的情况下在 CPU
和 GPU
之间自动进行 page-to-page
传输,以便在 GPU
上无错误地处理。该功能的工作方式与 CPU RAM
和磁盘之间的常规内存分页相同。我们使用此功能为 optimizer states
分配分页内存(paged memory
),当 GPU
内存不足时,它们会自动交换到 CPU RAM
,并在 optimizer update step
需要内存时分页换回 GPU
内存。
使用上述组件,我们为 quantized base model
中的具有单个 LORA adapter
的单个线性层定义 QLORA
如下:
其中
我们对 NF4
、对FP8
。 我们对 blocksize = 64
从而获得更高的量化精度,对 blocksize = 256
以节省内存。
注意:这里所有的计算都采用
BF16
。此外,LORA adapter
没有被量化而是直接采用BF16
,因为它的参数规模很小,而且也可以补偿fixed base model
的量化误差。
对于 parameter updates
,只需要 adapters
权重的误差梯度 4-bit
权重的误差梯度