利用GPT-3 Fine-tunes训练专属语言模型

news2024/11/17 17:50:54

利用GPT-3 Fine-tunes训练专属语言模型

在这里插入图片描述

文章目录

    • 什么是模型微调(fine-tuning)?
    • 为什么需要模型微调?
      • 微调 vs 重新训练
      • 微调 vs 提示设计
    • 训练专属模型
      • 数据准备
      • 清洗数据
      • 构建模型
      • 微调模型
      • 评估模型
      • 部署模型
    • 总结

什么是模型微调(fine-tuning)?

ChatGPT已经使用来自互联网的海量开放数据进行了预训练,对于任何输入都可以给出通用回答。如果我们想让ChatGPT的回答更有针对性,我们可以在输入时给出示例,ChatGPT可以通过“示例学习”(few-shot learning)理解你希望它完成的任务,并产生类似的合理输出。

但是“示例学习”每次需要给出示例,使用起来很不方便。微调(fine-tuning)可以通过训练更多示例来改进“短学习”,使用微调后的模型将不再需要在输入中提供示例。 这样既可以节约成本又可以实现更低延迟的请求。

更重要的是,对于一些专业场景,预训练模型可能无法达到理想的输出效果。此时需要我们给出更加具体和对口的数据对模型进行专门的强化,使其能够更好地回答该领域的问题,从而提升整体效果。

简而言之,微调允许我们将自定义数据集与大型语言模型(LLM)相匹配,让模型在我们的特定任务场景下依然表现良好。

为什么需要模型微调?

微调 vs 重新训练

这里有必要区分一下微调(fine-tuning)重新训练(re-training) 的概念。

简单地说,重新训练是用新数据从头开始训练模型,而微调是用新数据调整先前训练模型的参数。

针对特定任务场景,微调比重新训练无论从时间还是费用上都更快更经济

从头重新训练GPT-3 或 ChatGPT成本高的惊人。据估算,GPT-3一次训练的成本大约140万美元,ChatGPT模型更大,一次训练大约需要1200万美元。这还不包括上万颗A100GPU的成本。一块Nvidia A100 80G显存显卡按5万计算,1万块A100显卡光初始费用就5个小目标!很少有企业能够负担得起这么巨大的软硬件支出。

在GPT-3上微调也有成本,以功能最强的Davinci为例,训练成本0.03美元/1千token,这个成本相比重新训练天壤之别。下图是微调模型的训练和使用成本:

在这里插入图片描述

所以目前对大多数企业来说,只适合在GPT-3上做微调,除了少数巨头,绝大多数企业都没实力和能力重新训练。

微调 vs 提示设计

GPT-3支持“示例学习”(few-shot learning),我们可以通过在输入prompt时给予示例来提升模型输出效果,但提升效果远不如微调的效果,下面是微调和提示设计的效果对比:

在这里插入图片描述

对比提示设计,微调模型可以获得如下优势:

  • 更好的输出效果
  • 比示例学习更多的训练数据
  • 减少token消耗从而节约成本
  • 请求延迟更低

训练专属模型

可以通过以下6个主要步骤开始创建微调模型。为了方便大家理解,我会结合我们在GPT-3上定制客服机器人的Python代码来演示微调过程。

在这里插入图片描述

数据准备

GPT-3微调需要的数据格式是专属JSONL格式,形式如下:

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

上面的数据格式很好理解——每行都包含一个prompt和一个completion,表示特定提示对应的理想文本。

我们日常系统中的数据一般不会保存为JSONL格式,因此需要先将数据转换为JSONL格式。OpenAI提供了命令行工具来帮我们将常见数据格式转化为JSONL格式,用法如下:

openai tools fine_tunes.prepare_data -f <LOCAL_FILE>

其中<LOCAL_FILE>传入本地数据文件,支持CSV、TSV、XLSX、JSONJSONL格式,只要文件中的数据格式是包含 prompt completion 列或关键字就行。

数据准备阶段大家经常问的一个问题是*“我要准备多少数据用于微调才够?”*。通常来说,自然是“多多益善”,但由于微调设计训练成本,我们需要从中取得一个平衡。Open AI建议至少提供150–200个微调示例,但我个人在实际项目中发现150-200个微调示例往往不够,建议先从几百到一千条数据作为起始测试,根据微调后的模型效果再决定是否追加更多训练数据。

在这里插入图片描述

GPT-3支持自定义模型的持续微调,因此你可以随时用新数据在之前微调的模型上做进一步微调。

清洗数据

相比数据数量,数据质量更为关键

