Temperature Scaling
温度スケーリングでは、softmaxの前にモデルのロジットを1つの学習済み値で割ることで、予測を変えずに信頼度を精度に合わせます。
温度スケーリングは事後キャリブレーション手法の一つです。訓練済み分類器のロジットを、ソフトマックスの前に単一の正の数Tで割ります。Tは保留データで選び、モデルの信頼度が実際の正解率に一致するようにします。Tが1より大きいと過信した確率が平滑化され、1より小さいと信頼度が低すぎる確率がより鋭くなります。すべてのロジットを同じ正の数で割っても順序は変わらないため、予測クラスは変化せず、精度もまったく変わりません。論文「現代ニューラルネットワークのキャリブレーションについて」で、Guoらは現代のディープネットワークのキャリブレーションが不十分であること、またPlattスケーリングの1パラメーター版である温度スケーリングが、テストしたほとんどのデータセットで驚くほど効果的であることを示しました。
温度スケーリングの仕組み#
スケーリング後のソフトマックスは、クラスiにexp(z_i / T) / Σ_j exp(z_j / T)の確率を割り当てます。zはロジットです。T = 1ではモデルは変わらず、Tが大きくなるほど確率は一様分布に近づき、Tが0に近づくほど最上位クラスの確率は1に近づきます。学習後に、学習損失と同じ交差エントロピーを使った負の対数尤度 (NLL) を、保留検証セット上で最小化してTを適合させます。このときネットワークの重みは固定します。パラメーターは1つだけなので、適合には数秒しかかからず、検証セットへの過学習も起こりにくくなります。以下のPyTorchスクリプトは、ロジットが実際の3倍大きいモデルのTを適合させます。
import torch
import torch.nn.functional as F
# Held-out logits for 5,000 images and 10 classes from an overconfident model:
# labels are drawn so that softmax(logits / 3) is perfectly calibrated
torch.manual_seed(0)
logits = 9 * torch.randn(5000, 10)
labels = torch.multinomial(F.softmax(logits / 3, dim=1), 1).squeeze(1)
# Fit the single temperature that minimizes negative log-likelihood (NLL) on the held-out set
temperatures = torch.linspace(0.5, 6.0, 551)
nll = torch.stack([F.cross_entropy(logits / t, labels) for t in temperatures])
T = temperatures[nll.argmin()]
# Accuracy depends only on the argmax, which dividing by T never changes
accuracy = (logits.argmax(1) == labels).float().mean()
before = F.softmax(logits, dim=1).max(1).values.mean()
after = F.softmax(logits / T, dim=1).max(1).values.mean()
print(f"T = {T:.2f}, accuracy {accuracy:.3f}")
print(f"Mean confidence: {before:.3f} before, {after:.3f} after")適合の結果、実際の係数3に近いT = 2.98が得られます。精度は0.663のままですが、平均信頼度は0.880から0.664に低下し、スケーリング後はモデルの平均信頼度が精度と一致します。
ネットワークが過信するようになる理由#
交差エントロピーによる学習では、ネットワークがすでに正しく分類している学習例でも、より大きなロジットが報酬され続けるため、新しいデータでの精度が頭打ちになった後も信頼度が上がり続けます。Guoらは、深さ、幅、重み減衰、バッチ正規化をキャリブレーション不良の重要な要因として挙げました。キャリブレーションは、ビンごとに精度と信頼度をプロットする信頼性図と、各ビンでの信頼度と精度の差を予測数で重み付けして平均する期待キャリブレーション誤差 (ECE) で測定します。NLLやBrierスコアもキャリブレーションを評価します。確率としてスコアを解釈するあらゆる場面でキャリブレーションが重要です。たとえば、リスクが30%を超えるすべてのケースを紹介する医療トリアージルール、信頼度の低い予測を人に委ねるシステム、ラベル付け対象として信頼度の最も低い画像を選ぶアクティブラーニングのループなどです。
物体検出器の温度スケーリング#
検出器は通常、ソフトマックスではなく独立したシグモイドで各クラスをスコア付けします。温度は同様にsigmoid(z / T)として適用されます。Tが1より大きいと、スコアは0.5に近づき、高いスコアは下がり、低いスコアは上がります。YOLO26では、各ボックスの信頼度はクラスロジットのシグモイド値です。予測時にconfのしきい値0.25と比較されます。したがって、保留画像で適合した温度を使うと、このしきい値を超えるボックスが変わりますが、すべてのボックスの順位は維持されます。この順位は平均適合率 (mAP)などのランキング指標が基盤とするものです。
その他の設定における温度#
- 大規模言語モデル(LLMs): サンプリング温度は、次のトークンのロジットベクトルを同じ方法でTで割る値であり、ユーザーは多様性と決定性のバランスを取るために手動で設定します。Tが0に近づくと、サンプリングは貪欲デコードに近づき、常に最も確率の高いトークンが選ばれます。
- 知識蒸留: Hintonらの蒸留手法では、教師モデルと生徒モデルの両方のsoftmax出力の温度を上げることで、生徒モデルが誤ったクラスに対する教師モデルの相対確率を学習します。
- 対照学習: CLIPなどのモデルは、softmaxの前に画像とテキストの類似度スコアを学習済みの温度で割ります。これにより、損失が一致するペアとそれ以外をどれほど明確に分離するかが制御されます。
温度スケーリングと関連手法の比較#
- Plattスケーリング: シグモイドを適用する前に、二値分類器のスコアに傾きと切片を当てはめます。温度スケーリングは、共通の傾き1 / Tを使い、切片を使わずに多クラスへ拡張します。
- ベクトルスケーリングと行列スケーリング: クラスごとに別々の重みとバイアスを学習するか、ロジット全体に対する完全な行列を学習します。これらは柔軟性が高い一方で過学習しやすく、予測クラスが変わる可能性があります。
- 等張回帰: スコアを確率に変換するノンパラメトリックな単調写像で、scikit-learnのキャリブレーションツールではPlattスケーリングとともに利用できます。
- ラベルスムージング: 正解クラスの値を1.0ではなく0.9にするなど、学習ターゲットを平滑化して、学習中の過信を抑えます。温度スケーリングが変更するのは、学習済みモデルの出力のみです。
- コンフォーマル予測: スコアを予測集合に変換し、交換可能なデータ上で、たとえば90%の割合で真のラベルを含むことを保証します。










