PEFT 文档
IA3
加入 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 微调模型,您需要
- 实例化基础模型。
- 创建一个配置 (
IA3Config
),您可以在其中定义 IA3 特定的参数。 - 使用
get_peft_model()
包装基础模型以获得可训练的PeftModel
。 - 像平常训练基础模型一样训练
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"]
)