趋近智
我们已经考察了适配器模块的架构——这些小型、可训练的网络被插入到预训练 (pre-training)模型的层内,现在让我们关注它们的实现和训练的实际操作。要有效使用适配器,需要仔细考虑库的选择、训练配置以及超参数 (parameter) (hyperparameter)的调整。
使用适配器最常见的方法是采用基于PyTorch或TensorFlow等流行框架构建的专业库。例如Hugging Face的adapter-transformers等库大大简化了过程。这些库无需手动修改底层模型架构,而是提供了高级API来执行以下操作:
使用库函数添加适配器可能如下所示:
# 加载预训练模型
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
# 添加适配器配置
# 'adapter_size' 控制瓶颈维度
adapter_config = AdapterConfig(mh_adapter=True, output_adapter=True, reduction_factor=16, non_linearity="relu")
# 使用此配置向模型添加名为 'my_task_adapter' 的适配器
model.add_adapter("my_task_adapter", config=adapter_config)
# 指定要训练的适配器
model.train_adapter("my_task_adapter")
# 模型现在已准备好进行训练,只有适配器权重会被更新
# 继续进行标准训练循环(数据加载、优化器、损失计算、反向传播)
这种方法隐藏了直接修改nn.Module结构的复杂性,并确保与原始模型权重 (weight)的兼容性。
适配器训练的一个重要方面是冻结原始预训练 (pre-training)模型的权重 (weight)。只有新添加的适配器参数 (parameter)是可训练的。这大幅减少了需要计算和更新梯度的参数数量,与完全微调 (fine-tuning)相比,能显著节省内存和计算资源。
有几个超参数控制着适配器的行为和能力:
瓶颈维度(适配器大小 / reduction_factor): 这可以说是最重要的超参数。它定义了适配器内部中间层的大小(下投影和上投影中的,其中是Transformer层的隐藏维度)。
性能通常会随着适配器大小的增加而提升,随后趋于平稳或略有下降。最佳大小能平衡表达能力和效率。
非线性: 在适配器模块中,下投影之后会应用一个激活函数 (activation function)。常见选项包括GeLU、ReLU或SiLU。选择的函数会影响性能,并且是另一个可能需要调整的超参数。
初始化: 适配器权重 (weight)(、和偏置 (bias))通常随机初始化(例如,使用标准正态或Kaiming初始化),而基础模型权重保持冻结。一些研究表明,特定的初始化方案可以稍微改善收敛,但标准初始化通常效果良好。
适配器放置位置: 尽管原始的Adapter论文建议在每个Transformer块内的多头注意力 (multi-head attention)子层和前馈子层之后都插入适配器,但存在不同的变体。有些实现可能只在FFN之后放置适配器,从而进一步减少参数数量。最佳放置位置可能取决于具体任务。
adapter-transformers等库通常支持适配器组合等高级功能。这允许多个适配器(可能在不同任务或数据集上训练)进行组合使用或按顺序使用。
Stack操作)。Fuse操作)。这些技术支持更复杂的场景,例如多任务学习或组合在不同数据域上训练的适配器,而无需独立的模型副本。
强烈推荐使用成熟的库来实现适配器。重要选项包括:
adapter-transformers (Hugging Face): 这是流行transformers库的扩展,为Hugging Face模型提供了各种适配器类型(包括Pfeiffer适配器、Prefix Tuning、LoRA)的顺畅集成。它处理模块注入、权重 (weight)冻结和适配器管理。这些库抽象了大部分实现复杂性,让您可以专注于为特定应用配置、训练和评估适配器。
通过理解这些实现细节,包括库的使用、训练过程和超参数 (parameter) (hyperparameter)调整,您可以有效应用适配器微调 (fine-tuning),作为一种参数高效的替代方案,来对大型预训练 (pre-training)模型进行适应。本章稍后的实践部分将提供关于这些理念的具体实践经验。
这部分内容有帮助吗?
adapter-transformers库的官方文档,提供了实现和训练适配器模块的实用指南和API参考。© 2026 ApX Machine LearningAI伦理与透明度•