画像分類モデルを安定・高精度化する“ひと塩”テクニック
対象読者:クロスエントロピー損失は知っているが、学習が過信(over‑confidence)気味で安定しないと感じている初中級エンジニア。
ゴール:ラベルスムージングの仕組みと PyTorch 実装、適用時のチューニング方法を 5 分で理解する。
1. なぜラベルスムージング?
通常の one‑hot ラベルは「正解クラス 1.0/それ以外 0」という 100% の確信 をモデルに強要します。しかしこれは
- 過学習(over‑confidence)
- テスト時の誤判定が極端
を招く要因に。ラベルスムージングは
真ラベル 1.0 → 1 − ε
他クラス 0.0 → ε / (K−1)
と少しだけラベルを “曖昧” にすることで、予測分布に余裕を持たせ学習を安定させます。
2. PyTorch 実装(10 行)
import torch.nn.functional as F
def smooth_ce(logits, target, eps=0.1):
K = logits.size(1)
onehot = logits.new_full((len(target), K), eps / (K-1))
onehot.scatter_(1, target.unsqueeze(1), 1 - eps)
logp = F.log_softmax(logits, dim=1)
return -(onehot * logp).sum(dim=1).mean()
nn.CrossEntropyLoss
の置き換えとして criterion = smooth_ce
を使うだけ。
3. どんな効果がある?
症状 before | ラベルスムージング適用後 |
---|---|
訓練 acc ≫ val acc → 過学習 | 乖離が縮まり val acc +1〜3% |
Softmax 出力が 0.99 / 0.01 に張り付き | 0.85 / 0.10 / 0.05 など“自信控えめ”に |
MixUp と一緒に使うと損失が不安定 | ε=0.05 に下げると安定化 |
4. ハイパーパラメータ ε(イプシロン) の決め方
ハイパーパラメータ εとはラベルスムージングで 「正解ラベルをどれだけ“薄める”か」 を決める割合です。
ε | ラベル例 (K=4) | 効果イメージ | 使いどき |
0 | [0, 1, 0, 0] | まったく薄めず one‑hot | 従来の CrossEntropyLoss |
0.05 | [0.05, 0.85, 0.05, 0.05] | 少しだけ控えめに自信を下げる | クラス数が多い/軽い過学習対策 |
0.1 | [0.033, 0.9, 0.033, 0.033] | 標準的な値(ImageNet でも採用) | まず試す基準値 |
0.2↑ | [0.1, 0.7, 0.1, 0.1] | かなり曖昧なラベル | ノイズラベル多 or MixUp併用 |
覚え方:ε は “濃度調整つまみ”。高すぎればモデルが常に曖昧になり精度低下、低すぎれば過学習が残ります。まず 0.1 で試し、学習曲線や val acc を見ながら ±0.05 ずつ調整すると失敗しにくいです。
5. 失敗を防ぐチェックリスト
- Early Stopping 指標を見直す:損失が下がりづらくなるため、val accuracy でモニタ推奨。
- クラス不均衡データ:rare クラスが極端に少ない場合、ラベルスムージングより focal loss の方が有効。
- 推論後処理:Softmax 値が低めになるので、閾値で判定するタスクは再調整が必要。
6. 中級者向け:他手法との組み合わせと応用
テーマ | どう組み合わせる? | 効果・ポイント |
MixUp / CutMix | 入力画像とラベルを混在+εを小さめ(0.05)に設定 | 損失が安定し、ロバスト性↑ |
Knowledge Distillation | 教師モデルの“柔らかい予測”+スムージング | 生徒モデルの学習がスムーズに |
Pseudo‑Labeling | 擬似ラベルにεを加えて過信を抑制 | ノイズラベルでも精度低下を防ぐ |
7. 上級者向け:タスク別チューニングと理論背景
観点 | 上級テクニック | 例 / 効果 |
タスク応用 | 物体検出・セグメなどで ε を動的に変える | YOLO系で AP +1〜2% |
理論 | ロジットのエントロピーを高め汎化促進 | 過度にシャープな予測を防ぐ |
正則化比較 | Dropout 等と補完的、併用推奨 | 汎化性能を多角的に強化 |
まとめ
ラベルスムージングは「正解への過信を抑える」だけのシンプルな操作で、
- 過学習軽減
- 精度 1〜3% 向上
- 出力分布の安定
という効果を得られます。まずは ε=0.1 で試し、学習曲線と val accuracy の改善を体感してみましょう。