ひとことで言うと
特殊な分類損失は、標準の交差エントロピーでは学習が偏る場面で、例の難しさやラベルの確信度を補正する選択肢です。
易しい小問を大量に採点すると難問の結果が埋もれます。易しい例を軽くし、難例や少数クラスへ学習の目を向けます。
なぜ必要か
極端な不均衡では、容易な負例が多数あるため損失がそれらに埋もれます。Focal Lossは容易な例の損失を下げます。
少数クラスの汎化にはクラス分布に応じたマージンを入れるLDAM、過信の抑制にはone-hot教師を一様分布との重みに置き換えるLabel Smoothingがあります。
損失を変えれば不均衡が自動的に解決するわけではありません。少数クラスを重視するのか、容易な例を軽くするのかを先に切り分けます。
仕組み
正解クラスの予測確率を 、集中度を決める とすると、Focal Lossは次です。
は正解クラスの確率、 は非負の値です。 が大きい例ほど係数が小さくなります。
Label Smoothingでは、クラス数を 、平滑化率を 、one-hotラベルを として、教師値を次のように変えます。
正解を確率1と固定しないため、過信を抑え、予測の較正を改善する方向に働きます。LDAMはラベル分布を見たクラス依存のマージンを組み込みます。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| Focal Lossの係数 | 易しい例ほど損失の重みが下がる | 難しい例を除外する、と断定する |
| Label Smoothingの効果 | 過信を抑え、較正を改善する | 少数クラスだけを再重み付けする |
| 損失の選択 | 不均衡・難例集中・過信抑制で目的を分ける | どの不均衡にも同じ損失を使う |
実装で確かめる
確率が高い例ほどFocal Lossの係数が小さくなることだけをNumPyで確認します。
import numpy as np
p_t = np.array([0.99, 0.6, 0.1])
gamma = 2.0
focal = -(1 - p_t) ** gamma * np.log(p_t)
print(np.round(focal, 6))
取り違えやすいもの
| 手法 | 主に調整するもの | 使う判断 |
|---|---|---|
| Focal Loss | 例ごとの損失寄与 | 易しい負例が多すぎる |
| LDAM | クラス分布に応じたマージン | 少数クラスの汎化を重視する |
| Label Smoothing | 教師ラベルの確信度 | 予測の過信や較正を扱う |
| クラス再重み付け | クラスごとの損失係数 | 不均衡を重みで補正する |
想起チェック
Focal Lossは何の寄与を下げるか
正しく分類できた容易な例、特に大量の容易な負例の損失への寄与です。難しい例を学習対象から削除する手法ではありません。