PEFT documentation
Polytropon
Polytropon
Polytropon 是一个多任务模型,其“库存”中包含多个不同的 LoRA 适配器。该模型通过路由函数学习库存中适配器的正确组合,从而为特定任务选择最佳的模块子集。PEFT 还支持针对 Polytropon 的 Multi-Head Adapter Routing (MHR),它通过更细粒度地组合适配器头来构建并改进路由函数。适配器头被划分为不相交的块,并为每个块学习不同的路由函数,从而允许更高的表达力。
该论文的摘要如下:
模块化设计鼓励神经网络模型解耦并重组知识的不同方面,从而更系统地向新任务进行泛化。在本工作中,我们假设每个任务都与一个(可能较小的)技能库中的潜在离散技能子集相关联。相应地,技能对应于参数高效(稀疏 / 低秩)的模型参数化。通过联合学习这些参数以及任务-技能分配矩阵,每个任务的网络被实例化为激活技能参数的平均值。为了促进技能在任务之间形成非平凡的软划分,我们实验了一系列归纳偏置,例如印度自助餐过程先验和双速学习率。我们在两个主要设置中评估了我们的潜在技能模型:1) 在 BabyAI 平台的 8 个层级上进行基于接地指令跟随的多任务强化学习;以及 2) 在 CrossFit 上对预训练的文本到文本生成模型进行少样本适应,该基准包含 160 个 NLP 任务。我们发现,与知识在任务间纠缠的全共享、任务特定或条件生成参数的基线相比,网络的模块化设计显著提高了强化学习中的样本效率和监督学习中的少样本泛化能力。此外,我们展示了离散技能如何有助于可解释性,因为它们生成了明确的任务层级。
该论文的摘要如下:
用于跨任务泛化的参数高效微调(PEFT)包括在少样本适配到测试任务之前,先在多任务训练集上预训练适配器。Polytropon [Ponti et al., 2023](Poly)联合学习一个适配器库和一个路由函数,该函数在预训练和少样本适配期间为每个任务选择一个(可变大小的)适配器子集。在本文中,我们研究了适配器路由在其成功中所起的作用,并根据我们的发现设计了新的变体。首先,我们基于更细粒度的路由能提供更多表达能力的直觉,提出了 MHR(Multi-Head Routing),它组合适配器参数的子集,并在可比的参数预算下优于 Poly;通过仅微调路由函数而不微调适配器(MHR-z),我们在极致的参数效率下实现了具有竞争力的性能。其次,我们发现 Poly/MHR 的性能是多任务优化更好的结果,而非如先前假设的那样,是由促进适配器重组和局部适配的模块化归纳偏置所致。事实上,我们发现 MHR 在任务之间表现出比其他任何方法都更高的梯度对齐。由于这意味着路由仅在多任务预训练期间至关重要,我们提出了 MHR-mu,它在少样本适配期间丢弃路由,并微调预训练适配器的平均值。这确立了 MHR-mu 作为单适配器微调的有效方法。
如果您想先尝试路由而不进行训练,可以查看 Arrow LoRA 变体。
API
PolyConfig
类 peft.PolyConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truepoly_type: Literal['poly'] = 'poly'n_tasks: int = 1n_skills: int = 4n_splits: int = 1 )
参数
- r (
int) — Poly 中每个 Lora 的注意力维度。 - target_modules (
Union[List[str],str]) — 要应用 Poly 的模块名称。 - exclude_modules (
Optional[Union[List[str], str]]) — 不应用适配器的模块名称。传入字符串时,将执行正则表达式匹配。传入字符串列表时,将执行精确匹配,或检查模块名称是否以传入的任一字符串结尾。 - modules_to_save (
List[str]) — 除 Poly 层外,需要设置为可训练并在最终检查点中保存的模块列表。 - init_weights (bool) — 是否执行 Poly 权重的初始化。
- poly_type (
Literal["poly"]) — 要使用的 Poly 模块变体。目前仅支持 “poly”。 - n_tasks (
int) — 多任务场景中的任务数量。 - n_skills (
int) — 每个 Poly 层中的技能(LoRA)数量。 - n_splits (
int) — Poly 层中每个 LoRA 的拆分数量。大于 1 的值表示使用了多头路由(MHR)。
这是用于存储 PolyModel 配置的类。
PolyModel
类 peft.PolyModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )