🐙

少ないデータセットで、パーソナリティを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