资讯动态

LoRA与P-Tuning对比:大模型微调到底在调什么?

发布时间:2026/10/19 10:37:25 来源:尧图企业网站定制
上周有个做推荐系统的朋友问我大模型微调到底调的什么他试过几次全量微调显存直接撑爆后来听人说LoRA省显存又听人说P-Tuning不用改权重被这两套名字绕得晕头转向。这个问题其实问到了点子上——很多人把LoRA和P-Tuning当成两种微调工具来选但没搞清楚它们根本是在不同的层面上动刀。这篇文章我就以这两个方法为例把大模型微调的本质、两者的数学原理、训练时的实际手感以及怎么选型一次性说清楚。1. 先从微调到底在调什么说起1.1 全量微调是拿着整个模型做梯度更新要理解LoRA和P-Tuning得先回到最朴素的微调过程。一个预训练好的大模型比如7B参数的模型权重已经固定下来了。微调的意思是拿一批特定领域的数据比如法律问答、电商客服对话、代码补全让模型在这些数据上继续计算损失、反向传播、更新权重。全量微调Full Fine-tuning最直观所有层的所有参数都参与梯度更新。你手里那份几十GB的权重文件训练完每一层都变了。问题是这么做不光慢更麻烦的是优化器状态带来的显存压力。训练7B模型时Adam优化器要为每个参数保存一阶动量和二阶动量再加上梯度和参数本身实际显存占用轻松翻好几倍。我见过有人拿单卡A10080GB跑7B全量微调序列稍微长一点就OOM。1.2 模型权重里的知识到底是什么形态那知识存哪了其实就存在权重矩阵里。Transformer结构里注意力层的Q、K、V投影矩阵以及FFN层的两个全连接层这些全是矩阵乘法。模型经过预训练这些矩阵学到了海量语料里的统计规律某个词和哪些词共现、某种句法结构怎么表达、某种推理链条怎么走。微调就是想在这些已有的规律上做修正。比如你想让模型学会我们的客服话术是先道歉、再给方案本质上是让某些权重矩阵产生一个更新量ΔW使得同样输入进来输出的概率分布偏向你想要的方向。全量微调是直接把ΔW加到所有层的权重上而参数高效微调方法核心思路就是去逼近这个ΔW只是逼近的方式各有各的招。1.3 为什么全量微调越来越跑不动了除了显存和算力开销全量微调还有两个让人头疼的副作用一是灾难性遗忘模型在调整某个领域能力时很可能把通用能力冲掉训完变得偏科二是部署成本哪怕训练好了一份新权重还得保留一份完整副本几个微调任务就是几份全量模型。这催生了各种参数高效微调PEFT方法思路概括成一句话尽量少动参数、尽量精准地影响模型行为。LoRA和P-Tuning正是两条截然不同的技术路线。2. LoRA给权重矩阵开一条低秩小道2.1 LoRA的核心假设权重更新是低秩的LoRA论文的核心观察很有意思大模型在全量微调时权重矩阵的变化量ΔW虽然是高维的但它的有效秩并不高。意思是你不需要动整个d×d的矩阵只需要在某个低维子空间里去调整就能达到接近全量微调的效果。这个假设听起来有点反直觉但实验和后续大量实践都证明对大模型来说预训练已经让它学到了足够好的通用表征微调只是在这个表征上做轻量的方向修正。这种修正用少数几个方向就能描述类似房间里要挪动一组家具不用重新砌墙只需要调整几个关键支点的位置。2.2 数学表达与实现拆解LoRA的做法非常直白。原来某个线性层的计算是h Wx微调时我们希望h (W ΔW)xLoRA不直接学ΔW而是把ΔW分解成两个低秩矩阵的乘积ΔW B × A其中B的维度是d×rA的维度是r×kr远小于d和k。这样原本要学习d×k个参数现在只需要学r×(dk)个参数。比如一个4096×4096的矩阵选r8参数量从1677万降到大约6.5万缩了两百多倍而前向计算的时候把两个矩阵乘起来再和输入x相乘即可。训练时原始权重W被冻结只有B和A在更新。初始化上有个关键细节A用高斯分布初始化B用全零初始化这样训练开始时BA0ΔW0模型的输出不会因为插入低秩分支而发生突变保证了训练初期的稳定性。推理阶段更妙——你可以直接把BA合并进W得到一个新的权重矩阵W完全不会增加任何推理延迟。这一点我在实际部署时非常看重因为线上推理对延迟极敏感LoRA合并权重后和原始模型跑起来速度一模一样。2.3 rank、alpha和target_modules应该怎么定几个超参数是LoRA实践里最常见的坑。rankr控制低秩空间的维度r越小可训练参数越少、训练越快但表达能力受限r越大逼近全量微调的能力越强显存占用也越高。我常用的基线是r8或r16在多数任务上效果已经不错。一个比较稳的做法是先用小r跑一版看验证loss能不能降下去如果欠拟合就加大r。alpha是另一个让人困惑的参数。它控制低秩分支的缩放比例实际生效的更新量是alpha / r倍。最终合并回权重时BA要再乘上这个缩放系数。常见设置是alphar的几倍比如r8、alpha16。我自己试过把alpha调得很大效果反而会震荡建议新手直接用alpha2r起步再根据学习率一起调。target_modules决定了把LoRA插到哪些层。这是最影响效果的选择之一。实践上我一般覆盖注意力层的q_proj、v_proj再加k_proj和o_proj。研究发现q和v上效果比较灵敏而FFN层gate_proj、up_proj、down_proj在知识注入类任务上表现也不错。只插q和v能省不少显存但能力上限略低想追求更强效果就把attention和FFN全插上。注意不是插的层越多越好比如在通用对话能力很强的基座模型上过度插入反而可能让训练不稳定。2.4 实测中的训练表现与显存占用以7B模型为例我在单张消费级显卡24GB显存上用过LoRA微调。r8、只插q/v、序列长度1024、batch size设为1加梯度累积峰值显存大约在18-20GB勉强能跑。同样的配置换成全量微调想都不用想光优化器状态就超了。训练速度上LoRA虽然多了一次低秩矩阵乘法的计算但因为被冻结的原始权重不用算梯度反向传播开销明显小整体训练速度反而比全量微调快不少。但LoRA也不是万能的。我在某个领域数据集上对比过LoRA的效果和全量微调还有差距尤其在任务复杂、需要大量新知识的场景下。有个让我印象很深的案例让模型学会一套全新的、和预训练分布差异很大的代码规范LoRA r16训了很久生成结果还是偶尔回到旧习惯后来切到P-Tuning搭配少量示例才把问题压住。所以LoRA擅长的是让模型在已有能力上改变风格、格式或遵循特定指令而不是往模型里塞大量全新知识。3. P-Tuning不给模型动刀只在输入端垫话3.1 从Prompt到Embedding软提示的本质P-Tuning的思路和LoRA完全不同。LoRA改的是权重P-Tuning改的是输入序列里的一段可学习的向量。学术上管这种参数叫软提示soft prompt意思是像提示词一样插入序列但它不是人写的字而是一串训练出来的embedding向量。为什么软提示能影响模型行为大模型在预训练和上下文学习阶段已经积累了极强的条件生成能力给你一段前缀模型会顺着概率往下续写。硬提示手工写的prompt就是在利用这种能力但人手写的提示词是离散的未必是模型最敏感的触发方式。P-Tuning把提示词变成连续可优化的向量让模型在训练中自己找到最戳中它内部偏好的输入表示。3.2 P-Tuning v1的局限与v2的转向初版P-Tuning只在embedding层插入可学习的连续向量这个设计效果很不稳定。问题在于embedding层的扰动经过多层Transformer之后被急剧放大或稀释尤其在小模型上几乎不可控。后来出现的P-Tuning v2转向了另一个思路在每一层的输入上做prefix式的软提示。这个概念借鉴自Prefix-Tuning——不只在最前面垫向量而是给每一层都准备一份独立的前缀向量和该层的隐藏状态拼接。我在复现P-Tuning时对比过两版v1在小参数模型上训练loss经常波动得很厉害收敛后提升也有限v2就稳多了逐层插入相当于把提示信息渗透到了每一层注意力计算里模型更容易捕捉到你要的信号。现在的P-Tuning实践中大家说的基本都是v2这种逐层prefix版本你要是查资料看到旧版笔试题式对比别被绕进去。3.3 可训练参数藏在哪、怎么生效P-Tuning的可训练参数是一个num_prefix_tokens × hidden_size × num_layers规模的张量。假设每层插20个前缀token7B模型的hidden_size是4096共32层那么可训练参数量约为20×4096×32≈262万换算下来也就几十MB比LoRA通常还要少一个数量级。生效机制也很有意思。每一层计算注意力时前缀向量会和当前的输入序列一起参与注意力矩阵计算这样前缀就相当于引导信号把模型内部的注意力引向你想要的方向。训练过程里只有这些前缀向量在更新模型主体权重完全不动。因为我恰好保存过不同初始化种子和不同前缀长度下的效果发现前缀长度太短比如不到10个token信号不够太长超过100个token又会占用序列长度、干扰正常内容20到50个是一个比较稳的区间。需要说明这些具体数值是我自己的实验观察不同基座模型对P-Tuning的敏感度差异很大新项目还是要自己扫一遍长度参数。4. LoRA与P-Tuning的核心差异一个改肉身一个改输入4.1 作用域不同权重空间 vs 表征空间这是理解两者区别最关键的维度。LoRA是在权重空间里做文章它实实在在地改变了Q、V等投影矩阵的值模型的能力边界被重新塑造了P-Tuning是在表征空间里做文章它不改变任何一个权重只改变输入序列在模型内部形成的激活值分布模型的能力边界没动但注意力被引导到了一个特定位置。用个生活化的类比LoRA像给一个熟练工人换了套新工具他本身的手艺没变但工具顺不顺手会影响他干活的效率P-Tuning像在原地给工人画了个施工路线图告诉他这次按这条路线走他工具箱里的东西一件都没换。前者适合改变工人能干什么后者适合改变工人这次优先干什么。4.2 效果特性对比指令遵循 vs 领域知识从实际效果看差异非常明显。我在同一份客服对话数据上做过对比实验LoRA微调后模型在回答时明显更贴合客服话术结构语气变得规范遇到没见过的产品问题时也能按新风格组织语言P-Tuning则更擅长让模型在推理时稳定地执行某个格式——比如统一输出JSON、固定先给结论再给理由但对知识本身的新增几乎没有帮助。如果要给模型灌输新领域的知识LoRA明显更强因为它改变了权重等价于把知识写进了模型参数里但如果只是想调整输出格式、让模型在特定任务上更听话P-Tuning的性价比非常高。另外P-Tuning因为不改变权重训练速度极快我在几乎不损失任务效果的情况下用它给一个对话模型加了必须用礼貌语气回答的约束整个训练跑完不到十分钟。4.3 能否叠加使用可以而且在我实际项目中两者一起用的情况挺常见的。LoRA负责领域能力塑造P-Tuning负责输出行为约束两者各管一段互不干扰。具体操作上先在数据上训练LoRA分支再冻结LoRA合并后的权重训练P-Tuning前缀向量或者反过来也无大碍。你也可以用PEFT库把它们作为两个独立的adapter挂上去推理时两个都激活效果是叠加的。不过有个细节必须注意慎防重复控制同一维度。比如你已经在prompt里写了很详细的输出格式P-Tuning再去强化学输出格式可能造成过度约束反而让模型变得机械。我踩过这个坑模型输出的每一句话都像模板几乎没有变化后来把P-Tuning的前缀长度减半才恢复自然度。5. 选型建议与避坑经验5.1 遇到什么场景优先选LoRA如果你手里的任务属于要改变模型能力本身优先考虑LoRA。典型的信号包括模型对新领域的术语不熟悉、回答时胡编乱造、缺少某种推理能力。LoRA适合往模型里注入而不仅限于约束。它也适合需要保留多个领域能力的场景每个领域训练一份LoRA adapter切换时只需要换权重文件不用同时加载多个全量模型。我见过不少公司做多租户产品底座模型只有一个但每个客户都有一份LoRA推理时按请求动态挂载这套方案在工程上非常成熟。选LoRA时我给一个比较稳的起点配置r16、alpha32target_modules覆盖q/k/v/o四类投影学习率1e-4用AdamW优化器先跑一个epoch看趋势。显存太紧就瘦身成r8、只插q/v学习率降到5e-5。请记住这些参数是起始点不是终点务必按自己的数据量调整。5.2 遇到什么场景优先选P-Tuning如果场景是模型能力本来就有只是需要稳定地输出某种格式比如让模型写诗都押韵、让模型回复都以行动建议结尾、让模型在情感分析里只输出正面/负面/中性三个词P-Tuning是最轻的选择。它训练快、显存占用极低一个普通办公显卡就能跑。尤其适合快速迭代的运营类需求今天改格式明天换话术每次训练都是一根烟的功夫。另外如果你手里的数据量特别少比如只有几百条标注样本我更倾向于P-Tuning。因为这种情况下LoRA虽然也能训但很容易过拟合到那几百条样本的噪声上而P-Tuning训练参数量更少、约束更弱反而不容易把小样本里的偶然规律学进去。5.3 几个容易翻车的地方**第一个坑在LoRA训练时不小心把base模型也设成可训练。**我看过好几起翻车现场调了LoRA但忘了冻结原权重结果等于隐式做了全量微调训练慢、显存崩最后模型还大概率灾难性遗忘。用Hugging Face PEFT库的时候确认一下model.base_model的requires_grad是不是False。**第二个坑LoRA合并后效果评估失真。**合并权重的操作看似安全但在低精度推理比如半精度下某些基座模型合并后会有一点点精度损失。我的习惯是训练阶段用adapter模式验证部署上线前再合并合并后用一批测试集回归一遍确认diff在可接受范围内再发布。**第三个坑P-Tuning在长上下文任务里占用序列位置。**前缀token是要占序列长度的如果任务本身上下文很长而你又把前缀设得很大等于缩减了模型能看到的真实内容窗口。我之前做长文档问答时前缀设到100个token效果反而明显下降后来压缩到30个token就恢复了。做长文本相关任务时优先考虑LoRA或者至少把P-Tuning的前缀长度压到很低。**第四个坑把两者混用时的学习率冲突。**LoRA和P-Tuning的可训练参数在同一个优化器里更新但它们对学习率的敏感度完全不同——LoRA往往需要1e-4级别而P-Tuning有时1e-3也不错。如果共用一套学习率会出现一边收敛快一边振荡的情况。我的做法是分两组参数、分别配不同学习率或者干脆分阶段训练先LoRA后P-Tuning。6. 我的实际体会没有银弹但有一条清晰的主线做了那么多微调项目之后我的体会是不用纠结于哪个方法更强要问自己我到底想动模型的什么。想动它学会了什么用LoRA想让它在面对任务时表现成什么样用P-Tuning。两者不是替代关系更像螺丝刀和扳手的关系。最后分享一个我经常用的排查思路当你用一个PEFT方法训练效果不佳时先别急着换方法先做三件事——第一Output随机的debug样本看模型是格式不对还是内容不对第二用训练集的一小部分跑过拟合测试如果loss降到极低但验证没提升多半是表征能力不够考虑加大LoRA的rank第三回去检查数据质量我见过太多所谓的微调效果差案例最后都是数据标注不一致导致的。模型微调的说到底是数据的规律方法只是帮你把规律写进合适的位置而已。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