ChatGPTの前身、GPT2のファインチューニングを実行してみた

X 旧Twitterはこちら。
https://twitter.com/ison1232

************

chatGPTなどの大規模言語モデルのLLMが流行っていますが、今現在の最新モデルはGPT4。
これのいくつか前のモデルGPT2をファインチューニングしてみました。

大規模言語モデルなどに実行する、ファインチューニングとは何か

ちなみに、ファインチューニングとは何かをちょこっと解説。

まず大規模言語モデルってのは、事前学習といって、ネット上の大量のテキストデータを読み込んで学習しています。

chatGPTなんかは英語での学習量が多いので、英語は強いです。
一方、日本語はというと、多少学習しているとは言え、英語ほどは勉強していないので、若干弱い感はあります。

そんな大規模言語モデルですが、この事前学習で特定の言語を習得していきます。

言語を習得した大規模言語モデルですが、専門的な内容になると若干学習量が不足していたりします。
これは当然ですね。
専門的な内容はネットには無かったり、あってもあっさりとしたものしかアップされてない場合もあります。

で、例えばゴルフのことをchatGPTに聞きたいと。
試してみると、結構まともに答えますが、深堀りした内容になると違った答えが返ってきたりします。

そこでチャットGPTに足りない専門的な内容を学習させていくのが、ファインチューニングという方法です。

結果的に、chatGPTが法律の専門家になったり、医療のプロフェッショナルになったりできる訳です。

ちなみに「ファインチューニング」の用語をGPT4に聞いてみました。

****ここから

ファインチューニングは、既存の言語モデルを特定のタスクやドメインに適応させるプロセスです。

ファインチューニングは、元の言語モデルを大規模な汎用データセット(例:Wikipediaなど)で事前訓練した後に行われます。これにより、言語モデルは一般的な言語理解能力を獲得します。

しかし、特定のタスクやドメインにおいてより優れたパフォーマンスを発揮するためには、モデルをタスク固有のデータセットで追加のトレーニングを行う必要があります。これがファインチューニングの目的です。

具体的には、ファインチューニングでは、タスクに関連するデータセットを用いてモデルを再訓練します。タスクには様々なものがあります。例えば、テキスト生成、質問応答、文書分類などです。

ファインチューニングのプロセスでは、事前訓練済みモデルの一部またはすべてのパラメータを新しいデータセットで再訓練し、特定のタスクに特化させます。これにより、モデルはタスクに対してより精度の高い予測や生成ができるようになります。

ファインチューニングは、特定のタスクにおいて既存のモデルを最適化するための効果的な手法です。それによって、モデルは特定のドメインやアプリケーションに適応しやすくなり、より良い結果を得ることができます。

****ここまで

おわかりでしょうか。
特定のタスクや専門的な内容を学習させたい時は、このファインチューニングが必要になるんです。

では実際にやってみましょう。

今回のファインチューニングをGPT2にした理由

今回はGPT2をファインチューニングしてみます。
ちなみに2023年7月現在、GPT3.5-turbo、GPT4はファインチューニングできません。
(年内中にはGPT3.5-turboもGTP4もできるようになる予定っぽいです)

ファインチューニングできるのはGPT2とGPT3とかになります。

GPT2は無料でできますが、GPT3はopenAIのAPI接続でやらないとなので、トークン数に応じて料金がかかります。

そこで今回は無料でできるGPT2を選択しました。

GPT2のファインチューニングの具体的な方法

結論から言うと、ちょっと前のモデルなので、結構エラーが出ます。
なのでググったり、GPTったりして解決していきます。

使うモデルはrinna社が出しているやつ。
これは事前学習に日本語でトレーニングされているのでよろしいかと。
こいつをファインチューニングしていきましょう。

Hugging Faceのrinnaモデル
https://huggingface.co/rinna/japanese-gpt2-medium

 

ファインチューニングはデータセットが非常に大事

まずは学習させるデータセットを作ります。
このデータセットを作るのは非常に大事な作業になります。

もしかしたら、大規模言語モデルのパラメータ数に匹敵するくらい大事かもです。
このデータセットの質次第で、ファインチューニング後の精度が随分変わってきます。

そんなこんなで、今回はゴルフの専門的な内容を作りたかったので、ゴルフのデータを制作します。

まずはデータセットの一部です。

****ここから

質問: ゴルフの歴史はいつ始まりましたか?
応答: ゴルフの起源は古代スコットランドにさかのぼります。15世紀頃からスコットランドでプレーされるようになり、その後世界中に広まりました。

質問: ゴルフをするために必要なクラブの種類は何ですか?
応答: ゴルフではドライバー、アイアン、ウェッジ、パターなど、さまざまなクラブが使用されます。それぞれのクラブには特定の用途や飛距離の特性があります。

質問: ゴルフで使われる最も長いクラブは何ですか?
応答: ゴルフで使われる最も長いクラブは「ドライバー」と呼ばれるクラブです。ドライバーはティーショットで使用され、飛距離を伸ばすために設計されています。

質問: ゴルフの試合で最も重要なスコアは何ですか?
応答: ゴルフの試合で最も重要なスコアは「トータルスコア」です。これはすべてのホールでのストローク数の合計を指します。

