深度解读 · 模型训练 / 微调

LoRA 无悔指南

低秩微调(LoRA)到底能不能追平"全参微调"?答案是:只要做对几个关键细节,它在绝大多数后训练场景下表现完全一致——还更省算力。

原文:Thinking Machines Lab · Connectionism · 2025.09.29 · 作者 John Schulman(PPO 之父、OpenAI 联合创始人)
一句话抓住重点

过去大家含糊地说"LoRA 不如全参"。这篇用大量实验给出明确边界:只要 LoRA 加在所有层(尤其 MLP/MoE)数据不超 adapter 容量,监督微调与全参的学习曲线完全重合;强化学习场景哪怕秩低到 1 也能追平——因为策略梯度每条轨迹只携带约 1 bit 信息。最优学习率约为全参 10×,每步只花 FLOPs。

10×
LoRA 最优学习率
约为全参 10 倍
每步约花全参
⅔ 的 FLOPs
rank=1
RL 场景秩 1
即可追平全参
~1 bit
策略梯度每条
轨迹约学 1 bit
01 · 动机

为什么要关心 LoRA

今天的大模型动辄上万亿参数、预训练吃掉几十万亿 token。但后训练用的数据小得多、领域也窄。用一整个 TB 级权重去承载几 GB、甚至几 MB 数据带来的更新,直觉上太浪费——这就是参数高效微调(PEFT)的动机。

最主流的方法就是 LoRA:把原始权重矩阵 W 换成 W' = W + (α/r)·BA,其中 B、A 是两个小矩阵,参数量远小于 W。它用一个低维表示来承载微调带来的更新。除了省钱,LoRA 还有几个工程优势:

🏢
多租户服务
原始权重不变,一台推理服务器能同时挂很多 adapter 批量采样(vLLM/SGLang 都支持)
💾
训练显存小
不必为所有权重存 fp32 梯度与优化器状态,训练布局只比采样稍大
📦
易加载迁移
adapter 体积小,机器间传输、装载都快
但有个老问题
学术界一直含糊:LoRA 相比全参到底差多少?本文要回答它
02 · 核心发现

什么时候 LoRA = 全参微调

作者在 Llama 3、Qwen3(含 MoE)上跑了大量监督学习 + RL 实验,用 log loss 而非采样评测以求通用。三条关键结论:

① 数据没超容量时,监督微调完全一致

在中小规模指令微调 / 推理数据集上,LoRA 与全参学习曲线几乎重合——loss 随训练步数对数线性下降。只有当数据量超过 LoRA 容量(低秩 adapter 装不下了),曲线才会掉队。注意不是撞到一个无法逾越的下限,而是训练效率随"容量/数据量之比"变差。

② 必须加在所有层,尤其 MLP/MoE

2021 原版论文建议只加注意力矩阵,很多后续工作照搬。但本文发现:只加注意力层会明显拖慢学习,即便用更高秩把参数量补齐也没用。

LoRA 配置(Llama-3.1-8B)参数量效果
attn-only, rank=2560.25B最差
mlp-only, rank=1280.24B反而更好 ✓
mlp-only, rank=2560.49B
all-layers, rank=2560.70B最好
💡 解读:问题不在参数多少,而在"加在哪儿"
参数量相近的 attn-256(0.25B)还不如 mlp-128(0.24B)。作者用经验神经正切核(eNTK)解释:影响核函数最大的是参数最多的层,只有 LoRA 覆盖到 MLP/MoE 这些"参数大户",LoRA 的训练动力学才约等于全参。

③ RL 场景:秩 1 就够,因为 RL 学得"很少"

这是最反直觉也最实用的发现。LoRA 在策略梯度 RL 上完全追平全参,哪怕秩=1。背后是一个信息论论证:

# 监督学习 vs 强化学习:每条样本学到多少信息
监督学习:每条样本 ≈ O(token 数) bit
策略梯度 RL:每条轨迹 ≈ O(1) bit  (只有末尾一个 advantage)
→ 一条轨迹上千 token 时,RL 每 token 吸收信息少约 1000×

# MATH 实验:1万题 × 32 采样 ≈ 需吸收 32 万 bit
而 rank-1 LoRA(Llama-3.1-8B) 就有 300 万参数 → 容量绰绰有余

作者甚至预测 DeepSeek-R1-Zero(5.3M 轨迹)也能用低秩 LoRA 复现。

03 · 调参实操

别被四个超参吓到

采纳 Hu 等人的参数化 W' = W + (α/r)·BA。看似要调四个超参(α、LR_A、LR_B、init_A),其实存在一个两参数变换不变性,砍掉两个自由度——真正有效的只有两个

⚡ 1/r 缩放:最优学习率几乎与秩无关
那个 1/r 前置因子让最优学习率近似与秩无关——训练初期不同秩的学习曲线甚至完全重合(作者一度怀疑写了 bug 把 rank 忽略了)。rank=4 到 512 之间,最优 LR 变化不到 2 倍。
💡 一句话调参法
直接用 HuggingFace peft 默认参数(α=32、A 均匀初始化、B 置零、AB 同学习率),把全参的最优学习率 ×10 拿来用即可——短训练(<100 步)用 ×15。作者明确表示"试不出比这更好的"。

唯一软肋——批大小:在某些设置下 LoRA 对大批大小容忍度不如全参(批越大 loss 惩罚越明显,且与秩无关,是 BA 矩阵乘积参数化本身的优化动力学问题)。不过两者都在较小批时取得最佳 loss,实践影响可能不大。

04 · 无悔区间

两个条件同时满足,LoRA 就和全参没差别

条件 1
加在所有层
尤其承载大部分参数的 MLP/MoE 层。满足后,训练一开始动力学就和全参一致。
条件 2
不受容量约束
可训练参数量超过待学信息量(可用数据集大小估算)。在此之前 LoRA 一路"长得像"全参。
结果
低悔区间
LoRA ≈ 全参,且覆盖绝大多数后训练场景

算力账:LoRA 更划算

全参微调(FullFT)每步3 N²
LoRA 每步(R≪N)≈ 2 N²

LoRA 把"更新整个 W"换成更新两个小矩阵,前向-反向总开销约为全参的 。按算力(而非步数)算,往往更省。

🔥 联网补充:作者来头不小
John Schulman 是 PPO、TRPO 的提出者、OpenAI 联合创始人、ChatGPT RLHF 体系核心人物,2024 年离开 OpenAI 加入 Thinking Machines Lab(前 OpenAI CTO Mira Murati 创办)。由他来谈"RL 后训练只需极低容量",分量很重。本文实验跑在 TML 的 Tinker 微调 API 上。
05 · 对你的框架

💡 对 trainer 的落地启示

🧩
MoE 的 LoRA 按专家拆
每个专家单独训一个 LoRA,秩 = 总秩 ÷ 激活专家数(Qwen3 MoE 为 8),保持参数比一致
🎯
RL 后训练大胆用低秩
做 GRPO/策略梯度类训练时,rank 不必给高,省显存还不掉点
📐
学习率迁移规则
已有全参最优 LR,直接 ×10 给 LoRA,短跑(<100 步)用 ×15
🔬
待解工程问题
MoE 上 LoRA 如何与张量并行/专家并行兼容,是作者点名的开放问题——正是大规模 MoE 框架的重点