# Cues
[[微调和推理时prompt一致性]]
# Notes
SFT
• 先调prompt,保证让模型可以按照你想输出的样式先输出。如果怎么调都不行建议换模型,说明能力不行。正常来说,通过prompt至少有20%以上的答案是正确的,才有SFT成功的可能性。但是,如果prompt不太复杂就能够有不错的效果,prompt不用构造太复杂。模型就可以遵循指令。
• 可以通过更强大的模型造一些数据,然后,再多个模型对其进行打标,判断产生的QA对是否符合要求,这样够可以构造一批高质量的样本。如果有人力的支持,可以进行人工检验,更加保险。
• 调参的时候,可以对learning rate,weight decay从大往小调,通常lr从1E-4开始,weight decay从0.25开始。
• 模型越大,肯定是效果越好,在模型很大情况下可以开ds
• 事实上loss,对于大模型训练仅能做一个基本的判断了,基本上,到了中后期,loss小,效果不一定好,甚至还会出现loss先下降后上升的情况,即使是在训练集。所以,正确的判断方法还是,从小步数的checkpoint,进行accuray或者其他业务指标的判断,正常情况,只要模型在正常训练,该指标通常也是下降逐渐到收敛的一个状态。因此,不能太依赖loss指标,仅仅做初步参考。
• 数据的多样性非常重要,再三强调,**训练集的数据分布一定要包括测试集的数据分布**,这样测试集才会有好的效果,所以,当你的测试集效果不好,但是训练集数据还可以的时候,记得去检查测试集有没有类似的数据。如果没有,ok,手动人工针对性添加数据把,先5个,10个的先加,再看训练效果。
• 数据集的风格一定要统一,输出的答案风格一定要单一。比如,每次答案都是以json格式的,确保数据都是``json xxx ```这种格式。如果sql的答案都是select a,b,c, 那么就不要出现select *。保证你数据的统一性,纯洁性是模型不学偏的根本。
• 思维链+fewshot肯定是可以提高原始模型能力的,但是,**SFT就不用加思维链和fewshot了**,直接用样本堆死它。而且思维链+fewshot也超级耗时啊,标注也是一个超级麻烦的事情。所以,还不如直接造大量高质量样本,直接让模型学习。暴力但是很有效。
• 对于多任务问题,可能有的同学会问到底多少条数据才合理,个人经验,**每个垂域400条高质量数据足矣**。
• 可以对数据集设置一个难易程度,让模型先学简单后学难的,有利于模型的加速收敛
• 在小模型上面,如果纯用某一类数据去SFT,效果可能还会下降,这是因为小模型能力差,泛化能力也差,一旦数据分布相差太大,模型基础能力都game over了。解决方式是要不换更大模型,要不增加一些base模型产生的数据
• 用[[GRPO]]训练过的模型去rollout,再选择高分的数据去SFT的效果比纯用原始数据SFT的效果可能会更好。而且用这个SFT后的模型去再进行RL,效果更佳。但是这个过程不能够重复,因为越到后面,模型产生的答案越单一,其实效果没有那么好。
RL[强化学习](强化学习.md)
• 和SFT一样,做RL的模型本身就对数据集回答的超级差,可能20%都达不要,那就果断换模型吧。这里着重说一下,SFT是为了让模型有能力去回答问题,而RL仅仅是将这个能力推到上限。就和我们打篮球一样,一个经过训练的篮球运动员,在发挥好的时候,可以10中8,但是他可能平时就5中5,而RL做的就是让该运动员长期处在10中8等状态。但是如果运动员只能10中2,且从来没有10中8,那么他怎么都到不了10中8。
• 对于reward的设计,对于有明显规则可以作为critic的问题,比如数学或者逻辑问题,RL是有效果的,但是如果没有明显规则,需要用大模型或者other模型打分的问题,可能RL就没有那么大的效果了。特别是那些非常主管问题的,比如,C罗比梅西伟大吗?
• reward的规则一定要考虑完整,且不能太多reward rule,否则会让模型彻底偏向某个规则,或者直接reward hacking。比如,对于仅有1个正例或者1个负例的数据集,如果完成正例的回答是很难的,而回答负例是很简单的,且正例数据比负例少,模型就倾向于全部数据都打负例,这样模型依然可以得到高分。
• 对于没有经过SFT的模型,kl散度可以不用开,因为没有经过SFT的模型产生的数据实际多样性还是有的,不会像SFT那么统一
• RL训练的模型更应该关注reward是否快速增长到收敛,而不是看loss
• 对于有确定性rule reward的数据集,可能纯RL也能起到效果,不用再去SFT。反之,必须SFT,再RL。如果SFT都没有效果,那么别指望RL了。
• 一定记得取不同训练步骤的checkpoint针对某些问题进行检验,好记性不如烂笔头,看指标终究抵不过bad case的研究。
• reward是基石,KL散度是尺度器,reward直接决定了RL能够达到的上限,KL是让模型的生成不要太单一或者太杂乱。通常KL是从小到大调,一般0.001足够了
• 如果Base-RL的效果想要更进一步,可以试试用base-RL拒绝采样一批样本,然后对Base模型进行简单的冷启动微调,随后再继续RL。这就是先挑出reward高的样本先微调冷启动一把。
• reward始终不上涨,在排除了一切可能的原因后,建议用训练前的模型针对一些case rollout出多个回复(n可以大一点),看下这些回复的奖励是不是都特别低,如果都特别低,那说明基模的能力上限就如此,想要通过探索来提升表现是行不通的,建议换模型或者对SFT模型进行优化。
• 当出现训练不稳定(如损失值突然飙升),可启用梯度裁剪,裁剪值一般为0.2。
• PPO的学习率通常需要比SFT小一个数量级。例如,如果SFT阶段的学习率是2e-5,PPO阶段的初始学习率建议设置为1e-6到3e-6之间,过高的学习率极易导致模式崩溃(Mode Collapse)。
• 为防止能力遗忘,可以在RL的prompt池中混入5%-10%的通用SFT数据。这是一种简单有效的方法,可以在优化特定偏好的同时,通过让模型回顾通用任务来“锚定”其基础能力。
• 在PPO训练前,务必对RM的输出进行归一化处理。这可以防止因奖励模型打分范围不固定而导致的梯度爆炸或消失,极大提升训练稳定性。
• RLHF阶段的batch_size宁大勿小。更大的批次可以提供更稳定的梯度估计,尤其对于PPO。如果显存不足,应优先使用Gradient Accumulation来等效扩大批次大小。
• 在RLHF中可能经常碰到Reward Hacking,解决方案是在奖励函数中加入惩罚项,或者调低某个reward的权重系数,或者将这些作弊样本作为负例,重新训练奖励模型。
• Reward持续上升,并且KL散度爆炸式增长,这需要增加KL惩罚项的权重,通常建议从一个较小的值(如0.001)开始,逐步增加。
• KL散度很低,奖励几乎不增长或者增长缓慢,KL惩罚太过了,模型被过度束缚,调低系数,同时可以检查下学习率,如果学习率非常低,模型更新步子太小,可能也会导致reward增长缓慢。
• 模型训练初期就输出大量重复或者无意义的内容,习率过高。过大的学习率可能导致模型参数更新过于剧烈,跳出了有效的参数空间,导致mode collapse。这需要降低学习率。对于大模型微调,学习率通常设置得非常小,例如 1e-6 到 1e-5 之间。可以从一个保守的值开始尝试。同时,使用warmup和decay策略通常是个好主意,一般推荐cosine策略。
• 模型响应的长度变得非常短或非常长,这是因为奖励模型可能存在length bias,需要修正奖励模型:在RM训练数据中加入不同长度的优质样本,消除长度偏见。或者在RL阶段加入长度惩罚/奖励。
• reward持续上涨,但人工评估发现生成内容存在事实错误或逻辑混乱,这是因为RM过拟合或偏好数据存在偏差,导致模型学习到“欺骗性策略”。这时候需要根据你的具体任务,把奖励拆分多个独立维度,分别标注并加权融合。
• Critic的Value Loss波动剧烈,难以收敛,这是因为reward方差过大,导致Critic难以准确估计长期价值,这时候需要对reward或者advantage进行归一化
• 策略熵快速下降,生成内容同质化严重,这是因为entropy_coef过低,导致策略过早收敛到局部最优,探索能力不足。可以增大熵系数;或者采用DAPO的Clip-Higher策略:解耦PPO的clip上下界,放宽低概率token的提升空间,缓解熵崩溃。
• DPO中,模型对 chosen 和 rejected 的概率差增长缓慢,这是因为beta 值过高。DPO中的 beta 参数扮演着类似PPO中KL散度惩罚的角色,它控制着隐式奖励模型的温度。beta 过高意味着策略更新过于保守。可以调低 beta。降低 beta可以让模型更大胆地学习偏好,拉开 chosen 和 rejected 的差距。
• DPO中,DPO训练损失下降很快,但生成效果差,甚至不如SFT模型,这是因为beta 值过低 或 学习率过高。beta 过低导致模型过于激进,偏离SFT模型太远,丢失了通用能力。学习率过高同样会破坏预训练模型的结构。可以调高 beta:增加对SFT模型的约束。降低学习率:使用更小的学习率(如 1e-7 到 5e-6)进行微调。
• GRPO训练,batch size越大,其实效果越稳定,尤其是模型能力没有那么好的情况下。
未完待续。。。。。期望多多交流,私聊技术哦
![CleanShot 2025-06-15 at
[email protected]|1000](https://imagehosting4picgo.oss-cn-beijing.aliyuncs.com/imagehosting/fix-dir%2Fmedia%2Fmedia_Hbom7G6ctX%2F2025%2F06%2F15%2F01-27-10-2c55bcdab4cb8bee159948b25a535fc3-CleanShot%202025-06-15%20at%2001.27.00-2x-9cf54f.png)
以下是关于微调方法的三种方式的中文表格总结:
| 方式 | 描述 | 示例 | 费用结构 |
|------|------|------|----------|
| 商业模型提供商微调 | 模型供应商提供商业模型的在线微调能力 | OpenAI 的 GPT-3.5 | 按 token 付费 |
| 云厂商平台 | 云厂商提供的模型部署、微调平台 | 阿里云的 PAI 平台(DeepSeek 模型)| 只需使用云厂商的 GPU 算力 |
| 自托管开源方案 | 适合拥有足够强大 GPU 的公司,希望完全本地私有化 | 各种开源方案配合自部署微调平台 | 需要自备硬件并搭建基础设施 |
___
是的,**Supervised Fine-Tuning (SFT)** 和 **Group Relative Policy Optimization (GRPO)** 是两个并列但不同的模型训练方法,它们分别属于不同类型的技术路线,用于改善大语言模型(LLM)的表现。下面用通俗易懂的语言展开解释一下:
# SFT 与 GRPO 的差异与联系
| 区别项 | SFT(监督式微调)| GRPO(群组相对策略优化)|
| ---- | ---------------------------------- | ------------------------------------------------ |
| 核心思想 | 直接模仿预先提供的标准答案 | 根据生成答案的好坏反馈优化 |
| 所需数据 | 必须要有高质量标注数据(正确答案)| 不需要完整标准答案,只需要好坏评价 |
| 适用场景 | 需要稳定、可控的答案场景 | 希望生成更灵活、更有创造性的答案 |
| 模型表现 | 更倾向模仿原始数据,更稳定 | 更倾向探索新答案,可能更具创新性 |
| 训练难度 | 相对简单易操作 | 相对复杂,需要建立有效的反馈系统 |
| | - **SFT** 像"背课文",给了标准答案,模型照着学;<br> | **GRPO** 像"实战训练",不给标准答案,只告诉模型表现好坏,让模型自己探索出更好的方式。|
---
# 一、Supervised Fine-Tuning (SFT) - 监督式微调
**简单来说**:
- 就像学生做作业,由老师给出正确答案,然后学生反复练习直到掌握一样。
- 在SFT中,模型就像是"学生",我们事先准备好大量高质量的问题和答案数据,让模型去学习这些数据,记住正确的回答方式。
- 这种方式的关键是**预先准备好的数据质量**,数据越准确、越丰富,模型的表现就越好。
**举个例子**:
> 假设你要训练一个聊天机器人回答数学问题。
> 你准备了10万道数学题,每道题都附有详细的标准答案(步骤 + 答案)。
> 模型通过学习这些题目的答案,慢慢掌握了数学题的解答方法,以后遇到类似的题目就可以正确地回答了。
**特点总结**:
- 依赖提前准备的高质量标注数据。
- 模型会忠实地学习和模仿数据中给出的答案风格和逻辑。
- 训练起来相对容易,但受限于数据的质量和数量。
---
# 二、Group Relative Policy Optimization (GRPO) - 群组相对策略优化
**简单来说**:
- GRPO是一种强化学习(RL)的方法,和上面监督学习完全不同。
- 在强化学习中,模型并不是从标准答案直接学习,而是通过不断的"尝试与反馈"来优化。
- 模型生成一些答案后,我们给每个答案打分(好/不好),模型就根据这些反馈慢慢优化,逐渐提升表现。
- **GRPO**的特色在于,它不是逐个单独评价答案,而是**一批(群组)一批地评价答案**,再用这些群组的相对得分差异来帮助模型理解怎样的回答更好。
**举个例子**:
> 同样训练一个解答数学题的机器人,这次你不给标准答案,而是让模型自己生成10个答案,然后人类(或自动化评分系统)对这10个答案整体评分,比如:
>
> - 第1个答案:得分 70分
> - 第2个答案:得分 90分
> - 第3个答案:得分 50分
> - ……
>
> 然后模型再仔细观察:『为什么第2个答案得分最高?』
>『第3个答案错在哪里?』
>『第1个答案少了什么步骤?』
>
> 经过反复尝试,模型逐渐明白"高分答案"长什么样,从而表现越来越好。
**特点总结**:
- 通过不断试错和反馈提高模型表现,更有"探索"的感觉。
- 不再需要提前准备详细的标准答案,但需要高质量的评分体系。
- GRPO的优势在于让模型能生成更灵活、更有创造性的答案,而不仅仅局限于模仿预先准备的数据。
---
# 总结
- **SFT** 像"背课文",给了标准答案,模型照着学;
- **GRPO** 像"实战训练",不给标准答案,只告诉模型表现好坏,让模型自己探索出更好的方式。
在实际使用中,这两种方法经常被组合使用:
- 先用SFT打基础,让模型具备基本的能力。
- 再用GRPO进一步优化,让模型更灵活,更符合实际需要。
这样组合起来,可以达到更好的效果。
两者在基本思路上有相似之处,都是在预训练模型的基础上进行微调,使模型更适合特定任务。但细节上有明显差异:
| 路线 | |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [监督微调 SFT](监督微调%20SFT.md) | - **OpenAI 的微调模块**:<br> 通常采用监督学习的方式,你上传标注好的 JSONL 数据,然后选择一个基座模型,系统会利用这些标注数据对模型进行微调,调整模型的参数使其更适应你提供的训练数据。<br> |
| [[GRPO]] | - **[[GRPO]]-DeepseekR1 的方法**:<br> 这里使用的是强化学习策略优化(Group Relative Policy Optimization,GRPO)的方法。训练过程中不仅依赖监督信号,还引入了奖励函数(例如格式奖励、准确率奖励和编辑距离奖励)来评估生成结果,然后通过策略优化来调整模型。这种方法在生成任务中可以更灵活地控制输出格式和内容。<br> |
总结来说,虽然两者都是基于预训练模型的微调,但 OpenAI 的方法更偏向于传统的监督微调,而 GRPOTrainer 则结合了强化学习的策略优化,使得微调过程中可以直接用生成质量的反馈来调整模型。
___
https://github.com/huggingface/open-r1?tab=readme-ov-file
这个项目的目标是公开复现 DeepSeek-R1 模型,也就是说,它提供了一整套代码和工具,让大家可以按照公开的流程来微调和评估这个模型。简单来说:
- **复现 DeepSeek-R1**:项目重现了 DeepSeek-R1 的整个训练和微调过程,包括用监督学习(SFT)和基于强化学习的 GRPO 方法来改进模型表现。
- **数据处理与生成**:它包含了数据预处理、数据生成(用来扩充训练数据)以及评估脚本,方便大家验证模型在数学推理、代码生成等任务上的表现。
- **开放与可扩展**:整个项目是开源的,目的是让更多人可以在这个基础上进行改进和二次开发,推动相关研究和应用。
换句话说,这个项目不是在从零开始训练一个模型,而是复现并改进已有的 DeepSeek-R1,通过公开的代码让大家都能用相同的方法来微调和评估模型。
___
# 参考资料
https://colab.research.google.com/drive/1T5-zKWM_5OD21QHwXHiV9ixTRR7k3iB9?usp=sharing
[hiyouga/LLaMA-Factory/LLaMA-Factory: 一键调用LLaMA-Factory ,轻松微调。集成多种辅助功能。 - CG (codewithgpu.com)](https://www.codewithgpu.com/i/hiyouga/LLaMA-Factory/LLaMA-Factory)
我来为您解释一下如何微调(fine-tune) Llama 模型,我会尽量用通俗的语言解释这个过程。
作为 Java 程序员转入 AI 领域,您需要了解以下几个关键概念和步骤:
1. 基本概念:
- 微调是指在预训练模型的基础上,用特定数据集进行进一步训练,使模型更适合特定任务
- LoRA(Low-Rank Adaptation)是一种高效的微调方法,只需要更新很小一部分参数(1-10%)
- 在这个例子中使用了 Unsloth 框架,它可以让训练速度提升 2 倍
1. 主要步骤:
a) 环境准备:
```python
# 安装必要的库
!pip install unsloth
```
b) 加载模型:
```python
from unsloth import FastLanguageModel
# 加载预训练模型
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/Llama-3.2-3B-Instruct", # 选择模型
max_seq_length = 2048, # 最大序列长度
load_in_4bit = True # 使用4位量化以减少内存使用
)
```
c) 准备训练数据:
- 需要准备对话格式的数据,包含用户输入(user)和助手回答(assistant)
- 数据需要转换成模型可以理解的格式
d) 配置训练参数:
```python
# 设置 LoRA 参数
model = FastLanguageModel.get_peft_model(
model,
r = 16, # LoRA 秩,建议值 8,16,32,64,128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha = 16,
lora_dropout = 0
)
```
e) 开始训练:
```python
from trl import SFTTrainer
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset,
dataset_text_field = "text"
)
trainer.train()
```
f) 保存模型:
```python
# 本地保存
model.save_pretrained("lora_model")
tokenizer.save_pretrained("lora_model")
```
1. 实用建议:
- 建议使用 Google Colab 等云平台进行训练,因为需要 GPU 资源
- 开始时可以用小数据集测试流程
- 确保训练数据质量,这对模型效果影响很大
- 可以先用较小的模型(如 1B 或 3B 参数量的版本)来测试
- 注意保存训练检查点,以防训练中断
1. 资源消耗参考:
- 使用 Tesla T4 GPU 训练时,峰值内存使用约 6.5GB
- 完整训练时间因数据集大小而异,示例中约 7.5 分钟
如果您想开始尝试:
1. 先在 Google Colab 上运行示例代码
2. 准备一个小的测试数据集
3. 逐步调整参数观察效果
4. 成功后再尝试使用自己的数据集进行训练
需要注意的是,虽然示例使用 Python,但您不需要精通 Python,只需要能看懂基本语法并修改关键参数即可。随着您的深入学习,可以逐步掌握更多 AI 相关知识。