ChatGPT进阶:利用Fine-tuning训练自己的模型

这篇具有很好参考价值的文章主要介绍了ChatGPT进阶:利用Fine-tuning训练自己的模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

ChatGPT是“大力出奇迹”的经典表现,大模型给ChatGPT带来了惊人的智能,但是要训练这样的大模型,可是十分烧钱的,根据OpenAI给出的数据,1700亿参数的Davinci模型从头训练一遍,大概需要耗时3个月,耗资150万美元。那我们普通人或者小公司面对这个高门槛,对自定义模型是不是就完全没有希望了呢?其实除了从头训练一个模型,我们还可以选择基于一个基础模型进行训练,这样,我们可以往里添加自己的个性化数据,最终得到一个领域增强的个性化模型,这个技术被OpenAI称为Fine-tuning。

个性化模型有什么用?我们知道,OpenAI给的模型(如Davinci、Curie、gpt-3.5-turbo)都是通用化模型,而现代社会的行业和知识如此之庞大,每个领域都有自己细分的专业知识,比如,我们知道ChatGPT的一个典型应用场景就是智能客服,但同样是客服,保险领域的客服和淘宝店铺的客服需要面对的客户和需要解答的问题就完全不一样,想要给出更好的答案,我们就需要打磨自己的个性化模型。

原理

OpenAI的Fine-tuning技术基于预训练模型,通过在小规模任务上对该模型进行微调来快速适应具体的任务。其核心原理是将预训练模型的权重进行微调,以适应新任务的输入和输出。

Fine-tuning一般包括以下步骤:

  1. 加载预训练模型:选择一个与所需任务相关的预训练模型,并加载其权重。
  2. 选择任务数据集:选定特定任务所需的数据集。
  3. 对模型进行微调:将任务数据集作为输入,以最小化模型在此数据集上的损失函数。在这个过程中,通常需要在训练集和验证集上进行多次迭代,以避免过拟合问题。
  4. 在测试集上进行测试:使用微调后的模型,在测试集上测试其性能表现。

Fine-tuning的优点在于它可以让我们快速获得针对特定任务的高质量模型,而无需从头开始训练模型。同时,由于Fine-tuning仅更新了部分权重,并且大多数权重已经在预训练阶段得到了很好的优化,因此Fine-tuning相对于从头开始训练模型而言,需要的训练时间和计算资源都要少得多。

步骤

这里,我想到了一个点子,知识星球的粉丝群问答不就是最好的例子么,一问一答,刚刚好对应上,比如齐俊杰的投资理财粉丝群,如果把最近一个月的问答数据作为训练数据,看看结果如何,可能会是个比较有意思的事情。

a.准备训练数据

我们需要将需要训练的数据准备为jsonl格式,这种格式的特点就是每一行都是json的格式(关于什么是json,参考这里)如下

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

比如,我的训练数据为dataset.jsonl,里面的问答大概有2500行,对于fine-tuning来说,数据量不能太少,少于100条数据的话,训练出来的模型质量应该好不了:

{"prompt": "医药和消费有什么基金推荐的", "completion": "医药可以看看工银前沿的赵蓓,她挺均衡的,对于这个行业我了解不多,你还可以看看医药100指数,消费挺多的,消费50也挺好。"}
{"prompt": "请教一下老师,恒生科技第一大持仓股是快手。而快手是亏损最大的互联网企业。似乎齐老师也说过不看好快手,会不会影响恒生科技持仓。", "completion": "如果你要是能选股,确实不应该买指数。从指数选择的角度来说。中概互联我们更看好一些。但他跟恒生科技的相关度其实很高"}
{"prompt": "想问一下国投瑞银这边基金公司和綦缚鹏的风格实力怎么样", "completion": "他风格不是很固定。最近在偏向周期。(个人观点,不作为投资建议)"}

其中,prompt是问题,completion是答案。

b.安装工具

我们都知道,在机器学习领域,Python语言是主力(参考这里),在OpenAI也不例外,我们需要先安装Python语言环境,安装这一步省略不讲了。安装完毕后,需要使用python自带的pip工具安装OpenAI提供的训练工具

pip install --upgrade openai

同时,因为需要跟OpenAI的平台进行交互,所以,我们需要OPENAI_API_KEY,这个是需要注册的,且要收费

export OPENAI_API_KEY="<OPENAI_API_KEY>"

c.调优数据

openai tools fine_tunes.prepare_data -f dataset.jsonl

