Focal Loss
Focal Lossは、簡単なサンプルの寄与をほとんどなくし、希少で難しいサンプルが学習を主導するようにクロスエントロピーを調整します。計算式、ガンマ、RetinaNet、派生手法について解説します。
Focal lossは、モデルがすでにうまく分類できるサンプルの重みを下げ、学習が難しい誤分類サンプルに集中するようにした、修正版の損失関数です。Linらは2017年の論文Focal Loss for Dense Object DetectionでRetinaNet検出器とともにこの手法を発表し、物体検出における背景と物体の極端な不均衡に対処しました。現在では、あるクラスのサンプル数が他のクラスを大幅に上回る分類問題で広く使用されています。
不均衡の問題#
1段階物体検出器は、画像内のすべての候補位置を分類します。RetinaNetでは、画像ごとに約100,000箇所を評価します。そのほとんどは背景であり、モデルは学習の初期段階で背景を棄却するようになります。標準的なクロスエントロピーでは、簡単な負例もそれぞれ小さな損失を加えます。負例の数が非常に多いため、合計損失とその勾配を支配し、物体を含むわずかな位置からの信号をかき消します。2段階物体検出器は、領域提案段階で候補を絞り、前景と背景を一定の比率でサンプリングすることでこれを回避します。従来の1段階検出器はハードネガティブマイニングに依存していました。Focal lossは損失関数自体で不均衡を補正するため、サンプリングせずにすべての候補を学習に使用できます。
Focal lossの仕組み#
モデルが正解クラスに割り当てる確率をp_tとします。クロスエントロピーはCE = -log(p_t)であり、focal lossはこれに変調係数を乗算します。
FL = -α_t (1 - p_t)^γ log(p_t)
- フォーカシングパラメーター
γ(gamma): 簡単なサンプルの損失が減少する速さを制御します。γ = 0の場合、focal lossはクロスエントロピーと等しくなります。p_tが1に近づくと、(1 - p_t)^γは0に近づきます。一方、p_tが小さい誤分類サンプルでは、クロスエントロピー損失のほぼ全量が維持されます。論文で最良とされた設定γ = 2では、p_t = 0.9と分類されたサンプルの損失は、クロスエントロピーの場合より100分の1になります。 - バランス重み
α_t(alpha): 正例には固定の重みを、負例にはその補数を適用します。RetinaNetはα = 0.25とγ = 2を使用します。また論文では、物体に割り当てられたアンカーの数で各画像の合計損失を正規化しています。
torchvisionのsigmoid_focal_loss関数は、この式を実装しています。alpha=-1を設定するとバランス重みが無効になり、簡単・中程度・難しい正例に対するγの効果だけを比較できます。
import torch
import torch.nn.functional as F
from torchvision.ops import sigmoid_focal_loss
# Logits for three positive examples: easy, moderate, and hard
logits = torch.tensor([4.0, 1.0, -2.0])
targets = torch.ones(3)
# alpha=-1 turns off class weighting so only the gamma focusing term differs
bce = F.binary_cross_entropy_with_logits(logits, targets, reduction="none")
focal = sigmoid_focal_loss(logits, targets, alpha=-1, gamma=2.0, reduction="none")
for p, b, f in zip(logits.sigmoid(), bce, focal):
print(f"p={p:.2f} cross-entropy={b:.6f} focal={f:.6f} ratio={b / f:,.1f}x")Focal lossは、簡単なサンプルの損失 (p = 0.98) を約3,091分の1、中程度のサンプル (p = 0.73) を13.8分の1、難しいサンプル (p = 0.12) をわずか1.3分の1に縮小します。そのため、難しいサンプルが学習信号のほぼすべてを占めるようになります。
Focal lossの用途#
RetinaNetに加えて、focal lossとその派生手法は、多くの高密度検出器やTransformerベースの検出器の分類ブランチの学習に使われます。これにはDeformable DETRなどのDETR系モデルも含まれます。医用画像解析では、病変が画像のごく一部しか占めないことが多いため、画像セグメンテーションモデルでは、微小な所見が無視されないよう、また再現率を高めるために、focal lossとDice lossを組み合わせることが一般的です。Ultralyticsでは、RT-DETRトレーナーがVarifocal Lossでクラスをスコア化し、ultralytics.utils.lossモジュールは、デフォルト値がgamma=1.5とalpha=0.25のFocalLossクラスを提供します。
Focal lossと関連手法の比較#
- クラス重み付け: 重み付きクロスエントロピーは、クラス頻度に基づいて、希少クラスのすべてのサンプルに同じ固定の重みを加えます。focal lossは、各サンプルの現在の難しさに応じて重み付けするため、モデルの学習に伴って重みが変化します。
- ハードネガティブマイニング: 損失が最も大きい負例だけを残し、その他を破棄します。focal lossはすべてのサンプルを維持し、簡単なサンプルの重みを滑らかに縮小します。
- Varifocal Loss: VarifocalNetで提案された非対称な手法で、負例の重みだけを下げ、正例はIoUを考慮したスコアに近づくよう学習します。そのため、クラスの信頼度にも位置特定の品質が反映されます。
- Distribution Focal Loss (DFL): Generalized Focal Lossに由来するボックス回帰損失で、各ボックスの辺を離散確率分布として扱います。focal lossとは名称だけが共通しており、ボックス回帰に適用されます。










