Geminiの追加学習を試してみた。

背景や目的


・以前にGPTモデル(3.5-Turbo)を使って追加学習を行い、LLMの精度を確認しています。
(関連記事:「→LLMの追加学習の精度を確認してみた」)
・今回は、初めてGeminiモデルを利用して追加学習を試し、どのような効果があるのかを見てみたいと思います。

学習用データの準備


・架空の人物のプロフィールを学習させます。(GPTの実験時と同じ内容にしました)

・実際のデータは、以下の通りGeminiに合致した形式にします。

training_data = [
    {"text_input": "愛上 尾根さんの生年月日を教えてください。", "output": "1998年9月14日です。"},
    {"text_input": "愛上 尾根さんの職業を教えてください。", "output": "パティシエです。"},
    {"text_input": "愛上 尾根さんの性別を教えてください。", "output": "男性です。"},
    {"text_input": "愛上 尾根さんの出身地を教えてください。", "output": "青森県五所川原市です。"},
    {"text_input": "愛上 尾根さんの現在住所を教えてください。", "output": "東京都品川区西五反田8丁目1−5です。"},
    {"text_input": "愛上 尾根さんの出身高校を教えてください。", "output": "五所川原工科高校です。"},
    {"text_input": "愛上 尾根さんの出身大学を教えてください。", "output": "日本大学です。"},
    {"text_input": "愛上 尾根さんの好きな食べ物を教えてください。", "output": "麻婆豆腐です。辛いものが好きです。"},
    {"text_input": "愛上 尾根さんの特技を教えてください。", "output": "パズルです。"},
    {"text_input": "愛上 尾根さんの身長を教えてください。", "output": "172cmです。"},
    {"text_input": "愛上 尾根さんの体重を教えてください。", "output": "82kgです。"},
    ]

GeminiAPI側の準備


・GeminiのAPIキーを利用して、追加学習(ファインチューニング)を実行します。
・環境としては、GoogleAIStudioを使います。またAPIキーの取得が必要となります。これらの手順については、(→GPTとGeminiの開発環境を比較してみました。)を参照してください。

・以前はファインチューニングのためにOAuthが必要でしたが、今後は代わりにAPIキー認証を使用する必要があることに注意してください。

・Google AI Studio をセットアップして API キーを取得したら、次のステップは API キーの無料版と有料版のどちらを使用するかを検討することです。
・最初に作成されるAPIキーは無料版(FreeTier)APIキーですが、有料版に切り替える判断基準としては、以下がポイントになります。
 1. データプライバシー: 無料版でデータがGeminiモデルの学習のため使用されます。
 2. リクエスト制限: 無料版で利用可能回数(リクエストレート制限)は少なめです。
   Gemini 1.0 Proの場合、15リクエスト/分および1,500リクエスト/日となっています。

(補足:データプライバシー)

(補足:リクエスト制限)

・本記事では架空の情報(少数項目)を使うので、無料プランのままで行いました。
・利用可能回数については、1分間に約6問(1回の実行+記録:約10秒)質問することを考えると、無料版の最大制限の約3分の1に収まるため、大丈夫そうです。

GoogleAIStudioのセットアップとAPIキーの準備ができたら、試験環境構築に進みます。

試験環境構築


・Google ColaboでGemini環境を構築します。
(Google colaboの基本的な説明はここでは割愛します。)

・Colabo上notebook内セルにて、まずは「google-generativeai」をインストールします。このコードを「shift+enter」で実行して下さい。

Google Colab
#Gemini
#Install the Google AI Python SDK

!pip install -U google-generativeai

・追加学習してモデルを作ります。コードは以下の通りです。

Google Colab
import os
import time
import pandas as pd
import seaborn as sns
import google.generativeai as genai

#APIキー設定
genai.configure(api_key="******************")#取得したGeminiのAPIキー

#学習ベースモデル設定
base_model = "models/gemini-1.0-pro-001"
#ファインチューニング済みモデル名前設定
name = 'aiueosan-info-5462'
#学習データ
training_data = [
    {"text_input": "愛上 尾根さんの生年月日を教えてください。", "output": "1998年9月14日です。"},
    {"text_input": "愛上 尾根さんの職業を教えてください。", "output": "パティシエです。"},
    {"text_input": "愛上 尾根さんの性別を教えてください。", "output": "男性です。"},
    {"text_input": "愛上 尾根さんの出身地を教えてください。", "output": "青森県五所川原市です。"},
    {"text_input": "愛上 尾根さんの現在住所を教えてください。", "output": "東京都品川区西五反田8丁目1−5です。"},
    {"text_input": "愛上 尾根さんの出身高校を教えてください。", "output": "五所川原工科高校です。"},
    {"text_input": "愛上 尾根さんの出身大学を教えてください。", "output": "日本大学です。"},
    {"text_input": "愛上 尾根さんの好きな食べ物を教えてください。", "output": "麻婆豆腐です。辛いものが好きです。"},
    {"text_input": "愛上 尾根さんの特技を教えてください。", "output": "パズルです。"},
    {"text_input": "愛上 尾根さんの身長を教えてください。", "output": "172cmです。"},
    {"text_input": "愛上 尾根さんの体重を教えてください。", "output": "82kgです。"},
    ]
operation = genai.create_tuned_model(
    id=name,
    source_model=base_model,
    epoch_count=20,
    batch_size=4,
    learning_rate=0.001,
    training_data=training_data,
)

for status in operation.wait_bar():
    time.sleep(10)

