本文涉及到的详细测试代码和测试步骤放置于:
https://github.com/xinyuwei-david/david-share.git下的:DeepLearning/SLM-SFT-Best-Practise
本文中不再赘述代码实现。欢迎给repo点亮Star,您的点赞是作者持续创作的动力。
客户使用Phi3.5作为基础模型,微调模型的coding能力。
因为Phi-3.5没有发布base model,只能使用Instruct model。
第一次微调:
训练语料的示例(已经脱敏):
prompt:
.NET Framework專案要如何使用XXX SDK
Completion:
使用 Qaaa.PasS;
using (var scope = new PasSContextScope(User))
{
PaaSContext context = 范围。上下文;// ....
}
训练完毕后,完全答非所问。
查询训练的损失函数:
校验集Loss下降太慢,存在过拟合。
第二轮:
设置lora_dropout = 0.05
epoch從30次調整成100次
校验集的损失函数下降还是有问题。
第三轮:
数据集增加,30题题目每一题增生到100+,全部dataset共3000笔。
数据集重新随机排序
训练/验证变成:0.7/0.3
训练中过拟合问题看似解决了,但训练后的模型回答问题还是错的。
第四轮:
对训练语料进行增强,增加COT步骤,例如:
*Step-by-Step Analysis:**
1. **Define Purpose**: The code aims to use NEBULA SDK by retrieving data based on the user's identity.
2. **Code Structure**: Imports necessary namespaces and defines an MVC controller with authorization.
3. **Data Handling**: Retrieves the English name
把训练语料改成全英文书写
训练后的模型能力有所提升,问了四道题,有一半是对的。
第五轮:
针对一条知识做多条训练数据的生成,采用随机插入、随机交换、随机删除和回译。
准确率比上次提升10%不多。
第六轮:
在训练参数中增加更丰富的prompt,同时将LoRA微调换成全微调。
准确率提升很多,但有时候针对同一个问题,有时候出现答案不一致的情况。
第七轮:
重新微调,将学习率设置为learning_rate=5e-4, 之前是learning_rate=5e-5.
推理时候,设置如下参数:
设置 do_sample=False:
禁用随机采样,确保模型每次都选择概率最高的词。
设置 temperature=0.0:
温度参数控制采样的随机性,值越低,模型越偏向于选择高概率的词。
当温度为 0 时,结合 do_sample=False,模型将以最确定的方式生成文本。
训练完毕后,模型可以准确回答问题。