状態:ドラフト(2026-10-13)、一部実測。 例はノートPCのCPUで実際に動かした値です(
code/04_losses.py、1秒以内)。論文の数値は原文を開き、条件とともに転載しました。 作成ルール:実測データを基本とし、計測できなかったものは「未計測」と表記します。
目次
- 1. 損失関数は「採点基準」である
- 2. 交差エントロピー
- 3. focal loss:簡単な例を静かにさせる
- 4. ヒートマップロス
- 5. データ拡張
- 6. 学習率スケジュールと大バッチ
- 7. 混合精度
- 8. 限界と私たちのプロジェクト
- 参考文献
1. 損失関数は「採点基準」である
第1回で見たように、学習とはロスを減らす方向に重みを移動させる作業です。そのため、モデルが何を学ぶかは 損失関数をどう設定したかによって決まります。採点基準が「間違いの数」であれば生徒は簡単な問題を多く正解させようとし、「難しい問題に加点」であれば難しい問題に執着します。検出において、この違いは実際に大きな問題になります。
2. 交差エントロピー
分類の基本損失は 交差エントロピー(CE)です。モデルが正解クラスに与えた確率を p_t とすると、損失は −log(p_t) になります。正解に1を与えると0になり、0に近づくほど無限大に大きくなります。
| p_t | 0.1 | 0.5 | 0.9 | 0.99 |
|---|---|---|---|---|
| CE | 2.303 | 0.693 | 0.105 | 0.010 |
(直接計算。)すでにうまく正解している例(p_t = 0.9)でも、損失が0.1もあります。1つひとつは小さくても、このような例が 非常に多い と話が変わってきます。
3. focal loss:簡単な例を静かにさせる
問題:背景の10万マス
シングルステージ検出器(第6回)は、画像のすべての位置にあらかじめ配置したボックス(アンカー)ごとに「物体であるか」を判定します。RetinaNetの論文には、画像1枚あたりこのような候補が 約10万個あると記載されています。そのうち物体はほんのわずかで、残りは空、壁、床です。大半は、モデルがすぐに「背景」であると正しく判定できるようになる簡単な例です。
実際に計算してみました。すでによく正解している背景の10万マス(p_t 0.95–0.999)と、まだ正解できていない物体の100マス(p_t 0.05–0.5)の損失の総和です。
| 損失 | 背景10万マスの総和 | 物体100マスの総和 | 全体における物体の割合 |
|---|---|---|---|
| 交差エントロピー | 2,595.7 | 145.7 | 5.3% |
| focal(γ=2) | 3.3 | 91.2 | 96.5% |
(実測、 code/04_losses.py [2]。)CEでは学習シグụの95%が「すでに知っていること」から生じます。本来学ぶべき物体はノイズに埋もれてしまいます。
解決策:(1 − p_t)^γを掛ける
Linらによるfocal lossは、CEに (1 − p_t)^γ を掛けます。
FL(p_t) = −α_t · (1 − p_t)^γ · log(p_t)
p_tが1に近い簡単な例は (1 − p_t)^γ が0に近づいて損失がほとんどなくなり、難しい例はほとんどそのままになります。γ=2の場合、p_t=0.9の例の損失はCEの1/100、p_t=0.99の場合は1/10,000になります(上記の曲線、直接計算と論文の説明は同じです)。
論文の数値:γ=2が最も良く、0.5〜5の範囲で大きくは変わりませんでした。γ=2のときα=0.25が最も良くなりましたが、α=0.5とのAPの差は0.4だけでした。損失は約10万個のアンカー全体で計算し、正解が割り当てられたアンカー数で割ります。この損失で学習したシングルステージ検出器RetinaNet(ResNet-101-FPN、短い辺800px、サイズジッター拡張と1.5倍長くの学習)は、COCO test-devで 39.1 AP を記録し、当時のツーステージ検出器を上回りました。
設計の意図を確認しておくと、以前は簡単な背景を サンプリングで捨てていました(難しい音声だけを選んで学習するなど)。focal lossは捨てずに 重みを継続的に下げる ようにしています。損失関数の1行でデータの選別を代替したわけです。
4. ヒートマップロス
第3回のヒートマップ出力は、どのような損失で学習するのでしょうか。2つの方向性があります。
- MSE:正解のガウス分布の山と予測マップのピクセルごとの二乗誤差平均。Stacked HourglassやHRNetが使用します。
- ペナルティを軽減したfocal:CornerNet(2018)が頂点ヒートマップに使用し、CenterNet(2019)が物体中心ヒートマップに引き続いて使用したものです。正解点(値が1)にはfocal形式の損失を、残りのピクセルには
(1 − 정답값)^βを掛け、 正解に近いピクセルのペナルティを軽減します。 α=2、β=4を使用し、正解点の数で割ります。
64×64のヒートマップにおいて、σ=2の正解の山に対するいくつかの予測の損失を測定しました(実測)。
| 予測 | MSE | ペナルティを軽減したfocal |
|---|---|---|
| すべて0(何も検出しなかった場合) | 0.00307 | 9.21 |
| 正解そのまま | 0.00000 | 0.31 |
| 1マスずれた山 | 0.00037 | 0.66 |
| 4マスずれた山 | 0.00388 | 14.73 |
MSE側を見ると、「何も検出しなかった」(0.00307)ほうが「4マスずれ」(0.00388)よりも 低く なっています。ピクセルの大部分が0であるマップで平均を取るため、モデルの立場からすると、山を当てもんの場所に描くよりもすべて0で塗りつぶす方が損失が少なくなります。学習初期にヒートマップモデルが「すべて0」に陥ってしまう理由がここにあります。ペナルティを軽減したfocalは正解点の数で割るため、値の大きさがピクセル数に埋もれることがなく、「すべて0」に対しても大きな損失(9.21)を与えます。ただし、この例では4マスずれのほうが「すべて0」よりも大きなペナルティを受けています。損失によって、何をより悪いとみなすかが異なることを示す表です。
5. データ拡張
モデルが実際に遭遇する変化を学習時にあらかじめ見せておくのが拡張です。何を拡張するかは、すなわち「モデルが無視すべき変化」の宣言にほなりません。
- AlexNet(2012):ランダムクロップ+左右反転により学習データを実質2048倍にし、カラーJitterによってtop-1エラーを1%以上削減しました(第1回)。
- U-Net(2015):細胞が実際にそのように歪むため、弾性変形を使用しました(第3回)。
- mixup(2018):2つの画像と2つのラベルを同じ割合で混ぜ合わせます。
x̃ = λx_i + (1−λ)x_j,ỹ = λy_i + (1−λ)y_j、λはBeta(α, α)からサンプリングします。ImageNetのResNet-50を200エポック学習した場合、top-1エラーは23.6%から22.1%へ改善しましたが(α=0.2)、90エポックでは23.5%から23.3%へと効果が小さくなりました。データ拡張は、長く学習する余裕がある場合に大きな効果を発揮します。 - 第7回のViT系(DeiT)はデータ拡張に大きく依存しています。mixupとCutMixを同時に外すと、ImageNetのtop-1精度は81.8%から75.8%に低下しました。
データ拡張を行う際は、ラベルも一緒に変更する必要があります。画像を左右反転させた場合、ボールのx座標や、姿勢における「左手・右手」というラベルも変更しなければなりません。卓球においては時間軸にも注意が必要です。連続フレームを入力するボール検出モデルに、フレームの順序を逆にした動画を入力すると、ボールの運動方向が逆になってしまいます。
6. 学習率スケジュールと大バッチ
学習率は勾配降下法における歩幅です。最初から最後まで同じ歩幅を維持するよりも、変化させていく方が望ましいことが経験的に知られています。
- ウォームアップ:最初の数エポックは小さな学習率から目標値まで線形に増加させます。ランダムに初期化された重みは勾配が不安定なため、最初から大きな歩幅だと発散しやすくなります。
- コサイン減衰(SGDR、2017):
η_t = η_min + ½(η_max − η_min)(1 + cos(π·T_cur/T))。最初はゆっくり、中盤は速く、終盤は再びゆっくりと減少します。元の論文では周期ごとに学習率を再び引き上げる(リスタート)手法が提案されましたが、実務ではリスタートを行わずに1つの周期だけを使用するケースが少なくありません。
ウォームアップ5エポック+コサイン減衰、合計100エポック、最高値0.1の設定です(直接計算)。
에폭 0 2 4 5 25 50 75 99
lr 0.020 0.060 0.100 0.100 0.089 0.054 0.016 0.000
大バッチの線形スケーリング則。 Goyalら(2017)は、ミニバッチサイズをk倍にするなら、学習率もk倍にすべきだと提案しました(lr = 0.1 · 배치/256)。ただし、最初の5エポックの間は0.1から3.2まで徐々に引き上げるウォームアップが必要でした。これにより、ResNet-50をバッチサイズ8192、データセンターのGPU256枚を用いて 1時間 で90エポック分学習させることができ、ImageNetの検証用top-1エラーは23.74%(±0.09)となり、バッチサイズ256のベースラインである23.60%(±0.12)と同等になりました。ウォームアップを行わなかった場合は24.84%でした。
7. 混合精度
GPUは16ビット浮動小数点数(半精度)を32ビットよりもはるかに高速に計算でき、メモリ消費も半分になります。しかし、単純に16ビットに変更するだけでは学習が破綻してしまいます。実際に確認してみました(実測)。
FP16 가장 작은 정규수 6.10e-05, 가장 큰 수 65504
FP32 기울기 3.00e-04 2.00e-06 5.00e-08 1.00e-08
FP16 로 바로 3.00e-04 2.03e-06 5.96e-08 0.00e+00 ← 1e-8 이 0 이 되고 5e-8 은 6e-8 로 뭉개진다
×1024 → FP16 → ÷1024 3.00e-04 2.00e-06 5.00e-08 1.00e-08 ← 손실 스케일
FP16 가중치 1.0 에 1e-4 를 더하면 1.0 ← 갱신이 사라진다
2つの問題点が見られます。非常に小さな勾配が0になってしまい(アンダーフロー)、大きな重みに小さな更新量を足し合わせると丸め誤差によって消えてしまいます。Micikeviciusら(2018)による混合精度学習は、以下の3つの方法でこれを防ぎます。
- FP32のマスターウェイト:重みの32ビットのコピーを保持し、パラメータの更新はそこで行います。計算を行うときだけ16ビットに丸めて使用します(上記3行目の問題の解決策)。
- ロススケーリング:逆伝播の前に損失に大きな数値(論文では8から32Kの間、多くのネットワークではそこまで必要ありません)を掛け、勾配をFP16で表現できる範囲まで引き上げ、パラメータ更新の直前に元で割って戻します(上記3つ目の問題に対する解決策)。
- FP32の累積:16ビットの乗算結果を32ビットで加算します。
重みのコピーが存在するため重み用のメモリは50%増加しますが、メモリの大半を占める活性化値が16ビットになるため、学習全体のメモリ消費量はほぼ半分になると論文は報告しています。最近はFP32と同等の指数部範囲を持つ bfloat16 が多く使われており、ロススケーリングなしでもアンダーフローがほとんど起きません。SAM 2の論文における速度計測も、bfloat16の自動混合精度で行われました(第10回)。
8. 限界と私たちのプロジェクト
- 損失関数は ラベルの約束をそのまま学習します。TT ScoreのBlurBallでは、ブレたボールの端ではなく 中心にラベルを打つように変更したところ、同一構造のモデルであっても高速なボールの再現率が大きく向上しました(TT Scoreモデル解剖 第2回)。損失関数を変更することと同様に、ラベルのルールを変更することも「採点基準」を変えることに他なりません。
- データ拡張によって画質劣化の条件(暗さ、低解像度、長時間露光)をあらかじめ見せることができますが、私たちはまだそのような拡張を用いた再学習を行っておらず、劣化条件は 評価にのみ使用しました(同記事のセクション6)。スマートフォン動画を用いたファインチューニングは現在進行中です。
- focal lossのγ、学習率、ウォームアップの長さといったハイパーパラメータは、タスクごとに再調整すべき値です。論文の値はあくまで出発点にすぎません。
次回からは検出についての解説です。ツーステージ検出器(R-CNNからFaster R-CNN)とアンカーから見ていきます。
ティーティーの一言。 背景の10万個のセルが「あの背景だよ!」と一斉に叫ぶと、1つのボールの声が聞こえなくなります。focal lossは、すでに正解したセルに静かにするように言うものです。
参考文献
- Lin, T.-Y., Goyal, P., Girshick, R., He, K., Dollár, P. (2017). Focal Loss for Dense Object Detection. ICCV 2017. https://arxiv.org/abs/1708.02002
- Law, H., Deng, J. (2018). CornerNet: Detecting Objects as Paired Keypoints. ECCV 2018. https://arxiv.org/abs/1808.01244
- Zhou, X., Wang, D., Krähenbühl, P. (2019). Objects as Points. arXiv. https://arxiv.org/abs/1904.07850
- Zhang, H., Cisse, M., Dauphin, Y. N., Lopez-Paz, D. (2018). mixup: Beyond Empirical Risk Minimization. ICLR 2018. https://arxiv.org/abs/1710.09412
- Loshchilov, I., Hutter, F. (2017). SGDR: Stochastic Gradient Descent with Warm Restarts. ICLR 2017. https://arxiv.org/abs/1608.03983
- Goyal, P. et al. (2017). Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour. arXiv. https://arxiv.org/abs/1706.02677
- Micikevicius, P. et al. (2018). Mixed Precision Training. ICLR 2018. https://arxiv.org/abs/1710.03740
- Touvron, H. et al. (2021). Training data-efficient image transformers & distillation through attention. ICML 2021. https://arxiv.org/abs/2012.12877
- サンプルコードと出力:このフォルダーの
code/04_losses.py,code/04_losses.out.txt