模型微调
主流微调方案
SFT (Supervised Fine-Tuning) - 有监督微调
DPO (Direct Preference Optimization) - 直接偏好优化
PPO (Proximal Policy Optimization) - 近端策略优化
OPO (通常指 ORPO)Odds Ratio Preference Optimization) SFT 和 DPO 二合一
(还在未来,原理就是模型在进行有监督微调的同时,学会分辨好坏,让模型回答更符合人类喜好、更安全、更自然、少幻觉)
SFT (Supervised Fine-Tuning) - 有监督微调
就是在预训练大模型(如 LLaMA、GPT)基础上,用高质量人工标注的数据 ,再做一轮有监督训练,让模型学会按指令办事、输出更规范 / 更专业 / 更符合人类预期的答案。
大模型的进化阶段主要分3个 :
-
Pre-train 预训练 大模型通过海量数据学习到各种知识,目标是学会语言规律、知识、语法、常识。
像读遍全网书籍的学霸:知识全懂、语法全会,但不会审题、不会按要求答题,用自己学习到的东西回答。 -
SFT (Supervised Fine-Tuning) 有监督微调 在预训练模型基础上,用人工标注指令问答数据做有监督训练,目标是让大模型学会遵循指令、按格式输出、对齐任务.
像一个学生,从课本上学到海量知识,但是不会答题写卷子 但是 老师给题库 + 标准答案刷题:学生就学会看懂问题、按要求作答,能正常聊天、写代码、做任务,但语气生硬、不够贴心。
3. RLHF (Reinforcement Learning from Human Feedback) 基于人类反馈的强化学习
在 SFT 模型后,用人类打分偏好数据 ,通过强化学习 优化,目标是让回答更符合人类喜好、更安全、更自然、少幻觉
人给模型回答打分、排好坏,用强化学习让模型学会说人话、更贴心、守规矩。
PPO 近端策略优化
PPO 是传统 RLHF:打分 + 强化学习调教
用强化学习让模型(Actor)不断生成回答,用奖励模型(RM)打分,再用Critic 评估价值;
PPO 核心是限制每次更新幅度(clip)+ 用 KL 散度防止学歪 / 忘本,在稳定训练的同时,让模型朝高分方向优化。
先有一个 ** 阅卷老师 (RM)** 给所有答案打分, 再不断纠正你:往高分写法学,不许偏离太多。
DPO 直接偏好优化
DPO 是简化版 PPO:不用单独训练奖励模型,直接一步对齐
DPO不需要单独的奖励模块,直接就用人类偏好数据(好回答,坏回答)训练,跳过中间打分环节,直接让模型选好的,避开坏的
不用专门阅卷老师,直接给你好答案、坏答案两两对比, 让你自己学会:以后就按好的那种风格写,自动避开坏的。
DPO 和 RLHF 的区别
一句话概括 : DPO 是简化版的 RLHF
RLHF:Reinforcement Learning from Human Feedback 人类反馈强化学习(传统三阶段) DPO:Direct Preference Optimization 直接偏好优化(RLHF 简化平替版)
都是用人类偏好数据(两个回答,哪个更好 A>B),让大模型:更符合人类喜好、更少废话、更少幻觉、更安全。
-
RLHF:
先雇一个专业评委(RM 模型)给答案打分,再让模型反复刷题冲分(PPO),流程繁琐、容易练废。
-
DPO:
不用单独评委,直接把「哪个回答好、哪个差」写成数学约束,直接教模型学好避坏,简单省事、效果差不多。
大白话理解 PPO 普通强化学习: 每次更新模型步子迈太大,一改参数,模型直接崩、输出乱套。 PPO 做了一件核心事: 限制模型每一次更新的幅度,不许跟旧模型差太远
SFT 和 DPO的区别
SFT有监督微调 :教模型 「标准答案长什么样」
SFT让大模型知道问题该怎么做,怎么解决,只会模仿固定写法,不会判断好坏,没有"人情味"
DPO直接偏好优化:教模型 「哪个回答更好、哪个更烂」
在SFT基础上:更自然、更得体、会拒绝违规问题、更少废话、更少幻觉、更贴合人类口味 就像一个厨师,SFT让大模型知道怎么做菜,DPO让大模型知道怎么做才更好,更符合人类喜欢
主流微调工具
LLaMA Factory(最火、中文友好)
-
支持:SFT、DPO、RLHF(PPO) 全流程;LoRA/QLoRA/ 全参数;100 + 模型(Llama/Qwen/GLM)
-
特点:零代码 / 低代码,WebUI + 命令行,单卡就能跑
-
适合:个人 / 中小企业、快速验证、DPO/RLHF 对齐
Axolotl(社区强、易配置)
-
支持:LoRA/QLoRA、全参数、SFT/DPO;主流 Llama 系模型
-
特点:配置文件驱动,一行命令启动,社区成熟
-
适合:熟悉 Hugging Face、需要灵活配置的开发者
Unsloth(最快、显存最小)
-
特点:比普通 LoRA 快 2--3 倍,4bit QLoRA,单卡 4090 可训 7B 模型
-
适合:资源有限、追求速度、个人 / 小团队
DeepSpeed(微软、超大模型)
-
特点:ZeRO 优化、分布式训练,支持千亿级模型,显存优化极强
-
适合:企业级、大模型(70B+)、多机多卡训练
SFT数据处理
模型微调有一句名言 : 模型微调的效果,70% 取决于数据质量,30% 取决于算法和参数。
在进行模型微调之前,需要有数据,那么数据要存成什么格式,就有了下面两个主流数据格式 .
两大主流数据格式:Alpaca 和 ShareGPT
Alpaca 格式 (单轮指令微调的标准)
最适合**"一问一答"**的任务,如逻辑推理、文本分类、翻译。
格式: 一问一答 { "instruction": "用户指令/问题", "input": "补充上下文(可选)", "output": "模型标准回答" } 例如: { "instruction": "解释什么是LoRA", "input": "", "output": "LoRA是低秩适配,一种轻量化微调方案,只训练少量参数,节省显存。" } { "instruction": "请总结下面这段话", "input": "大模型训练分为预训练、SFT有监督微调、RLHF人类反馈强化学习三个阶段。", "output": "大模型训练主要包含预训练、SFT微调、RLHF对齐三个环节。" }
ShareGPT 格式 (多轮对话微调的标准)
多轮人机对话标准格式,用来做多轮上下文对话微调,LLaMA-Factory、所有大模型微调框架都原生支持。
专门解决:一轮聊完接着聊、有上下文记忆 的场景。
格式: 多轮问答 [ { "conversations": [ { "from": "human", "value": "什么是SFT?" }, { "from": "gpt", "value": "SFT是有监督微调,让大模型学会遵循人类指令。" }, { "from": "human", "value": "那和DPO有什么区别?" }, { "from": "gpt", "value": "SFT学标准答案,DPO学好坏偏好;SFT是单标答,DPO是成对对比。" } ] } ]
现在主流的是 ShareGPT , 因为即使是 单轮指令一问一答,也可以转成ShareGPT的格式 , 这样
数据清洗
网上爬下来的数据或者开源数据集,通常充满杂志,脏数据会让模型学废话、学病句、学错误逻辑、重复话术、幻觉变重。
数据清洗目的:去掉重复、错误、噪声,避免模型学坏
去重: 防止模型学到太多系统知识,导致过拟合,泛化能力下降
-
精确去重:删完全相同的样本。
-
模糊/语义去重**(MinHash + LSH)**:用句向量聚类,合并意思一致的(如 "查物流"≈"怎么看物流")。
去噪 :去掉一些错误的内容 和 "拒绝回答"
-
去掉乱码 + 去掉广告 + 去掉错误 + 去掉拒绝话术
-
去掉拒绝话术: 绝大多数开源 SFT 数据集都是用 GPT批量生成,里面有一堆的[AI 免责声明]
「AI 免责声明 / 拒绝话术过滤」 属于低质 + 有害数据清洗的,例如 : As an AI language model, I can't... 我是AI助手,无法为你提供... 抱歉,我不能... 这个问题我无法回答 很抱歉,我无法帮你 作为人工智能,我不能... 这些句子对我们自己训练模型毫无用处,甚至剧毒。
脱敏:去除敏感信息
- 手机号、身份证、姓名等隐私信息替换或删除。
过滤 : 低质文本过滤(剔除病句、流水账、废话)
- 过滤掉含有暴力、色情、广告
微调要多少数据合适
数量 < 质量
首先 数据的质量 要大于 数据的数量 : (LIMA论文证明)只用 1000 条人工精修对话 做 SFT,效果追平 / 超过用 5 万条爬虫 + GPT 生成的低质数据 微调的模型。
配比策略(防止灾难性遗忘)
不能只喂垂直数据,会 "变傻" , 比如一直给大模型喂某个领域的知识数据,模型可能会变傻,他的一些通用能力会下降
-
70%~80% 垂直领域数据
(如医疗、法律、客服、编程)
- 决定模型专业能力
-
10%~20% 通用能力数据
(日常闲聊、写作、常识、简单推理)
- 防止 "灾难性遗忘",保住基础智商
-
5%~10% 自我认知数据
-
格式:
-
Q:你是谁?
-
A:我是 XX 医疗助手,由 XX 团队开发,专注医疗问诊。
-
-
防止模型说 "我是 ChatGPT / 我是 AI 语言模型"
-
Lora进行高效SFT
全量微调 Full Fine-Tuning
全量微调需要更新模型里的 每一个参数 ,把大模型里所有参数、所有权重全部拆开重新训练更新
-
成本极高 : 需要大量的显存才能做到
-
灾难性遗忘 : 如果sft数据少了,直接过拟合(被新知识过渡洗脑了) + 灾难性遗忘(把旧知识忘了),越训越废。
LoRA 低秩适配
不改动原始大模型权重,只额外训练两个很小的低秩矩阵,用极小参数量实现大模型微调。
大白话比喻 大模型:一本不能改的精装原版大字典 全量微调:把整本字典重新改写,代价超大、耗显存、耗算力 LoRA:不碰原字典,只附一张小小的备注纸条 训练只练这张纸条,推理时把纸条效果叠加到原模型上。
把模型微调比做是房子美化 ,那么全量微调是把房子全拆了重建, Lora就是给房子加装饰,不改变原有
QLoRA量化低秩适配
QLoRA = 4-bit 量化压缩 + LoRA 低秩微调 ,是 LoRA 的 "极致省钱显存版",让单张 24GB 消费级显卡(如 RTX 4090)就能微调 70B 大模型,效果还接近全量微调
大白话比喻 全量微调:把精装大书逐页重写(成本极高) LoRA:书不动,贴几张备注纸条(省成本,但书还是 16-bit,占显存) QLoRA:先把书缩成 4-bit 压缩本(占空间极小),再贴备注纸条;读的时候临时解压看,极致省显存,效果不掉线
4-bit NF4 量化
-
把 16-bit(BF16/FP16)模型权重 → 4-bit NormalFloat(NF4)
-
显存占用:16-bit → 4-bit,直接降为 1/4
-
优势:NF4 针对模型权重的正态分布优化,精度损失极小
-
代价: 精度会有极其微小的损失,但在微调任务中几乎可以忽略不计
LoRA的 核心参数
Rank (r) : LoRA 秩
r 是低秩矩阵的维度,决定 LoRA 学习能力强弱
原理:r 越大,可拟合的知识、风格越多;r 越小,参数量越少、越不容易过拟合
调参规律:
-
小场景(只改语气、人设):r=4、8
-
常规领域 SFT(客服、日常、行业问答):r=16
-
复杂领域(代码、医疗、专业推理):r=32、64
影子比喻 : 用低维还原高维 把模型比做成一个 复杂的三维物体(比如一只手) , 这只手是预训练后学习到的一个庞大知识库 1.全量微调 : 相当于把这只手每个细胞,每个纹路都改一遍,工作量非常大 2.LoRa(秩为r) : 相当于我们不改变手的本身,而是给手大一束光,投下一个影子 -秩r 就是这个影子的复杂度 -如果r=1 , 影子就看是一条直线,分不清楚是手还是棍子 (丢失太多信息了) -如果r=8 , 影子能清晰看出手的轮廓,能分辨手的动作是握拳还是比耶 -如果r=16 , 影子能更加清晰显示出 手指的关节和细微动作 r秩的本质 : 代表了你决定用多小的代价(参数量)去模拟表达内心复杂的“知识更新”
Alpha 缩放因子
lora_alpha 缩放因子 , 决定新学的知识(Lora) 对模型的影响有多大
通常 : Alpha = 2 * rank , 也就是缩放因子 = 2 * 秩
Target Modules 目标模块
决定将 LoRA 层应用到原模型的哪些算子中。
Transformer 结构:
-
主要包含
q_proj,k_proj,v_proj,o_proj(Attention 层) -
gate_proj,up_proj,down_proj(MLP 层)。
全面微调:为了获得最佳性能,建议覆盖所有的线性层(Linear Layers),而不仅仅是 Attention 层。
显存优化 :如果显存极度紧张,可以只针对 q_proj 和 v_proj。
Learning Rate 学习率
LoRA 微调中,学习率 (Learning Rate, LR) 是最重要的超参数,没有之一。它决定了模型在训练过程中,根据误差更新权重的"步长"。
QLoRA 推荐学习率值 :2e-4 (0.0002)。
- 这比全量微调(通常 1e-5)要大,因为 LoRA 参数少,需要更大的步长,更激进的更新。
Scheduler学习率调度策略 :推荐 cosine (余弦退火) 或 linear(线性衰减)。
-
Linear (线性衰减):
-
形状:一条笔直的斜线。
-
逻辑 :每一步减少的幅度是恒定的。它非常"诚实",无论处于训练的哪个阶段,减速的力度都一样。
-
-
Cosine (余弦退火):
-
形状:半个余弦波形(S型曲线)。
-
逻辑:
-
初期:下降非常缓慢,让模型在高学习率区域多停留一会儿,充分探索。
-
中期:下降速度加快,快速穿过不稳定的区域。
-
后期:下降再次变慢,进入极其平缓的"微调"状态,在最优解附近反复摩擦。
-
-
Warmup(预热) 是深度学习训练初期的一个"热身"阶段。
简单来说,在训练开始的前几百步(或前 5%-10% 的数据),我们不直接使用设定的最高学习率,而是从 0 开始,线性地增加到预热目标值。
微调技巧 NEFTune
NEFTune (Noisy Embeddings Fine-Tuning)是一个非常有意思且"暴力美学"的微调技巧。它的核心思路非常简单:在微调过程中,向模型的 Embedding(词嵌入)层注入一些随机噪声
效果:
-
防止过拟合(Overfitting)
-
显著提升对话的流畅度和指令遵循能力
核心参数:Noise Alpha
在配置 NEFTune 时,
- Noise Alpha :决定了噪声的大小 , 通常在 5 到 15 之间。
偏好对齐
偏好对齐 (Preference Alignment) 是大模型训练中"从机器变成人"的关键一步。
如果说预训练(Pre-training)是让模型"博览群书",指令微调(SFT)是让模型"学会听令",那么偏好对齐就是给模型装上"价值观"和"情商",让它的输出符合人类的偏好、安全标准和逻辑习惯
SFT只是让模型学会怎么说话 , 偏好对齐就是让模型说‘好话’ 对齐的核心,不是写更多的标准答案,而是告诉模型:“这个回答比那个更好”。
偏好对齐核心结构:三元组
与 SFT 的"一问一答"不同,偏好数据通常包含三个部分,我们称之为 "三元组":
-
Prompt (提示词):用户的提问。
-
Chosen (胜者):人类(或强模型)认为更好的回答。
-
Rejected (败者):人类认为较差的回答。
为什么必须是"三元组"而不是"问答对"?
区分度:普通的问答对(SFT 数据)只告诉模型“路怎么走。 而三元组通过 Chosen 和 Rejected 的对比,让模型通过对比,学到什么样的才是好的,什么样的是‘坏的’
数据来源
构建偏好数据比 SFT 数据难得多,SFT只需要问题+答案,而偏好对齐需要问题+两个相反的答案
人工标注 (The Gold Standard)
能拿到质量最高的数据,但是也最贵
流程:
-
让模型针对同一个问题生成多个回答
-
标注员对回复进行 1-5 分的打分,或者针对"是否有幻觉"、"是否礼貌"进行勾选
-
将模型生成的错误回复(Rejected)手动修改为完美回复(Chosen),从而形成高质量的对比对。
LLM-as-a-Judge
由于人工标注又贵又慢,现在主流的做法是用"强模型"带"弱模型"(即 AI 反馈取代人类反馈)。
流程:
-
Prompt:同一个问题。
-
生成:用你的待训练模型(如 LoRA 微调中的模型)生成多个回答。
-
评审 :用一个更强大的模型(如 Gemini 1.5 Pro 或 GPT-4o)充当"裁判",让它根据你设定的准则(比如:请选出最适合语音播报、最简洁的答案)选出
Chosen和Rejected。 -
构建数据: 根据gemini或gpt的选择构建 对比对
数据剧毒
DPO 算法对数据非常敏感。如果数据里有"毒",模型会学坏。以下是三个最致命的坑。
事实错误
本质是 : 偏好倒置 ,把"差回答"标成了 Chosen,把"好回答"标成了 Rejected
-
如果给DPO的答案就是错的,例如 : 问题 : 1+1= , 好答案:3 , 坏答案:4
-
那么这种情况对于DPO来说就是导航指反了方向,走得越快,错得越远
相似度过高
本质是:区分度缺失 当 Rejected 样本太弱时,模型不需要学习任何复杂的逻辑,模型会找到一种"捷径"。
-
比如Chosen 和 Reject 只差一个字时,那么DPO 算法算出来的 Loss 会非常小,模型学不到东西,甚至梯度消失。
-
考试全是 1+1,学生学会了偷懒,遇到高考就抓瞎。
隐形偏见
本质是 : 统计性走捷径
-
比如 :老师喜欢写字多的学生,那么模型会认为 "写的长" == "写的好", 训练出来的模型会变得话多且没用
-
如果你构造的数据集中,
Chosen总是比Rejected长,DPO 训练后的模型会变成一个话痨。它会为了讨好奖励机制,疯狂堆砌废话
DPO的局限
-
数据成本高 : 需要高质量的(Chosen , Rejectd)数据。
-
容易过拟合 : DPO容易用力过猛,模型为了讨好人类的偏好,容易导致语言能力退化
-
流程繁琐 : 需要先做SFT 然后再做DPO, 要训练两次,还要加载Reference Model , 显存和时间消耗高