PEFT 文档
C3A: 通过循环卷积实现参数高效微调
并获得增强的文档体验
开始使用
C3A: 通过循环卷积实现参数高效微调
C3A 是一种参数高效的微调技术,它利用循环卷积在合理的资源限制内实现高秩适应。
请注意,你应该为 C3A 使用比其他方法大得多的学习率 (LR)。例如,1e-1 的学习率是 C3A 的一个良好起点。此外,应使用小得多的权重衰减。你可以参考 method_comparison
文件夹了解更多详情。
对于 block_size
,它会影响可调参数和性能。作为开始,你可以选择一个接近 $\frac{\sqrt{d_1\times d_2}}{r}$ 的 $\mathrm{gcd}(d_1,d_2)$,其中 $r$ 是你将为此任务使用的 LoRA 秩。
C3A 目前有以下限制:
- 仅支持 `nn.Linear` 层。
- 不支持量化层。
- 块大小应该是目标层输入和输出大小的公约数。
如果这些限制不适用于你的用例,请考虑使用其他方法。
论文摘要如下:
低秩适应 (LoRA) 因其在微调大型基础模型方面的应用而广受欢迎,它利用低秩矩阵 $\mathbf{A}$ 和 $\mathbf{B}$ 来表示权重变化(即 $\Delta \mathbf{W} = \mathbf{B} \mathbf{A}$)。该方法通过将 $\mathbf{A}$ 和 $\mathbf{B}$ 与激活值依次相乘,减少了可训练参数,并减轻了与完整增量矩阵相关的大量内存消耗。尽管取得了成功,但其固有的低秩特性可能会限制其性能。虽然已经提出了几种变体来解决这个问题,但它们往往忽略了 LoRA 带来的关键计算和内存效率。在本文中,我们提出了循环卷积适应 (C3A),它不仅以增强的性能实现了高秩适应,而且在计算能力和内存利用方面也表现出色。大量的实验表明,C3A 在各种微调任务中始终优于 LoRA 及其变体。
C3AConfig
class peft.C3AConfig
< 来源 >( task_type: typing.Union[str, peft.utils.peft_types.TaskType, NoneType] = None peft_type: typing.Union[str, peft.utils.peft_types.PeftType, NoneType] = None auto_mapping: typing.Optional[dict] = None base_model_name_or_path: typing.Optional[str] = None revision: typing.Optional[str] = None inference_mode: bool = False block_size: int = 256 target_modules: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None block_size_pattern: Optional[dict] = <factory> init_weights: Optional[Union[bool, Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']]] = 'xavier_uniform' )
参数
- block_size (
int
) — C3A 的块大小,必须能被目标层的输入大小和输出大小整除。如果你不知道该使用什么块大小,请将其设置为目标层所有输入和输出大小的最大公约数。增加此值将导致参数减少。 - target_modules (
Union[list[str],str]
) — 应用 C3A 的模块名称。 - bias (
str
) — C3A 的偏置类型。可以是 ‘none’、‘all’ 或 ‘c3a_only’。如果为 ‘all’ 或 ‘c3a_only’,则相应的偏置将在训练期间更新。请注意,这意味着即使禁用适配器,模型也不会产生与未经适应的基础模型相同的输出。 - modules_to_save (
list[str]
) — 除了 C3A 层之外,需要设置为可训练并保存在最终检查点中的模块列表。 - layers_to_transform (
Union[list[int],int]
) — 要转换的层索引,如果指定此参数,它将在该列表中指定的层索引上应用 C3A。如果传入单个整数,它将在该索引的层上应用 C3A。 - layers_pattern (
str
) — 层模式名称,仅当 `layers_to_transform` 不为 `None` 且层模式不在常见层模式中时使用。 - block_size_pattern (
dict
) — 从层名称或正则表达式到与默认指定值不同的 block_size 的映射。例如,`{"model.decoder.layers.0.encoder_attn.k_proj": 1280}`。 - init_weights (
Union[bool, Literal["gaussian", "kaiming_uniform", "xavier_uniform"]]
) — C3A 权重的初始化。如果权重应初始化为常用分布,则将其设置为 False。如果权重应初始化为零,则将其设置为 True。
这是用于存储 C3AModel 配置的配置类。
C3AModel
class peft.C3AModel
< 来源 >( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False state_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
参数
- model (
torch.nn.Module
) — 要适配的模型。 - config (C3AConfig) — C3A 模型的配置。
- adapter_name (
str
) — 适配器的名称,默认为 `"default"`。
返回
torch.nn.Module
C3A 模型。
从预训练的 transformers 模型创建 C3A 模型。
该方法在 [待办] 中有详细描述。
属性:
- model (
PreTrainedModel
) — 需要被适配的模型。 - peft_config (C3AConfig): C3A 模型的配置。
merge_and_unload
< 来源 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )
此方法将 C3A 层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要此方法。
set_adapter
< 来源 >( adapter_name: str | list[str] )
设置活动的适配器。
通过移除所有 C3A 模块而不进行合并,恢复基础模型。这将返回原始的基础模型。