ChatGPTのAIモデルをFine-tuningしてみた

# 1.はじめに
本記事では、Fine-tuningを試した内容をまとめています。
OpenAIが開発したAIであるChatGPTでもFine-tuningの機能が提供されているのでそちらを使用しています。
本記事の目標は以下の通りです。
・OpenAIのコンソール上でFine-tuningを実施し、語尾や口調を変化させること。

# 2.Fine-tuningとは
Fine-tuningとは、大量のデータで事前学習されたモデル（事前学習済みモデル）に対して、解きたいタスクに応じたデータを追加で学習させ、パラメータを微調整することを指します。
Fine-tuningを行うことで特定の目的に特化させ、その特定分野に関しては回答の精度を上げることができます。

# 3.準備作業
本記事ではOpenAIを使用していますので、OpenAIのアカウントが必要になります。
アカウントの作成方法については、他の方が記事を書いてくださっていますので、そちらを参考にしていただければと思います。
https://qiita.com/shimmy-notat/items/1e22dcdaa06ea54208ac

# 4.学習データの作成
学習データは以下のようなjsonl形式のファイルが必要になります。
```
{"messages": [{"role": "system", "content": "あなたは武士です"}, {"role": "user", "content": "What your name?"}, {"role": "assistant", "content": "拙者、〇〇と申す。武士としての道を歩む者でござる。お見知りおき願いたい。"}]}
{"messages": [{"role": "system", "content": "あなたは武士です"}, {"role": "user", "content": "What's the weather like today?"}, {"role": "assistant", "content": "本日も快晴でござるな。青空が美しい。"}]}
```

学習データの作成はOpenAIのコンソールを使用して行いました。
Playground > Chatで以下のチャットを入力しています。
![スクリーンショット 2024-06-23 9.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/ebdaecb8-5a87-bff8-ba8e-78b40de381f4.png)


```
あなたはgpt-3.5-turboのファインチューニング用のデータを作成します。
以下のフォーマットでJSONL形式のファイルを作成してください。
ファインチューニングしたいAIの属性は武士です。一人称は「拙者」で語尾は「ござる」などです。
====
{"messages": [{"role": "system", "content": "あなたは武士です"}, {"role": "user", "content": "What your name?"}, {"role": "assistant", "content": "拙者、〇〇と申す。武士としての道を歩む者でござる。お見知りおき願いたい。"}]}
{"messages": [{"role": "system", "content": "あなたは武士です"}, {"role": "user", "content": "What's the weather like today?"}, {"role": "assistant", "content": "本日も快晴でござるな。青空が美しい。"}]}
```
※サンプルの記載を省くと、babbage-002などの古いモデルのフォーマットで出力されるので注意が必要です。

# 5.ファインチューニングの手順
①のコンソールからFine-tuningを選択し、②の右上のCreateを選択します。
![スクリーンショット 2024-06-07 16.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/5374c03e-7eac-636a-ce1b-d3dbed71ca50.png)
設定値はそれぞれ以下の通り
### Base Model
どのモデルをベースにFine-tuningするかを選択する項目です。
Fine-tuningしたモデルがあれば、それをさらにFine-tuningすることも可能。
今回は`gpt-3.5-turbo-0125`を使用します。
![スクリーンショット 2024-06-07 16.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/966e139e-3245-cda7-3ea5-c143f658562b.png)


### Training data
トレーニング用のデータです。jsonl形式でアップロードする必要があります。
既にアップロード済みの場合は、FileIDから指定可能。
`4.学習データの作成`で作成したjsonl形式のファイルをこちらではアップロードします。
![スクリーンショット 2024-06-07 16.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/b160a29e-29b5-f47e-f878-fa630d96ad73.png)


### Validation data
テスト用のデータです。トレーニングデータと同様にjsonl形式で用意します。
![スクリーンショット 2024-06-07 16.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/76568665-ece1-5a36-91f2-7be610da3e26.png)


### Suffix
モデルのIDにカスタムSuffixを入れる項目です。入力することで任意の接尾辞をつけることができます。省略可能です。
![スクリーンショット 2024-06-07 16.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/462bd0af-ff4d-4c11-b038-a10bbbcde50f.png)
入力すると以下のカスタムSuffixの箇所にSuffixが設定されます。
```
ft:ファインチューニングに使用したモデル:personal:カスタムSuffix:ランダムな文字列
```

### Seed
ランダム性を制御する値。
![スクリーンショット 2024-06-07 16.59.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/f657879a-18e6-db5c-818e-ad725e566f77.png)