该指令会帮我们优化训练数据,该指令运行过程中会问我们几个问题,主要是给prompt添加了固定的后缀,比如”->”,给completion添加了开头的空格和结尾的换行符,如下

{"prompt":"医药和消费有什么基金推荐的 ->","completion":" 医药可以看看工银前沿的赵蓓,她挺均衡的,对于这个行业我了解不多,你还可以看看医药100指数,消费挺多的,消费50也挺好。\n"}
{"prompt":"请教一下老师,恒生科技第一大持仓股是快手。而快手是亏损最大的互联网企业。似乎齐老师也说过不看好快手,会不会影响恒生科技持仓。 ->","completion":" 如果你要是能选股,确实不应该买指数。从指数选择的角度来说。中概互联我们更看好一些。但他跟恒生科技的相关度其实很高\n"}
{"prompt":"想问一下国投瑞银这边基金公司和綦缚鹏的风格实力怎么样 ->","completion":" 他风格不是很固定。最近在偏向周期。(个人观点,不作为投资建议)\n"}

准备好的数据文件是dataset_prepared.jsonl

d.提交数据训练

我们准备好数据后,就要提交到OpenAI的平台上进行训练了,此时需要提供数据文件dataset_prepared.jsonl和模型,目前OpenAI支持的BASE_MODEL有4个(参考这里),是Davinci、Curie、Ada、Babbage,从左到有,价格分别是从贵到便宜,性能是从好到一般。如果想知道每个模型的效果,可以同时基于2个BASE_MODEL进行训练,最后比较效果。这次考虑到训练成本,先用Curie作为BASE_MODEL训练。

openai api fine_tunes.create -t dataset_prepared.jsonl -m curie

耗时大概30分钟以上。训练的进度可以通过下面这个命令获取,ft-SSIJ4DsHFfp9LEtuHWyQcn5B这个是fine-tuning的job ID,是上面create命令会给出的。

openai api fine_tunes.follow -i ft-SSIJ4DsHFfp9LEtuHWyQcn5B

这里有个小技巧,如果训练数据集较大,不用每次提交训练任务都要把数据重新上传一遍,可以直接使用之前已经上传的数据,使用方法如下

openai api fine_tunes.create -t file-WSkHmtSfBLORMAhEoEVyBDO4 -m curie

这个file-WSkHmtSfBLORMAhEoEVyBDO4是之前上传完文件后通过下面的命令得到的

(.venv) ➜  openai api files.list                      
{
  "data": [
    {
      "bytes": 620175,
      "created_at": 1680619086,
      "filename": "dataset_prepared.jsonl",
      "id": "file-WSkHmtSfBLORMAhEoEVyBDO4",
      "object": "file",
      "purpose": "fine-tune",
      "status": "processed",
      "status_details": null
    },
  ],
  "object": "list"
}

e.使用模型

查看fine-tuning任务的详细信息

(.venv) ➜  openai api fine_tunes.list                                                                                
{
  "data": [
    {
      "created_at": 1680619087,
      "fine_tuned_model": "curie:ft-personal-2023-04-04-15-28-34",
      "hyperparams": {
        "batch_size": 2,
        "learning_rate_multiplier": 0.1,
        "n_epochs": 4,
        "prompt_loss_weight": 0.01
      },
      "id": "ft-SSIJ4DsHFfp9LEtuHWyQcn5B",
      "model": "curie",
      "object": "fine-tune",
      "organization_id": "org-WTfVkVyUtqWdmv711ZZWHw7T",
      "result_files": [
        {
          "bytes": 225243,
          "created_at": 1680622115,
          "filename": "compiled_results.csv",
          "id": "file-RfmMXqxf94DhsxLN2jfATCTW",
          "object": "file",
          "purpose": "fine-tune-results",
          "status": "processed",
          "status_details": null
        }
      ],
      "status": "succeeded",
      "training_files": [
        {
          "bytes": 620175,
          "created_at": 1680619086,
          "filename": "dataset_prepared.jsonl",
          "id": "file-WSkHmtSfBLORMAhEoEVyBDO4",
          "object": "file",
          "purpose": "fine-tune",
          "status": "processed",
          "status_details": null
        }
      ],
      "updated_at": 1680622115,
      "validation_files": []
    },
  ],
  "object": "list"
}

