LoRA 微调中的 target_modules 参数详解
什么是 target_modules?
在使用 LoRA (Low-Rank Adaptation) 进行大模型微调时,target_modules 是一个关键参数,它指定了哪些模块需要添加 LoRA 适配器。
简单来说:LoRA 不会修改原始模型的所有参数,而是在选定的模块上"插入"小型可训练层。target_modules 就是告诉系统在哪里插入这些层。
常见的模块选择
最小配置(仅注意力层)
target_modules = ['q_proj', 'v_proj']
- 训练参数最少
- 适合显存极度受限的场景
- 效果可能不如更全面的配置
标准配置(注意力 + 输出)
target_modules = ['q_proj', 'k_proj', 'v_proj', 'o_proj']
- 平衡性能和效率
- 覆盖注意力机制的核心组件
- 大多数任务的推荐配置
全面配置(注意力 + FFN)
target_modules = [
'q_proj', 'k_proj', 'v_proj', 'o_proj', # 注意力层
'gate_proj', 'up_proj', 'down_proj' # 前馈网络
]
- 训练参数较多,但仍远少于全量微调
- 覆盖 Transformer 的主要组件
- 适合复杂任务或需要更强适应能力的场景
各模块的作用
| 模块 | 作用 | 重要性 |
|---|---|---|
q_proj | 查询投影(注意力机制) | ⭐⭐⭐ |
k_proj | 键投影(注意力机制) | ⭐⭐⭐ |
v_proj | 值投影(注意力机制) | ⭐⭐⭐ |
o_proj | 输出投影(注意力机制) | ⭐⭐ |
gate_proj | 门控投影(FFN) | ⭐⭐ |
up_proj | 上投影(FFN) | ⭐⭐ |
down_proj | 下投影(FFN) | ⭐⭐ |
如何选择?
根据资源决策
- 显存 < 8GB:只选择
q_proj,v_proj - 显存 8-16GB:添加
k_proj,o_proj - 显存 > 16GB:可以包含所有 FFN 层
根据任务决策
- 简单任务(如分类、情感分析):标准配置即可
- 复杂任务(如推理、生成):建议全面配置
- 特定领域适配:全面配置效果更好
参考示例
from peft import LoraConfig, get_peft_model
# 配置 LoRA
lora_config = LoraConfig(
r=8, # LoRA 秩
lora_alpha=32, # 缩放因子
target_modules=[ # 目标模块
'q_proj', 'k_proj', 'v_proj', 'o_proj',
'gate_proj', 'up_proj', 'down_proj'
],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
# 应用到模型
model = get_peft_model(base_model, lora_config)
model.print_trainable_parameters()
# 输出示例: trainable params: 4.2M || all params: 7B || trainable%: 0.06%