请选择 进入手机版 | 继续访问电脑版
查看: 1285|回复: 0

OpenAI fine-tuning(微调)训练专属GPT模型教程

[复制链接]

171

主题

11

回帖

22万

积分

开发人员

积分
220771
发表于 2023-5-17 06:28:27 | 显示全部楼层 |阅读模式
本文由THE.AI开发者徽药原创,阅读时间:约10分钟,学习难度:困难。(联系方式:微信feeltingdays)

ChatGPT的出现给我们带来了巨大的便利,但是训练这样的大模型需要巨额投入。根据OpenAI官方给出的数据,Davinci模型从头训练一遍需要耗时3个月,耗资150万美元。对于普通人或小公司来说,这个高门槛似乎让自定义模型变得不可能。然而,Fine-tuning技术为我们提供了一种更加经济实惠的解决方案。通过基于一个基础模型进行训练,并添加自己的个性化数据,我们可以得到一个领域增强的个性化模型。这种个性化模型在现代社会中有着广泛的应用,因为现代社会的行业和知识如此之庞大,每个领域都有自己细分的专业知识。比如,ChatGPT的一个典型应用场景是智能客服,但是不同领域的客服需要面对的客户和需要解答的问题完全不同。因此,打磨自己的个性化模型是非常必要的,当然本地训练是需要使用魔法工具的。
原理
OpenAI的Fine-tuning技术是一种基于预训练模型的技术,可以通过微调已有的模型来适应新的具体任务。其核心原理是调整预训练模型的权重,使其能够更好地适应新任务的输入和输出。Fine-tuning技术的优势在于可以快速获得高质量的模型,而无需从头开始训练。通过在小规模任务上微调预训练模型,可以在更短的时间内得到适用于各种任务的个性化模型。这种技术已经被广泛应用于自然语言处理、语音识别、计算机视觉等领域,为我们提供了更高效、更准确的解决方案。
Fine-tuning⼀般包括以下步骤:
1. 加载预训练模型:选择⼀个与所需任务相关的预训练模型,并加载其权重。
2. 选择任务数据集:选定特定任务所需的数据集。
3. 对模型进⾏微调:将任务数据集作为输⼊,以最⼩化模型在此数据集上的损失函数。在 这个过程中,通常需要在训练集和验证集上进⾏多次迭代,以避免过拟合问题。
4. 在测试集上进⾏测试:使⽤微调后的模型,在测试集上测试其性能表现。

Fine-tuning技术的优点在于可以快速获得针对特定任务的高质量模型,而无需从头开始训练。相对于从头开始训练模型,Fine-tuning技术只需更新部分权重,而大多数权重已经在预训练阶段得到了很好的优化,因此需要的训练时间和计算资源都要少得多。这种高效的方法可以大大提高我们的工作效率,同时还可以提高模型的准确性和可靠性。Fine-tuning技术已经被广泛应用于各种领域,如自然语言处理、计算机视觉、语音识别等,为我们提供了强大的工具和解决方案。
步骤
这里,我想到了一个有趣的点子,就是将知识星球的粉丝群问答数据应用于训练模型。这种问答形式恰恰符合了Fine-tuning技术的应用场景,因为可以将这些数据作为训练集,让模型更好地适应这个特定的领域。例如,对于投资理财粉丝群,我们可以将最近一个月的问答数据作为训练数据,进行Fine-tuning,以得到更加个性化的投资理财模型。这种方法不仅可以提高模型的准确性,还可以为我们提供更加实用的投资建议和理财策略。这样的应用不仅有趣,而且也非常实用,可以帮助我们更好地应对各种问题和挑战。
1.准备训练数据:
我们需要将需要训练的数据准备为jsonl格式,这种格式的特点就是每⼀⾏都是json 的格式(关于什么是json,参考这里 )如下:
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
...

比如,我的训练数据为 data.jsonl ,里面的问答有3条,对于Fine-tuning来说,数据量不能太少,少于100条数据的话,训练的质量很低,我这里仅建立3条作为演示,所以也不考虑质量。
{"prompt": "如何提高电商平台的转化率?", "completion": "电商平台可以通过以下几种方式来提高转化率:优化网站的布局和设计,使其更加易用和用户友好;提供更加个性化的推荐和营销服务,根据用户的兴趣和需求来展示相关的商品和服务;加强售后服务和客户关系管理,提高用户的满意度和忠诚度。"}
{"prompt": "如何提高电商平台的用户体验?", "completion": "电商平台可以通过以下几种方式来提高用户体验:优化页面加载速度,减少用户等待时间;提供更加详细和准确的商品信息和评论,帮助用户做出更好的购买决策;加强社交和互动功能,让用户能够更好地参与和分享购物体验。"}
{"prompt": "如何提高电商平台的品牌知名度?", "completion": "电商平台可以通过以下几种方式来提高品牌知名度:加强线上线下营销策略,多渠道宣传和推广品牌; 提供优质的商品和服务,赢得用户的口碑和信任; 加强社交媒体和口碑营销,让用户能够更好地分享和推荐品牌。"}
其中,prompt是问题,completion是答案。

