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

前语

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

那么微调都能够解决什么问题呢?结合官网的攻略,常见的场景有:

  • 文本生成:能够经过供给相关数据集和指导性的文本,生成更加准确和有针对性的文本
  • 文本分类:将一段文本分成多个类别,例如电子邮件分类
  • 情感剖析:剖析一段文本的情感倾向,是否活跃或消沉

本文将对情感剖析进行一次测验。

预备数据

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

榜首列是谈论内容,第二列1代表活跃, 0 代表消沉。

ChatGPT3微调-评论文本情感分析

有需求的能够从这儿下载,一共是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>

ChatGPT3微调-评论文本情感分析

履行指令后咱们看到他回来的提示中告诉了数据一共有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即可。

ChatGPT3微调-评论文本情感分析

之后会生成两个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,所以咱们需求撤销这次练习。

ChatGPT3微调-评论文本情感分析

openai api fine_tunes.cancel -i <YOUR_FINE_TUNE_JOB_ID>

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

openai api fine_tunes.list

ChatGPT3微调-评论文本情感分析

接下来咱们加上模型等候练习完结即可。 假如过程中不小心关掉窗口或许中断了能够用以下指令康复。

openai api fine_tunes.follow -i <YOUR_FINE_TUNE_JOB_ID>

完毕练习

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

ChatGPT3微调-评论文本情感分析

最终咱们看一下剖析结果

openai api fine_tunes.results -i <YOUR_FINE_TUNE_JOB_ID>

ChatGPT3微调-评论文本情感分析

详细的解析大家能够阅览官方文档,这儿咱们首要看一下准确度

ChatGPT3微调-评论文本情感分析

运用模型

模型的性能指标给出了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自动给咱们补齐的分隔符。

从大数据集中随机拿了几个例子,结果是对的,可是输出有问题

ChatGPT3微调-评论文本情感分析

ChatGPT3微调-评论文本情感分析

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

梅开二度

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

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

ChatGPT3微调-评论文本情感分析

ChatGPT3微调-评论文本情感分析

ChatGPT3微调-评论文本情感分析

ChatGPT3微调-评论文本情感分析