PEFT 文档
通过 Householder 反射自适应 (HRA) 弥合低秩自适应与正交自适应之间的差距
并获得增强的文档体验
开始使用
通过 Householder 反射自适应 (HRA) 弥合低秩自适应与正交自适应之间的差距
HRA 是一种简单而有效的基于适配器的微调方法,它利用了 Householder 反射。该方法利用了两种策略的优势,减少了参数和计算成本,同时抑制了预训练知识的损失。它在不同模型(包括大型语言模型 (LLM) 和条件图像生成器)上,以更少的可训练参数持续获得更好的性能,并优于最先进的适配器。
论文摘要如下:
尽管遵循不同的技术路线,低秩自适应和正交自适应技术都可以基于少量可训练参数,有效地将大规模预训练模型应用于特定任务或领域。在本研究中,我们弥合了这两种技术之间的差距,提出了一种基于 Householder 反射的简单而有效的自适应方法。给定一个预训练模型,我们的方法通过将每个冻结的权重矩阵与一个由一系列可学习的 Householder 反射 (HR) 构建的正交矩阵相乘来对其层进行微调。这种基于 HR 的正交微调等效于自适应的低秩自适应。此外,我们表明,与 HR 对应的反射平面的正交性会影响模型的容量和正则性。该分析促使我们对 HR 的正交性进行正则化,从而产生了我们提出的 Householder 反射自适应 (HRA) 方法的不同实现。与最先进的方法相比,HRA 在自适应大型语言模型和条件图像生成器时,以更少的可学习参数取得了卓越的性能。代码可在 peft 和 HRA 获取。
HRAConfig
class peft.HRAConfig
< 来源 >( task_type: typing.Union[str, peft.utils.peft_types.TaskType, NoneType] = None peft_type: typing.Union[str, peft.utils.peft_types.PeftType, NoneType] = None auto_mapping: typing.Optional[dict] = None base_model_name_or_path: typing.Optional[str] = None revision: typing.Optional[str] = None inference_mode: bool = False r: int = 8 apply_GS: bool = False target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None )
参数
- r (
int
) — HRA 在不同层之间的秩。最好将“r”设置为偶数;否则,默认的初始化方法将无法工作。 - apply_GS (
bool
) — 是否应用 Gram-Schmidt 正交化。 - target_modules (
Optional[Union[List[str], str]]
) — 应用适配器的模块名称。如果指定,只有具有指定名称的模块才会被替换。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。如果指定为“all-linear”,则选择所有线性模块,不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,将引发错误——在这种情况下,您应该手动指定目标模块。 - exclude_modules (
Optional[Union[List[str], str]]
) — 不应用适配器的模块名称。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。 - init_weights (
bool
) — 是否执行 HRA 权重的初始化。 - layers_to_transform (
Union[List[int], int]
) — 要转换的层索引。如果传递一个整数列表,它将把适配器应用于此列表中指定的层索引。如果传递单个整数,它将对该索引处的层应用转换。 - layers_pattern (
Optional[Union[List[str], str]]
) — 层模式名称,仅在layers_to_transform
不为None
时使用。这应针对模型的nn.ModuleList
,通常称为'layers'
或'h'
。 - modules_to_save (
List[str]
) — 除了适配器层之外,要设置为可训练并保存在最终检查点中的模块列表。
这是用于存储 HRAModel 配置的配置类。
HRAModel
class peft.HRAModel
< 来源 >( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False state_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
参数
- model (
torch.nn.Module
) — 将附加适配器调谐器层的模型。 - config (HRAConfig) — HRA 模型的配置。
- adapter_name (
str
) — 适配器的名称,默认为"default"
。 - low_cpu_mem_usage (
bool
,optional
, 默认为False
) — 在元设备上创建空的适配器权重。有助于加快加载过程。
返回
torch.nn.Module
HRA 模型。
从预训练模型创建 Householder 反射自适应 (HRA) 模型。该方法在 https://huggingface.co/papers/2405.17484 中有描述。
示例
>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAModel, HRAConfig
>>> config_te = HRAConfig(
... r=8,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... init_weights=True,
... )
>>> config_unet = HRAConfig(
... r=8,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... init_weights=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = HRAModel(model.text_encoder, config_te, "default")
>>> model.unet = HRAModel(model.unet, config_unet, "default")
属性:
- model (
~torch.nn.Module
) — 将要被适配的模型。 - peft_config (HRAConfig): HRA 模型的配置。
删除一个现有的适配器。
merge_and_unload
< 来源 >( progressbar: bool = False safe_merge: bool = False adapter_names: typing.Optional[list[str]] = None )
此方法将 HRA 层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要这样做。
通过移除所有 hra 模块而不进行合并,恢复基础模型。这将恢复原始的基础模型。