高级用法
自定义您的模型名称
您可以使用后缀参数将最多40个字符的后缀添加到您的微调模型名称中。
OpenAI CLI:
openai api fine_tunes.create -t test.jsonl -m ada –suffix “custom model name”
结果的名称将是:
ada:ft-your-org:custom-model-name-2022-02-15-04-21-04
分析您的微调模型
一旦作业完成,我们会将结果文件附加到每个作业中。当您检索微调时,此结果文件ID将被列出,并且在查看微调事件时也会显示。 您可以下载这些文件:
OpenAI CLI:
openai api fine_tunes.results -i <YOUR_FINE_TUNE_JOB_ID>
CURL:
curl https://api.openai.com/v1/files/$RESULTS_FILE_ID/content \ -H "Authorization: Bearer $OPENAI_API_KEY" > results.csv
_results.csv
文件包含每个训练步骤的一行,其中一步指的是对数据批次进行前向和后向传递。除了步数之外,每行还包含以下与该步骤相应的字段:
-
elapsed_tokens:模型到目前为止已经看到的标记数量(包括重复)
-
elapsed_examples:模型到目前为止已经看到的示例数量(包括重复),其中一个示例是批处理中的一个元素。例如,如果
batch_size = 4
,则每个步骤将使elapsed_examples
增加4。 -
training_loss:训练批次上的损失
-
training_sequence_accuracy:在训练批次中完成百分比,在这些完成中,模型预测出来的标记完全匹配真实完成标记。例如,使用
batch_size
为3时,如果您的数据包含[[1,2]、[0,5]、[4,2]]这些完成,并且模型预测[[1,1]、[0,5]、[4,2]]这些结果,则准确率将是2/3=0.67 -
training_token_accuracy: 模型正确预测出训练批次中令牌百分比。例如,在
batch_size
为3时,如果您的数据包含[[1, 2], [0, 5], [4 , 2]] 这些完成,并且模型预测 [[1 , 1], [0 , 5], [4 , 2]] 这些结果,则准确率将是5/6=0.83
分类特定指标
我们还提供了在结果文件中生成额外的分类特定指标的选项,例如准确度和加权F1分数。这些指标会定期针对完整验证集进行计算,并在微调结束时计算。您将在结果文件中看到它们作为附加列。
要启用此功能,请设置参数--compute_classification_metrics
。另外,您必须提供一个验证文件,并设置classification_n_classes
参数(多类分类)或classification_positive_class
参数(二元分类)。
OpenAI CLI:
# For multiclass classificationopenai api fine_tunes.create \ -t <TRAIN_FILE_ID_OR_PATH> \ -v <VALIDATION_FILE_OR_PATH> \ -m <MODEL> \ --compute_classification_metrics \ --classification_n_classes <N_CLASSES># For binary classificationopenai api fine_tunes.create \ -t <TRAIN_FILE_ID_OR_PATH> \ -v <VALIDATION_FILE_OR_PATH> \ -m <MODEL> \ --compute_classification_metrics \ --classification_n_classes 2 \ --classification_positive_class <POSITIVE_CLASS_FROM_DATASET>
如果您设置了 --compute_classification_metrics
,以下指标将显示在结果文件中:
对于多类分类
-
分类/准确率: 准确率
-
分类/加权F1分数: 加权F-1分数
对于二元分类
以下指标基于0.5的分类阈值(即当概率> 0.5时,将示例归类为正类)。
-
分类/准确率
-
分类/精度
-
分类/召回率
-
分类/f{beta}
-
分类/auroc – AUROC曲线下面积
-
classification/auprc – AUPRC曲线下面积
请注意,这些评估假定您使用文本标签来表示令牌化为单个标记的类别,如上所述。如果不满足这些条件,则您得到的数字可能是错误的。
验证
您可以保留一些数据进行验证。验证文件与训练文件具有完全相同的格式,并且您的训练和验证数据应该互斥。
如果在创建微调作业时包括一个验证文件,则生成的结果文件将包括对模型在训练期间定期针对您的验证数据表现如何进行评估。
OpenAI CLI:
openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> \ -v <VALIDATION_FILE_ID_OR_PATH> \ -m <MODEL>
如果您提供了验证文件,我们会在训练期间定期计算验证数据批次的指标。您将在结果文件中看到以下额外的指标:
-
validation_loss:验证批次上的损失
-
validation_sequence_accuracy:模型预测令牌与真实完成令牌完全匹配的验证批次中完成百分比。例如,使用一个
batch_size
如果您的数据包含完成情况[[1,2],[0,5],[4,2]]并且模型预测[[1,1],[0,5],[4,2]] ,则准确率为 2/3 = 0.67。 -
validation_token_accuracy:模型正确预测出来的验证批次中令牌百分比。例如,使用一个
batch_size
如果您的数据包含完成[[1,2],[0,5],[4,2]]并且模型预测[[1,1],[0 ,5 ] , [4、2 ]] ,则准确率为 5/6 = 0.83 。
超参数
我们选择了适用于各种用例的默认超参数。唯一必需的参数是训练文件。
话虽如此,调整用于微调的超参数通常可以导致产生更高质量输出的模型。特别是,您可能想要配置以下内容:
-
model
:要微调的基础模型名称。您可以选择其中之一:“ada”、“babbage”、“curie”或“davinci”。有关这些模型的更多信息,请参阅Models文档。 -
n_epochs
-默认为4。训练模型的时期数。一个时期是指完整地通过训练数据集进行一次循环。 -
batch_size
-默认为训练集中示例数量的约0.2%,上限为256个。批量大小是用于训练单个前向和后向传递的训练示例数量。通常,我们发现较大的批量大小 tend to work better for larger datasets. -
learning_rate_multiplier
-默认值为0.05、0.1或0.2,具体取决于最终batch_size。微调学习率是用于预先培训原始学习率乘以此倍增器得到的结果。我们建议尝试在范围内使用值 0.02 到 0.2 来查看哪种方法产生最佳结果。根据经验,我们发现较大的学习速度通常与较大 的batch size
配合使用效果更好。 -
compute_classification_metrics
– 默认值为False 。如果设置为True,则对分类任务进行微调,在每个 epoch 结束时计算验证集上特定于分类任务(准确性、F-1 分数等) 的度量标准。
要配置这些额外超参数,请通过OpenAI CLI的命令行标志传递它们,例如:
openai api fine_tunes.create \ -t file-JD89ePi5KMsB3Tayeli5ovfW \ -m ada \ --n_epochs 1
从已经微调的模型继续微调
如果您已经为任务微调了一个模型,并且现在有额外的训练数据需要加入,您可以从该模型中继续进行微调。这将创建一个从所有训练数据中学习而不必重新从头开始训练的模型。
要做到这一点,在创建新的微调作业时传递已经微调好的模型名称(例如 -m curie:ft-<org>-<date>
)。其他培训参数不必更改,但是如果您的新培训数据比以前的培训数据小得多,则可能会发现将 learning_rate_multiplier
减少2至4倍很有用。
权重与偏差
您可以将微调同步到权重和偏差中,以跟踪实验、模型和数据集。
要开始使用,您需要一个权重和偏差帐户和一个付费的OpenAI计划。为确保您正在使用openai
和wandb
的最新版本,请运行:
pip install –upgrade openai wandb
要将您的微调与Weights&Biases同步,请运行:
openai wandb sync
您可以阅读 Weights & Biases 的文档以获取有关此集成的更多信息。
示例笔记本
分类
finetuning-classification.ipynb
本笔记本将演示如何微调模型,以分类输入文本是否与棒球或曲棍球相关。我们将在笔记本中执行以下四个步骤:
-
数据探索将概述数据源和示例的外观
-
数据准备将把我们的数据源转换为可用于微调的jsonl文件。
-
微调将启动微调作业并解释所得到的模型性能。
-
使用该模型将演示如何向经过微调的模型发出请求以获取预测结果。
Collapse
问题回答
olympics-1-collect-data.ipynb
olympics-2-create-qa.ipynb
olympics-3-train-qa.ipynb
这个项目的想法是创建一个基于几段提供的文本的问答模型。基于GPT-3模型,当答案包含在段落中时,它们能够很好地回答问题,但是如果答案不包含在内,则基础模型通常会尽力回答,并且经常导致混淆的答案。
为了创建一个只有在有足够上下文情况下才能回答问题的模型,我们首先创建了一个基于文本段落的问题和答案数据集。为了训练该模型仅在存在正确上下文时才作出回应,我们还添加了对抗性示例,在这些情况下,问题与上下文不匹配。对于这些情况,我们要求该模型输出“无足够上下文来回答问题”。
我们将在三个笔记本上执行此任务:
-
第一个笔记本专注于收集最近的数据,这些数据是GPT-3在预训练期间没有看到的。我们选择了2020年奥运会(实际上是在2021年夏季举行),并下载了713个独特页面。我们通过单独的部分组织了数据集,这些部分将作为提问和回答的背景。
-
第二个笔记本将利用Davinci-instruct根据维基百科章节提出一些问题,并根据该章节回答这些问题。
-
第三个笔记本将利用上下文、问题和答案对的数据集,另外创建对抗性问题和上下文对,在这种情况下,模型将被提示回答“无足够的上下文来回答问题”。我们还将训练一个鉴别器模型,该模型预测是否可以基于上下文来回答问题。