少ないデータセットで、パーソナリティをLLMにファインチューニングする旅
AIの世界は進化が超絶早く、つい最近まで「大規模」と呼ばれていた20BクラスのLLMが、今ではSLM(Small Language Model)と呼ばれるようになりました。GPT-4のような巨大モデルと比べれば「小さい」という意味ですが、それでも200億個のパラメータを持つモデルです。技術の進歩ってマジで早いですよね。
AIに個性を持たせる難しさ
プロンプトエンジニアリングの技術も進化して、システムプロンプトを工夫すれば、かなり多様な回答を引き出せるようになってきました。たとえば、「関西弁で話す料理研究家」とか「硬派な哲学者」みたいなキャラクター設定もある程度は実現できます。
でも、実際にやってみると分かるんですが、思い通りのキャラクターを維持するのって本当に大変なんですよね。
よくある問題
システムプロンプトに性格や口調、専門知識を詳しく書き込んで、RAG(Retrieval-Augmented Generation:外部データベースから情報を取得して回答する仕組み)と組み合わせて頑張っても、こんな問題が起きます:
キャラクター崩壊の瞬間
- 会話してほしいのに、急に箇条書きで返答してくる
- 「ですます調」で話していたのに、いきなり「だ・である調」になる
- 関西弁キャラなのに、標準語が混じってしまう
RAGとの相性問題
- 外部データの文体に引きずられて、設定したキャラクターが薄まる
- 専門用語の説明になると、急に教科書的な口調になる
- データベースの内容をそのまま引用して、個性が消える
プロンプトエンジニアリングの達人(私は「プロンプト仙人」と呼んでいます)なら、これらを上手くコントロールできるみたいですが、普通の人(私)にはなかなか難しいのが現実です。プロンプトに何千文字もの詳細なルールを書き連ねても、完璧にはいかないんですよね。
ファインチューニングという解決策
そこで登場するのが「ファインチューニング」という手法です。
これはプロンプトで外から「こう振る舞ってください」と指示するのではなく、モデル自体の中身を直接カスタマイズする方法です。人間に例えるなら、「演技してもらう」のではなく「性格そのものを変える」ようなもの。だから、より自然で一貫性のある応答が可能になります。楽しいそうですよね。
ファインチューニングでできること
- 深いキャラクター性の定着:表面的な口調だけでなく、思考パターンまで変更
- 専門知識の内在化:モデルが元々持っていない知識を追加
- 一貫した応答スタイル:どんな質問が来ても崩れない個性
なぜファインチューニングは普及していないのか
これだけ良いことばかりな技術なのに、なぜみんな使わないのか?答えは簡単です。めちゃくちゃハードルが高いからです。
1. コストの壁
モデルを学習させるには、一般向けでは最高クラスのGPUが必要です。
AI業界ではエントリーGPUと言われてるみたいですが、
- RTX 4090:約30万円(メモリ24GB)
- RTX 5090:40万円以上(2025年時点)
- プロ向けGPU(A100など):数百万円??
もちろんGPUだけでなく、PCのRAMなども128GB準備したりと、半端なく導入敷居が高くなります
2. データセットの準備
データセットとは、「こう聞かれたら、こう答える」という問答集のようなものです。
{"messages": [
{"role": "user", "content": "今日は天気がいいね。一緒に散歩でも行かない?"},
{"role": "assistant", "content": "べ、別に天気がいいからって散歩なんて行きたくないし!でも、あんたが一人で迷子になったら困るから、仕方なく付き合ってあげてもいいけど...。ただ勘違いしないでよね、あんたのためじゃなくて、たまたま私も外の空気吸いたかっただけなんだから!"}]
}
こんな感じのペアを、通常は最低でも1万個以上用意する必要があります。1万個の質問と、それぞれに対するキャラクターに合った回答を書く...想像するだけで気が遠くなりますよね。
しかも、ただ量があればいいわけではなく:
- バリエーション豊かな質問
- 一貫性のある回答スタイル
- 自然な会話の流れ
これらすべてを満たす必要があります。
3. 学習設定という職人技
これがマジで難しくて、モデルごとに最適な設定が違うし、「これが正解」という推奨値もほとんど存在しません。
調整が必要なパラメータの例:
- 学習率(Learning Rate):学習の速さ
- バッチサイズ:一度に処理するデータ量
- エポック数:データセット全体を何回学習するか
- ウォームアップステップ:学習の立ち上がり方
- 重み減衰(Weight Decay):過学習を防ぐ正則化
これらを適切に組み合わせないと、モデルが壊れたり、全然学習しなかったり、過学習して使い物にならなくなったりします。
少ないデータで個性を定着させるには?
ここからは少し技術的な話になりますが、100個程度のデータセットでもある程度キャラクター性を定着させる方法が見えてきました。私が試行錯誤の末にたどり着いた手法のメモを残します
PEFT(Parameter-Efficient Fine-Tuning)の活用
まず、ファインチューニングでは「PEFT」という手法を使います。これは、モデル全体ではなく一部だけを効率的に学習させる技術です。巨大なモデルの全パラメータを変更するのではなく、重要な部分だけをピンポイントで調整します。LoRAとか、Boneとか、DoRAとか言われているアレです。
過学習との闘い
データが少ない場合の一番の問題は「過学習(Overfitting)」です。
過学習とは、学生が教科書を丸暗記してしまい、応用問題が解けなくなるような状態です。モデルが少ないデータを完全に記憶してしまい、新しい質問に対して柔軟に答えられなくなってしまうんですよね。
過学習の症状:
- 訓練データと全く同じ質問にしか答えられない
- 少し違う聞き方をすると、とんちんかんな回答をする
- キャラクターは定着するが、知能が低下する
私のレシピ:100データセットでの学習設定
試行錯誤の結果、以下の設定でいい感じの焼き具合になりました:
(前提としてRWKVを基準にしています)
1. 部分的な学習対象の選択
凍結する層(学習しない)
- Embedding層:単語の意味を理解する部分
- head:最終的な出力を生成する部分
- FFN(Feed-Forward Network):情報を処理する中間層
学習する層(これだけです)
- Linear Attention機構のR(Receptance)とV(Value)のみ
なぜこの選択なのか?Linear Attentionは「何に注目するか」を決める部分で、ここを調整することでキャラクター性を効率的に学習できます。学習結果に満足できない場合にFFN->Head->Embの順で学習に含みます。(当然過学習の可能性も高まります)
2. LoRAの設定
**LoRA(Low-Rank Adaptation)**は、少ないパラメータで効率的に学習する技術です。
- Rank = 2〜4(一般的な推奨は16ですが、少ないデータには高すぎる)
- Rankが低いほど、学習するパラメータが少なくなり、過学習を防げます
- ただし、低すぎると表現力が落ちるので、バランスが重要
3. 学習率とバッチサイズ
-
学習率(lr)= 5e-6以下(0.000005以下)
- 通常の1/10程度に抑えることで、急激な変化を防ぐ
-
バッチサイズ = 32以上
- Gradient Checkpointingという数回ステップごとにBackpropする方法でメモリ効率をあげる
- 大きなバッチサイズで、より安定した学習を実現
- これ、結構見落としがちで、過学習のほとんどはこれでキマります。
実際の効果
この設定により、:
- 100ペア程度のデータセットで基本的なキャラクター性が定着
- 汎用的な会話能力を維持したまま、個性を追加
- 学習時間は数十分程度(モデルサイズによる)
- 一般的なゲーミングPCでも実行可能(24GB :) )
まとめ:挑戦してみよう!
完璧ではないかもしれませんが、この方法なら個人でも手の届く範囲でファインチューニングに挑戦できます。
必要なもの:
- ある程度のGPU(RTX 4090)
- 100個程度の問答データ
- Pythonの基礎知識
- 試行錯誤を楽しむ心
- 愛
失敗しても、それがまた学びになります。AIに個性を持たせる、この創造的で楽しい作業に、ぜひ挑戦してみてください。
注:この記事で紹介した設定は、モデルやデータセットによって最適値が変わります。あくまで出発点として参考にしていただき、自分の環境に合わせて調整してください。
Discussion