PEFT 文档

IA3

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

IA3

本概念指南简要概述了 IA3,这是一种旨在改进 LoRA 的参数高效微调技术。

为了使微调更高效,IA3(通过抑制和放大内部激活来注入适配器)通过学习的向量来重新缩放内部激活。这些学习的向量被注入到典型的基于 Transformer 架构的注意力和前馈模块中。在微调过程中,这些学习的向量是唯一可训练的参数,因此原始权重保持冻结。与 LoRA 那样处理权重矩阵的学习的低秩更新不同,处理学习的向量使得可训练参数的数量要小得多。

与 LoRA 类似,IA3 具有许多相同的优点:

  • IA3 通过大幅减少可训练参数的数量,使微调更加高效。(对于 T0 模型,IA3 模型只有约 0.01% 的可训练参数,而即使是 LoRA 也有超过 0.1% 的可训练参数)。
  • 原始的预训练权重保持冻结,这意味着你可以有多个轻量级且便携的 IA3 模型,用于在其之上构建的各种下游任务。
  • 使用 IA3 微调的模型的性能与完全微调的模型的性能相当。
  • IA3 不会增加任何推理延迟,因为适配器权重可以与基础模型合并。

原则上,IA3 可以应用于神经网络中任何权重矩阵的子集,以减少可训练参数的数量。根据作者的实现,IA3 权重被添加到 Transformer 模型的键、值和前馈层中。具体来说,对于 Transformer 模型,IA3 权重被添加到键和值层的输出,以及每个 Transformer 块中第二个前馈层的输入。

给定注入 IA3 参数的目标层,可以根据权重矩阵的大小来确定可训练参数的数量。

PEFT 中常见的 IA3 参数

与 PEFT 支持的其他方法一样,要使用 IA3 微调模型,你需要:

  1. 实例化一个基础模型。
  2. 创建一个配置(IA3Config),在其中定义 IA3 特定的参数。
  3. 使用 get_peft_model() 包装基础模型,以获得一个可训练的 PeftModel
  4. 像平常训练基础模型一样训练 PeftModel

IA3Config 允许您通过以下参数控制如何将 IA3 应用于基础模型:

  • target_modules:要应用 IA3 向量的模块(例如,注意力块)。
  • feedforward_modules:在 target_modules 中被视作前馈层的模块列表。对于注意力块,学习的向量与输出激活相乘,而对于经典的前馈层,向量与输入相乘。请注意,feedforward_modules 必须是 target_modules 的子集。
  • modules_to_save:除了 IA3 层之外,需要设置为可训练并在最终检查点中保存的模块列表。这些通常包括为微调任务随机初始化的模型的自定义头部。

用法示例

对于序列分类任务,可以如下为 Llama 模型初始化 IA3 配置:

peft_config = IA3Config(
    task_type=TaskType.SEQ_CLS, target_modules=["k_proj", "v_proj", "down_proj"], feedforward_modules=["down_proj"]
)
< > 在 GitHub 上更新