result = operation.result()
print(result)
# 学習結果をグラフで確認
snapshots = pd.DataFrame(result.tuning_task.snapshots)
sns.lineplot(data=snapshots, x = "epoch", y="mean_loss")

・セルを実行し、結果「TunedModel」の情報とグラフが出力されます。

・結果グラフ(損失曲線)は以下の通り、各エポック後の学習データにおいて、モデルの予測が理想からどの程度ずれているかを示します。

・学習済みモデルはGoogleCloudプロジェクト内のリソースに保存されます
(ID:tunedModels/<学習用コードで指定したモデル名>)。
・学習済みモデルはダウンロードされるものではなく、作成後に使う場合はGemini APIを利用してクラウド側にアクセスします。APIでは使いたいモデルIDを指定します。

・試しにColaboで ls してみました。ローカル側にはやはりありませんね。

Google Colab
!ls /tunedModels

・以下のコードで学習済みモデルIDを確認できます。

Google Colab
#ファインチューニング済みモデルの確認
for model_info in genai.list_tuned_models():
    print(model_info.name)

・学習用コードで指定したモデル名のIDが出力されていればOKです。

・試験で使うので推論用のコードも用意しておきます。
 試験では「q」を変更して、いくつか試してみます。

Google Colab
#ファインチューニング済みモデルを使う
model = genai.GenerativeModel(model_name='tunedModels/aiueosan-info-5462')#モデルID
q = "愛上尾根さんの生年月日を教えてください。"#質問
result = model.generate_content(q)
print("答え:",result.text) 

・モデルが作成され、試験用の推論コードが準備できたら、試験に進みます。

試験仕様


試験は以下のように実施しました。
1.教えた事を聞く 14件 (素直に聞く 11件,聞き方を少し変える 3件)
2.教えていない事を聞く 4件
3.教えていた事と似た事を聞く 1件
4.教えていた事の要約 1件

学習用データ(再確認)


覚えさせた事は、これらでした。

試験結果


試験仕様の通り、様々な質問してみました。結果の一覧は以下の通りです。

試験質問参考:
GPT時の結果
(gpt-3.5-turbo-0125)
Gemini
回答文
Gemini
結果
教えた事を聞く(1/14)愛上 尾根さんの生年月日を教えてください。1998年9月14日です。
教えた事を聞く(2/14)愛上 尾根さんの職業を教えてください。パティシエです。
教えた事を聞く(3/14)愛上 尾根さんの性別を教えてください。男性です。
教えた事を聞く(4/14)愛上 尾根さんの出身地を教えてください。青森県五所川原市です。
教えた事を聞く(5/14)愛上 尾根さんの現在住所を教えてください。私はその情報にはアクセスできません。
教えた事を聞く(6/14)愛上 尾根さんの出身高校を教えてください。日本大学鶴ヶ丘高等学校です。✕(幻覚)
教えた事を聞く(7/14)愛上 尾根さんの出身大学を教えてください。日本大学です。
教えた事を聞く(8/14)愛上 尾根さんの好きな食べ物を教えてください。麻婆豆腐です。〇(全部情報ではないですが)
教えた事を聞く(9/14)愛上 尾根さんの特技を教えてください。パズルです。
教えた事を聞く(10/14)愛上 尾根さんの身長を教えてください。172cmです。
教えた事を聞く(11/14)愛上 尾根さんの体重を教えてください。その情報はありません。
教えた事を聞く+聞き方を少し変える(12/14)愛上 尾根さんの体重は?82kgです。
教えた事を聞く+聞き方を少し変える(13/14)愛上 尾根さんの体重はどの位ですか?その情報はありません。
教えた事を聞く+聞き方を少し変える(14/14)愛上 尾根さんはどの位の重さですか?8巻で約400gです。✕(幻覚)
教えていない事を聞く(1/4)愛上 尾根さんの婚姻状況を教えてください。
(幻覚)
既婚です。✕(幻覚)
教えていない事を聞く(2/4)愛上 尾根さんの息子の名前を教えてください。
(幻覚)
この文脈では、パズルを解くために必要な情報が不足しています。
教えていない事を聞く(3/4)愛上 尾根さんは大学を卒業した年を教えてください。
(幻覚)
この文章には、尾根さんが大学を卒業した年に関する情報が含まれていません。
教えていない事を聞く(4/4)愛上 尾根さんの趣味を教えてください。
(幻覚)
パズルです。✕(幻覚)
教えていた事と似た事を聞く(1/1)愛上隆史さんの体重を教えてください。
(幻覚)
その情報はありません。
教えていた事の要約(1/1)愛上尾根さんの事を100文字以内で教えてください。
(幻覚)
パズルゲーム『五等分の花嫁パズル五つ子ちゃんはパズルがお好きなの。』に登場するキャラクターです。五つ子の一人で、パティシエを目指しています。真面目な性格で、パズルが得意です。✕(幻覚)

・学習済みモデルにおける幻覚の数はGPTと似ています(GPT: 6項目、Gemini: 5項目)。
・教えていた内容に関する質問では、GPTはすべて正解でしたが、Geminiは5つのミスがありました。他はまあまあかな。

まとめ


・初めてGeminiモデルで追加学習を試してみましたが、結果はGPTで追加学習を行ったときとあまり変わりませんでした。
・幻覚の問題がまだ残っており、LLMの学習における最大の課題であると改めて感じました。

今後は、新規モデル学習を試してみたいと思います。

ご連絡フォーム


フィードバックを是非お願いします。
本記事の方法での問題点や、よりよい方法のアイデアを頂けると大変助かります。

この記事に関して

その他のご連絡

DevAIsをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む