GPT-3本质上是一个大型神经网络,它对我们来说是一个黑盒。所以它是典型的“garbage in, garbage out”,模型输出质量与训练数据质量有着直接的关系。

数据质量和多样性越高,模型就会工作得越好。通常需要一组不同的示例,以确保模型能够很好地泛化到新的示例。最好能够提供一个正面示例和负面示例,以确保模型能够处理各种输入。

为了验证微调模型质量,我们通常会将数拆分为训练集和验证集,通常按照 80 % / 20 % 80\%/20\% 80%/20%的比例进行拆分。

⚠注意:除JSONL格式外,训练数据和验证数据文件必须是UTF-8编码,并包含字节顺序标记(BOM),文件大小不能超过200MB。

构建模型

微调数据准备好后,我们就协议开始着手微调模型了。在开始微调训练之前,我们需要先确定微调的基础模型。

每个微调工作都从一个基础模型开始,默认为curie。基础模型不同会影响模型的性能和微调模型的成本。目前支持微调的基础模型包括:adababbagecuriedavinci

下面是用Python完成模型构建:

import openai

openai.api_key = "YOUR_API_KEY"

resp = openai.FineTune.create(training_file="training_file_path", 			
                              validation_file="validation_file_path", 
                              check_if_files_exist=True, 
                              model="davinci")
job_id = resp["id"]
status = resp["status"]
print(f'微调任务ID: {job_id},状态: {status}\n')

上面的代码选择davinci作为基础模型,并传入了训练集和验证集的本地文件路径,创建微调任务。如果创建成功,则会返回微调任务的id及状态。

创建微调任务还支持其他参数,说明如下:

参数名类型默认值说明
training_filestring训练集文件路径,必须是JSONL格式
validation_filestringnull验证集文件路径,必须是JSONL格式
如果提供,则在微调期间,定期生成验证度量。这些指标可以在微调结果文件中查看。
训练集数据与验证集数据必须互斥。
check_if_files_existbooleantrue是否检验文件是否存在
modelstringcurie要微调的基础模型的名称。可以选择adababbagecuriedavinci或2022-04-21之后创建的微调模型。
n_epochsint4训练几轮。
batch_sizeintnull训练的批次大小。默认情况下,批次大小将动态配置为训练集样本数的约0.2%,上限为256。通常来说较大的批次大小对于较大的数据集更有效。
learning_rate_multiplierfloatnull学习率系数。微调学习率=预训练的原始学习率乘以该值。
默认情况下,学习率系数为0.05、0.1或0.2,具体取决于最终批次大小(较大的学习率往往在较大的批次大小下表现更好)。我们建议使用0.02到0.2范围内的值进行实验,以查看产生最佳结果的方法。
prompt_loss_weightfloat0.01提示损失权重。控制模型学习生成提示(生成输出的权重为1),并增加输出较短时训练的稳定性。
如果提示非常长(相对于输出),那么减少这个权重可以避免过度学习。
compute_classification_metricsbooleanfalse如果为true,则在每轮训练结束时使用验证集计算效果,例如准确度和F-1 score 。这些指标可以在结果文件中查看。
classification_n_classesintnull分类任务中的类别数。
多类别分类需要此参数。
classification_positive_classstringnull二分类任务中的正例。
在进行二分类时,需要此参数来生成精度、召回率和F1 score 。
classification_betasarraynull如果提供,将按照指定的beta值计算F-beta分数。F-beta是F-1的概括。仅用于二分类任务。
beta为1(即F-1分数)时,准确率和召回率的权重相同。beta越大,召回率的权重越大,准确率的权重越小。beta分数越小,准确率权重越高,召回率权重越低。
suffixstringnull最多40个字符的字符串,将添加到微调后的模型名称中。

微调模型

微调任务创建之后通常处于Pending状态,这是因为OpenAI系统中通常有其他任务排在你之前,我们的任务会先放在队列中,等待被处理。一般来说一旦进入训练状态,微调训练可能需要几分钟或几小时,具体取决于选择的基础模型和数据集的大小。我们可以用微调任务id来查询微调任务的状态:

while status not in ["succeeded", "failed"]:
    time.sleep(2)
    # 获取微调任务的状态
    status = openai.FineTune.retrieve(id=job_id)["status"]
    print(f'微调任务ID: {job_id},状态: {status}')
    
print(f'微调任务ID: {job_id} 完成, 结束状态: {status}\n')

评估模型

微调成功后都会有训练结果输出,可以通过如下代码获取评估结果:

