mcpField
F
Fine-Tuning Assistant

Fine-Tuning Assistant

github.com/jmsktmデータ・データベース10204 回インストール40 週間前に更新
リポジトリ

Fine-Tuning Assistant について

Fine-Tuning Assistantは、事前学習済みモデルを特定のタスクやスタイルに適応させるためのスキルです。方針の選択、データセット準備、学習、評価を案内し、LoRAやQLoRAなども扱います。

主な機能

  1. 01ファインチューニングとプロンプトの比較
  2. 02学習データセットの準備と検証
  3. 03ベースモデルと学習パラメーターの選択
  4. 04学習の監視と結果のテスト
  5. 05LoRA、QLoRA、インストラクションチューニング

活用シーン

  1. 01タスクにファインチューニングが必要か判断
  2. 02モデル学習用のサンプルを整形
  3. 03調整済みモデルとベースラインを比較
  4. 04過学習や学習上の問題を調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jmsktm/claude-settings --skill fine-tuning-assistant

インストール後、Claude Code で/fine-tuning-assistantを入力して読み込まれたか確認します。

詳細

ファインチューニングアシスタント

ファインチューニングアシスタントのスキルでは、事前学習済みモデルを特定のユースケースに合わせて適応させるプロセスを案内します。ファインチューニングによって、専門的なタスクでのモデルの性能を大幅に向上させたり、好みのスタイルをモデルに学習させたり、プロンプトだけでは実現できない機能を追加したりできます。

このスキルでは、ファインチューニングとプロンプトエンジニアリングのどちらを選ぶか、トレーニングデータの準備、ベースモデルの選択、トレーニングパラメーターの設定、結果の評価、ファインチューニング済みモデルのデプロイを扱います。LoRA、QLoRA、インストラクションチューニングなどの最新手法を活用し、ファインチューニングを実用的かつ費用対効果の高いものにします。

API 経由で GPT モデルをファインチューニングする場合も、オープンソースモデルを使ってローカルでトレーニングする場合も、Hugging Face などのプラットフォームを利用する場合も、このスキルがファインチューニングに戦略的かつ効果的に取り組めるようサポートします。

主なワークフロー

ワークフロー 1:ファインチューニングするか判断する
  1. 問題を評価します:
    • プロンプトで目標を達成できますか?
    • タスクの形式やスタイルは一貫していますか?
    • 品質の高いトレーニングデータはありますか?
    • 投資する価値はありますか?
  2. アプローチを比較します:
    アプローチ使用するタイミング投資
    より良いプロンプト最初の試行、タスクにばらつきがある場合低
    少数の例を使ったプロンプト形式が一貫していて、データが限られている場合低
    RAGナレッジ集約型で、データが動的な場合中
    ファインチューニングスタイルが一貫していて、専門的なタスクの場合高
  3. 要件を評価します:
    • 品質の高い例が最低 100~1000 件
    • 明確な評価基準
    • トレーニングとホスティングの予算
  4. 判断:プロンプト/RAG では不十分な場合に限り、ファインチューニングします
ワークフロー 2:ファインチューニング用データセットを準備する
  1. トレーニング例を収集します:
    • 対象のユースケースを代表している
    • 品質が高い(出力に誤りがない)
    • タスクのバリエーションを幅広く網羅している
  2. トレーニング用に形式を整えます:
    {"messages": [
      {"role": "system", "content": "You are a helpful assistant..."},
      {"role": "user", "content": "User input here"},
      {"role": "assistant", "content": "Ideal response here"}
    ]}
    
  3. 品質を保証します:
    • 例のサンプルを手作業で確認する
    • スタイル/形式に一貫性があるか確認する
    • 重複や品質の低い項目を削除する
  4. トレーニング/検証/テストの各セットに分割します
  5. データセットの形式を検証します
ワークフロー 3:ファインチューニングを実行する
  1. ベースモデルを選択します:
    • サイズと性能のトレードオフを考慮する
    • タスクの複雑さに合ったモデルを選ぶ
    • ユースケースにおけるライセンスを確認する
  2. トレーニングを設定します:
    # OpenAI fine-tuning
    training_config = {
        "model": "gpt-4o-mini-2024-07-18",
        "training_file": "file-xxx",
        "hyperparameters": {
            "n_epochs": 3,
            "batch_size": "auto",
            "learning_rate_multiplier": "auto"
        }
    }
    
    # LoRA fine-tuning (local)
    lora_config = {
        "r": 16,  # Rank
        "lora_alpha": 32,
        "lora_dropout": 0.05,
        "target_modules": ["q_proj", "v_proj"]
    }
    
  3. トレーニングを監視します:
    • 損失曲線を確認する
    • 過学習がないか確認する
    • 保留データセットで検証する
  4. 結果を評価します:
    • ベースラインモデルと比較する
    • 多様な入力でテストする
    • 性能の後退がないか確認する

クイックリファレンス

