本稿は ファインチューニング(Fine-tuning) に関する記事です。
| この記事の要点 |
- ファインチューニング = 事前学習済みモデルを少量のデータで用途特化する追加学習
- 分類: SFT(教師あり)/ RLHF・DPO(嗜好学習)/ ドメイン適応
- 軽量化手法: LoRA / QLoRA / PEFT — 一部パラメータだけ更新、個人 GPU でも可能
- ハードル: 良質な教師データが命。1000〜数万件レベルでも効くケースが多い
- 主要ツール: Hugging Face TRL / PEFT、Axolotl、Unsloth、OpenAI / Anthropic の Fine-tuning API
- 選定の鉄則: まず Prompt Engineering と RAG で十分か検討してからファインチューニングへ
|
ファインチューニングとは?
ファインチューニング (Fine-tuning) は、事前学習済みのモデル(基盤モデル)を小規模なタスク特化データで追加学習し、特定の用途・文体・タスクに最適化する手法です。「微調整」と訳されることもあります。
巨大モデルをゼロから学習するのは数千〜数万 GPU × 数ヶ月かかりますが、ファインチューニングは個人 GPU でも数時間〜数日で完了するため、業務へのカスタマイズ手段として広く使われます。
主な種類
| 種類 | 目的 | データ形式 |
| SFT (Supervised Fine-Tuning) | 指示と理想の応答を教える | (入力, 出力)ペア |
| Instruction Tuning | 指示への従順さを獲得 | (指示, 入力, 出力) 3 つ組 |
| ドメイン適応 (Continual Pretraining) | 専門分野のテキストで知識を吸収 | 大量の生テキスト |
| RLHF | 人間の好みで応答品質を整える | (プロンプト, 応答A, 応答B, 選好) |
| DPO (Direct Preference Optimization) | RLHF の簡略版・現代主流 | (プロンプト, chosen, rejected) |
| 分類器ファインチューニング | BERT 等で分類タスク | (テキスト, ラベル) |
軽量ファインチューニング(PEFT)
フルファインチューニングは数十 GB の VRAM を必要とするため、一部のパラメータだけ更新する PEFT (Parameter-Efficient Fine-Tuning) が広く使われます。
| 手法 | 概要 | 特徴 |
| LoRA (Low-Rank Adaptation) | 低ランク行列のみ学習 | VRAM 1/10、学習速度速い、複数 LoRA を切替可能 |
| QLoRA | 4-bit 量子化 + LoRA | 7B モデルが 8GB GPU で学習可能に |
| Adapter Tuning | 各層に小さなアダプタ層を追加 | LoRA の前身 |
| Prefix / Prompt Tuning | 埋め込み Prefix を学習 | 非常に軽量だが品質はやや劣る |
| IA³ | 少数のスケーリング係数のみ学習 | 超軽量 |
| DoRA | LoRA の改良。方向とノルムを分離 | LoRA より高精度 |
典型ワークフロー
| ステップ | 内容 |
| 1. 課題定義 | 「何ができるようになって欲しいか」を明確に |
| 2. ベースライン | Prompt + RAG で達成可能か試す(多くはここで十分) |
| 3. データ収集 | 1k〜10k 件程度を目安に良質な (入力, 出力) ペアを集める |
| 4. データクリーニング | 重複削除・形式統一・PII マスキング |
| 5. ベースモデル選定 | Llama / Mistral / Qwen / Gemma など。サイズ・ライセンス考慮 |
| 6. 学習設定 | LoRA ランク・学習率・エポック数 |
| 7. 学習実行 | GPU + Hugging Face TRL / Unsloth / Axolotl |
| 8. 評価 | 保持データで自動評価 + 人手評価 |
| 9. デプロイ | マージしたモデルを推論サーバへ。LoRA のまま切替も可 |
| 10. 監視・再学習 | 本番ログをサンプリングして次回データに |
主要ツール
| ツール | 役割 |
| Hugging Face TRL | SFT / DPO / RLHF の高レベル API |
| Hugging Face PEFT | LoRA / QLoRA / IA³ 等の実装 |
| Hugging Face Transformers + Accelerate | 学習の土台と分散補助 |
| Unsloth | 軽量・高速ファインチューニング(個人 GPU 向け) |
| Axolotl | 設定ファイルベースの実装フレームワーク |
| LLaMA-Factory | GUI 付き OSS ファインチューニング |
| OpenAI Fine-tuning API | GPT 系を SaaS でファインチューニング |
| Anthropic / Google | 限定的に API 経由のファインチューニング |
| AWS Bedrock / Vertex AI | マネージドファインチューニング |
QLoRA 最小サンプル
|
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
from trl import SFTTrainer
from datasets import load_dataset
# 4-bit 量子化設定
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B",
quantization_config=bnb_config, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-3B")
# LoRA 設定
lora_config = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05,
target_modules=["q_proj", "v_proj"], task_type="CAUSAL_LM")
model = get_peft_model(model, lora_config)
# データセット (ダミー例)
dataset = load_dataset("tatsu-lab/alpaca", split="train[:1000]")
# 学習
trainer = SFTTrainer(model=model, tokenizer=tokenizer,
train_dataset=dataset, dataset_text_field="text", max_seq_length=512)
trainer.train()
trainer.model.save_pretrained("./my-lora")
|
ファインチューニング vs RAG vs プロンプト
| 課題 |
推奨手段 |
| 最新情報・社内文書の参照 | RAG |
| 出力形式・口調の固定 | プロンプト または ファインチューニング |
| 特定の専門領域の深い知識 | ドメイン適応 + RAG |
| 応答の安全性 / 偏りの抑制 | RLHF / DPO |
| 特殊な構造化出力(JSON 厳密) | ファインチューニング または Structured Output |
| レイテンシ削減(小モデル化) | 蒸留 + ファインチューニング |
| 軽い試行錯誤・短納期 | プロンプト最優先 |
業務開発の鉄則は「プロンプト → RAG → ファインチューニング」の順に試すこと。多くは前 2 段で十分です。
運用上のヒント
| Tips |
- 少量高品質 が原則: 1 万件のゴミより 1000 件の良データ
- データ作成はLLM で下書き → 人間が校正のループが効率的
- LoRA は用途別に複数学習して切替可能(複数ペルソナ・複数言語)
- 評価セットは学習前に固定(途中で変えない)
- ベース LLM のライセンスを必ず確認(Llama Community License、Apache 2.0 等)
- 本番ではマージ済みフルモデルかLoRA のまま運用するかをデプロイ要件で決める
- 過学習防止に早期停止と検証データの監視
|
注意点
| よくある落とし穴 |
- カタストロフィックフォゲッティング: 元々持っていた一般能力が消える。データ多様性を確保
- データ漏洩: 個人情報・機密が学習データに紛れる → 出力で漏れるリスク
- ベースモデル選定ミス: 小さすぎるとタスクに耐えない、大きすぎると VRAM 不足
- 評価軽視: 学習時 loss だけ見て本番品質を担保できない
- 商用ライセンス違反: 学習データやベースモデルの利用条件を逸脱
- 新モデル登場で陳腐化: 半年〜1 年でベースが世代交代する
- 過剰投資: プロンプトと RAG で済む課題に高コストなファインチューニングを当てる
|
関連