fine_tune = openai.FineTune.retrieve(id=job_id)
result_files = fine_tune.get("result_files", [])
if result_files:
    result_file = result_files[0]
    resp = openai.File.download(id=result_file["id"])
    print(resp.decode("utf-8"))

这里有丰富的模型评估数据,供我们对模型微调质量进行评估。

部署模型

如果模型效果满意,我们就可以将模型投入生产使用了。openai.FineTune.retrieve()方法返回的数据结构中的fine_tuned_model就是微调后的模型名称。可以直接拿这个模型名称在API中使用。

model_name = openai.FineTune.retrieve(id=job_id)["fine_tuned_model"]

response = openai.Completion.create(
  model=model_name,
  prompt="今天晚上吃什么好呢?\n",
  temperature=0.7,
  max_tokens=256,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0,
  stop=["END"]
)

总结

ChatGPT最让人惊艳的一点,就在于能够像人一样去对话。这种流畅的人机对话背后所展现的强大的自然语言理解力和表达力,目前只表现在通用领域。一旦进入某个专业领域,ChatGPT经常会“一本正经,胡说八道”。此时用特定领域的知识对模型进行微调是时间成本和经济成本最高的解决方案。事实证明,哪怕是最小的训练数据,也会带来明显的表现提升。

未来随着LLM变得更大、更易访问和开源,相信在不久的将来,我们可以看到微调在自然语言处理中无处不在。同时我也非常期待边缘学习的突破,可以将大模型训练的成本降下来,那时我们再来看如何从头重新训练一个大模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cesium: 绘制线段(008)

第008个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中绘制线段,左键点击开始绘制,右键点击取消绘制 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共139行)相关API参考:专栏目标示例效果 配置方式 1)…

Win11的两个实用技巧系列清理磁盘碎片、设置系统还原点的方法

Win11如何清理磁盘碎片?Win11清理磁盘碎片的方法磁盘碎片过多&#xff0c;会影响电脑的运行速度&#xff0c;所以需要定期清理&#xff0c;这篇文章将以Win11为例&#xff0c;给大家分享的整理磁盘碎片方法相信很多用户都会发现&#xff0c;随着电脑使用时间的增加&#xff0c…

一文了解 requestAnimationFrame

requestAnimationFrame 的基本使用 requestAnimationFrame 是什么 window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数&#xff0c;该回调函数会在浏…

想要实现无人机控制算法二次开发,一定不要错过这个matlab工具包

什么是Matlab工具包 Matlab工具包提供了无人机位置环控制算法、Simulink示例程序&#xff0c;通过Matlab ROS Toolbox建立Matlab&#xff08;Simulink&#xff09;与ROS之间的通信链路&#xff0c;Prometheus项目中将提供转为Matlab设计的控制接口&#xff0c;同时将继承Prome…

Scala-特质

特质 特质的混入用法 特质的叠加 特质和抽象类的区别 特质自身类型 特质 Scala 语言中&#xff0c;采用特质 trait&#xff08;特征&#xff09;来代替接口的概念&#xff0c;也就是说&#xff0c;多个类具有相同 的特质&#xff08;特征&#xff09;时&#xff0c;就可以…

ELK + Kafka 测试

配置file beat输出到 Kafkalogstash服务器从kafka获取数据并输出到es集群在es集群上查看索引kibana界面添加索引查看数据1.配置file beat输出到 Kafka 1.1 Filebeat机器配置数据采集和输出目标 做好域名解析 # vim /usr/local/filebeat/filebeat.yml # 修改输出目标为kafka…

CRM客户管理系统哪个好用?盘点前十名!

CRM客户管理系统排行&#xff1f;盘点前十名&#xff01; CRM客户管理系统是一种集成多种功能的软件系统&#xff0c;可以帮助企业跟进和管理客户关系、提高销售业绩、优化营销策略等。对于企业来说&#xff0c;选择一款适合自己的CRM系统非常重要&#xff0c;因为它能够直接影…

使用kotlin编写html dsl框架

前排提醒&#xff0c;这个框架就是我写着玩的&#xff0c;如果您已经会使用vue或其他前端框架&#xff0c;这篇文章可能对您没有什么意义。即使您不会如上提到的框架&#xff0c;也不要对该框架报有过高的期待&#xff0c;该框架更多的是&#xff0c;我自己的自娱自乐。 这里还…

新闻格式的演变及其对我们消费新闻方式的影响

这些年来&#xff0c;我们消费新闻的方式发生了翻天覆地的变化&#xff0c;从印刷报纸和广播新闻时代到 24 小时新闻频道和数字新闻平台时代。随着新闻媒体的发展&#xff0c;新闻呈现的格式也发生了变化。今天&#xff0c;新闻格式在新闻如何被受众传播和理解方面起着至关重要…