アクションコマンド/トリガー
アプローチを決める「[タスク] にはファインチューニングすべきですか」
データを準備する「ファインチューニング用にデータを整形する」
モデルを選ぶ「[タスク] のファインチューニングに適したモデル」
トレーニングを設定する「[目標] のためのファインチューニングパラメーター」
結果を評価する「ファインチューニング済みモデルを評価する」
トレーニングの問題をデバッグする「ファインチューニングの損失が減少しない」

ベストプラクティス

  • まずはプロンプトを工夫する:ファインチューニングにはコストがかかるため、まずはより低コストな選択肢を試し尽くしましょう

    • プロンプトの改善で目標の80%を達成できますか?
    • プロンプト内で少数の例を使った学習を試しましょう
    • ナレッジ関連のタスクにはRAGを検討しましょう
  • 量より質:優れた例100件は、平凡な例10,000件に勝ります

    • すべての例をゴールドスタンダードにしましょう
    • 人間が例を検証するのが望ましいです
    • モデルに学習させたくないものはすべて取り除きましょう
  • 用途に合わせて形式を揃える:学習例は実際の使用方法を反映させましょう

    • 本番環境と同じプロンプト構造にする
    • 現実的な入力のバリエーションを用意する
    • エッジケースを明示的に網羅する
  • 過剰な学習を避ける:エポック数を増やせばよいとは限りません

    • 過学習の兆候がないか、検証損失を確認しましょう
    • まずは1~3エポックから始めましょう
    • 検証の指標が頭打ちになったら早期終了しましょう
  • 適切に評価する:学習損失が目標ではありません

    • 保留したテストセットを使用する
    • 同じテストでベースラインと比較する
    • 能力の後退がないか確認する
    • エッジケースを明示的にテストする
  • すべてにバージョンを付ける:ファインチューニングは反復的なプロセスです

    • 学習データにバージョンを付ける
    • 実験の設定を記録する
    • うまくいったことと、うまくいかなかったことを文書化する

高度なテクニック

LoRA(低ランク適応)

大規模モデルを効率的にファインチューニングします:

from peft import LoraConfig, get_peft_model

lora_config = LoraConfig(
    r=16,                           # Rank of update matrices
    lora_alpha=32,                  # Scaling factor
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

# Apply LoRA to base model
model = get_peft_model(base_model, lora_config)

# Only ~0.1% of parameters are trainable
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
QLoRA(量子化LoRA)

一般向けハードウェアで大規模モデルをファインチューニングします:

from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True
)

# Load model in 4-bit
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config
)

# Apply LoRA on top
model = get_peft_model(model, lora_config)
指示チューニング用データセットの作成

生データを指示形式に変換します:

def create_instruction_example(raw_data):
    return {
        "messages": [
            {
                "role": "system",
                "content": "You are a customer service agent for TechCorp..."
            },
            {
                "role": "user",
                "content": f"Customer inquiry: {raw_data['inquiry']}"
            },
            {
                "role": "assistant",
                "content": raw_data['ideal_response']
            }
        ]
    }

# Apply to dataset
instruction_dataset = [create_instruction_example(d) for d in raw_dataset]
評価フレームワーク

ファインチューニング済みモデルを包括的に評価します:

def evaluate_fine_tuned_model(model, test_set, baseline_model=None):
    results = {
        "task_accuracy": [],
        "format_compliance": [],
        "style_match": [],
        "regression_check": []
    }

    for example in test_set:
        output = model.generate(example.input)

        # Task-specific accuracy
        results["task_accuracy"].append(
            check_correctness(output, example.expected)
        )

        # Format compliance
        results["format_compliance"].append(
            matches_expected_format(output)
        )

        # Style matching (for style transfer tasks)
        results["style_match"].append(
            style_similarity(output, example.expected)
        )

        # Regression on general capabilities
        if baseline_model:
            results["regression_check"].append(
                compare_general_capability(model, baseline_model, example)
            )

    return {k: np.mean(v) for k, v in results.items()}
カリキュラム学習

難易度順に学習データを並べます:

def create_curriculum(dataset):
    # Score examples by complexity
    scored = [(score_complexity(ex), ex) for ex in dataset]
    scored.sort(key=lambda x: x[0])

    # Create epochs with increasing difficulty
    n = len(scored)
    curriculum = {
        "epoch_1": [ex for _, ex in scored[:n//3]],           # Easy
        "epoch_2": [ex for _, ex in scored[:2*n//3]],         # Easy + Medium
        "epoch_3": [ex for _, ex in scored],                   # All
    }
    return curriculum

よくある落とし穴と回避方法

  • よりよいプロンプトで十分な場合にファインチューニングを行う
  • 低品質または一貫性のない学習例を使用する
  • 適切なテストセットを保留しない
  • エポック数を増やしすぎる(過学習)
  • ファインチューニングによる能力の後退を無視する
  • 学習データと設定にバージョンを付けない
  • ファインチューニングで事実に関する知識が追加されると期待する(代わりにRAGを使用する)
  • 本番環境での使用方法と一致しないデータでファインチューニングする

コメント