2.安装工具
为了使用OpenAI提供的训练工具,我们需要先安装Python语言环境,需要Python3 以上版本,这一步骤比较简单,这里不再赘述。安装完毕后,我们需要使用Python自带的pip工具来安装OpenAI提供的训练工具,以便进行后续的训练和调试工作。
使用OpenAI 命令行界面 (CLI),运行以下代码:

pip install --upgrade openai


同时,因为需要跟OpenAI的进行交互,所以我们需要提前设置OPENAI_API_KEY,这个可以点此在THEAI商城购买
mac/linux系统用以下代码:
export OPENAI_API_KEY="<OPENAI_API_KEY>",格式不要写错了应该是export OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
wind系统用以下代码,:
set OPENAI_API_KEY="<OPENAI_API_KEY>",格式不要写错了应该是set OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3.优化训练数据
我这里使用的是Windows11系统计算机,我把刚刚这个三行电商的例子,建立data.jsonl文件放在D盘,在D盘目录启动windows powshell (鼠标右键点击在终端打开)。
openai tools fine_tunes.prepare_data -f data.jsonl
该指令会帮我们优化训练数据,该指令运⾏过程中会问我们几个个问题。
b1.png
翻译为中文即:
正在分析...
-您的文件包含3个提示完成对。一般来说,我们建议至少有几百个例子。我们发现,示例数量每增加一倍,性能就会线性增加
-所有提示都以后缀`?结尾`
-所有提示都以前缀开头`如何提高电商平台的`
-所有完成都以前缀开头`电商平台可以通过以下几种方式来提高`. 大多数时候,您应该只将输出数据添加到完成中,而不添加任何前缀
-所有补全都以后缀`结尾`
-完成应该以空白字符(``)开头。由于我们使用的标记化,这往往会产生更好的结果。看见https://platform.openai.com/docs ... paring-your-dataset了解更多详细信息
下面根据提示把data.jsonl进行相应的修改,我这里只做样例就不修改了。
4.提交训练数据
准备好数据后,就要提交给openai训练了,此时需要提供数据文件data.jsonl和模型,⽬前OpenAI⽀持的BASE_MODEL有4个,分别为Davinci、Curie、Ada、Babbage,从左到有价格由贵到便宜,性能是从好到⼀般。这次以Davinci作为 BASE_MODEL训练。
openai api fine_tunes.create -t data.jsonl -m davinci
b2.png
很快得到训练结果,ft-snVk5MaVokc98dNixL4XSWDoB这个是fine-tuning的job ID,是以上create命令建立的。
如果训练量大,训练的进度可以通过下面这个命令获取:
openai api fine_tunes.follow -i ft-snVk5MaVokc98dNixL4XSWDo
这⾥有个技巧,如果训练数据集较大,不用每次提交训练任务都要把数据重新上传⼀遍,可以直接使用之前已经上传的数据,方法如下:
openai api fine_tunes.create -t  file-l4iHZJRxlpjutirYrnqXTz7l -m davinci
这个 file-l4iHZJRxlpjutirYrnqXTz7l 是之前上传完⽂件后通过下面的命令得到的。
5.训练模型
查看fine-tuning任务的详细信息
openai api fine_tunes.list
b3.png
这个命令可以查看训练进度,因为只有三条命令,所以训练秒结束。
openai api fine_tunes.follow -i ft-snVk5MaVokc98dNixL4XSWDo
b4.png
模型训练完毕,得到的⾃定义模型是”davinci:ft-personal-2023-05-17-00-05-18”, 没有排队,训练秒结束,耗费0.1美元。
下⾯我们用新模型进行提问。
openai api completions.create -m davinci:ft-personal-2023-05-17-00-05-18 -p 如何提高电商平台的转化率?
b5.png
可惜结果不够理想,数据还是太少。
下面通过这行查看训练结果数据:
openai api  fine_tunes.results -i ft-snVk5MaVokc98dNixL4XSWDo
b6.png
我们训练的最终目的是希望损失函数的结果最小,即training_loss(训练_损失)值最小,且使得training_sequence_accuracy(训练_序列_精度)和training_token_accuracy(训练_标记_准确性)值最⼤,但从下面的数据看,training_loss为0没有损失, 但是training_sequence_accuracy为0没有精度,training_token_accuracy也均小于1,标记也没准确性,从这也就印证了为什么问答的效果并不好。
当然,这只是一个样例,要想能够影响ChatGPT模型的输出结果,只有一个办法不断的优化数据然后提交训练。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则