AI・機械学習
中級
壊滅的忘却(LLM)(カイメツテキボウキャク)
ニューラルネットワークが新しいタスクや知識を学習する際に、以前に習得した知識を急激かつ大幅に失う現象。継続学習・ファインチューニングにおける主要な課題。
0 回閲覧
0 いいね
2026/6/6 更新
関連タグ
継続学習
ファインチューニング
LLM
EWC
壊滅的忘却
壊滅的忘却(LLM)とは
壊滅的忘却(Catastrophic Forgetting, CF)とは、ニューラルネットワークが新しいタスクや知識を学習する際、以前に獲得した知識を急激かつ大規模に失う現象を指す。1989年にMcCloskey & Cohenによって提唱され、連結主義モデルの根本的な脆弱性として認識されてきた。
LLMにおける発生メカニズム
重み上書きによる干渉
大規模言語モデルの知識は数十億〜数千億パラメータに分散して符号化されている。ファインチューニング時に勾配降下法でこれらの重みを更新すると、新しいデータ分布に最適化されるが、以前のタスクに必要だった重みパターンが破壊される。
事前学習済み重み W₀
↓ ファインチューニング(新タスクT₂)
最適化後の重み W₁ → T₂には最適だがT₁の性能が大幅劣化
可塑性・安定性ジレンマ
- 可塑性(Plasticity): 新しい情報を素早く学習する能力
- 安定性(Stability): 既存知識を保持する能力
これら二つはトレードオフの関係にあり、完全な両立は困難。学習率を高くすると可塑性は上がるが安定性が低下し、逆の場合は新しいタスクの学習が遅くなる。
LLMファインチューニングでの実例
一般的なファインチューニングシナリオ
# 問題のある標準的なファインチューニング
from transformers import AutoModelForCausalLM, Trainer, TrainingArguments
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B")
# 医療ドメインデータでファインチューニング
training_args = TrainingArguments(
output_dir="./medical-llama",
num_train_epochs=3,
learning_rate=2e-5,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=medical_dataset, # 医療テキストのみ
)
trainer.train()
# 結果: 医療QAは向上、一般常識・コーディング能力が低下
典型的な劣化パターン
| ファインチューニング前 | ファインチューニング後 |
|---|---|
| 数学推論: 85% | 数学推論: 62% |
| 一般常識: 78% | 一般常識: 55% |
| コーディング: 72% | コーディング: 48% |
| 医療QA: 45% | 医療QA: 89% |
緩和手法の分類
1. 正則化ベース手法
EWC(Elastic Weight Consolidation)
- Fisher情報行列を用いて重要なパラメータを特定
- 重要度の高い重みの変更にペナルティを課す
- 古いタスクの性能を保護しながら新タスクを学習
L2正則化
- 新パラメータと旧パラメータの差をL2ノルムでペナルティ化
- シンプルだが効果は限定的
2. リプレイベース手法
Experience Replay
- 過去のタスクデータの一部をバッファに保存
- 新タスク学習中に古いデータも混合して学習
- データ保持コストが発生するが高効果
Generative Replay
- 過去データの代わりに生成モデルで擬似データを生成
- データストレージ不要だが生成品質に依存
3. パラメータ効率的手法
LoRA / QLoRA
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
)
model = get_peft_model(base_model, config)
# ベースモデルの重みは凍結し、LoRAアダプタのみ更新
# 壊滅的忘却を大幅に軽減
Adapter Layers
- Transformerブロックに小さなアダプタモジュールを挿入
- ベース重みを変更せずにタスク固有の知識を追加
4. アーキテクチャベース手法
Progressive Neural Networks
- タスクごとに新しいカラムを追加、既存重みは凍結
- 横方向の接続(Lateral Connections)で知識転移
PackNet
- ネットワークの使用されていない容量を新タスクに割り当て
- タスクごとにサブネットワークを持つ
評価指標
# BWT(Backward Transfer): 新タスク学習後の旧タスク性能変化
BWT = (1/(T-1)) * Σ(R[T][k] - R[k][k])
# R[i][j]: タスクiまで学習後のタスクjの性能
# 負の値が大きいほど壊滅的忘却が深刻
# FWT(Forward Transfer): 過去の学習が未来タスクに与える恩恵
FWT = (1/(T-1)) * Σ(R[i-1][i] - R_base[i])
# Stability: 旧タスク性能の保持率
Stability = 1 + BWT # 1.0に近いほど忘却なし
2025年の最新動向
LLM特有の課題
- スケールの問題: 数十億パラメータモデルでEWCのFisher行列計算は計算量的に困難
- 継続事前学習: 新しいコーパスでの継続学習時に以前の言語能力が低下する問題
- アライメント劣化: RLHFでアライメントしたモデルをファインチューニングするとアライメントが壊れる「アライメント税」
実用的なソリューション(2025年基準)
# 推奨: PEFT + リプレイの組み合わせ
from peft import LoraConfig
# ステップ1: LoRAで重要重みを保護
lora_config = LoraConfig(r=64, target_modules=["q_proj", "v_proj", "k_proj", "o_proj"])
# ステップ2: ドメインデータ + 汎用データの混合学習
dataset = DatasetMixer(
domain_data=medical_corpus, # 70%
general_data=general_corpus, # 30% (リプレイ効果)
domain_weight=0.7,
)
# ステップ3: 定期的な評価
evaluator = ContinualLearningEvaluator(
tasks=[medical_qa, general_qa, coding_bench],
early_stop_on_forgetting=True,
forgetting_threshold=0.1, # 10%以上の劣化で停止
)
産業応用での考慮点
- モデルバージョン管理: ファインチューニング前後のチェックポイントを保持
- A/Bテスト: ファインチューニング後の全タスクでの性能を事前評価
- 段階的適応: 一度に全データでなく段階的にファインチューニング
- 知識蒸留: 教師モデル(元モデル)から生徒モデルへの知識転移でベースライン保護
壊滅的忘却はLLMの実用化における最重要課題の一つ。2025年現在、LoRA系のPEFT手法が事実上の標準的緩和策として採用されているが、完全な解決には至っていない領域である。