DeNA LLMスタディPart 3: モデル学習方法論 - 事前学習からRLHF/DPOまで
DeNA LLMスタディ資料Part 3をベースに、事前学習、ファインチューニング、強化学習の違いとLoRA、QLoRA、DPOなど最新の効率的学習技法を深掘り分析します。
シリーズ: DeNA LLMスタディ (3/5)
- Part 1: LLM基礎と2025年AI現況
- Part 2: 構造化出力とマルチLLMパイプライン
- Part 3: モデル学習方法論 ← 現在の記事
- Part 4: RAGアーキテクチャと最新トレンド
- Part 5: エージェント設計とマルチエージェントオーケストレーション
はじめに
DeNAのLLMスタディ資料Part 3では、LLMの多様な学習方法論を扱います。事前学習(Pre-training)、ファインチューニング(Fine-tuning)、強化学習(Reinforcement Learning)の違いを理解し、LoRA、QLoRA、DPOのような最新の効率的学習技法の原理と実務適用方法を見ていきます。
本記事はDeNAスタディ資料をベースにしつつ、2025年の最新トレンドと実務経験を追加して執筆しました。
事前学習 vs ファインチューニング vs 強化学習
レストランの比喩で理解する
DeNA資料は3つの学習方式をレストラン運営に例えて説明しています:
graph TD
A[事前学習<br/>Pre-training] --> B[ファインチューニング<br/>Fine-tuning]
B --> C[強化学習<br/>RLHF/DPO]
A1[料理人基本訓練<br/>すべての料理を学ぶ] --> A
B1[特定のレストラン<br/>メニュー特化] --> B
C1[顧客フィードバックで<br/>味を改善] --> C
事前学習 (Pre-training)
- 目的: 汎用的な言語理解能力の獲得
- データ: 数十〜数百TBのWebデータ
- コスト: 数億〜数千億円 (GPT-4推定1000億円以上)
- 比喩: 料理学校ですべての調理技法を学ぶ過程
ファインチューニング (Fine-tuning)
- 目的: 特定タスク/ドメインへの特化
- データ: 数千〜数万個のタスク別データ
- コスト: 数十万〜数百万円
- 比喩: イタリアンレストランのパスタ専門家になる過程
強化学習 (Reinforcement Learning)
- 目的: 人間の好みに合わせた応答生成
- データ: 数千〜数万個の好みデータ
- コスト: 数百万〜数千万円
- 比喩: 顧客フィードバックを受けて料理の味を調整する過程
実務意思決定ガイド
graph TD
Start[LLM学習必要?] --> Q1{新しい知識<br/>必要?}
Q1 -->|はい| PreTrain[事前学習<br/>コスト: 非常に高い]
Q1 -->|いいえ| Q2{タスク特化<br/>必要?}
Q2 -->|はい| FineTune[ファインチューニング<br/>コスト: 中程度]
Q2 -->|いいえ| Q3{好み調整<br/>必要?}
Q3 -->|はい| RL[強化学習<br/>コスト: 中程度]
Q3 -->|いいえ| Prompt[プロンプトエンジニアリング<br/>コスト: 低い]
意思決定チェックリスト:
- プロンプトで解決可能か? → まずプロンプト最適化を試す
- 既存モデルがタスクを理解するか? → はい: 強化学習、いいえ: ファインチューニング
- 完全に新しいドメインか? → 事前学習を検討 (ただしコストに注意)
PEFT: 効率的ファインチューニングの登場
従来のファインチューニングの問題点
全パラメータを更新するFull Fine-tuningの限界:
- メモリ使用量: 7Bモデルのファインチューニングに80GB+ VRAM必要
- 時間コスト: 数時間〜数日かかる
- デプロイ困難: タスクごとにモデル全体を保存する必要 (数十GB)
PEFTの核心アイデア
Parameter-Efficient Fine-Tuning (PEFT)は全パラメータの一部のみを学習して効率性を最大化します:
graph TD
subgraph 従来のファインチューニング
A[元のモデル<br/>7Bパラメータ] --> B[全体更新<br/>7Bパラメータ]
B --> C[新しいモデル<br/>28GB保存]
end
subgraph PEFT
D[元のモデル<br/>7Bパラメータ] --> E[少数パラメータ追加<br/>数百万個]
E --> F[アダプターのみ保存<br/>10MB以下]
end
PEFT主要方法論:
- Adapter: レイヤー間に小さなネットワークを挿入
- Prefix Tuning: 入力に学習可能なprefixを追加
- LoRA: 重み行列を低ランク分解して更新 (最も人気)
- Prompt Tuning: ソフトプロンプトのみを学習
LoRA: 低ランク適応の原理
数学的背景
LoRA(Low-Rank Adaptation)は次のような数学的洞察に基づいています:
# 元の重み更新 (Full Fine-tuning)
W_new = W_original + ΔW # ΔWは d×d サイズ
# LoRAの低ランク分解
ΔW = B @ A # Bは d×r、Aは r×d (r << d)
# 実際の適用
output = (W_original + B @ A) @ input
核心アイデア:
- 事前学習済み重みはすでに多くの情報を含んでいる
- ファインチューニング時に必要な変化量(ΔW)は低い内在次元(intrinsic dimension)を持つ
- したがってΔWを2つの小さな行列(B, A)の積で表現可能
LoRAハイパーパラメータ設定ガイド
# LoRA設定例 (HuggingFace PEFT)
lora_config:
r: 8 # Rank (内在次元)
lora_alpha: 16 # スケーリングパラメータ
lora_dropout: 0.1 # Dropout比率
target_modules: # 適用するレイヤー
- q_proj # Query projection
- v_proj # Value projection
bias: "none" # Bias学習の有無
ハイパーパラメータ選択ガイド:
| パラメータ | 推奨値 | 説明 |
|---|---|---|
| r (Rank) | 4〜16 | 小さいほどメモリ節約、大きいと表現力増加。ほとんど8が適切 |
| lora_alpha | r〜2r | 学習率と似た役割。通常rの1〜2倍 |
| lora_dropout | 0.05〜0.1 | 過学習防止。小さいデータセットは高く設定 |
| target_modules | q_proj, v_proj | AttentionのQuery/Valueが最も効果的 |
LoRAの変形
DoRA (Weight-Decomposed Low-Rank Adaptation, 2024)
# DoRA: 重みを大きさ(magnitude)と方向(direction)に分解
W = m * (V + B @ A)
# m: 学習可能な大きさ、V: 正規化された重み、B@A: LoRA
- 利点: Full Fine-tuningに近い性能
- 欠点: LoRAより若干遅い
GaLore (Gradient Low-Rank Projection, 2024)
# Gradientを低ランク空間に投影してメモリ節約
gradient_lowrank = project_to_lowrank(gradient)
optimizer.step(gradient_lowrank)
- 利点: オプティマイザの状態も低ランクで圧縮 → メモリ50%追加削減
- 欠点: 実装の複雑度が高い
LoRA+ (2024)
# 学習率を行列A、Bに異なって適用
lr_A = lr * eta # Aは高い学習率
lr_B = lr # Bは基本学習率
- 利点: 収束速度1.5〜2倍改善
- 欠点: ハイパーパラメータチューニング必要
QLoRA: 量子化とPEFTの結合
4bit量子化の革新
QLoRAは4bit量子化とLoRAを結合してメモリ使用量を劇的に削減します:
graph TD
subgraph メモリ_比較
A[元の16bit<br/>14GB] --> B[8bit量子化<br/>7GB]
B --> C[4bit QLoRA<br/>3.5GB]
end
subgraph 性能_維持
D[Full Fine-tuning<br/>100%] --> E[LoRA<br/>98%]
E --> F[QLoRA<br/>97%]
end
QLoRA核心技術:
- 4bit NormalFloat (NF4): 正規分布に最適化された量子化
- Double Quantization: 量子化定数も量子化
- Paged Optimizers: CPU-GPUメモリ自動管理
QLoRA実務ワークフロー
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
# 1. 4bit量子化設定
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat 4bit
bnb_4bit_compute_dtype="float16", # 計算はfloat16
bnb_4bit_use_double_quant=True, # Double quantization
)
# 2. モデルロード
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto" # 自動デバイス割り当て
)
# 3. LoRA設定
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
# 4. PEFTモデル生成
model = get_peft_model(model, lora_config)
# 5. 学習可能パラメータ確認
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"訓練可能パラメータ: {trainable_params:,} ({trainable_params/7e9*100:.2f}%)")
# 出力: 訓練可能パラメータ: 4,194,304 (0.06%)
QLoRA実務ヒント:
- GPUメモリ: 7BモデルをRTX 3090 1枚(24GB)で学習可能
- バッチサイズ: Gradient accumulation活用 (例: batch_size=1, gradient_accumulation_steps=16)
- 学習時間: Full Fine-tuning比1.5〜2倍遅い (量子化オーバーヘッド)
RLHFとDPO: 人間の好み学習
RLHFの複雑性
Reinforcement Learning from Human Feedback (RLHF)は強力ですが複雑です:
graph TD
A[1. SFTモデル学習<br/>Supervised Fine-tuning] --> B[2. リワードモデル学習<br/>Reward Model]
B --> C[3. PPOでポリシー最適化<br/>Proximal Policy Optimization]
D[人間の好みデータ<br/>A vs B比較] --> B
B --> E[リワードスコア予測]
E --> C
C --> F[最終整列モデル<br/>Aligned Model]
RLHFの問題点:
- 3段階パイプライン: SFT → Reward Model → RL最適化
- 不安定性: PPOはハイパーパラメータに敏感
- 高コスト: リワードモデル学習 + RLサンプリング
- デバッグ困難: RL収束失敗時、原因把握が難解
DPO: 直接好み最適化
Direct Preference Optimization (DPO)はリワードモデルなしで人間の好みを直接学習します:
graph TD
A[人間の好みデータ<br/>好み応答 vs 非好み応答] --> B[DPO損失関数<br/>Classification Loss]
B --> C[整列モデル<br/>単一段階学習]
D[RLHF: 3段階] -.-> E[SFT → Reward → PPO]
F[DPO: 1段階] -.-> C
DPO損失関数:
# DPO Loss (数式簡略化)
loss = -log(σ(β * (log π(y_w|x) - log π(y_l|x))))
# y_w: 好み応答 (chosen)
# y_l: 非好み応答 (rejected)
# β: ハイパーパラメータ (一般的に0.1)
# σ: Sigmoid関数
DPOの利点:
- シンプルさ: リワードモデル不要、1回の学習で完了
- 安定性: Classification lossはPPOより安定
- 効率性: メモリと時間50%削減
- 性能: RLHFと同等またはより良い性能
DPO実務実装
from trl import DPOTrainer
# DPO学習設定
training_args = TrainingArguments(
output_dir="./dpo_model",
per_device_train_batch_size=4,
learning_rate=5e-5,
num_train_epochs=3,
gradient_accumulation_steps=4,
)
# DPO Trainer初期化
dpo_trainer = DPOTrainer(
model=model,
args=training_args,
train_dataset=preference_dataset, # (prompt, chosen, rejected)形式
tokenizer=tokenizer,
beta=0.1, # DPOハイパーパラメータ
)
# 学習実行
dpo_trainer.train()
好みデータ形式:
preference_dataset = [
{
"prompt": "Pythonでリストをソートする方法は?",
"chosen": "sorted()関数を使えば良いです: sorted([3,1,2])",
"rejected": "ただsort()を使えばいいよ"
},
# ...
]
DPOの変形
ORPO (Odds Ratio Preference Optimization, 2024)
- SFTと好み学習を同時に実行
- 別途のSFT段階不要
- 学習時間さらに短縮
IPO (Identity Preference Optimization, 2024)
- Referenceモデルなしで学習可能
- メモリ使用量さらに削減
KTO (Kahneman-Tversky Optimization, 2024)
- ペア比較データの代わりに個別フィードバック使用 (良い/悪い)
- データ収集コスト大幅削減
タスク別学習方法選択ガイド
コスト-性能トレードオフ
graph TD
A[タスクタイプ分析] --> B{一般知識<br/>十分?}
B -->|はい| C[プロンプトエンジニアリング<br/>コスト: $0]
B -->|いいえ| D{ドメイン特化<br/>必要?}
D -->|はい| E{データサイズ}
E -->|少量| F[Few-shot ICL<br/>コスト: $0]
E -->|中間| G[LoRA/QLoRA<br/>コスト: $10~100]
E -->|大量| H[Full Fine-tuning<br/>コスト: $1,000~10,000]
D -->|いいえ| I{応答品質<br/>改善?}
I -->|はい| J[DPO/ORPO<br/>コスト: $100~1,000]
実務推奨事項
1. チャットボット/対話型システム
プロンプト → SFT (LoRA) → DPO
- ドメイン知識注入: LoRAで効率的ファインチューニング
- 対話品質改善: DPOで好み整列
2. 文書分類/タグ付け
プロンプト → LoRA (選択的)
- ほとんどプロンプトで十分
- 極限性能必要時LoRA追加
3. コード生成
プロンプト → SFT (QLoRA) → RLHF/DPO
- コードスタイル学習: QLoRAで大量コード学習
- 実行可能性改善: RLHFでコンパイルエラーペナルティ
4. 要約/翻訳
プロンプト → DPO
- 基本モデルで十分な場合が多い
- スタイル調整: DPOで望むトーン/長さ学習
メモリ要件比較
| 方法 | 7Bモデル | 13Bモデル | 70Bモデル |
|---|---|---|---|
| Full Fine-tuning | 80GB | 160GB | 800GB+ |
| LoRA | 40GB | 80GB | 400GB |
| QLoRA | 24GB | 40GB | 200GB |
コンシューマーGPU活用可能性:
- RTX 4090 (24GB): QLoRAで7B、LoRAで3B学習可能
- RTX 3090 (24GB): QLoRAで7B学習可能
- RTX 4060 Ti (16GB): QLoRAで3B学習可能
示唆点と所感
民主化されるLLMファインチューニング
DeNA資料を通じて最も印象的だった点は、LLMファインチューニングがもはや大企業の専有物ではないということです。QLoRAとDPOの登場により:
- 24GB VRAMで7Bモデルファインチューニング可能
- 数百ドル予算でドメイン特化モデル構築可能
- 複雑なRLHFの代わりに簡単なDPO活用可能
効率性のパラダイムシフト
最近、効率性(Efficiency)が話題になっています:
- LoRA: パラメータ0.1%学習でFull Fine-tuningの98%性能
- QLoRA: メモリ1/4で同等性能
- DPO: RLHF複雑度1/3で同等性能
これは単純な最適化ではなく新しい数学的洞察の結果です。低ランク仮説、量子化理論、暗黙的リワードモデルなど学界の研究が実務に迅速に移転されています。
実務者への教訓
- プロンプトから始める: 80%はプロンプトで解決可能
- LoRAを基本に: ファインチューニング必要時まずLoRAを試す
- QLoRAでリソース節約: 性能差わずか、メモリ4倍節約
- DPOで整列: RLHFはレガシー、DPOが新しい標準
- 測定して改善する: ベンチマークスコアより実際タスク性能に集中
2025年展望
次のようなトレンドが予想されます:
- より小さく強力なモデル: Phi-3、Gemma 2のような小型モデルの躍進
- オンデバイスファインチューニング: スマートフォンでもファインチューニング可能な時代
- 自動化されたハイパーパラメータチューニング: AutoML for LLM Fine-tuning
- マルチモーダルPEFT: 画像+テキスト同時ファインチューニング
参考資料
論文
- LoRA: Low-Rank Adaptation of Large Language Models (Microsoft, 2021)
- QLoRA: Efficient Finetuning of Quantized LLMs (University of Washington, 2023)
- Direct Preference Optimization (Stanford, 2023)
- DoRA: Weight-Decomposed Low-Rank Adaptation (NVIDIA, 2024)
- GaLore: Memory-Efficient LLM Training (CMU, 2024)
ライブラリ
- HuggingFace PEFT - LoRA、QLoRA実装
- HuggingFace TRL - RLHF、DPO実装
- Unsloth - 2倍速いLoRA学習
実習資料
次回予告: “DeNA LLMスタディPart 4: プロダクション展開とモニタリング”では、ファインチューニングしたモデルを実際のサービスに展開する戦略、モニタリング方法、コスト最適化技法を扱う予定です。
他の言語で読む
- 🇰🇷 한국어
- 🇯🇵 日本語(現在のページ)
- 🇺🇸 English
- 🇨🇳 中文
この記事は役に立ちましたか?
より良いコンテンツを作成するための力になります。コーヒー一杯で応援してください!☕