(.venv) ➜   openai api fine_tunes.follow -i ft-SSIJ4DsHFfp9LEtuHWyQcn5B
[2023-04-04 22:38:07] Created fine-tune: ft-SSIJ4DsHFfp9LEtuHWyQcn5B
[2023-04-04 22:46:52] Fine-tune costs $4.89
[2023-04-04 22:46:53] Fine-tune enqueued. Queue number: 5
[2023-04-04 22:47:38] Fine-tune is in the queue. Queue number: 4
[2023-04-04 22:50:08] Fine-tune is in the queue. Queue number: 3
[2023-04-04 22:50:15] Fine-tune is in the queue. Queue number: 2
[2023-04-04 22:54:51] Fine-tune is in the queue. Queue number: 1
[2023-04-04 22:57:26] Fine-tune is in the queue. Queue number: 0
[2023-04-04 22:57:50] Fine-tune started
[2023-04-04 23:06:11] Completed epoch 1/4
[2023-04-04 23:20:51] Completed epoch 3/4
[2023-04-04 23:28:34] Uploaded model: curie:ft-personal-2023-04-04-15-28-34
[2023-04-04 23:28:35] Uploaded result file: file-RfmMXqxf94DhsxLN2jfATCTW
[2023-04-04 23:28:35] Fine-tune succeeded

Job complete! Status: succeeded  
Try out your fine-tuned model:

openai api completions.create -m curie:ft-personal-2023-04-04-15-28-34 -p <YOUR_PROMPT>   

模型训练完毕,得到的自定义模型是”curie:ft-personal-2023-04-04-15-28-34”, 排队花了20分钟,训练花了30分钟,耗费资金大概4.89美元,2500条数据,还是不便宜的。

下面我们用新模型进行提问

(.venv) ➜   openai api completions.create -m "curie:ft-personal-2023-04-04-15-28-34" -p "医药和消费有什么基金推荐的 ->"

》医药和消费有什么基金推荐的 -> 消费和医药比%     

可惜,给出的答案比较差,我们查看训练的结果数据,我们训练的最终目的是希望损失函数的结果最小,即training_loss值最小,且使得training_sequence_accuracy和training_token_accuracy值最大,但从下面的数据看,training_loss最小才0.06372293254171614,training_sequence_accuracy为0.5,training_token_accuracy最高也才0.9166666666666666,且表现得很不稳定,从这也就印证了为什么问答的效果并不好。

(.venv) ➜   openai api fine_tunes.results -i "ft-SSIJ4DsHFfp9LEtuHWyQcn5B"
step,elapsed_tokens,elapsed_examples,training_loss,training_sequence_accuracy,training_token_accuracy
1,482,2,0.45391547040630686,0.0,0.5755395683453237
2,980,4,0.6011948533307662,0.0,0.6086956521739131
3,1334,6,0.5914613516018767,0.0,0.528
4,1640,8,0.41827734171512065,0.0,0.5526315789473685
5,2618,10,0.5738252286081992,0.0,0.6934673366834171
6,3148,12,0.32921856693228024,0.0,0.639344262295082
7,3550,14,0.5036230062589969,0.0,0.5983606557377049
3855,2231118,7710,0.06739243882282422,0.0,0.9139784946236559
......
......
省略了中间的几千行内容
......
......
3856,2231616,7712,0.16957119258711775,0.0,0.8467153284671532
3857,2232082,7714,0.2004900809357239,0.5,0.808
3858,2232276,7716,0.08515305384741474,0.0,0.8518518518518519
3859,2232678,7718,0.19010555123939107,0.0,0.8529411764705882
3860,2233608,7720,0.057206735256356465,0.0,0.8762886597938144
3861,2234074,7722,0.2355557036819172,0.0,0.7916666666666666
3862,2234396,7724,0.14572308102632223,0.0,0.905511811023622
3863,2235182,7726,0.13363321007470183,0.0,0.8378378378378378
3864,2235488,7728,0.09592527983439035,0.5,0.9166666666666666
3865,2236002,7730,0.06372293254171614,0.0,0.8909090909090909

那好,下一步就是要定位到具体的问题,然后进行调优,这个就要放到下一篇文章再讲了。

结论

在这篇文章里讲述了模型微调fine-tuning的基本概念和原理,还有利用OpenAI的工具训练自有模型的快捷方法。整体来说,快速入门还是比较简单的,要把模型调好还是要花不少时间和资金成本的,上面的演示的curie还不是最贵的基础模型,最贵的是davinci模型,还要贵10倍。文章来源地址https://www.toymoban.com/news/detail-580269.html