質問: ゴルフで使われる「パー」とは何ですか?
応答: ゴルフのホールは通常、パーと呼ばれる目標スコアが設定されています。パーはホールをプレーするために平均的なスコアを表し、ホールの難易度を示す目安となります。

****ここまで

全部で150の質問応答セットで、テキストのみのデータです。

開発はgoogle colabを使いますので、
このファイルを
/content/drive/MyDrive/保存したファイル名.txt
にアップしておきます。

※アップロード先は、各自の環境によります。
上記はgoogle driveを読み込んでいます。
各自で読み替えてください。

ちなみにGPT3だとjsonlファイルにするのですが、GPT2は通常のテキストを読み込めるらしいので、このデータを直接食わせてみます(食わせるとはお下品ですが、AI関連では俗語で結構使います)。

ファインチューニングの前後で推論を比較する

さてまずはファインチューニングの前に、GPT2にゴルフについて聞いてみましょう。

開発環境はgoogle colabを使います。
GPU
T4
ハイメモリ
あたりの設定です(設定は若干動かせると思います)。

推論のコードはこちら。

import文に使う pip installは各自で入れてください。


import torch
from transformers import T5Tokenizer, AutoModelForCausalLM

# テキストの準備
text = ‘ゴルフで使用される「パター」とは何ですか、’

# トークナイザーとモデルの準備
tokenizer = T5Tokenizer.from_pretrained(‘rinna/japanese-gpt2-medium’)
model = AutoModelForCausalLM.from_pretrained(‘rinna/japanese-gpt2-medium’)

# テキストを変換
input = tokenizer.encode(text, return_tensors=’pt’)

# 推論
model.eval()
with torch.no_grad():
output = model.generate(input, do_sample=True, max_length=100, num_return_sequences=1)
print(tokenizer.batch_decode(output))

早速質問してみます。

質問
ゴルフで使用される「パター」とは何ですか、

回答
そもそもシャフトとは、球を打ち上げたときに、その球がまっすぐな方向に転がるように設計された機械部品である。 ゴルフの場合はボールにラバーを張り付けてボールを飛ばす。 パッティングの場合は、球が上方向に転がるように作られているため、シャフトという器具は使われていない。 ゴルフボールは、ゴルフコースを作る上で非常に重要な道具である。 しかし、ゴルフプレー中、グリップで転がすボールを自分の体が横…。

ゴルフの専門的な学習をしていないので、イマイチな回答ですね。

 

ファインチューニングを実行する

ではファインチューニングをやっていきましょう。

コードはこちら。

#時間を計測
%%time
# ファインチューニングの実行
!python ./transformers/examples/language-modeling/run_clm.py \
–model_name_or_path=rinna/japanese-gpt2-medium \
–do_train \
–do_eval \
–_file=/content/drive/MyDrive/保存したファイル名.txt \
–num_train_epochs=100 \
–save_steps=5000 \
–save_total_limit=3 \
–per_device_train_batch_size=1 \
–per_device_eval_batch_size=1 \
–output_dir=output3/ \
–use_fast_tokenizer=False \
–logging_steps=50

エポック数100で学習させます。
(今回は簡略化して、trainのみで終わらせます)

トレーニング開始。

データセットの量がそれほど多くないので、10分位で終わりますね。

完成したモデルを読み込んで、ゴルフについて聞いてみましょう。

推論のコードはこちら。


import torch
from transformers import T5Tokenizer, AutoModelForCausalLM

# テキストの準備
text = ‘ゴルフで使用される「パター」とは何ですか、’

# トークナイザーとモデルの準備
tokenizer = T5Tokenizer.from_pretrained(‘rinna/japanese-gpt2-medium’)
model = AutoModelForCausalLM.from_pretrained(‘output3/’)

# テキストを変換
input = tokenizer.encode(text, return_tensors=’pt’)

# 推論
model.eval()
with torch.no_grad():
output = model.generate(input, do_sample=True, max_length=100, num_return_sequences=1)
print(tokenizer.batch_decode(output))

学習が終わったモデルを読み込んで、質問してみます。

質問
ゴルフで使用される「パター」とは何ですか

応答: ゴルフで使用される「パター」とは、グリーン上でボールを転がすためのクラブです。パターは短くて軽量であり、プレーヤーが正確なパットをするために使用されます。

どうでしょう。
いい感じに回答できてますね。

このようにファインチューニングをすると、chatGPTなどの大規模言語モデルはそれぞれの専門家として、ふるまえるようになるんですね。

ChatGPTの前身、GPT2のファインチューニングを実行してみたのまとめ

どうでしょう。
こんな感じでGPT2のファインチューニングの完成です。

これでゴルフの専門家?の一丁上がりですね。
まあデータが少ないので、ゴルフ中級者入口程度の受け答えですが(笑。

データを増やして学習させれば、いい感じのゴルフ先生になってくれます。

あとはパラメータ数が段違いのGPT4が、早くファインチューニングできるように、openAIさんにお願いするのみです。

どれだけ優秀な先生になってくれるのか、今から楽しみです。

※こちらではチャットGPTなどの各GPTシリーズのファインチューニングも承ります。
ご希望の方、ご相談はお問い合わせからご連絡ください。

PAGE TOP