对ChatGPT进行微调(Fine-Turning)的一些总结
Fine-Turning的官方文档
Fine-Turning地址
一、说在前头
虽然在官方文档中,官方介绍一些微调示例以及微调的技巧,但是我自己感觉,这些都是一些方向性的指导,缺乏细节。对于像我这样非人工智能方向出身的人来说,只看这些示例和技巧,很难将大模型训练出理想中的效果。我的经验是:训练好大模型需要补上一些人工智能相关的知识,同时也需要不断的实操。
为什么要补一些人工智能的知识呢?我这里举一个例子:我在基于自己的数据对大模型做微调的时候发现,训练中有两个参数Training Loss
和 Validation Loss
, 这两个参数的值在训练时是在不断变化的,当这两个值最后都不再抖动,趋近于0的时候就会有比较理想的训练效果,但是自己完全不知道这两个参数的作用是什么。
参考这个链接学习AI
二、关于微调数据
从官方文档来看,基于ChatGPT的大模型进行微调,对开发者来说实际上能够控制的变量非常少,一个是训练数据、一个是训练的轮次(epoch)。实际上官方也不推荐自定义训练轮次,在进行微调的时候,系统会根据数据量自己确定一个训练轮次,因此对我们来说,最重要也是唯一重要的事情就是准备 【训练数据集】
和【验证数据集】
。
但是如何将企业知识变成【训练数据集】
和【测试数据集】
真的是非常非常难,自己目前也没有找到好的方法论,因此只能去看一些开源的数据集如何准备的,通过学习这些开源的数据集的数据总结经验。
2.1数据集参考
斯坦福52K英文指令数据:ttps://github.com/tatsu-lab/stanford_alpaca
52K 条指令中的每一条都是唯一的,答案由text-davinci-003模型生成得到的。斯坦福52K中文指令数据:https://github.com/carbonz0/alpaca-chinese-dataset
与原始alpaca数据json格式相同,数据生成的方法是机器翻译和self-instruct。斯坦福52K中文指令数据:https://github.com/hikariming/alpaca_chinese_dataset
经过人工精调的中文对话数据集,加入除了alpaca之外的其他中文聊天对话 人工微调,部分并不中文化的问题,我们将重新询问chatgpt或文心一言,重新获取回答并覆盖掉alpaca的回答.基于GPT4的斯坦福英文数据及中文数据https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM
基于GPT4生成的斯坦福52K指令数据,后用ChatGPT翻译得到的中文数据BELLE Group Dataset:https://huggingface.co/datasets?sort=downloads&search=BELLE+Group
链家基于ChatGPT用self-instruct生成的中文指令数据集,其中还包括中文数学题数据和多轮对话数据。由于数据是模型生成的,未经过严格校验!BELLE项目生成的中文指令数据:https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M
生成方式基于种子prompt,调用openai的api生成中文指令。包含了23个常见的中文数据集,对于每个任务,由人工书写若干种指令模板,保证数据的高质量与丰富度,数据量为115万 。多轮对话数据:https://huggingface.co/datasets/BelleGroup/multiturn_chat_0.8M
包含约50万条由BELLE项目生成的中文指令数据https://huggingface.co/datasets/BelleGroup/train_0.5M_CN
chatDoctor:https://github.com/Kent0n-Li/ChatDoctor
Med-ChatGLM:https://github.com/SCIR-HI/Med-ChatGLM/tree/main/data
通过医学知识图谱和GPT3.5 API构建了中文医学指令数据集。中国法律数据资源,由上海交大收集和整理: https://github.com/pengxiao-song/awesome-chinese-legal-resources
三、经验总结
- 保证足够的训练数据数量:对gpt-3.5-turbo模型,大概需要50到100个效果会比较好,推荐从设计50个高质量的示例开始,不断增加
- 收集到的初始数据,要既包含训练集也要包含验证集,可以在初始阶段生成评估模型,提升质量
- 重复:在数据样本比较少的情况下(以50条数据为例),同样的数据多次重复比不重复效果要好,在测试的时候发现,数据重复10次的效果要比单条数据好(50条变成了500条)
- 数据格式:如果数据比较复杂,比如答案细分成几点:1、2、3、4,每一点都有换行符,训练的效果不如那种答案只是简单一句话的
- 训练轮次: 多轮训练会有好的效果,但是随着多轮的进行,提升会下降,如果轮次过多,会发生遗忘的问题。13条数据第一次回答全错,第二轮训练回答对了五个,第三轮训练回答对了6个。多轮训练有可能会把之前训练对的结果变成错误的,四轮训练把第三轮训练的正确结果给修改了。
四、一些示例
4.1 微调代码
代码地址
1 | import openai |
4.2 Promt示例
在微调大模型的基础之上,有时候你还是需要设计一些Prompt,可以参考下面的示例来写自己的Prompt
1 | # Role: xx公司交易机器人 |
五、参考链接
指令微调数据集整理