ChatGPT微调指南:从数据准备到模型训练

释放双眼,带上耳机,听听看~!
本文介绍了如何通过微调来进行情感分析模型的训练,包括数据准备、格式化和模型选择等步骤。

本文正在参加 ✍🏻 技术视角深入 ChatGPT 征文活动

前言

如果阅读过openai的文档,便能看到对于模型提供了fine-turning功能,即微调。GPT-3已经在互联网中进行了大量文本的预训练,当我们给出少量示例的提示时,它通常可以直观地了解正在尝试执行的任务并生成一个合理的完成。这通常被称为“小样本学习”。但我们需要的是一些特定的需求,比如GPT之前未预训练过的数据或是一些私有数据,便可以用微调通过训练来改进小样本学习。

那么微调都可以解决什么问题呢?结合官网的指南,常见的场景有:

  • 文本生成:可以通过提供相关数据集和指导性的文本,生成更加准确和有针对性的文本
  • 文本分类:将一段文本分成多个类别,例如电子邮件分类
  • 情感分析:分析一段文本的情感倾向,是否积极或消极

本文将对情感分析进行一次尝试。

准备数据

先从网上获取了一份关于酒店评论的数据,总共就两列。

第一列是评论内容,第二列1代表积极, 0 代表消极。

ChatGPT微调指南:从数据准备到模型训练

有需要的可以从这里下载,总共是1w条
评论文本情感分析

不过目前的数据是不能直接使用的,我们需要转换成GPT能接受的格式

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
...

数据预处理

openai很贴心的准备一个工具来验证、格式化数据。

安装CLI

pip install --upgrade openai

验证、格式化

openai tools fine_tunes.prepare_data -f <LOCAL_FILE>

ChatGPT微调指南:从数据准备到模型训练

执行命令后我们看到他返回的提示中告诉了数据一共有300条,并猜测我们是要进行分类模型,同时建议我们用ada模型,拆分出训练集和测试集,加入分隔符(加入分隔符可以帮助模型更好地理解输入的数据),分别会在接下来让我们选择

为所有提示添加后缀分隔符 `->`
- [Recommended] Add a suffix separator ` ->` to all prompts [Y/n]: Y
在完成的开头添加空格字符
- [Recommended] Add a whitespace character to the beginning of the completion [Y/n]: Y 
是否要将其拆分为训练和验证集
- [Recommended] Would you like to split into training and validation set? [Y/n]: Y

无特殊情况全部选Y即可。

ChatGPT微调指南:从数据准备到模型训练

之后会生成两个jsonl文件,同时返回一段参考命令、训练预计的时间。

训练模型

选择模型

首先,我们需要对模型进行一个选择,目前只支持davincicuriebabbageada

模型名称 描述 训练/1K tokens 使用/1K tokens
Davinci 最强大的GPT-3模型,可以完成其他模型可以完成的任何任务,通常具有更高的质量 $0.0300  $0.1200
Curie 非常有能力,但速度更快,成本更低,比Davinci更适合 $0.0030 $0.0120
Babbage 适用于简单任务,非常快速,成本更低 $0.0006 $0.0024
Ada 适用于非常简单的任务,通常是GPT-3系列中速度最快,成本最低的模型 $0.0004 $0.0016

模型的训练和使用都是需要费用的。出于各种原因我们直接选择Ada。

开始训练

在此之前,我们先将key添加到环境变量中

export OPENAI_API_KEY="<OPENAI_API_KEY>"

然后再来看一下之前openai给我们参考的代码

openai api fine_tunes.create 
    -t ".train_data_prepared_train.jsonl" 
    -v ".train_data_prepared_valid.jsonl" 
    --compute_classification_metrics 
    --classification_positive_class " 1"

-t、-v分别是训练集和测试集

–compute_classification_metrics可以计算模型在分类任务中的性能指标,在验证集上计算模型的准确率(accuracy)、精确率(precision)、召回率(recall)和F1分数。这有助于评估模型的性能,并调整微调过程中的超参数和训练策略。

–classification_positive_class是指分类的积极类别或正例

这里还需要一个 -m,来设置选择的模型。我也是手快直接回车了,本来以为会报错,可它正常运行了,但是默认的模型可能不是我们期望的ada,所以我们需要取消这次训练。

ChatGPT微调指南:从数据准备到模型训练

openai api fine_tunes.cancel -i <YOUR_FINE_TUNE_JOB_ID>

不过我也是用list查了一下,发现默认的模型是curie

openai api fine_tunes.list

ChatGPT微调指南:从数据准备到模型训练

接下来我们加上模型等待训练完成即可。
如果过程中不小心关掉窗口或者中断了可以用以下命令恢复。

openai api fine_tunes.follow -i <YOUR_FINE_TUNE_JOB_ID>

结束训练

耗时25分钟,花费了0.06刀(比预计的少很多)。

ChatGPT微调指南:从数据准备到模型训练

最后我们看一下分析结果

openai api fine_tunes.results -i <YOUR_FINE_TUNE_JOB_ID>

ChatGPT微调指南:从数据准备到模型训练

详细的解析大家可以阅读官方文档,这里我们主要看一下准确度

ChatGPT微调指南:从数据准备到模型训练

使用模型

模型的性能指标给出了0.85的准确率,这里用Playground调用测试一下。

除此之外还可以使用CLI命令

openai api completions.create -m <FINE_TUNED_MODEL> -p <YOUR_PROMPT>

或者使用API

const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
  model: "训练完后模型的id",
  prompt: "Say this is a test",
});

输入的prompt末尾需要加上之前CLI自动给我们补齐的分隔符。

从大数据集中随机拿了几个例子,结果是对的,但是输出有问题
ChatGPT微调指南:从数据准备到模型训练

ChatGPT微调指南:从数据准备到模型训练

ChatGPT微调指南:从数据准备到模型训练

ChatGPT微调指南:从数据准备到模型训练

应该是completion结尾没有分隔符的原因,明天再试试,顺便扩大一下样本。

梅开二度

第二次训练在completion的末尾全都加上了” ###”作为分隔符。

在playgroud、API、CLI中记得设置Stop

ChatGPT微调指南:从数据准备到模型训练

ChatGPT微调指南:从数据准备到模型训练

ChatGPT微调指南:从数据准备到模型训练

ChatGPT微调指南:从数据准备到模型训练

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

稀疏点云表面重建与 SDF 的神经网络算法

2023-12-18 18:41:14

AI教程

ChatGPT: 为什么选择强化学习而不是监督学习?

2023-12-18 18:51:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索