工程机械焊接件焊接结构件三维扫描检测外观质量控制-CASAIM三维扫描检测仪

焊接已发展为制造业中的一种重要的加工方法&#xff0c;广泛应用于航空、航天、冶金、石油、汽车制造以及国防等领域。工程机械焊接件品种繁多、几何形状复杂&#xff0c;焊接件质量的好坏将直接影响到产品的使用寿命长短。对焊缝表面尺寸测量及评定表面焊缝缺陷时&#xff0c;…

不到3天给公司省下近10万,低代码是真给老板省钱

早上领导开组会提了个似曾相识的需求&#xff0c;客户想要一个点餐系统。需求是用户登录后可以直接享有会员权益&#xff0c;还要提供外卖管理系统、配送系统、数据中台、BI数据分析、系统托管等O2O解决方案。 这是餐饮业典型的业务场景&#xff0c;如果缺乏必要的数字化工具支…

GitLab分支管理规范

GitLab 分支管理规范 本规范用于描述日常研发流程中关于 GitLab 上代码分支使用的规则, 大家共同严格遵守规范, 避免出现分支管理混乱现象, 保证日常的发版上线工作顺利进行。 Workspace: 工作区, 平时我们写代码的地方Index: 暂存区, 写完代码后让它变成的待提交的状态Repos…

《系统架构设计》-05-架构模型(Architecture Model)

文章目录1. 概述1.1 模型1.2 软件设计领域的架构模型2. 领域模型&#xff08;Domain Model&#xff09;2.1 概念2.2 示例3. 设计模型&#xff08;Design Model&#xff09;3.1 概念3.2 创建过程4. 代码模型4.1 概念4.2 创建过程5. 三种模型的关系1. 概述 1.1 模型 诠释&#…

“华为杯”研究生数学建模竞赛2006年-【华为杯】A题:Ad Hoc 网络中的区域划分和资源分配问题(附获奖论文)

赛题描述 Ad Hoc网络是当前网络和通信技术研究的热点之一,对于诸如军队和在野外作业的大型公司和集团来说,Ad Hoc网络有着无需基站、无需特定交换和路由节点、随机组建、灵活接入、移动方便等特点,因而具有极大的吸引力。 在Ad Hoc网络中,节点之间的通信均通过无线传输来完…

黑马Spring学习笔记(三)——Spring整合MyBatis、Junit

一、Spring整合Mybatis 步骤1:项目中导入整合需要的jar包【pom.xml】<!--Spring操作数据库需要该jar包--> <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.20</version&g…

前端技术和框架

一、各种技术概述 1.HTML &#x1f9e8;HTML中文称为超文本标记语言&#xff0c;从语义上来说&#xff0c;它只是一种是一种标识性的语言&#xff0c;并不是一种编程语言。 <p>这是一段话</p>通过这个标签可以表示文本的一个段落。而且其中还有还有图片标签、视…

Dvwa及Sqli安装

Dvwa与Sqli安装资源准备Dvwa安装SQLI安装资源准备 链接&#xff1a;https://pan.baidu.com/s/1ZhPTmSgD-VaAevK-JyWtjQ 提取码&#xff1a;2hkd Dvwa安装 首先将Dvwa解压到phpstudy的www目录下&#xff1a; 然后进入到相应的config文件下&#xff0c;会发现一个dist结尾的文…

第三节 流程控制语句

流程控制语句 顺序结构 分支结构 if分支结构&#xff1a; 格式1: if(条件表达式){ 代码 } 格式2&#xff1a; if(条件表达式){ 代码 }else{ 代码 } 格式3&#xff1a; if(条件表达式){ 代码 }else if&#xff08;&#xff09;{ 代码 }else if&#xff08;&#xff09;{ 代码…

SpringCloud(五)MQ消息队列

MQ概念常见消息模型helloworld案例实现实现spring AMQP发送消息实现spring AMQP接收消息工作消息队列实现发布订阅模型Fanout Exchange实现DirectExchange实现TopicExchange实现DirectExchange 和FanoutExchange的差异DirectExchange 和TopicExchange的差异基于RabbitListener注…

浅谈hcip devops考试心得

官网&#xff1a;华为HCIP-Cloud Service DevOps Engineer 今天考过了hcip devops的考试&#xff0c;写两句&#xff0c;对于一些参加考试的朋友留下一点参考: 第一个问题&#xff0c;hcip还需要报班嘛&#xff1f; 我认为这一项是不需要的&#xff0c;有点浪费钱&#xff0c;…