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

news/2024/4/27 4:42:16/文章来源:https://blog.csdn.net/jarodyv/article/details/129243315

利用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 openaiopenai.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.luyixian.cn/news_show_74842.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript split()方法

JavaScript split()方法 目录JavaScript split()方法一、定义和用法二、语法三、参数值四、返回值五、更多实例5.1 省略分割参数5.2 使用limit参数5.3 使用一个字符作为分割符一、定义和用法 split() 方法用于把一个字符串分割成字符串数组。 二、语法 string.split(separat…

NCRE计算机等级考试Python真题(四)

第四套试题1、以下选项中&#xff0c;不属于需求分析阶段的任务是&#xff1a;A.需求规格说明书评审B.确定软件系统的性能需求C.确定软件系统的功能需求D.制定软件集成测试计划正确答案&#xff1a; D2、关于数据流图&#xff08;DFD&#xff09;的描述&#xff0c;以下选项中正…

RTMP的工作原理及优缺点

一.什么是RTMP&#xff1f;RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;实时消息传输协议&#xff09;是一种用于低延迟、实时音视频和数据传输的双向互联网通信协议&#xff0c;由Macromedia&#xff08;后被Adobe收购&#xff09;开发。RTMP的工作原理是&#…

IP-GUARD控制台账户输入多次错误密码锁定后该如何解锁?

其他管理员账户给锁定了,暂时只能等其锁定时间到了才可以再次输入,默认是设置是锁定30min; 1、如果急需此账户查看,可以使用admin系统管理员账户登录控制台,在工具-账户中清除这个账户的密码,重新登录设置密码。

NIO与零拷贝

目录 一、零拷贝的基本介绍 二、传统IO数据读写的劣势 三、mmap优化 四、sendFile优化 五、 mmap 和 sendFile 的区别 六、零拷贝实战 6.1 传统IO 6.2 NIO中的零拷贝 6.3 运行结果 一、零拷贝的基本介绍 零拷贝是网络编程的关键&#xff0c;很多性能优化都离不开。 在…

【云原生kubernetes】k8s 常用调度策略使用详解

一、前言 通过之前的学习&#xff0c;我们了解到k8s集群中最小工作单位是pod&#xff0c;对于k8s集群来说&#xff0c;一个pod的完整生命周期是由一系列调度策略来控制&#xff0c;这些调度策略具体是怎么工作的呢&#xff1f;本文将详细讨论下这个问题。 二、k8s调度策略简介…

【多目标优化算法】多目标蚱蜢优化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

APP测试的7大注意点。

1. 运行 1&#xff09; App安装完成后的试运行&#xff0c;可正常打开软件。 2&#xff09; App打开测试&#xff0c;是否有加载状态进度提示。 3&#xff09; App⻚面间的切换是否流畅&#xff0c;逻辑是否正确。 4&#xff09; 注册 同表单编辑⻚面 用户名密码⻓度 …

快手电商新增商品信息诊断规则,对商家有何影响?

1、2022年快手短剧日活跃用户达2.6亿 新榜讯 近日&#xff0c;快手数据显示&#xff0c;2022年快手短剧日活跃用户达2.6亿&#xff0c;现在的付费用户数对比2022年4月增长超过480%&#xff0c;快手已经是最大的短剧消费市场。此外&#xff0c;2023年快手小游戏日活跃用户峰值超…

一文掌握项目管理工具 —— 时标网络图

一、认识时标网络图二、时标网络图的绘制方法三、自由时差、关键路径、总时差四、时标网络图可解决哪些问题进度调整的问题计算检测点时的 PV 数据资源平滑问题在系统集成项目管理工程师下午的案例分析考试中,有一道计算题分值达 20 分。整套试卷的总分为 75分,考试能否通过合…

ubuntu下用i686-w64-mingw32交叉编译支持SDL、Openssl的ffmpeg库

前言 本篇博客是基于前两篇关于ffmpeg交叉编译下&#xff0c;进行再次编译操作。ubuntu下ffmpeg的交叉编译环境搭建可以参看以下我的这篇博客&#xff1a;https://blog.csdn.net/linyibin_123/article/details/108759367 &#xff1b; ubuntu下交叉编译openssl及交叉编译支持o…

20分钟6个示例4个动图教你学会Async Hooks

序幕 async_hooks模块提供了一个全新的功能世界,但作为 Node.js 爱好者,我最感兴趣的是,它可以让您轻松了解我们在应用程序中经常执行的一些任务的幕后情况。 在本文中,我将尝试借助async_hooks模块来演示和解释一个典型的异步资源的生命周期。 Async Hooks API 简介 as…

OSWatcher.sh脚本说明

OSWatcher.sh脚本位于oswbb目录下&#xff08;Oracle 19c数据库中脚本的路径是&#xff1a; /u01/app/oracle/product/19.0.0/dbhome_1/suptools/tfa/release/tfa_home/ext/oswbb/&#xff09;&#xff0c;由脚本startOSWbb.sh和stopOSWbb.sh来调用启动和停止它。 1. startOSW…

《数据库系统概论》学习笔记——第七章 数据库设计

教材为数据库系统概论第五版&#xff08;王珊&#xff09; 这一章概念比较多。最重点就是7.4节。 7.1 数据库设计概述 数据库设计定义&#xff1a; 数据库设计是指对于一个给定的应用环境&#xff0c;构造&#xff08;设计&#xff09;优化的数据库逻辑模式和物理结构&#x…

C#窗口介绍

窗口就是打开程序我们所面对的一个面板&#xff0c;里面可以添加各种控件&#xff0c;如下图所示&#xff0c;我们可以在属性栏设置其标题名称、图标、大小等。图1 窗口图 图2 设置面板 图3 设置双击标题框&#xff0c;会生成Load函数&#xff0c;也可以到事件里面去找Load函数…

线上监控诊断神器arthas

目录 什么是arthas 常用命令列表 1、dashboard仪表盘 2、heapdump dumpJAVA堆栈快照 3、jvm 4、thread 5、memory 官方文档 安装使用 1、云安装arthas 2、获取需要监控进程ID 3、运行arthas 4、进入仪表盘 5、其他命令使用查看官方文档 什么是arthas arthas是阿…

《嵌入式应用开发》实验一、开发环境搭建与布局(上)

1. 搭建开发环境 去官网&#xff08;https://developer.android.google.cn/studio&#xff09;下载 Android Studio。 安装SDK&#xff08;默认Android 7.0即可&#xff09; 全局 gradle 镜像配置 在用户主目录下的 .gradle 文件夹下面新建文件 init.gradle&#xff0c;内容为…

web服务器(1)

阻塞和非阻塞、同步和异步 网络IO阶段一&#xff1a;数据就绪 操作系统&#xff0c;tcp接受缓冲区 阻塞&#xff1a;调用IO方法的线程进入阻塞状态 非阻塞&#xff1a;不会改变线程的状态&#xff0c;通过返回值判断 网络IO阶段二&#xff1a;数据读写 应用程序 同步…

新闻稿的制作流程:从确定新闻稿目的到将其分发给媒体

对于任何希望向媒体和公众传达具有新闻价值的信息的组织来说&#xff0c;新闻稿都是必不可少的工具。精心制作的新闻稿可以帮助您宣传您的业务、产品或服务&#xff0c;并可以产生有价值的媒体报道。在本文中&#xff0c;我们将指导您完成新闻稿的制作过程&#xff0c;从确定新…

社区1月月报|OceanBase 4.1 即将发版,哪些功能将会更新?

我们每个月都会和大家展开一次社区进展的汇报沟通会&#xff0c;希望通过更多的互动交流让OceanBase 开源社区更加透明&#xff0c;实现信息共享&#xff0c;也希望能营造更加轻松的氛围&#xff0c;为大家答疑解惑&#xff0c;让大家畅所欲言。如果您对我们的社区有任何建议&a…