Focal Loss(フォーカルロス)
クラス不均衡問題に対処するために Cross-Entropy Loss を改良した損失関数。簡単なサンプル(高確信度の正解予測)の損失重みを下げ、難しいサンプル(低確信度の予測)に学習を集中させる。物体検出の RetinaNet で提案され、LLM のトークンレベル学習やクラス不均衡なテキスト分類でも効果を発揮する。
Focal Loss とは
Focal Loss は 2017 年に Meta AI(当時 Facebook AI Research)の Tsung-Yi Lin らが RetinaNet 論文で提案した損失関数である。従来の Cross-Entropy Loss に (1 - p_t)^γ という変調係数を掛けることで、正しく分類できているサンプル(p_t が高い)の損失寄与を抑え、誤分類されやすいサンプルに学習を集中させる。
数学的定義
FL(p_t) = -α_t * (1 - p_t)^γ * log(p_t)
- p_t: 正解クラスの予測確率
- γ(ガンマ): フォーカシングパラメータ。0 で Cross-Entropy と同一、大きいほど easy sample の重みが低下。γ=2.0 が標準
- α_t: クラスバランス重み。少数クラスに高い重みを付与。α=0.25(背景クラス)/ 0.75(前景クラス)が標準
γ=2.0 の場合、p_t=0.9(確信度 90%)のサンプルの損失は Cross-Entropy の 1/100 に低下。p_t=0.5(確信度 50%)では約 1/4 にしか低下せず、難しいサンプルに学習リソースが集中する。
γ 値の効果
| γ 値 | p_t=0.9 の重み | p_t=0.5 の重み | 用途 |
|---|---|---|---|
| 0 | 1.0 | 1.0 | Cross-Entropy と同一 |
| 1 | 0.1 | 0.5 | 軽い補正 |
| 2 | 0.01 | 0.25 | 標準設定 |
| 3 | 0.001 | 0.125 | 強い補正 |
| 5 | 0.00001 | 0.031 | 極端な不均衡向け |
物体検出での成功
RetinaNet が Focal Loss で達成した成果:
- COCO AP: 39.1(当時の one-stage 検出器最高、two-stage の Faster R-CNN 36.2 を超越)
- 背景:物体比: 約 100,000:1 の極端な不均衡を解消
- 後続の FCOS、ATSS、GFL すべてが Focal Loss を採用
- YOLO シリーズも v5 以降で Focal Loss をオプション搭載
LLM・NLP での応用
Focal Loss は元々画像認識向けだが、テキスト処理でも有効:
- クラス不均衡テキスト分類: スパム検出(正例 1%)、有害コンテンツ検出(正例 0.5%)で F1 スコア 3-8% 向上
- トークンレベル学習: LLM の事前学習で頻出トークン(the, a, is)の損失重みを自動的に下げ、稀少トークン(専門用語、固有名詞)の学習を強化。研究段階だが Focal Loss 適用で perplexity 2-5% 改善の報告あり
- Named Entity Recognition: 大半が O タグ(非エンティティ)の不均衡をγ=2.0 で緩和
- 固有表現抽出: Focal Loss + CRF の組み合わせで少数エンティティの再現率向上
- 機械翻訳: 稀少語の翻訳精度を Focal Loss で改善する研究が 2024 年に発表
実装例
# PyTorch での Focal Loss 実装
class FocalLoss(nn.Module):
def __init__(self, gamma=2.0, alpha=0.25):
super().__init__()
self.gamma = gamma
self.alpha = alpha
def forward(self, logits, targets):
ce_loss = F.cross_entropy(logits, targets, reduction='none')
p_t = torch.exp(-ce_loss)
focal_weight = (1 - p_t) ** self.gamma
loss = self.alpha * focal_weight * ce_loss
return loss.mean()
派生手法
- Quality Focal Loss(QFL): GFocalNet で提案。連続値の品質スコアを予測
- Distribution Focal Loss(DFL): バウンディングボックスを離散分布として予測
- Poly Loss: Focal Loss を多項式展開で一般化。ε_1=1.0 で Focal Loss を含む
- Balanced Focal Loss: クラス頻度に基づく α の自動設定
よくある質問(FAQ)
Q1: γ=2 以外の値を使うべき場面はありますか? A: 不均衡が極端(正例 0.1% 未満)なら γ=3-5 が有効。逆に比較的バランスの取れたデータセット(正例 30%+)では γ=0.5-1.0 で十分。γ が大きすぎると難しすぎるノイズラベルにも過度に注力するため、ラベル品質が低い場合は γ を控えめにする。
Q2: Focal Loss と Class Weight の違いは? A: Class Weight はクラス全体に一律の重みを付与するのに対し、Focal Loss はサンプルごとの予測確信度に応じて動的に重みを調整する。両者の併用(α + γ)が最も効果的で、RetinaNet の標準設定もこの併用。
Q3: LLM の事前学習に Focal Loss は使われていますか? A: 2026 年現在、主要な LLM の事前学習では標準 Cross-Entropy が主流。ただし Focal Loss 的なトークン重み付け(高頻度トークンの重み削減)は研究レベルで効果が確認されており、今後の採用が期待される。SFT フェーズでは不均衡な指示分布への対処として使用例がある。
まとめ
- Focal Loss は Cross-Entropy に動的重み (1-p_t)^γ を追加した改良版
- γ=2.0、α=0.25 が標準ハイパーパラメータ
- 物体検出で革命的成果を上げ、NLP にも波及
- クラス不均衡タスクで F1 を 3-8% 改善
- LLM での応用は研究段階だが将来性あり