LLM-SFT训练指"北"
前言
垂类场景(游戏,法律,医学等)下,如何进行SFT训练,核心目的是让通用大模型适应特定领域知识和任务格式。
SFT的数据多样性到底是什么?什么叫高质量的SFT数据。
SFT阶段能注入知识吗?能是为什么,不能又是为什么?
通用基座如何提升模型垂类场景的知识能力?
评价指标
评价维度:
真实性:指输出包含准确的信息,不会胡编乱造、不会前后矛盾。
有用性:能够清晰理解用户意图,回答合理,并给出专业可靠的答复。
安全性:安全性指输出不包含政治敏感内容、色情或者暴力内容,不会对用户造成身体、心理或社交伤害,不威胁公共安全。
版更指标:
GSB评估;人评(双盲);机评(position bias)
数据建设
冷启数据如何收集?
多样性怎么评估?
数据来源
真实数据
竞品爬虫。
内部过往积累知识。
合成数据
核心围绕:可控性,多样性。
Self-Instruct:给定问题分类+seed+examples做self-instuct。By GPT3。
Classification:可控
Filtering:过滤质量低,多样性去重。
Personas:prompt给定人设信息,从人设信息出发,构造合成数据。
多样性评估
From Kimi 1.5 tech report。
Furthermore, we developed a tagging system to categorize prompts by domain and discipline, ensuring balanced representation across different subject areas。
核心:让prompt/数据有标签体系。
游戏场景下:设想的维度,玩法x内容。
玩法:RPG,SLG,MOBA
内容:道具,人物,数值,攻略。
数据类目分布热力图:数据标注明显有了⽅向感,数据扩量更好量化。
踩坑实验
注⼊知识
问题:xxx是谁?
答案:xxx,是公司的副总裁。
背景:SFT后的模型,模型对于人名类的问题,统一回复是xxx副总裁。
原因:模型过拟合,强行注入知识,模型死机硬背,仅学到pattern,带来幻觉。
解法:剔除通用场景的人设注入数据,通过RAG方式进行检索生成。
fix后:
SFT仅仅只是behavior cloning。
垂类&通用知识占比
背景:原始数据中,通用数据的占比较少,仅约10~20%,其他3类数据(安全,游戏,内部)占比较大。
影响:
fix:调整训练数据占比,极大提升通用数据,并降低大幅降低垂域游戏数据占比。
结论:需要大量的通用数据,来保证模型的基础回复能力。
Less is more
By LIMA
doubling the training set does not improve response quality. This result, alongside our other findings in this section, suggests that the scaling laws of alignment are not necessarily subject to quantity alone, but rather a function of prompt diversity while maintaining high quality responses.
问题:
原始训练数据存在大量的重复游戏知识数据,
数据样式,<游戏名>这款游戏发行商<发行商名>,是一款xxxx 这样的格式,
在SFT阶段pattern同质化太严重,属于无效数据,可能引起过拟合。
1.消除达人这款游戏发行商是广州xx有限公司,品类是3D Tiles、休闲益智、消除,应用描述:3D益智的解压消除小游戏,有手就能通关!。
2.聚吧跳棋这款游戏发行商是宁波xx有限公司,是一款棋牌博彩题材的游戏,应用描述:跳棋双人对战,多人混战,好友团战。
3.宫廷风云这款游戏发行商是苏州xx有限公司,发布日期为2024-10-25,是一款中国历史题材的游戏,应用描述:女主晋升,古风时装轻松获取。
结果:SFT数据 10w量级 --> k量级。(高质量数据),SFT数据量级显著降低的情况下,并不明显影响模型最终评测效果。
结论:SFT阶段数据不是“越多越好”!
经验:在SFT训练数据数据与LLaMa、Yi等类似量级,保持在10-100k以内的水平。
Prompt一致性
背景
通⽤问答prompt会提到“不要回答xxx问题”,但实际SFT数据并没有保证遵守此设定,prompt和实际回复⽅式的⼀致性对最终微调效果的影响是否有影响,一直是不清晰的点。
实验设置
以编程为例⼦,垂类人设的设定是不需要满⾜⽤⼾提出编程问题的需求,即可以⽤拒识/回避式回复。
问题:打印1到50之间的所有质数
满⾜式回复:质数指⼤于1的⾃然数中,除了1和它本⾝以外不再有其他因数。
\n\n```\nfor num in range(1, 51):\n if num > 1:\n for i in
range(2,num):\n if num % i == 0:\n break\n
else:\n print(num)\n```\n这段代码会打印1到50之间的所有质数。回避式回复:对不起您的问题与xxx⽆关,我作为xxx助⼿,主要是提供xxx相关的帮助和建议。这个打印1到50之间的所有质数的问题,我可能⽆法提供帮助。如果您有任何xx相关的问题或需要建议,欢迎随时向我提问。
数据:
4k条通⽤垂类数据(不包含编程)
14条编程相关数据(有满⾜式回复和回避式回复)
前提:
原底座会满⾜编程问题
“不回答编程问题”算是「垂类场景」新的指令遵循需求
实验结果:
训练 | 测试编程问题(不回答数/总数) | |||
prompt | 回复 | prompt要求不回答 | promtp要求回答 | |
#1 | 不回答 | 满足式 | 0/11 | 0/11 |
#2 | 不回答 | 回避式 | 11/11 | 10/11 |
#3 | 回答 | 回避式 | 8/11 | 7/11 |
结论:
#2 说明prompt与实际回复⼀致时是能很好完成新的指令遵循需求;
#1 和 #3 说明prompt说⼀套实际回复另⼀套的话,模型⼤部分情况是跟着实际SFT的回复⾛,此时指令遵循是不可控的状态;
#2 只增加回避式回复会严重导致偏差,对满⾜式回复有需求的话需要做更进⼀步的对⻬(⻅下面)。
补充实验
训练 | 测试编程问题(不回答数/总数) | |
|---|---|---|
⽐例 | prompt要求不回答 | prompt要求回答 |
14:0 | 11/11 | 10/11 |
11:3 | 11/11 | 4/11 |
9:5 | 6/11 | 2/11 |
与底座能⼒不同的新指令需要更多的数据;
简单SFT数据配⽐很难让相反能⼒的指令同时遵循做到100%。
说明数据标准的一致性很关键!
Conclusion
多样性到底是什么?
语义相似 不多样/同质?? ×(一般会做向量化去重)
五花⼋⻔的边缘问题 = 多样?×
覆盖类目品类体系 ✓
真实⽤⼾的In-depth/breadth需求(类似WizardLM Evol-Instruct) ✓
什么SFT数据叫⾼质量?
真实问题:prompt/问题不是某些“形⽽上”⼈⼠YY出来的 ×
风格一致:回答遵循同样⻛格、符合标注标准 ✓
模型能力:在模型能⼒范围内 ✓
标准清晰:不同⼈多次review都不会有明显意⻅ ✓
SFT能注入知识问题吗?会带来什么问题?
不要把LLM当作“超大号bert” ×
灾难性遗忘 ×
知识冲突与幻觉 ×
死记硬背 ×
Ref
The Unlocking Spell on Base LLMs: Rethinking Alignment via In-Context Learning
Smaug: Fixing Failure Modes of Preference Optimisation with DPO-Positive
https://github.com/LLaMafia/SFT_function_learning
LIMA: Less Is More for Alignment
Yi: Open Foundation Models by 01.AI
Llama 2: Open Foundation and Fine-Tuned Chat Models
STaR:Bootstrapping Reasoning With Reasoning
ReAct: Synergizing Reasoning and Acting in Language Models
Kimi k1.5: Scaling Reinforcement Learning with LLMs