趋近智
适配器是参数高效微调 (PEFT) 系列中一种先行且有影响力的方案。与完全微调或 LoRA 那样修改全部甚至部分原始模型权重不同,适配器背后的核心思想巧妙而简洁:将小型、新初始化、可训练的神经网络模块插入到冻结预训练大型语言模型 (LLM) 的结构中。
可以把庞大的预训练LLM想象成一个固定结构。适配器就像是小巧、专门的扩展包,你可以将其插入到这个结构中指定的插槽里。在微调过程中,只有这些紧凑的适配器模块内的参数会被更新,而基础LLM中数十亿参数保持不变。这种方法大幅减少了可训练参数的数量,通常不到原始模型尺寸的1%,使得即使计算资源有限也能进行微调。
适配器模块最常见的设计遵循瓶颈结构。这通常包括:
从数学上讲,如果 h∈Rdmodel 是适配器的输入隐藏状态:
这里的超参数是适配器维度,dadapter(也称为瓶颈维度)。较小的 dadapter 意味着更少的可训练参数,但适配器学习任务特定修改的能力可能较弱。dadapter 的典型值可能范围在 8 到 128 之间,远小于模型的隐藏维度(例如,4096 或更多)。
这些适配器模块通常被插入到 Transformer 结构中每个模块的特定位置。常见的插入点是依次在多头自注意力子层之后和在前馈网络 (FFN) 子层之后。适配器之前的层归一化层也可能进行微调。
适配器模块在 Transformer 模块中的插入点和结构。适配器通常放置在主要子层之后,并采用带有残差连接的瓶颈结构。
训练过程利用了基础模型的冻结特性:
这种有针对性的训练大幅减少了存储梯度和优化器状态(如 Adam 中的动量和方差估计)所需的内存,使得在大模型上进行微调在消费级或中等规模的企业级 GPU 上成为可能。
重要的可调超参数包括适配器维度 (dadapter)、适配器参数的学习率,以及如果偏离标准做法,可能还包括适配器的具体插入位置。
像 Hugging Face 的 adapter-transformers 库(transformers 主库的一个扩展)提供了方便的 API 来添加、训练和管理各种适配器配置(包括不同的架构变体,如 Pfeiffer 或 Houlsby 适配器),适用于许多预训练模型。在 PyTorch 中定义适配器模块可能如下所示:
import torch
import torch.nn as nn
class Adapter(nn.Module):
def __init__(self, model_dim, bottleneck_dim, activation=nn.GELU()):
super().__init__()
self.down_project = nn.Linear(model_dim, bottleneck_dim)
self.activation = activation
self.up_project = nn.Linear(bottleneck_dim, model_dim)
# 将上投影层的权重初始化为零或接近零
# 有助于在训练初期稳定模型
nn.init.zeros_(self.up_project.weight)
nn.init.zeros_(self.up_project.bias)
def forward(self, x):
# x 是输入隐藏状态(例如,MHA 或 FFN 的输出)
down = self.down_project(x)
activated = self.activation(down)
up = self.up_project(activated)
# 添加残差连接
output = x + up
return output
# 示例用法(- 在 Transformer 模块内部)
# ... 前置层(例如,MHA + LayerNorm) ...
# hidden_states = layer_norm(hidden_states + attention_output)
# adapter1 = Adapter(model_dim=config.hidden_size, bottleneck_dim=64)
# hidden_states_after_adapter1 = adapter1(hidden_states)
# ... 前馈网络 ...
总之,适配器模块提供了一种引人注目的 PEFT 策略,其特点是向冻结的基础模型添加小型、可训练的瓶颈层。它们的参数效率和模块化使其成为适应 LLM 的一个有价值的工具,特别是在管理多个任务或面临严格计算限制时,尽管潜在的推理延迟是一个需要考虑的因素,相比于允许将修改合并回基础模型的方法。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造