### Configure hyperparameters
以下の記事でわかりやすく記載されています。
https://qiita.com/mamosanhaeiyuudesu/items/e0c4e9f6db7435e4c2cf
![スクリーンショット 2024-06-07 17.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/64cb6663-8125-6a46-b0d4-6122200a80e2.png)


# 6.ファインチューニング後のモデルの評価
Compare機能を使用してFine-tuningの結果を確認します。
Fine-tuningの結果の右下にあるPlaygroundボタンから遷移できます。
![スクリーンショット 2024-06-07 17.02.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/27ec6256-5859-13b3-e1ae-29e8a5360bdb.png)

`gpt-3.5-turbo`と結果を比較します。
System欄に学習データにもあった「{“role": "system", "content": "あなたは武士です”}」部分のcontent部分を入力します。
![スクリーンショット 2024-06-07 17.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/d6419aa2-2bb6-15e8-0a2a-54472795142d.png)
その後、メッセージを送ることで`gpt-3.5-turbo`と学習後のモデルのそれぞれの結果を確認できます。
![スクリーンショット 2024-06-07 17.06.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/a8cfeddb-5366-bf76-36fb-e8ed347a04f6.png)

次はテストデータになかったような内容を入力してみます。
![スクリーンショット 2024-06-16 11.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/4bdfd80c-3838-ef57-4cdd-e1feb0a4867e.png)

見ての通り、テストデータ外の質問などでも語尾などが変わっているように思います。
もう少し回答内容の精度を上げることは可能かと思いますが、最低限語尾の変更などはできたと思います。

# 7.ファインチューニングのベストプラクティス
今回のFine-tuningをやっている最中に失敗した内容をまとめます。
### 今回起こったエラーケースとその対処法
#### テストデータ作成時の失敗
chatGPTにテストデータ作成の際にサンプルなしで渡すと古い形式でデータが作成される。
また、初期設定だとデータが途中で途切れるため、Maximum Tokensの設定を大きくしましょう。テストデータは最低10件必要になります。
![スクリーンショット 2024-06-16 11.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/42745869-4d25-5b12-fc29-844316511cfb.png)

#### 学習時の失敗
今回の1つの語尾を学習させましたが、複数の語尾を学習させようとすると質問に対する回答が混ざることがありました。基本的にテストデータのcontent部分の内容を1つに絞った方が良さそうです。
![スクリーンショット 2024-06-02 11.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120185/b4bbc21d-5937-f744-5671-194e33d7e7c3.png)



### 継続的な改善のためのヒント
今回は使用しませんでしたが、バリデーションデータについて公式ドキュメントに以下の記載があるので今後精度の向上などを目指すのであれば、バリデーションデータの活用などを行った方が良さそうです。

>After collecting the initial dataset, we recommend splitting it into a training and test portion. When submitting a fine-tuning job with both training and test files, we will provide statistics on both during the course of training. These statistics will be your initial signal of how much the model is improving. Additionally, constructing a test set early on will be useful in making sure you are able to evaluate the model after training, by generating samples on the test set.

```
最初のデータセットを収集した後、トレーニング用とテスト用に分割することをお勧めします。
トレーニングファイルとテストファイルの両方を使用してファインチューニングジョブを送信すると、トレーニング中に両者の統計情報を提供いたします。
これらの統計情報は、モデルがどの程度改善しているかの初期の指標になります。
さらに、早期にテストセットを構築することは、トレーニング後にテストセットでサンプルを生成してモデルを評価できるようにするために有用です。
```


# 8.まとめ
今回語尾などの変更を目標にFine-tuningを行いました。
やってみた印象としてはやはりテストデータの準備が一番重要に感じました。
今回は、ChatGPTで用意したデータをそのまま利用しましたが、より精度の高い結果を求めるならデータ量を増やしたり、学習データ自体の内容の吟味も重要かと思います。
あとは、過学習などの要因となるため、あまり知識のない状態でConfigure hyperparametersあたりの設定値は変更を加えるべきではないという印象を感じました。




# 9.参考記事
https://qiita.com/shimmy-notat/items/1e22dcdaa06ea54208ac
https://qiita.com/sakue_103/items/c71e65808cb92356508c 
https://qiita.com/sakue_103/items/03d79d1d7c7c565830c6
https://qiita.com/mamosanhaeiyuudesu/items/e0c4e9f6db7435e4c2cf