ChatGPT Advanced: 微調整を使用して独自のモデルをトレーニングする

序文

ChatGPT は「多大な労力をかけて奇跡を起こす」という古典的なパフォーマンスです。大規模なモデルは ChatGPT に驚くべき知能をもたらしますが、そのような大規模なモデルを訓練するには非常にコストがかかります。OpenAI が提供するデータによると、Davinci モデルは 1,700 億のパラメータを持ちます1回の訓練に約3か月、150万ドルの費用がかかります。では、私たち一般人や中小企業にはこの敷居が高く、カスタムモデルには希望はないのでしょうか?実際、モデルを最初からトレーニングすることに加えて、基本モデルに基づいてトレーニングすることも選択できます。このようにして、それに独自のパーソナライズされたデータを追加し、最終的にドメイン拡張を備えたパーソナライズされたモデルを取得できます。このテクノロジーは、 OpenAIによるファインチューニングと呼ばれるものです。

パーソナライゼーション モデルの用途は何ですか? OpenAI によって与えられるモデル (Davinci、Curie、gpt-3.5-turbo など) は一般的なモデルであり、現代社会の産業と知識は膨大であり、各分野にはそれぞれ細分化された専門知識があることがわかっています。 ChatGPT の典型的なアプリケーション シナリオはインテリジェントな顧客サービスですが、顧客サービスでもあります。保険分野の顧客サービスとタオバオ ストアの顧客サービスでは、顧客も答えるべき質問もまったく異なります。より良い回答を提供したい場合は、当社が対応します。私たち自身のパーソナライズされたモデルを磨き上げる必要があります。

原理

OpenAI の微調整テクノロジーは、事前トレーニングされたモデルに基づいており、小規模なタスクでモデルを微調整することで、特定のタスクに迅速に適応できます。その中心原理は、新しいタスクの入力と出力に適応するために、事前トレーニングされたモデルの重みを微調整することです。

微調整には通常、次の手順が含まれます。

  1. 事前トレーニングされたモデルをロードする: 目的のタスクに関連する事前トレーニングされたモデルを選択し、その重みをロードします。
  2. タスク データセットの選択: 特定のタスクに必要なデータセットを選択します。
  3. モデルを微調整します。タスク データセットを入力として取得して、このデータセット上のモデルの損失関数を最小限に抑えます。このプロセスでは、過剰適合の問題を回避するために、通常、トレーニング セットと検証セットに対して複数の反復を実行する必要があります。
  4. テスト セットでテストする: 微調整されたモデルを使用して、テスト セットでそのパフォーマンスをテストします。

微調整の利点は、モデルを最初からトレーニングすることなく、特定のタスク用の高品質のモデルを迅速に取得できることです。同時に、微調整では重みの一部のみが更新され、ほとんどの重みは事前トレーニング段階で適切に最適化されているため、モデルを最初からトレーニングする場合と比較して、微調整にはより多くのトレーニング時間とコンピューティング リソースが必要になります。 . ましてや。

ステップ

ここでアイデアを思いつきました。ナレッジ プラネットのファン グループの質疑応答がその最良の例ではないでしょうか? データをトレーニングして結果を確認する方が面白いかもしれません。

a. 学習データを準備する

学習させるデータをjsonl形式で用意する必要がありますが、この形式の特徴は以下のように各行がjson形式になっている点です(jsonとは何かについては こちら を参照) 。

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

たとえば、トレーニング データはdataset.jsonl約 2,500 行の質問と回答ですが、微調整を行うには、データ量が少なすぎてはなりません。データが 100 個未満であると、トレーニングされたモデルの品質が良くないはずです。 :

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

このうち、プロンプトは質問であり、完了は答えです。

b. ツールをインストールする

機械学習の分野では Python 言語が主力であることは誰もが知っていますが (こちらを参照)、OpenAI も例外ではありませんが、最初に Python 言語環境をインストールする必要があり、インストール手順は省略されます。インストールが完了したら、Python に付属のツールを使用して、pipOpenAI が提供するトレーニング ツールをインストールする必要があります。

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":" 医药可以看看工银前沿的赵蓓,她挺均衡的,对于这个行业我了解不多,你还可以看看医药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 に基づいて同時にトレーニングし、最終的に効果を比較することができます。今回は訓練コストを考慮して、まずキュリーをBASE_MODEL訓練として使用します。

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

約30分以上かかります。トレーニングの進行状況は、ft-SSIJ4DsHFfp9LEtuHWyQcn5B コマンドで取得できます。これは、上記の create コマンドで指定された微調整のジョブ ID です。

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. モデルを使用する

微調整タスクの詳細を表示する

(.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

次のステップは、特定の問題を特定してチューニングを実行することです。これについては、次の記事で説明します。

結論は

この記事では、モデルの微調整の基本概念と原則、および OpenAI のツールを使用して独自のモデルをトレーニングする簡単な方法について説明します。全体として、クイック スタートは比較的簡単ですが、モデルの調整には依然として多くの時間と費用がかかります。上で示した curie は最も高価な基本モデルではありません。最も高価なのは davinci モデルで、さらに高価です。 10回。

おすすめ

転載: blog.csdn.net/zhaomengsen/article/details/130711049