IA3
注入适配器通过抑制和放大内部激活或 IA3,是一种通过学习三个向量来重新调整自注意力与编码器-解码器注意力层和位置前馈网络的中间激活的缩放。
本文摘要为
少样本上下文学习(ICL)使预训练语言模型能够在不进行任何基于梯度的训练的情况下执行先前不可见的任务,方法是将少量训练示例作为输入的一部分进行输入。ICL 会造成大量的计算、内存和存储成本,因为它涉及在每次进行预测时处理所有训练示例。参数高效微调 (PEFT)(例如适配器模块、提示微调、稀疏更新方法等)提供了一种替代范例,其中训练一小部分参数以使模型能够执行新任务。在本文中,我们严格比较了少样本 ICL 和 PEFT,并证明后者提供了更高的准确性以及显著降低的计算成本。同时,我们引入了一种名为 (IA)^3 的新型 PEFT 方法,该方法通过学习向量缩放激活,在仅引入极少量新参数的情况下获得更强的性能。我们还提出了一个基于 T0 模型的简单方法,称为 T-Few,它可以应用于新任务而无需特定任务的微调或修改。我们通过将 T-Few 应用于 RAFT 基准来验证其在完全不可见任务上的有效性,首次实现超人类性能,并比最先进的技术提高了 6% 的绝对值。我们实验中使用的所有代码均已公开.
IA3Config
类 peft.IA3Config
< 源文件 >( peft_type: Union = None auto_mapping: Optional = None base_model_name_or_path: Optional = None revision: Optional = None task_type: Union = None inference_mode: bool = False target_modules: Union = None feedforward_modules: Union = None fan_in_fan_out: bool = False modules_to_save: Optional = None init_ia3_weights: bool = True )
参数
- target_modules(
Optional[Union[List[str], str]]
)——要应用适配器的模块的名称。如果指定了该名称,只替换具有指定名称的模块。当传递一个字符串时,将执行正则匹配。当传递一个字符串列表时,将执行精确匹配或检查模块的名称是否以任何传递的字符串结尾。如果指定为“全部线性”,则选择所有线性/Conv1D 模块,但不包括输出层。如果未指定,系统将根据模型架构选择模块。如果不知道该架构,将引发错误 - 在这种情况下,您应该手动指定目标模块。 - feedforward_modules (
Optional[Union[List[str], str]]
)——要视为前馈模块的模块的名称,如同原始论文中所述。这些模块将(IA)³ 向量乘以输入,而不是输出。feedforward_modules
必须是target_modules
中存在的名称或名称的子集。 - fan_in_fan_out (
bool
) — 如果要替换的层像(fan_in,fan_out)一样存储权重,则将此设置成 True。例如,gpt-2 使用像(fan_in,fan_out)一样存储权重的 `Conv1D`,因此应将其设置为 `True`。 - modules_to_save (
Optional[List[str]]
) — 除了 (IA)³ 层之外,将待设置模块的列表设置为可训练的,并保存在最终的检查点中。 - init_ia3_weights (
bool
) — 是否初始化 (IA)³ 层中的向量,默认为True
。不建议将此项设为False
。
这是存储 IA3Model 配置的配置类。
IA3Model
使用预训练的变压器模型创建通过抑制和放大内部激活((IA)^3)模型而注入的适配器。该方法在 https://arxiv.org/abs/2205.05638 中进行了详细描述
示例
>>> from transformers import AutoModelForSeq2SeqLM, ia3Config
>>> from peft import IA3Model, IA3Config
>>> config = IA3Config(
... peft_type="IA3",
... task_type="SEQ_2_SEQ_LM",
... target_modules=["k", "v", "w0"],
... feedforward_modules=["w0"],
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = IA3Model(config, model)
属性:
- model (PreTrainedModel) — 要适配的模型。
- peft_config (
ia3Config
): (IA)^3 模型的配置。
add_weighted_adapter
< 源代码 > ( adapters: list[str] weights: list[float] adapter_name: str
删除现有的适配器。
merge_and_unload
< 源代码 > ( safe_merge: bool = False adapter_names: Optional[list[str]] = None )
参数
- safe_merge (
bool
) — 是否激活安全合并检查,以查看适配器权重中是否存在任何潜在的 Nan - adapter_names (
List[str]
, 可选) — 应当合并的适配器名称列表。如果为 None,将合并所有活动的适配器。默认为None
。
此方法将 IA³ 层合并到基础模型中。如果希望将基础模型用作独立模型,则需要此类操作。
示例
>>> from transformers import AutoModelForCausalLM
>>> from peft import PeftModel
>>> base_model = AutoModelForCausalLM.from_pretrained("tiiuae/falcon-40b")
>>> peft_model_id = "smangrul/falcon-40B-int4-peft-lora-sfttrainer-sample"
>>> model = PeftModel.from_pretrained(base_model, peft_model_id)
>>> merged_model = model.merge_and_unload()
设置活动适配器。
此外,此函数会设置指定适配器为可训练(即 requires_grad=True)。如果不希望如此,请使用以下代码。
通过移除所有 IA³ 模块且不合并,获取基本模型。这将返回原始基本模型。