微调是什么?SFT、LoRA、QLoRA 分别解决什么问题?

微调是什么?SFT、LoRA、QLoRA 分别解决什么问题?
上篇聊完预训练,你应该已经知道了:大模型在海量数据上"苦读"之后,具备了语言理解、常识推理这些通用能力。但问题是,光会这些还不够——你让它写代码,它可能给你蹦出一堆bug;你让它做翻译,它可能把"你好"翻成"Hello world"。
怎么办?
这就该微调上场了。
微调是什么?为什么要微调而不是从头训练?
打个比方。
预训练就像一个人从医学院毕业,基本功扎实、理论基础牢固。但你让他直接上手术台主刀,他肯定怂——他还需要去具体科室实习,学习心外科或者神经外科的专业技能。
微调,就是这个"实习"过程。
预训练模型已经学会了"通用能力",微调是在这个基础上注入"专业技能"。代码怎么写、翻译怎么润色、客服怎么回复——这些都不需要从头教,直接在预训练模型上微调就行。
从零训练一个GPT-3?光数据就要吃掉几十TB,算力烧掉几百万美元。普通开发者根本玩不起。
微调的精髓在于四个字:站在巨人肩膀上。
预训练模型的参数结构已经学到了通用知识,微调只需要"轻量化调整",成本从"造一座山"变成"爬一个坡"。
具体怎么做到的呢?
SFT 监督微调:简单直接,但代价不小
SFT,全称Supervised Fine-Tuning,翻译过来就是"监督微调"。它是微调领域最基础的方法,也是最容易理解的。
思路很直接:找一批标注好的数据(比如"输入:你好 | 输出:Hello"),然后让模型在这些数据上继续训练。
问题来了——训练什么范围?
最早的方案是"全量微调"。模型参数有多少,就训练多少。GPT-3有1750亿参数,全量微调一次需要多少显存?
答案是1.2TB。
普通显卡根本扛不住。你得用专业的AI服务器,租金一个月可能几万块。
另外,全量微调还有个问题:它会把预训练阶段学到的好东西"洗掉"一部分。相当于一个学霸,你把他的知识全擦掉重写,代价太大了。
所以后来大家开始想:能不能只训练一部分参数?
比如只训练最后几层网络,前面几十层的参数保持不动。这样显存占用就能降下来,大概是模型参数的15-20倍——仍然不少,但至少不是"天文数字"了。
但这还是不够。
模型越大,显存压力越大。7B参数的模型,全量微调需要140GB显存;70B参数的模型,需要1.4TB。消费级显卡根本玩不转。
我之前用单卡跑7B模型的微调,光加载模型就占了大半显存,根本没有空间给梯度计算了。后来换了服务器才搞定。
所以,LoRA登场了。
LoRA:省显存的核心思路是什么?
LoRA,Low-Rank Adaptation,中文叫"低秩适应"。
它的核心思想很巧妙:不碰原始模型参数,给它加一个"外骨骼"。
怎么加?
在Transformer的每一层旁边,LoRA注入两个小矩阵——A和B。
原始的权重矩阵叫W,新增的低秩矩阵A和B也是矩阵,它们的关系是:ΔW ≈ BA。
训练的时候,W保持冻结(不动),只训练A和B两个小矩阵。
你想啊,W是一个1750亿参数的大矩阵,A和B呢?可能只有几百万参数。
这就是LoRA的精妙之处:原来要训练1750亿参数,现在只需要训练几百万。显存占用从15-20倍降到2-5倍。
但这还没完。
LoRA还解决了另一个问题:推理延迟。
有些微调方法会在模型外面加一个"适配器",推理的时候需要额外计算 adapter 的输出。多了一个步骤,响应速度就慢了。
LoRA不一样。训练完成后,直接把W和BA合并成一个新矩阵W'。推理的时候跟原始模型一模一样,没有任何额外开销。
BA为什么能近似ΔW?这背后的数学原理叫"低秩假设"。研究者发现,神经网络的权重更新ΔW虽然维度很高,但它的有效信息往往只在一个低维子空间里。通俗点说:更新方向其实没那么复杂,不需要那么多维度来描述。
类比一下:
一个学霸脑子里装着1750亿个知识点(参数),现在你要教他Python编程。
全量微调的做法:把1750亿个知识点全擦了,重新写入Python相关的内容。
LoRA的做法:在他的知识体系旁边加一个便签本,专门记录Python编程技巧。他的大脑完全不动,便签本写满了,他的Python能力就上来了。
这就是LoRA的精髓:不改变原模型,只增加增量知识。
QLoRA:让70B大模型也能在消费级显卡上跑
LoRA已经省了很多显存,但70B参数的模型仍然需要几百GB显存。
普通人想微调70B大模型?门都没有。
QLoRA来了。
QLoRA = Quantized LoRA,翻译过来就是"量化LoRA"。
它的思路是:在LoRA的基础上,把模型参数从高精度(FP16)压缩到低精度(4-bit NF)。
FP16是什么精度?每个参数占16个比特(2个字节)。1750亿参数的模型,光权重就要占350GB显存。
4-bit呢?每个参数只占4个比特。压缩了4倍。
但这里有个问题:4-bit精度会不会导致模型"变傻"?
QLoRA用了NF4(4-bit NormalFloat)这种特殊的数据格式。它不是简单地把数字"四舍五入",而是智能压缩——确保每个数字区间内的信息量尽量均匀。
简单说:压缩的是存储空间,不是信息量。
效果怎么样?
GPT-3 175B的微调显存,从1.2TB降到了350GB。
70B模型从1.4TB降到了约48GB。
一张RTX 3090有24GB显存,加上一些优化手段,70B模型居然可以微调了。
这在以前是不可想象的。
类比一下:
FP16全量微调就像你买了一套精装书,每一页都是高清彩印,占满整个书架。
QLoRA就像把这套书扫描成口袋版,纸张小了、排版密了,但字还是那些字。一整个书架的精装书,现在一个口袋就能装下。
什么时候该用哪个?实战选型指南
说了一堆技术细节,实战中最关键的问题还是:什么时候该用哪个方法?
简单。
模型规模≤3B,全量微调完全可行。显存占用大概是参数的15-20倍,7B模型需要140GB显存——用个高端显卡服务器问题不大。直接SFT,简单粗暴效果好。
模型规模在7B到70B之间,首选LoRA。显存占用降到2-5倍,大概几十GB到一百多GB。消费级显卡配上优化手段,7B模型微调完全可行。这基本上是当前的主流选择。
模型规模超过70B,显存紧张,直接上QLoRA。4-bit量化把显存需求压缩到原来的三分之一到四分之一。没有这个技术,你根本玩不起70B以上的模型。
还有一个细节:LoRA一般只微调Attention层里的W_q和W_k,W_v和W_o可选,前馈层(FFN)通常冻结。
为什么?
因为研究者发现,Attention层是模型"学习知识"的关键部位。W_q决定query怎么生成,W_k决定key怎么生成——这两个矩阵对任务适配影响最大。
LoRA调参小贴士:rank和alpha怎么调?
用了LoRA,你还需要调几个参数。最重要的两个:rank和alpha。
rank,就是低秩矩阵的秩。r值越大,A和B矩阵越大,表达能力越强。但参数量也越多,显存占用也越大。
alpha,是缩放系数。LoRA的输出会乘以scale = alpha/r。alpha/r的值越大,LoRA的影响越强,学习速度越快,但可能不稳定。
常见配置是alpha = 2 * rank,scale始终等于2。
新手建议从rank=8或rank=16开始试。数据集小、任务简单,rank=8够用了。数据集大、任务复杂,可以试试rank=32或rank=64。
还有两个参数一般不用改:lora_dropout和bias。dropout默认0就行,加了反而可能影响效果。bias通常也保持冻结状态。
调参的感觉,就像调咖啡——水温高了苦,低了酸。rank和alpha就是水温,反复试才能找到最佳配方。
技术还在进化
从SFT到LoRA再到QLoRA,这十年微调技术经历了翻天覆地的变化。
核心目标只有一个:怎么用更少的资源,让大模型适应更多任务。
现在有了更先进的技术,比如DeepSeek-V2用的MLA注意力机制,进一步优化了显存占用。开源社区也在不断推出新的微调方法。
但底层逻辑没变:站在预训练模型的肩膀上,用最小的代价注入新技能。
现在你可能会想:微调让大模型变"专业"了,但有时候不用微调,直接给提示词也能让模型输出想要的结果。这是怎么回事?
下一篇文章,我们就来聊聊Prompt——提示词到底是怎么影响大模型输出的。