到了这里,关于ChatGPT进阶:利用Fine-tuning训练自己的模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI语音合成 VITS Fast Fine-tuning,半小时合成专属模型,部署训练使用讲解

    项目名:VITS-fast-fine-tuning (VITS 快速微调) 项目地址:https://github.com/Plachtaa/VITS-fast-fine-tuning 支持语言:中、日、英 官方简介: 这个代码库会指导你如何将自定义角色(甚至你自己),加入预训练的VITS模型中,在1小时内的微调使模型具备如下功能: 在 模型所包含的任意两

    2024年02月08日
    浏览(42)
  • 深入理解预训练(pre-learning)、微调(fine-tuning)、迁移学习(transfer learning)三者的联系与区别

    你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先,你需要随机初始化参数,然后开始训练网络,不断调整参数,直到网络的损失越来越小。在训练的过程中,一开始初始化的参数会不断变化。当你觉得结果很满意的时候,你就可以将训练模型的参数保存下来

    2024年02月15日
    浏览(37)
  • 小白理解GPT的“微调“(fine-tuning)

    对于GPT-3.5,我们实际上并不能在OpenAI的服务器上直接训练它。OpenAI的模型通常是预训练好的,也就是说,它们已经在大量的语料上进行过训练,学习到了语言的基本规则和模式。 然而,OpenAI提供了一种叫做\\\"微调\\\"(fine-tuning)的方法,让我们可以在预训练好的模型基础上进行

    2024年02月04日
    浏览(45)
  • Fine-tuning:个性化AI的妙术

    一、什么是大模型 ChatGPT大模型今年可谓是大火,在正式介绍大模型微调技术之前,为了方便大家理解,我们先对大模型做一个直观的抽象。 本质上,现在的大模型要解决的问题,就是一个序列数据转换的问题: 输入序列 X = [x1, x2, ..., xm], 输出序列Y = [y1, y2, …, yn],X和Y之

    2024年01月17日
    浏览(51)
  • 对 ChatGLM-6B 做 LoRA Fine-tuning

    ChatGLM-6B 是一个支持中英双语的对话语言模型,基于 GLM (General Language Model)。它只有 62 亿个参数,量化后最低 (INT4 量化) 只需要 6GB 的显存,完全可以部署到消费级显卡上。在实际使用这个模型一段时间以后,我们发现模型的对话表现能力确实非常不错。那么,基于这个模型做

    2023年04月25日
    浏览(33)
  • 一分钟搞懂 微调(fine-tuning)和prompt

    大家都是希望让预训练语言模型和下游任务靠的更近,只是实现的方式不一样。Fine-tuning中:是预训练语言模型“迁就“各种下游任务;Prompting中,是各种下游任务“迁就“预训练语言模型。 微调(fine-tuning)和prompt是自然语言处理领域中常用的两个术语,它们都是指训练和

    2023年04月26日
    浏览(50)
  • 深度学习概念(术语):Fine-tuning、Knowledge Distillation, etc

    这里的相关概念都是基于已有预训练模型,就是模型本身已经训练好,有一定泛化能力。需要“再加工”满足别的任务需求。 进入后GPT时代,对模型的Fine-tuning也将成为趋势,借此机会,我来科普下相关概念。 有些人认为微调和训练没有区别,都是训练模型,但是微调是在原

    2024年02月09日
    浏览(39)
  • llamafactory:unified efficient fine-tuning of 100+ lanuage models

    1.introduction llamafactory由三个主要模块组成,Model Loader,Data Worker,Trainer。 2.Efficient fine-tuning techniques 2.1 Efficient Optimization 冻结微调:冻结大部分参数,同时只在一小部分解码器层中微调剩余参数,GaLore将梯度投影到低维空间,以内存高效的方法实现全参数学习;相反,Lora冻结

    2024年04月14日
    浏览(39)
  • 了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

    🍉 CSDN 叶庭云 : https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要巨大的计算资源来运行。特别是,当需要为特定的下游

    2024年04月14日
    浏览(68)
  • Fine-tuning Large Enterprise Language Models via Ontological Reasoning

    本文是LLM系列文章,针对《Fine-tuning Large Enterprise Language Models via Ontological Reasoning》的翻译。 大型语言模型(LLM)利用特定任务的训练数据,将微调作为一种适应不同目标的技术。任务特异性应该与领域定向齐头并进,即LLM的专业化,以准确地处理给定感兴趣领域的任务。然

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包