登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  科技周边 >  人工智能

PEFT LoRA 怎样选择目标模块

来源:17golang原创

时间:2026-11-11 21:57:35 378浏览 收藏

PEFT LoRA 的目标模块应从模型真实结构和训练预算出发选择:先查看模块名称,再决定是只覆盖部分注意力投影、扩大注意力范围,还是使用 target_modules="all-linear" 覆盖更广的线性模块。q_proj、v_proj 不是所有模型通用的固定名称,覆盖更多模块也不保证任务效果更好。

官方地址:https://huggingface.co/docs/peft/

面对第一次微调的配置选择,我更倾向于先确认“究竟改了哪些层”,再决定要不要扩大。下面的判断属于配置建议,不是一次已经完成的训练复盘;示例代码未在本文环境执行,也没有虚构显存或准确率结果。

先把模块名字和任务范围分开

以某些具有独立注意力投影的模型为例,可能看到 q_proj、k_proj、v_proj、o_proj。它们描述的是模型里的模块名称,不是“某任务必须选择”的清单。另一些架构把多个投影融合成一个模块,照搬名称会导致找不到目标。

对已经加载的基础模型,可以查看模块名和类型:

# base_model 是你按模型官方方法加载的基础模型,此处不下载模型。
# 先看结构,不依赖从其他架构教程复制过来的名称。
for name, module in base_model.named_modules():
    if name:
        print(name, type(module).__name__)

先确定实际模型中的模块属于什么类型,再使用对应后缀或完整路径。不要只在参数名里搜到一个相似单词,就认定它是可用的模块;named_modules() 与 named_parameters() 看到的对象不同。

示例投影模块与两种目标选择规则的静态匹配关系
结构图:左侧是示例模型模块,右侧是选择规则;连线表达匹配关系,不表示执行顺序。

显式列表与 all-linear 各适合什么情况

选择适合的起点主要代价或限制
少量投影模块预算紧,希望先建立范围清楚的基线可能不足以适应任务,需要后续对照
扩大到更多注意力投影已有基线,想观察注意力覆盖的变化名称依赖架构,新增参数通常增多
all-linear希望更广覆盖,且预算允许不是“所有参数”,仍有类型和输出层规则

当前 LoraConfig 文档规定:列表按精确名称或后缀匹配,字符串通常作为正则表达式处理;特殊字符串 all-linear 用于选择 linear/Conv1D 模块。对于 PreTrainedModel,输出层会排除。它不是给嵌入、归一化和任意参数全部增加 LoRA 的开关。

省略 target_modules 时,PEFT 会依据已知模型架构选择目标;未知架构可能报错。因此“默认能工作”不代表默认目标就是你的最佳目标。我会把明确的目标列表一并记入实验记录,便于解释差异。

把选中的名称写成最小配置

下面只适用于结构中确实存在独立 q_proj 与 v_proj、且对应层受当前 PEFT 支持的因果语言模型。秩和缩放值用于演示配置,不是调参结论:

from peft import LoraConfig, get_peft_model

# 仅在当前模型确有这两个模块后缀时使用。
config = LoraConfig(
    task_type="CAUSAL_LM",
    target_modules=["q_proj", "v_proj"],
    r=8,
    lora_alpha=16,
    lora_dropout=0.05,
    bias="none",
)
# 注入适配器后,查看实际可训练参数;这里还没有开始训练。
model = get_peft_model(base_model, config)
model.print_trainable_parameters()

如果改为广覆盖方案,使用另一次独立加载的基础模型构建配置,并把 target_modules 改为字符串 "all-linear"。不要在已经注入适配器的同一模型上反复调用注入来充当干净的方案对比,也不要同时改变数据集与优化器后把差异全归因于目标范围。

构造成功只是最低条件。读者实际执行时,应看最终哪些模块带有适配器、可训练参数是否符合预期,并记录模型标识和 PEFT 版本。本文不提供伪造的输出数字。

我会怎样安排三种范围的对照

我的选择顺序是先用一个解释得清楚的窄范围作为预算基线,再尝试扩大注意力覆盖,最后比较广覆盖方案。这个顺序便于归因,并不是说窄范围一定更好。若任务本身要求更广适应、资源也足够,可以直接把广覆盖放进候选方案。

对于普通线性权重,LoRA 新增矩阵的参数量约为 r × (输入维度 + 输出维度);总量还要对目标模块求和,并考虑额外可训练组件。因此相同的秩 r,放在不同宽度、不同数量的层上,预算不同。不要只比较秩而忽略目标模块集合。

目标模块形状秩与新增参数预算的静态关系
结构图:目标模块和秩共同影响新增适配器参数量,不能把覆盖范围等同于效果提升。

比较时固定训练与评估数据划分、训练步数、优化设置和基础模型,分别记录新增参数量、资源开销、任务指标与具体失败样例。预算变化和评估结果是两个独立维度,图中的连接只表示决策时共同考虑,不代表参数更多必然带来更高分。

遇到特殊结构时不要硬套目标列表

如果一个 MoE 专家权重以 nn.Parameter 保存,而不是独立的 nn.Linear 模块,普通目标模块名不一定覆盖它。当前 PEFT 为这类情况提供 target_parameters;需要按模型实现和所用版本的支持范围单独配置,不应把普通模型的列表当成保证。

modules_to_save 也不是另一种目标模块列表:它用于让指定的额外模块可训练并随适配器保存,可能显著改变训练预算。只有确有任务需求时才加入,不能为了消除报错而把输出头或整个模型随意塞进去。

找不到 q_proj 应该怎么办?

回到模型真实结构,确认是否使用不同名称或融合投影,然后按受支持类型选择。改一个看起来相似的字符串不能保证语义一致。

all-linear 会自动启用量化吗?

不会。目标范围和基础模型的量化加载是不同配置,本篇仅讨论目标选择。

秩调大能代替扩大目标范围吗?

两者改变的内容不同:秩影响单个适配器容量,目标范围决定在哪些模块增加适配器。应作为不同实验条件比较。

官方 LoRA 配置说明:https://huggingface.co/docs/peft/en/package_reference/lora

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>