方法组合

配置类: ConfigUnion

虽然不同的高效微调方法和配置通常被单独提出,但将它们结合起来进行联合训练可能更有益处。为了使这一过程更加简便,adapters提供了使用ConfigUnion类来分组多个配置实例的功能。

例如,这可以用于为放置在多头注意力和前馈块之后的适配器模块定义不同的缩减因子:

from adapters import BnConfig, ConfigUnion

config = ConfigUnion(
    BnConfig(mh_adapter=True, output_adapter=False, reduction_factor=16, non_linearity="relu"),
    BnConfig(mh_adapter=False, output_adapter=True, reduction_factor=2, non_linearity="relu"),
)
model.add_adapter("union_adapter", config=config)

混合匹配适配器

配置类: MAMConfig

He et al. (2021) 研究了多种高效微调方法的变体与组合方案。 他们提出将混合匹配适配器作为前缀调优与并行瓶颈适配器的组合方案。 该配置由adapters原生支持:

from adapters import MAMConfig

config = MAMConfig()
model.add_adapter("mam_adapter", config=config)

并且与使用以下ConfigUnion相同:

from adapters import ConfigUnion, ParBnConfig, PrefixTuningConfig

config = ConfigUnion(
    PrefixTuningConfig(bottleneck_size=800),
    ParBnConfig(),
)
model.add_adapter("mam_adapter", config=config)

论文:

UniPELT

配置类: UniPELTConfig

Illustration of UniPELT.

展示单层Transformer中UniPELT方法的示意图。经过训练的组件以品红色调显示。

Mao等人(2022)在其UniPELT框架中采用了与He等人(2021)工作类似的方法。他们同样将多种高效微调方法(包括LoRA、Prefix Tuning和瓶颈适配器)整合到一个统一的设置中。UniPELT还引入了一个门控机制,用于控制不同子模块的激活。

具体来说,对于每个适配模块\(m\),UniPELT会添加一个可训练的门控值\(\mathcal{G}_m \in (0, 1)\),该值通过前馈网络(\(W_{\mathcal{G}_m}\))和Sigmoid激活函数(\(\sigma\))从Transformer层的输入状态(\(x\))计算得出:

\[\mathcal{G}_m \leftarrow \sigma(W_{\mathcal{G}_m} \cdot x)\]

这些门控值随后用于缩放注入适配器模块的输出激活,例如对于一个LoRA层:

\[ h \leftarrow W_0 x + \mathcal{G}_{LoRA} B A x \]

adapters的配置类中,这些门控机制可以通过use_gating=True来激活。 完整的UniPELT设置可以使用UniPELTConfig1进行实例化:

from adapters import UniPELTConfig

config = UniPELTConfig()
model.add_adapter("unipelt", config=config)

这与以下的 ConfigUnion 相同:

from adapters import ConfigUnion, LoRAConfig, PrefixTuningConfig, SeqBnConfig

config = ConfigUnion(
    LoRAConfig(r=8, alpha=2, use_gating=True),
    PrefixTuningConfig(prefix_length=10, use_gating=True),
    SeqBnConfig(reduction_factor=16, use_gating=True),
)
model.add_adapter("unipelt", config=config)

最后,由于每个适配器模块的门控值可能为分析提供有趣的洞见,adapters内置了一种机制,可通过output_adapter_gating_scores参数返回模型前向传播过程中计算的所有门控值:

outputs = model(**inputs, output_adapter_gating_scores=True)
gating_scores = outputs.adapter_gating_scores

请注意,此参数仅适用于基础模型类和AdapterModel类。 在示例中,gating_scores包含以下形式的字典:

{
    '<adapter_name>': {
        <layer_id>: {
            '<module_location>': np.array([...]),
            ...
        },
        ...
    },
    ...
}

论文:


1

请注意,adapters中UniPELT的实现遵循原始代码中的实现方式,与论文中的描述略有不同。详情请参阅此处