TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

損失関数と学習手法:交差エントロピー、focal loss、ヒートマップロス、データ拡張、学習率スケジュール、混合精度

状態:ドラフト(2026-10-13)、一部実測。 例はノートPCのCPUで実際に動かした値です(code/04_losses.py、1秒以内)。論文の数値は原文を開き、条件とともに転載しました。 作成ルール:実測データを基本とし、計測できなかったものは「未計測」と表記します。

目次

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 에 따른 손실: 교차 엔트로피 vs focal 0 1 2 3 4 0.0 0.2 0.4 0.6 0.8 1.0 정답 클래스에 준 확률 p_t (오른쪽일수록 「쉬운 예」) 교차 엔트로피(γ=0) focal γ=0.5 focal γ=2 p_t=0.9: focal 은 CE 의 1/100 쉬운 예의 몫이 사라진다
図:正解確率に応じた交差エントロピーとfocal lossの曲線。γ=2のとき、簡単な例の損失が大きく減少する

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つの方向性があります。

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. データ拡張

モデルが実際に遭遇する変化を学習時にあらかじめ見せておくのが拡張です。何を拡張するかは、すなわち「モデルが無視すべき変化」の宣言にほなりません。

データ拡張を行う際は、ラベルも一緒に変更する必要があります。画像を左右反転させた場合、ボールのx座標や、姿勢における「左手・右手」というラベルも変更しなければなりません。卓球においては時間軸にも注意が必要です。連続フレームを入力するボール検出モデルに、フレームの順序を逆にした動画を入力すると、ボールの運動方向が逆になってしまいます。

6. 学習率スケジュールと大バッチ

学習率は勾配降下法における歩幅です。最初から最後まで同じ歩幅を維持するよりも、変化させていく方が望ましいことが経験的に知られています。

ウォームアップ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つの方法でこれを防ぎます。

  1. FP32のマスターウェイト:重みの32ビットのコピーを保持し、パラメータの更新はそこで行います。計算を行うときだけ16ビットに丸めて使用します(上記3行目の問題の解決策)。
  2. ロススケーリング:逆伝播の前に損失に大きな数値(論文では8から32Kの間、多くのネットワークではそこまで必要ありません)を掛け、勾配をFP16で表現できる範囲まで引き上げ、パラメータ更新の直前に元で割って戻します(上記3つ目の問題に対する解決策)。
  3. FP32の累積:16ビットの乗算結果を32ビットで加算します。

重みのコピーが存在するため重み用のメモリは50%増加しますが、メモリの大半を占める活性化値が16ビットになるため、学習全体のメモリ消費量はほぼ半分になると論文は報告しています。最近はFP32と同等の指数部範囲を持つ bfloat16 が多く使われており、ロススケーリングなしでもアンダーフローがほとんど起きません。SAM 2の論文における速度計測も、bfloat16の自動混合精度で行われました(第10回)。

8. 限界と私たちのプロジェクト

次回からは検出についての解説です。ツーステージ検出器(R-CNNからFaster R-CNN)とアンカーから見ていきます。

ティーティーの一言。 背景の10万個のセルが「あの背景だよ!」と一斉に叫ぶと、1つのボールの声が聞こえなくなります。focal lossは、すでに正解したセルに静かにするように言うものです。

参考文献

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます