前言
最近在研究如果更好的制备通用 SFT 数据,baichuan 这篇文章对通用 SFT和 RLHF 两大技术进行了全面,个人认为非常具有参考意义。
Baichuan 将对齐划分为三个阶段:
Prompt Augmentation(prompt 增强):将用户查询转化为大预言模型更容易理解和执行的指令。
SFT:制备大量的高质量且多样的数据,使得大语言模型能够具备对话和处理复杂任务的能力。
RLHF:使得模型和人类价值观和偏好保持一致。
2 Optimization
2.1 Training
SFT:学习率 1e-5,针对不同size的模型,训练 2-6 个epoch,sample packing,引入 weight decay来防止过拟合。
Reward:修改了损失函数,通过引入绝对得分的均方误差损失来增强 rm model 在绝对得分上的结果
Reinforcement Learning:分别实验了 PPO 和 GRPO,GPRO 的效果可以与 PPO 媲美。比 DPO 和 KTO 好。因此采用 GPRO 作为rlhf的训练方法。
2.3 Prompt Augmentation
核心思想:根据用户的prompt 来生成相应的补充内容,然后将prompt 和 补充内容一起送入LLM中。
应用场景:在实际应用中由于prompt工程队用户来说有较大的学习成本,因此通过模型进行 prompt 增强能够提高交互效率。
补充内容包括以下方面:
产品应用场景响应的要求。
基于用户意图的扩展内容,具有非强制性调整。
响应格式约束,例如“内容应该逻辑清晰、组织有序且易于用户理解。”
2.4 Model Merging
跷跷板效应(seesaw effect):一个领域效果的提升会影响另一个领域的效果。模型合并能够balance 模型在各个领域上的结果。
这块是比较新的技术,后面写个具体的博客详细讲讲。
3 Data
数据才是大模型的核心关键。
3.1 Prompt Selection
3.1.1 Prompt System and Classification
本节构建了一个多维度,多粒度的 Prompt 分类体系。其 Prompt 数据源来自用户的真实请求和各种开源数据集
采用LLM对Prompt 进行评估,评估维度包括:
ability(技能):包括:knowledge-QA,text generation,code programming,logical reasoning。
Attributes(属性):与 ability 相关的上下文属性信息。如 text generation 中的 literary writing,practical writing。
domains(领域):常见的包括:IT,history,humanities(人文学科)等
language(语言):
Chinese:Traditional Chinese,Classical Chinese
foreign languages:English,French
Programming languages: python,c++
difficulty(难度):prompt的难度,分为:easy,intermediate,difficult
prompt constraints(约束):将prompt分为:unconstrained,simple constraints,strong constraints。
首先采用前沿的大模型进行分类,通过标注构建数万样本的分类训练集,然后用 Baichuan2-13B 来进行微调,在评估集上达到90%,效果强于BERT的81%。
3.1.2 Prompt Diversity
大量研究表明,相似和重复的prompt 能够对模型产生负面影响,prompt的多样性非常重要。
当前的embedding 方法缺乏任务相关的信息,因此本文提出了一个 task-aware embedding model来更细粒度的把控信息。
3.1.3 Prompt Quality
Training Data:先将数据分成20个桶,然后从每个桶中随机采样30个样本。对每个样本采用多个LLM模型进行评估:Clarity(清晰度),Practicality(实用性),Complexity(复杂度),Novelty(新颖性),每个维度打分分三级。然后综合多个模型的结果获得最终打分。(我们目前的维度是:事实正确性,满足用户需求,清晰度,完备性)
Performance and Effectiveness:采用Baichuan2-7B 来进行训练得到最终的打分模型:Quality-7B。在200个样本的评估集上测试后,发现结果要强于 GPT4。
3.2 Response Construction
Human Annotation(人工标注):对于同一个prompt,用多个模型和生成策略来生成多个response。标注员对这些response 进行偏好排序。先用Reward Model或LLM-as-judge 进行预先筛选,形成具有分级质量的评估集,这样可以丰富数据的偏好顺序。当最佳答案不满足标准,要求标注人员修改答案来形成高质量的sft数据和perference 数据。
Human-Machine Collaborative Annotation(人机协作标注):主要是采用LLM 来defect mining 和 automatic rewriting。
Instruction Back-Translation:针对需要专业知识和创造力的任务,标注人员无法生成高质量的结果。采用文本质量模型挖掘各个领域的文本,然后生成高质量 prompt-response 对。收集大量优质文案和好评文章,然后生成对应的 creative instructions。
Personalization(个性化):不同的用户有不同的风格偏好,通过在pronmpt加入不同风格相对应的风格描述,我们可以缓解风格偏好冲突,并增强模型在风格之间切换的适应性。对于 safety,timeliness,model functionality 会过度拒绝,极大损害用户体验。通过严格控制拒绝比例并将拒绝约束纳入系统消息和提示来解决这个问题。
3.3 Perference Data
对于Perference data ,数据的质量和数据的多样性也非常重要。采用类似 sft 数据中的 prompt system 来挖掘数据。受限于标注人员,我们只保留中文和英文的prompt。
对于每个prompt,采用 top3 most advanced models 来采样 5 个 responses。设置:temperature=1,top-p=0.99,top-k=50。
为了保证response 的多样性,采用 rouge 来过滤掉相似的 response。
采用 AutoRator 来对response 打分:
Absolute score:对于一些开放性回答如 Writing,open QA等进行绝对打分
Pair Comparison:判断两个response 是否具备相似的 tought chain和result。如 Math,Reasoning。
Golden Answer:针对 gloden answer 进行打分
经过 AutoRator后,高分和相似分数的response之外的数据去标注。对于带有 Gloden Answer的数据,直接使用即可。
标注中,对于每组 response,不仅仅要求标注员进行排序,并对 helpfulness,writing fluency,safety 三个维度进行打分。如果得分比较低,那么就会送去标注。
4 Key Ability
4.1 Instruction Following
主要通过以下手段来提高指令遵循能力:
System Message:收集高质量,大规模的 system message 来增强LLM的理解和遵循能力。如:role-playing,function call,security等
Constraint Instruction Expansion:通过添加约束来构建复杂指令,进而提升模型的遵循能力。论文从大量prompt中分解,聚类后提取了30 多种类型的约束,然后通过这些约束来优化对应的prompt,最后采用LLM来选择这些 prompt。
Response Reversal:复杂指令的对齐有两大挑战:包含多个约束的高质量prompt非常稀少;生成严格遵循多个约束的答案非常难且成本高昂。论文通过以下三步来生成高质量约束数据:
首先,先选择出高质量的文本
然后将该文本当做response,训练一个LLM 来生成该文本的prompt,然后将Response 的内在属性当做约束。
最后,标注员评估生成prompt的质量,提供一些改进建议。上述三个过程反复迭代直到所有约束均已经包含。
4.2 Math
Prompt Collect:在小学,初中,高中,大学水平之间均匀抽样。采用知识点来进行覆盖,每个级别内,均匀覆盖1000个不同的知识点。优先采样解题问题,因为包括更全面的步骤。
Response Generation:数学题中往往有答案,但是缺乏详细的步骤,而中间步骤对大模型训练来说非常重要。采用大模型来根据参考答案来生成详细的步骤,并保持一致的风格。论文发现:提供参考答案显著提高了生成响应的质量。
数学占比在 20%。
4.3 Reasoning
整个 reasoning data 分成以下几个类别:
Common Sense Reasoning(常识推理):
Propositional Hypothesis(命题假设):
Relationship Judgment(关系判断):
Multi-step Reasoning(多步推理):
Game Theory(博弈论):
Disruptive Problems(干扰问题):引入干扰条件来测试推理能力
Counterfactual Reasoning(反事实推理):
逻辑推理任务对数据质量非常敏感,需要手动检查 Response 风格和准确性。
推理这块我觉得后面得按照 O1 那条路走,就不赘述了,感兴趣的可以自己看看。
4.4 Code
按照类别分类包括:
Code Generation:输入为自然语言,输出为代码
Code Completion:代码补全
Code Debugging:代码错误识别和纠正
Code Explanation:总结代码的功能或者过程描述
Code Knowledge QA:常见的编码知识。 被下采样了80%。
按照难度分类包括:
simple:基本知识解决的小代码问题
medium:需要高级知识和一定时间来解决的问题
difficult:需要深入理解和大量调试的复杂代码
very difficult:需要专业能力,非常努力,具备深度研究的问题。
Code Knowledge QA 本质上是常见的知识问答,而不增强编码技能,因此将其采样率降低了80%。
分类为 very diffult 的样本需要模型能力之外的知识或额外上下文才能解决,不然容易产生幻觉难以通过人工验证,因此这部分数据舍弃。
Prompt Collection:从各种开源数据和相关网站中收集,对于Response,从以下维度进行评估:
Conformance:代码块的格式问题,代码注释等
Correctness:response 是否正确,如用单元测试进行测试。
Quality:评估答案是否进行详细的问题背景描述,答案过程解释等
Multi-Turn:现有大多数代码数据都是单轮的,而多轮有助于探索更多的细节等,因此采用LLM 来根据现有单轮问答生成一个新问题,新问题遵循:
基于原始问题,增加难度和深度
确保新问题是现实场景中可能遇到的实际问题,且与前轮问题相关
最后,用LLM 来获得新问题的答案
4.5 Tool-using
pass,感觉还不是很成熟。
4.6 Prompt Augmentation System
训练了一个 33B 的模型生成提示补充。数据集:9000。训练:2epoch,长度4096。
数据集构建:
针对不同的场景定义 Response styles,并收集一小部分 human-written seeds。
用大模型进行数据合成
通过大模型的自我纠正来提高数据质量。
PAS 的prompt 如下:
最后
这篇文章是对baichuan的sft文章的笔记,综合来看,baichuan将整个通用SFT做的还是非常扎实的,不过整个体系有些庞大,还是非常推荐读一读的。这篇文章也是市面上为数不多将SFT整体链条梳理清楚的paper了。
进技术交流群请添加AINLP小助手微信(id: ainlp2)
请备注具体方向+所用到的相关技术点 关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。