洛拉 https://huggingface.co/docs/peft/conceptual_guides/lora
本概念指南简要概述了LoRA,这种技术可以加速大型模型的微调,同时消耗更少的内存。
为了让微调更加高效,LoRA 的做法是通过低秩分解用两个较小的矩阵(称为更新矩阵)来表示权重更新。可以训练这些新矩阵以适应新数据,同时保持较低的更改总数。原始权重矩阵保持冻结状态,不会接受任何进一步的调整。为了产生最终结果,将原始权重和调整后的权重相结合。
这种方法有很多优点:
- LoRA 通过大幅减少可训练参数的数量,使微调更加高效。
- 原始预训练权重保持冻结状态,这意味着您可以拥有多个轻量级便携式 LoRA 模型,用于在其之上构建的各种下游任务。
- LoRA 与许多其他参数有效的方法正交,并且可以与其中许多方法组合。 LoRA is orthogonal to many other parameter-efficient methods
- 使用 LoRA 微调的模型的性能与完全微调的模型的性能相当。
- LoRA 不会增加任何推理延迟,因为适配器权重可以与基本模型合并。
原则上,LoRA 可以应用于神经网络中权重矩阵的任何子集,以减少可训练参数的数量。然而,为了简单性和进一步的参数效率,在 Transformer 模型中,LoRA 通常仅应用于注意力块。r
LoRA 模型中可训练参数的数量取决于低秩更新矩阵的大小,而低秩更新矩阵的大小主要由原始权重矩阵的秩和形状决定。
PEFT中常见的LoRA参数
与 PEFT 支持的其他方法一样,要使用 LoRA 微调模型,您需要:
- 实例化基本模型。
- 创建一个配置 (
LoraConfig
),在其中定义 LoRA 特定参数。 - 用 包裹基本模型
get_peft_model()
以获得可训练的PeftModel
. PeftModel
像平常训练基本模型一样训练。
LoraConfig
允许您通过以下参数控制 LoRA 如何应用于基础模型:
r
:更新矩阵的秩,以 表示int
。较低的秩会导致较小的更新矩阵和较少的可训练参数。target_modules
:应用 LoRA 更新矩阵的模块(例如,注意力块)。alpha
:LoRA 比例因子。LoRA scaling factor.bias
:指定是否bias
应训练参数。可以是'none'
,'all'
或者'lora_only'
。modules_to_save
:除了 LoRA 层之外的模块列表,要设置为可训练并保存在最终检查点中。这些通常包括模型的自定义头,该头是为微调任务随机初始化的。layers_to_transform
:LoRA 转换的层列表。如果未指定,target_modules
则变换中的所有图层。layers_pattern
target_modules
:如果layers_to_transform
指定,则匹配 中图层名称的模式。默认情况下,PeftModel
将查看公共层模式(layers
、h
、blocks
等),将其用于奇异和自定义模型。exotic and custom models