训练与优化 / 微调与蒸馏 实践指南实践 7 分钟阅读 查看源文件 ↗

LoRA 微调与诊断#

本页内容8 个部分

1. 先建立能比较的微调基线#

本篇从已有预训练模型出发,检查 adapter 配置、数据监督和评测。低秩参数化与参数量公式由 LoRA 原理维护;实践中先固定基础模型版本、tokenizer、模板、训练集与验证集,再记录 rank、alpha、插入模块、精度与有效 token 预算。

QLoRA 在量化的冻结基础权重上训练 LoRA,并结合 NF4、双重量化和分页优化器等设计。4-bit 主要描述基础权重存储,计算还需反量化到计算 dtype;激活和优化器并不是全部 4-bit。原工作报告单张 48GB GPU 微调 65B 模型,这是其配置下的结果,不是任意长度和 batch 的显存保证。QLoRA,§3–4。

1.1 最短验证路径#

  1. 不训练,先用基础模型跑固定验证样本,保存输出与指标。
  2. 用少量训练样本做一次前向、反向和更新,核对可训练参数只有预期模块,loss mask 与分母正确,梯度和参数有限。
  3. 确认一次更新后 adapter 或输出发生变化。记录初始化约定,首步某个因子的梯度为零可能是预期行为。
  4. 小数据训练、保存、重新加载,检查同一输入的结果;再扩大训练预算,用独立验证集判断收益。

2. 初始化与首步梯度#

为对齐前篇,记 h=W0x+sBAxh=W_0x+sBAx,其中 s=α/rs=\alpha/r。令 δ=∂L/∂h\delta=\partial\mathcal L/\partial h,单样本梯度为:

∇BL=sδ(Ax)⊤,∇AL=sB⊤δx⊤.\nabla_B\mathcal L=s\delta(Ax)^\top,\qquad \nabla_A\mathcal L=sB^\top\delta x^\top.

随机 AA、B=0B=0 时,初始增量为零;BB 通常有首步梯度,AA 的任务梯度为零。反过来随机 BB、A=0A=0 时,首步可更新的是 AA。若二者都为零,两份任务梯度均为零,分支不能靠该梯度启动。Dropout、其他正则或优化器衰减的贡献需另外区分。

两种单零初始化都可从原模型开始,但后续动力学未必相同。初始化动力学分析研究了特定宽度极限、缩放与学习率下的差别,不能直接推出任意有限模型中反向初始化都会爆炸。也不能声称“随机 AA 的梯度天然更干净”。

2.1 Gaussian 与 Kaiming 要记录实际方差#

Kaiming 初始化的一般形式随 fan-in 与激活增益变化。对 ReLU 增益,normal 方差为 2/k2/k,uniform 边界为 ±6/k\pm\sqrt{6/k},这里 k=dink=d_{\text{in}}。

LoRA 参考线性实现可使用 kaiming_uniform_(A, a=sqrt(5));这一参数对应边界 ±1/k\pm1/\sqrt{k}、方差 1/(3k)1/(3k),与 ReLU 的 2/k2/k 不同。LoRA 分支内部是线性映射,不能照搬“为 ReLU 守恒方差”的解释。Gaussian 与 uniform 的效果需要固定各自尺度后比较,本文没有二者等效的实测证据。

2.2 初始化的进一步对照#

LoRA+研究为两个因子使用不同学习率;Beyond Zero Initialization进一步研究两者非零初始化,在其理论设置与实验中改善了对部分次优学习率的稳健性。非零乘积会改变初始模型,因此比较时既要记录初始输出偏移,也要固定学习率搜索与预算;这些是进阶实验方向,不是标准初始化必须替换的结论。

3. 每个超参数改变什么#

配置 改变的内容 比较时记录什么
rank rr 增量的秩上限与可训练参数数 参数总量、验证收益、训练预算
alpha 显式系数 s=α/rs=\alpha/r 与 rank、学习率共同记录
target modules 哪些权重允许适配 模块全名、数量与是否含输出头
learning rate adapter 更新步幅 优化器、调度、有效 batch 与 token 分母
dropout adapter 输入的训练随机性 概率、施加位置、评测时是否关闭

3.1 怎样做第一轮对照#

原笔记中的 r∈{8,16,32,64}r\in\{8,16,32,64\}、α∈{r,2r}\alpha\in\{r,2r\} 和学习率 10−410^{-4} 到 5×10−45\times10^{-4} 可作为候选网格,并非按任务名称给定的最优配置。先固定一个小预算基线,再一次只改变一个主要因素;更换 rank 时,明确 alpha 是固定还是随 rank 改变。

Q/V 是可测试的窄插入范围,Q/K/V/O 与 MLP 是更广的范围。扩大范围可能改善适配,也会增加状态与计算;按实际模型模块名核对,不能假定所有架构都叫 q_proj。

4. 效果不理想时先判断哪一步失败#

先检查数据与执行是否正确,再调整容量,避免把所有问题都归因于 rank 太小。

