三、3SFT 最佳实践
- 数据集的质量对模型微调至关重要,毫不夸张的说,微调后的模型效果 80%取决于 SFT 训练数据,少量高质的数据要比大量低质或者普通的数据要好很多。
- 超参数调整
- Epochs:需要根据数据集多少动态调整
- Learning Rate:根据不同微调方法 LR 也需要调整
- Global BatchSize:调整 bs 可以加快训练速度,但是也会增加显存占用,需要根据 GPU 资源调整。
1、数据集准备
数据集的质量对模型微调至关重要,毫不夸张的说,微调后的模型效果 80%取决于 SFT 训练数据,少量高质的数据要比大量低质或者普通的数据要好很多。
- 数据集格式:SFT 数据一般以问答形式呈现,参考开源数据集:BAAI/COIG[8]
- Prompt 优化,适当构建 few-shot 及 COT(思维链,Chain-of-Thought)数据加入训练,可以有助于模型的指令理解以及多轮对话能力。
- 数据规模、多样性:通常 1 万条左右的精标数据即可发挥良好的效果,在扩充数据规模时需要注意数据多样性,多样性的数据可以提高模型性能
- 数据质量:挑选质量较高的数据,可以有效提高模型的性能。
1)数据集格式
问答格式可以处理成多种文件格式, 例如 JSONL, Excel File, CSV; 核心是要保持两个独立的字段, 即问题和答案。
例如:
[
{
"question": "特种珊瑚是一种海洋动物吗?",
"answer": "特种珊瑚虽然生活在海洋中,但它属于珊瑚软体类的石珊瑚目,是一种动物。而海洋动物是海洋中所有异养型生物的总称,包括鱼类、鲸类、浮游动物和游泳动物等,特种珊瑚只是其中的一种。"
}
]
2)Prompt 优化
- prompt 优化主要在训练阶段,用于增强指令的多样性,让模型更好的理解指令
- 预测阶段的 prompt 优化主要用于无法进行 finetune 的场景,例如 chatgpt/yiyan.baidu.com 等。
- 对于特定下游任务,预测阶段建议与训练阶段保持一致或者接近的 prompt,可以暂时忽略预测阶段的 prompt 优化。
- 适当构建 few shot 及 COT(Chain of Thought) 数据加入训练,可以有助于模型的指令理解以及多轮对话能力。
3)数据规模、数据多样性
在 SFT 上数据规模的重要性低于数据质量, 通常 1 万条左右的精标数据即可发挥良好的效果。
在扩充数据规模时需要注意数据多样性,多样性的数据可以提高模型性能。
在不扩大提示多样性的情况下扩大数据量时,收益会大大减少,而在优化数据质量时,收益会显著增加。
4)数据质量
挑选质量较高的数据,可以有效提高模型的性能。
数据质量用户需尽量自己把控,避免出现一些错误,或者无意义的内容。虽然平台也可以提供数据质量筛选的能力,但不可避免出现错筛的情况。
数据质量可以通过 ppl、reward model,文本质量分类模型等方式进行初步评估。经过人工进行后续筛选。
2、SFT 超参数调整
比如 10 万个样本 2-3 个 epoch 内为佳,2 ~ 5 万个样本 一般是 4-5 个 epoch 并且领域增强的 SFT 数据不需要太多,质量一定要把握好,一般的领域总结回复的任务几百条数据即可( 个人经验 ),视情况而定;小数据量可以适当增大 epoch,让模型充分收敛。
- 例如:EPOCH:100 条数据时, Epoch 为 15,1000 条数据时, Epoch 为 10,10000 条数据时, Epoch 为 2。
一般只需要关注以下 三个超参数的调整
- Epochs:需要根据数据集多少动态调整,比如 100 条数据时, Epoch 设置为 15,1000 条数据时, Epoch 为 10,10000 条数据时, Epoch 为 2。
- Learning Rate:根据不同微调方法 LR 也需要调整,对于 LoRA 的 peft 训练方式,同时可以适当增大 LR
- Global batch_size:调整 bs 可以加快训练速度,但是也会增加显存占用,需要根据 GPU 资源调整。如增加 accumulate step 32 64,当分布式节点增多时可以进一步增加 batch_size,提高吞吐。