记一次成功的小模型coding微调

文摘   2024-11-07 19:19   新加坡  

本文涉及到的详细测试代码和测试步骤放置于:

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;usingvar 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.

推理时候,设置如下参数:

  1. 设置 do_sample=False:

  • 禁用随机采样,确保模型每次都选择概率最高的词。

  • 设置 temperature=0.0:

    • 温度参数控制采样的随机性,值越低,模型越偏向于选择高概率的词。

    • 当温度为 0 时,结合 do_sample=False,模型将以最确定的方式生成文本。

    训练完毕后,模型可以准确回答问题。

    大魏分享
    https://github.com/davidsajare/david-share.git
     最新文章