LoRA 实操超参:rank/alpha/目标模块
02-PEFT原理
核心≈ 20 分钟
#LoRA#超参#实操
reviewed
我的状态:
前置知识点
一句话定义
LoRA 的效果由四个超参决定:秩 r(容量)、缩放 α(扰动幅度)、dropout(正则)、目标模块(作用位置),本节给出每个旋钮的默认值与调节依据。
为什么重要
同一份数据,r 与目标模块选得对,效果可差 10 个点以上;选错模块甚至完全学不动。这四个超参是 LoRA 微调中「性价比最高的一组实验变量」,也是多数「LoRA 效果不如预期」帖子的真正病因。
前置知识
kp-005 的 ΔW=BA 分解与 α/r 缩放的含义。
核心概念
- rank r:ΔW 的秩上限,决定表达容量。常用 8/16/32/64。
- alpha α:分支输出乘以 α/r。常用值为 r 的 1-2 倍(如 r=16, α=32)。
- lora_dropout:LoRA 分支上的 dropout,常 0.05-0.1,数据少时防过拟合。
- target_modules:对哪些线性层加 LoRA。注意力 q/k/v/o 投影是底线,FFN 的 gate/up/down 加上通常更强。
原理与机制
各旋钮的调节逻辑:
- r 与任务复杂度相关:格式改写、语气调整这类低复杂度任务 r=8-16 足够;涉及领域推理或多种子任务的 r=32-64;继续再大收益递减且过拟合风险上升。
- α 的作用是解耦「容量」与「步长」:调 r 会同时改变参数量与 BA 输出的尺度,α 保持固定(如 32)可让不同 r 的实验更可比;等价地,α/r 像该分支专属的学习率倍率。
- 目标模块影响信息流向:只加 q/v 是早期论文的省参数配置;现代实践普遍对注意力全部投影 + FFN 加 LoRA(如
all-linear),在指令遵循任务上普遍优于仅 q/v。 - 经验学习率配合:LoRA 参数少,可用比全参大 5-10 倍的学习率(1e-4 ~ 3e-4),详见 kp-016。
图示
容量 r: 8 ── 16 ── 32 ── 64 ── 128
效果: 89% 92% 94% 94% 91%(过拟合)
成本: ▂ ▃ ▄ ▆ █ (训练时间/显存)
结论: 取收益拐点, 默认 16 起步直观类比
r 是「补习班课时数」,α 是「老师讲课的音量」,目标模块是「补习哪几门课」。课时太少学不会,太多会疲劳(过拟合);音量过大淹没原有人格;只补一门课(仅 q/v)常常不够。
实例或案例
一个合同抽取任务的三组对照(同数据、同 3 epoch):仅 q_proj/v_proj、r=16 → F1 0.71;全线性层、r=16 → F1 0.83;全线性层、r=8 → F1 0.82。结论:目标模块的影响大于 r,先开满线性层再谈 r。
操作步骤
- 起步配置:
r=16, alpha=32, dropout=0.05, target_modules="all-linear"。 - 跑 500 step 看 loss 是否稳定下降,用 20 条固定样例生成观察格式是否开始收敛。
- 学不动(loss 平、输出不变):目标模块加满 → r 提到 32 → 检查数据格式(kp-014)。
- 验证集过拟合(train 降 eval 升):r 降回 16、dropout 提到 0.1、减 epoch。
- 每次只动一个超参,结果记入实验表(见 kp-026)。
排错清单
print_trainable_parameters显示 0:target_modules 名字与模型不匹配。- adapter 文件异常大(数百 MB):r 或目标模块开得过大,或误存了全模型。
- 同配置两次结果差异大:未固定随机种子(含 LoRA 初始化的种子)。
- 合并后效果与训练时不一致:核对合并脚本里的 α/r 缩放与精度,见 kp-009。
常见误区
- r 越大越好:超过任务所需后只剩过拟合与显存成本,多数场景 r=16-32 是拐点。
- 忽略 target_modules 只调 r:作用位置错了,调 r 无济于事。
- 把 alpha 与学习率混为一谈:α 是前向的静态缩放,学习率是优化步长,二者叠加决定有效更新幅度但语义完全不同。
与其他知识点的关系
与全局超参(学习率/批量)的配合见 kp-016;QLoRA 场景下这些超参的取值差异见 kp-007;训练效果异常的系统性排查见 kp-030。
延伸阅读
本节不适用:本节是工程经验汇总,无单篇权威文献;各家的推荐值请以所用框架文档的默认配置为基线做对照实验。
自测题
- r=16 时 alpha 应该取多少?为什么?
答:常取 32(α/r=2)。α 保持与 r 无关的固定值可以让不同 r 的实验可比,α/r 决定分支的等效扰动幅度。
- LoRA 学不动的排查顺序是什么?
答:先确认 target_modules 命中且 trainable params 非零,再开满全部线性层,然后升 r,最后回头检查数据与模板格式。
- 数据只有 500 条,r 应该偏大还是偏小?
答:偏小(8-16)并配合 dropout 0.1 与少 epoch——小数据下容量越大过拟合越快。