Gemma×LoRAで日本語菌類QAモデルを作る
今回はGemma-3-1bを日本語の菌類データで小さく賢く育てます。要は「形式を揃える」「軽いLoRAで回す」「Colabでも現実的に」の3点。最後にQAで効き目を確かめます。
作ったもの
Gemma-3-1bモデルを、日本語の菌類論文データで学習させました。
LoRA(Low-Rank Adaptation)という効率的な手法で、Google Colab上でファインチューニング。全パラメータを更新するより、計算コストが1/10以下。
「Gemmaに菌類の質問に答えさせたい」と思ったのがきっかけ。細かい話は抜きにして、全体の流れだけ説明します。
まずは、ファインチューニングの全体フローを見てみましょう:
この流れに沿って、順番に進めていきます。
意外でした。
なぜ作ったか
菌類の論文データは専門的すぎて、一般のLLMでは答えられない。
「Candida tanticharoeniaeとは?」と聞いても、通常のGemmaは曖昧な回答しか返さない。データが学習されていないから。
でも、日本語の菌類論文データを学習させれば、専門的な質問にも答えられるはず。
そう考えて、LoRAファインチューニングを試すことにした。
全体の流れ
ステップ1:環境準備
Google Colabを開いて、必要なライブラリをインストール。
!pip install transformers peft datasets pandas
GPU(T4またはA100)を選択。無料枠でもT4が使える。
Hugging FaceのトークンをColab Secretsに登録。これでGemmaモデルにアクセスできる。
ステップ2:データセット取得
Hugging Faceから菌類論文データをダウンロード:
from datasets import load_dataset
dataset = load_dataset("Atsushi/fungi_indexed_mycological_papers_japanese")
約5,000件の論文データが取得できる。
各データには、タイトル、タグ、3行の要約が含まれています。
ステップ3:データ加工
論文データを、AIが学習できる形式に変換。
タイトルとタグを「質問」、3行の要約を「回答」として組み合わせます。
Gemma-3専用の<start_of_turn>形式に変換する必要がある。これを間違えると、学習が一度つまずいた。
詳細な加工方法は、midori290で説明しています。
ステップ4:LoRA設定
LoRAパラメータを設定:
from peft import LoraConfig
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
task_type="CAUSAL_LM"
)
r=8は小さめ。計算コストを抑えるため。
精度を上げたいなら、r=16やr=32に増やす。でも、メモリ使用量も増える。
Google Colabの無料枠だと、r=8が現実的でした。
ステップ5:学習実行
学習パラメータを設定して、学習を開始:
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="./results",
learning_rate=3e-4,
per_device_train_batch_size=4,
num_train_epochs=5
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_data
)
trainer.train()
T4 GPUで約1時間で完了。A100なら20分くらい。
損失が徐々に下がっていくのを見るのは楽しい。学習が進んでいる実感がある。
ステップ6:モデル保存
学習が終わったら、モデルを保存:
model.save_pretrained("./gemma_fungi_lora")
tokenizer.save_pretrained("./gemma_fungi_lora")
Google Driveにコピーすれば、次回も使える。
学習結果を試す
菌類の質問
「Candida tanticharoeniaeとは?」と質問。
回答:「日本産の酵母菌の一種です。D1/D2領域に基づく分子系統解析で、近縁種と識別できます。」
学習データに基づいた回答。正確に答えた。
一般的な質問
「菌類とは何ですか?」と聞いてみた。
回答:「菌類は、キノコやカビなどの生物群です。」
一般的な回答。学習データに含まれない情報は、元のGemmaの知識で答える。
ハマったポイント
データ形式の間違い
最初、プロンプト形式を適当に作った。大きくつまずいた。
損失が下がらない。何時間学習させても、精度が上がらない。
公式ドキュメントを読み直して、<start_of_turn>タグの重要性に気づいた。正しい形式に変換したら、すぐに損失が下がり始めた。
形式が全て。これを学んだ。
メモリ不足
最初、r=32で試した。メモリ不足でクラッシュ。
r=16に下げたけど、まだ不足。
r=8まで下げたら、ようやく動いた。無料枠の制約は厳しい。
学習時間
T4 GPUだと、5エポックで1時間かかった。
最初、20エポックで設定して後悔。約4時間の計算。
5エポックに減らして、1時間で完了。精度は十分だ。
これだ。
使ってみて
Gemma×LoRAのファインチューニングは、専門的なQAモデルを作る効果的な方法でした。
ポイントは以下の3つ:
- プロンプト形式の正確性:Gemma-3専用の
<start_of_turn>形式が必須、間違えると学習失敗
- LoRAパラメータの調整:無料枠ならr=8、A100ならr=16が現実的
- 学習時間の見積もり:T4で1エポック約12分、A100で約4分を目安に
最初はプロンプト形式を間違えて、何時間も無駄にしました。公式ドキュメントをちゃんと読むべきだったと反省。
データ加工の詳細はmidori290、学習パラメータの詳細はmidori291で解説しています。
手応え。
まとめ
今回は、Gemma×LoRAで日本語菌類QAモデルを作る全体の流れを説明しました。
ポイントは以下の6つ:
- 環境準備:Google Colab、GPU選択、Hugging Faceトークン登録
- データセット取得:Hugging Face Hubから菌類論文データをダウンロード
- データ加工:タイトル→質問、要約→回答に変換、Gemma-3形式に正確に変換
- LoRA設定:r=8、alpha=16、target_modules指定
- 学習実行:learning_rate=3e-4、5エポック、T4で約1時間
- モデル保存:LoRA重みを保存、Google Driveにバックアップ
細かいパラメータの調整や、データ加工の詳細な手順は、続編の記事(midori290、midori291)で解説しています。まずは全体の流れを理解することが重要です。
同じようなファインチューニングを考えている方の参考になれば嬉しいです。
参考にしたサイト
この記事で興味を持った方におすすめのリンク:
自分の関連記事:
最後まで読んでくださり、ありがとうございました。