赞
踩
可以从API提供的模型中获得信息:
fine tune包括以下步骤:
定价页面,价格单位是1000个token,相当于750个英文单词。
模型可以微调的有:davinci、curie、babbage和ada这些是原始模型,instruction following训练(例如text-davinci-003)可以添加数据微调一些微调过的模型。
pip install --upgrade openai
以下适用于0.9.4及更高版本。OpenAI CLI需要python 3。
设置OPENAI_API_KEY环境变量
export OPENAI_API_KEY="<OPENAI_API_KEY>"
训练数据是你教GPT-3让它说什么的方式。
数据必须是一个JSONL文档,每一行都是与训练示例相对应的 prompt-completion对。可以用CLI数据准备工具将数据转换为此文件格式。
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
...
设计用于微调的 prompts和 completions与设计用于基本模型(Davinci、Curie、Babbage、Ada)的 prompts不同。基本模型的提示通常由多个示例组成(“few-shot learning”),但为了进行微调,每个训练示例通常由单个输入示例及其相关输出组成,而不需要给出详细instructions或在同一prompt中包括多个示例。
训练实例越多越好。建议至少有几百个例子。数据集大小的每增加一倍都会导致模型质量的线性增加。
openai tools fine_tunes.prepare_data -f <LOCAL_FILE>
该工具接受不同的格式,唯一的要求是它们包含一个prompt和一个 completion 列/键。可以传递一个CSV、TSV、XLSX、JSON或JSONL文件,在指导完成建议的更改过程后,它会将输出保存到一个JSONL文档中,以便进行微调。
接下来用OpenAI CLI 开始微调任务:
openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> -m <BASE_MODEL>
BASE_MODEL是开始使用的基本模型的名称(ada、babbage、curie或davinci), 默认为curie。可以使用后缀(suffix)参数自定义经过微调的模型的名称。
上述命令可以完成以下操作:
微调任务开始后,开始在系统上排队,根据模型大小和数据集大小,训练时间不等。如果中断,可以用以下命令回复:
openai api fine_tunes.follow -i <YOUR_FINE_TUNE_JOB_ID>
完成后,应该会显示微调模型的名称。除了创建微调任务外,还可以列出现有任务、检索任务的状态或取消任务。
# List all created fine-tunes 列出现有任务
openai api fine_tunes.list
# Retrieve the state of a fine-tune. The resulting object includes
# job status (which can be one of pending, running, succeeded, or failed)
# and other information 检索任务的状态
openai api fine_tunes.get -i <YOUR_FINE_TUNE_JOB_ID>
# Cancel a job 取消任务
openai api fine_tunes.cancel -i <YOUR_FINE_TUNE_JOB_ID>
可以通过传递模型名称作为完成请求的模型参数来开始发出请求:
OpenAI CLI:
openai api completions.create -m <FINE_TUNED_MODEL> -p <YOUR_PROMPT>
cURL:
curl https://api.openai.com/v1/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": YOUR_PROMPT, "model": FINE_TUNED_MODEL}'
Python:
import openai
openai.Completion.create(
model=FINE_TUNED_MODEL,
prompt=YOUR_PROMPT)
Node.js:
const response = await openai.createCompletion({
model: FINE_TUNED_MODEL
prompt: YOUR_PROMPT,
});
也可以使用其他的 Completions 参数:调用ChatGPT API
OpenAI CLI:
openai api models.delete -i <FINE_TUNED_MODEL>
cURL:
curl -X "DELETE" https://api.openai.com/v1/models/<FINE_TUNED_MODEL> \
-H "Authorization: Bearer $OPENAI_API_KEY"
Python:
import openai
openai.Model.delete(FINE_TUNED_MODEL)
要微调模型,需要一组训练示例,每个示例都由单个输入(“prompt”)及其相关输出(“completion”)组成。这与直接使用基本模型明显不同,在基本模型中,可以在一个prompt中输入详细的instructions (说明)或多个示例。
\n\n###\n\n
。分隔符不应出现在任何prompt的其他位置。 \n, ###,
或任何其他未出现在任何completion中的token 。在分类问题中,提示中的每个输入都应该被分类到预定义的类中。对于这类问题建议:
\n\n###\n\n
。当您最终向模型发出请求时,请记住还要附加此分隔符。案例研究:模型是否做出了不真实的陈述?
比方说,你想确保你网站上的广告文本提到了正确的产品和公司。换言之,您希望确保模型不会捏造事实。你可能想微调一个分类器,它可以过滤掉不正确的广告。
数据集可能如下所示:
{"prompt":"Company: BHFF insurance\nProduct: allround insurance\nAd:One stop shop for all your insurance needs!\nSupported:", "completion":" yes"}
{"prompt":"Company: Loft conversion specialists\nProduct: -\nAd:Straight teeth in weeks!\nSupported:", "completion":" no"}
在上面的例子中,我们使用了一个包含公司名称、产品和相关广告的结构化输入。作为分隔符,我们使用\nSupported:
它将prompt 和completion清楚地分隔开。有了足够数量的例子,只要分隔符不出现在提示或完成中,它就不会有太大的区别(通常小于0.4%)。
对于这个用例,我们对ada模型进行了微调,因为它将更快、更便宜,并且性能将与更大的模型相当,因为这是一项分类任务。
现在我们可以通过发出Completion请求来查询我们的模型。
curl https://api.openai.com/v1/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"prompt": "Company: Reliable accountants Ltd\nProduct: Personal Tax help\nAd:Best advice in town!\nSupported:",
"max_tokens": 1,
"model": "YOUR_FINE_TUNED_MODEL_NAME"
}'
Which will return either yes
or no
案例研究:情绪分析
比方说,你想获得一条特定推文的积极或消极程度。数据集可能如下所示:
{"prompt":"Overjoyed with the new iPhone! ->", "completion":" positive"}
{"prompt":"@lakers disappoint for a third straight night https://t.co/38EFe43 ->", "completion":" negative"}
一旦对模型进行了微调,就可以通过在completion 请求上设置logprobs=2
来返回第一个completion token的日志概率。积极类的概率越高,相对情绪就越高。
现在我们可以通过发出Completion请求来查询我们的模型。
curl https://api.openai.com/v1/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"prompt": "https://t.co/f93xEd2 Excited to share my latest blog post! ->",
"max_tokens": 1,
"model": "YOUR_FINE_TUNED_MODEL_NAME"
}'
返回:
{
"id": "cmpl-COMPLETION_ID",
"object": "text_completion",
"created": 1589498378,
"model": "YOUR_FINE_TUNED_MODEL_NAME",
"choices": [
{
"logprobs": {
"text_offset": [
19
],
"token_logprobs": [
-0.03597255
],
"tokens": [
" positive"
],
"top_logprobs": [
{
" negative": -4.9785037,
" positive": -0.03597255
}
]
},
"text": " positive",
"index": 0,
"finish_reason": "length"
}
]
}
案例研究:电子邮件分类
假设你想将收到的电子邮件分类为大量预定义类别中的一个。对于分类为大量类别的情况,我们建议您将这些类别转换为数字,这将很好地适用于大约500个类别。我们已经观察到,由于tokenization,在数字之前添加一个空格有时会稍微有助于提高性能。您可能需要按以下方式构建培训数据:
{"prompt":"Subject: <email_subject>\nFrom:<customer_name>\nDate:<date>\nContent:<email_body>\n\n###\n\n", "completion":" <numerical_category>"}
例子:
{"prompt":"Subject: Update my address\nFrom:Joe Doe\nTo:support@ourcompany.com\nDate:2021-06-03\nContent:Hi,\nI would like to update my billing address to match my delivery address.\n\nPlease let me know once done.\n\nThanks,\nJoe\n\n###\n\n", "completion":" 4"}
在上面的例子中,我们使用了一封上限为2043个tokens 的传入电子邮件作为输入。(这允许使用4个tokens分隔符和一个令牌completion,总计2048。)作为分隔符,我们使用了\n\n###\n\n
,并删除了电子邮件中出现的###。
条件生成是一个需要在给定某种输入的情况下生成内容的问题。这包括转述、总结、实体提取、给定规格的产品描述写作、聊天机器人和许多其他内容。对于这种类型的问题,我们建议:
\n \n###\n \n
。当最终向模型发出请求时,请记住还要附加此分隔符。END
案例研究:根据维基百科的一篇文章写一则引人入胜的广告
这是一个生成用例,确保提供的样本具有最高质量,因为微调后的模型将试图模仿给定示例的风格(和错误)。一个好的起点是大约500个例子。示例数据集可能如下所示:
{"prompt":"<Product Name>\n<Wikipedia description>\n\n###\n\n", "completion":" <engaging ad> END"}
例子:
{"prompt":"Samsung Galaxy Feel\nThe Samsung Galaxy Feel is an Android smartphone developed by Samsung Electronics exclusively for the Japanese market. The phone was released in June 2017 and was sold by NTT Docomo. It runs on Android 7.0 (Nougat), has a 4.7 inch display, and a 3000 mAh battery.\nSoftware\nSamsung Galaxy Feel runs on Android 7.0 (Nougat), but can be later updated to Android 8.0 (Oreo).\nHardware\nSamsung Galaxy Feel has a 4.7 inch Super AMOLED HD display, 16 MP back facing and 5 MP front facing cameras. It has a 3000 mAh battery, a 1.6 GHz Octa-Core ARM Cortex-A53 CPU, and an ARM Mali-T830 MP1 700 MHz GPU. It comes with 32GB of internal storage, expandable to 256GB via microSD. Aside from its software and hardware specifications, Samsung also introduced a unique a hole in the phone's shell to accommodate the Japanese perceived penchant for personalizing their mobile phones. The Galaxy Feel's battery was also touted as a major selling point since the market favors handsets with longer battery life. The device is also waterproof and supports 1seg digital broadcasts using an antenna that is sold separately.\n\n###\n\n", "completion":"Looking for a smartphone that can do it all? Look no further than Samsung Galaxy Feel! With a slim and sleek design, our latest smartphone features high-quality picture and video capabilities, as well as an award winning battery life. END"}
这里我们使用了多行分隔符,因为维基百科的文章包含多个段落和标题。我们还使用了一个简单的结束token,以确保模型知道何时应该完成。
案例研究:实体提取
这类似于语言转换任务。为了提高性能,最好按照字母顺序或与原始文本中出现的实体相同的顺序对不同的提取实体进行排序。这将有助于模型跟踪所有需要按顺序生成的实体。数据集可能如下所示:
{"prompt":"<any text, for example news article>\n\n###\n\n", "completion":" <list of entities, separated by a newline> END"}
例子:
{"prompt":"Portugal will be removed from the UK's green travel list from Tuesday, amid rising coronavirus cases and concern over a \"Nepal mutation of the so-called Indian variant\". It will join the amber list, meaning holidaymakers should not visit and returnees must isolate for 10 days...\n\n###\n\n", "completion":" Portugal\nUK\nNepal mutation\nIndian variant END"}
多行分隔符效果最好,因为文本可能包含多行。理想情况下,输入prompts的类型(新闻文章、维基百科页面、推文、法律文件)将高度多样,这些prompts反映了提取实体时可能遇到的文本。
案例研究:客户支持聊天机器人
聊天机器人通常会包含有关对话的相关上下文(订单详细信息)、迄今为止的对话摘要(Summary)以及最新几轮消息。对于这个用例,相同的过去对话可以在数据集中生成多行,每次都有一个稍微不同的上下文,每次生成代理(chatgpt)作为一个 completion。这个用例需要几千个示例,因为它可能会处理不同类型的请求和客户问题。为了确保性能高质量,我们建议检查会话样本,以确保代理消息的质量。摘要(Summary)可以使用单独的文本转换微调模型生成。数据集可能如下所示:
{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent:",
"completion":" <response2>\n"}
{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent: <response2>\nCustomer: <message3>\nAgent:",
"completion":" <response3>\n"}
在这里,我们有目的地分离不同类型的输入信息,但在prompt 和completion之间以相同的格式维护“客户代理”对话框( Customer Agent dialog)。所有的completions 都应该只由代理(agent)完成,并且我们可以在进行推理时使用\n
作为停止序列。(上一轮的completions 作为下一轮对话的最后一个Agent)
案例研究:基于性能技术列表的产品描述
在这里,将输入数据转换为自然语言是很重要的,这可能会带来卓越的性能。例如,以下格式:
{"prompt":"Item=handbag, Color=army_green, price=$99, size=S->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}
效果不如下面的:
{"prompt":"Item is a handbag. Colour is army green. Price is midrange. Size is small.->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}
为了获得高性能,请确保completions 基于所提供的描述。如果经常咨询外部内容,那么以自动方式添加此类内容将提高性能。如果描述是基于图像的,那么使用算法来提取图像的文本描述可能会有所帮助。由于completions 只有一个句子长,我们可以使用.
作为推理期间的停止序列。
您可以使用后缀( suffix)参数为微调后的模型名称添加最多40个字符的后缀。
OpenAI CLI:
openai api fine_tunes.create -t test.jsonl -m ada --suffix "custom model name"
由此产生的名称为:
ada:ft-your-org:custom-model-name-2023-05-10-19-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文件包含每个训练步骤(step)的一行,其中一个步骤指的是对一批(batch)数据进行一次正向和反向传递( forward and backward pass)。除了步骤编号外,每行还包含与该步骤对应的以下字段:
我们还提供了在结果文件中生成额外的分类特定指标(generating additional classification-specific metrics)的选项,例如accuracy和weighted F1 score。这些度量是根据完整的验证集定期计算的,并在微调结束时进行计算。您将在结果文件中看到它们作为附加列。
要启用此功能,请设置参数**–compute_classification_metrics**。此外,您必须提供一个验证文件(validation file),并为多分类设置classification_n_classes参数,或为binary classification设置classfication_ppositive_class参数。
OpenAI CLI:
# For multiclass classification
openai 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 classification
openai 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:
对于多类别分类
二分类
以下度量基于0.5的分类阈值(即,当概率>0.5时,示例被分类为属于正类。)
请注意,这些评估假设前提是tokenize 文本标签为单个token的类,如上所述。如果这些条件不成立,你得到的数字很可能是错误的。
您可以保留一些数据以供验证。验证文件的格式与训练文件的格式完全相同,训练和验证数据应该独立。
如果在创建微调任务时包含验证文件,则生成的结果文件将包含对微调模型在培训期间定期对照验证数据执行的评估
OpenAI CLI:
openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> \
-v <VALIDATION_FILE_ID_OR_PATH> \
-m <MODEL>
如果提供了验证文件,训练期间定期计算验证数据批次的指标。将在结果文件中看到以下附加指标:
我们选择了在一系列用例中都能很好地工作的默认超参数。唯一需要的参数是 training file。
也就是说,调整用于微调的超参数通常可以产生更高质量输出的模型。特别是,可能需要配置以下内容:
openai api fine_tunes.create \
-t file-JD89ePi5KMsB3Tayeli5ovfW \
-m ada \
--n_epochs 1
如果已经针对任务对模型进行了微调,并且现在有了要合并的其他训练数据,则可以继续从模型进行微调。这创建了一个从所有训练数据中学习的模型,而不必从头开始重新训练。
要做到这一点,在创建新的微调任务时传入微调模型名称(例如-m curie:ft-<org>-<date>
)。其他训练参数不必更改,但是,如果新的训练数据比以前的训练数据小得多,您可能会发现将learning_rate_multiplier 减少2到4倍是很有用的。
可以将微调与Weights & Biases同步,以跟踪实验、模型和数据集。
需要一个Weights&Biases帐户和一个付费的OpenAI plan。要确保使用的是openai和wandb的最新版本,请运行:
pip install --upgrade openai wandb
同步 fine-tunes 和Weights & Biases, 运行:
openai wandb sync
Weights & Biases documentation
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。