观察 优先核对 接着尝试的对照
loss 不降、输出不变 可训练模块、标签 mask、梯度、optimizer 参数组 极小干净训练集能否拟合
训练集改善,验证集不改善 切分泄漏、分布差异、评测模板 减少步数、改善覆盖,固定预算比较
训练与验证均受限 学习率、预算、基础模型能力 扩大插入范围或 rank,与全参基线比较
OOM 或吞吐很低 序列长度、激活与 optimizer 状态 累积、重算或 QLoRA,分别测量峰值

DoRA 等方法是额外对照选项,其收益需用同一任务与预算验证,不能直接当作 LoRA 效果差的保证修复。

4.1 过拟合怎样处理#

训练 loss 下降、同口径验证 loss 上升时,先排除验证集过小或分布变化,再减少训练步数、降低 rank、增加数据多样性,或测试 dropout 与权重衰减。AdamW 的权重衰减与 L2 loss 不等价,应记录实际优化器规则。常见 LoRA dropout 施加在输入 xx 上,即 sBADropout⁡(x)sBA\operatorname{Dropout}(x),不是在 AA、BB 之间任意插入。

5. 容量与部署的边界#

单层增量秩受 rr 限制,但整个网络可以通过多层适配改变复杂行为。不能只因任务涉及新知识就断言 LoRA 必然不够;应比较验证结果与足够调参的全参基线。未合并时有额外分支计算,延迟依赖 batch、rank、内核和服务实现,没有统一的 1–5% 数值。

5.1 合并与重新加载#

评测模式下,普通线性 LoRA 可合并为 Wmerged=W0+(α/r)BAW_{\text{merged}}=W_0+(\alpha/r)BA。在适配的 PEFT 实现中可调用 merge_and_unload(),再保存结果;具体支持取决于 adapter 类型、基础权重格式与库版本。

部署前对同一输入比较合并前后 logits 或任务结果,记录 dtype 与误差;量化权重重新量化后不保证完全一致。保留原 adapter 与基础模型版本,便于恢复和多任务切换。

5.2 与其他参数高效微调方法的区别#

方法 主要适配对象 需要另外检查的条件
Adapter 插入的瓶颈模块 新模块带来的计算与部署开销
Prefix / 深层 prompt 可训练前缀或中间提示 序列或 KV 开销、注入位置
LoRA / QLoRA 低秩权重增量;后者另量化基础权重 插入范围、rank、量化与合并条件
IA³ 激活的逐元素缩放 可调方向较少时的任务效果
AdaLoRA / DoRA 秩预算分配/权重幅值与方向 额外机制与对应实现的约定

参数比例随插入位置、模型和预算改变,不能按方法名固定为某个百分比。

6. 数据格式、监督与评估#

6.1 先确认哪些 token 参与损失#

原始数据可以存成 instruction/input/output,或包含 role/content 的 messages 列表;后者是存储结构,本身不等于完整 ChatML 序列。实际输入需用基础模型对应的聊天模板序列化,再核对角色边界、特殊 token、截断与标签 mask。

{"messages": [
  {"role": "user", "content": "Translate: The quick brown fox"},
  {"role": "assistant", "content": "敏捷的棕色狐狸"}
]}

若只监督 assistant 回答,应把其他位置从 loss 分母中排除。抽查最终 token 与 label,比只看原始 JSON 更能发现模板或 mask 错误。

6.2 质量与覆盖分别检查#

去重后检查训练与验证是否泄漏,审查空回答、截断和错误标签,再按目标用户的任务、语言与长度分布检查覆盖。长度过滤阈值来自当前任务和上下文预算,不机械地删去超过 2048 token 的样本。

LIMA展示了特定预训练模型与精心选取的 1000 条样本上的对齐结果;这不意味着任意任务都只需 1000 条数据。使用教师或评审模型筛选时,也要抽查其错误和偏好。

6.3 任务指标与行为回归一起看#

维度 做法 解读限制
损失与困惑度 相同 tokenizer、mask 与分母 不同口径不可直接比
目标任务 固定测试集与生成参数 检查污染、模板和随机性
人工或模型评审 盲测、随机顺序、明确标准 评审也会有偏差,需抽检
原有能力 固定回归集 不能只记录目标任务提升

7. 冻结基础权重仍需检查遗忘#

冻结 W0W_0 保留了原始权重文件,但启用 adapter 后,前向使用 W0+ΔWW_0+\Delta W,原有任务的行为仍可能退化。关闭 adapter 可恢复基础模型路径,并不保证启用时不遗忘。

可测试相关任务数据 replay、减少训练步数或约束输出偏移。Replay 比例依任务评估,不采用统一百分比。EWC 使用旧任务重要性估计惩罚参数偏移,需明确在哪组可训练参数上定义;对普通参数 θ\theta 的典型形式为:

LEWC=Ltask+λ2∑iFi(θi−θi∗)2.\mathcal L_{\text{EWC}}=\mathcal L_{\text{task}}+\frac{\lambda}{2}\sum_i F_i(\theta_i-\theta_i^*)^2.

FiF_i 是对角 Fisher 重要性估计,θ∗\theta^* 是旧任务参考参数,λ\lambda 为强度。输出 KL 约束则需要另定义参考模型、输入分布与 KL 方向。两者都增加成本,收益用目标任务与回归集共同判断。

参考资料与适用条件#

本篇的排查顺序与候选网格用于组织对照实验,未新增个人训练结果。

相关阅读路线

完成一次训练更新 ↗