こんにちは、竹輪内からしです。
NeurIPS2020にuncertainty calibrationの論文が発表されていました。
様々な手法と組み合わせられそうだったので、紹介します。
論文の情報
- タイトル:Improving model calibration with accuracy versus uncertainty optimization
- 著者:
- Ranganath Krishnan(Intel Labs)
- Omesh Tickoo(Intel Labs)
- 公開日: Mon, 14 Dec 2020 20:19:21 UTC (NeurIPS2020)
- リンク:
論文の概要
- uncertaintyの正解値なしで、予測が正しいとは限らないデータのuncertaintyを高く、予測が正しそうなデータのuncertaintyを低くするuncertainty calibrationという問題に取り組んだ。
- 微分可能なaccuracy vs uncertainty calibrationを提案した。
- distribution shiftのある画像分類問題において、他のuncertainty calibration手法よりもよいcalibrationができることを示した。
uncetaintyとは
Uncertaintyとは「予測結果が正しいとは限らない度合い」のことです。
ここでは、分類器を例に挙げて説明していきます。
分類器の多くは「どの程度予測が正しそうか」を評価します。例えば、以下の図のように、「各クラスである確率がどの程度か」を評価します。

分類器の出力例
上の図の場合は、"1"クラスの確率が99%なので、"1"クラスを予測結果として出力されます。
このときの99%という確率をconfidenceと呼びます。
これは、予測結果が正しそうな度合いと見なすことができます。
逆に、uncertaintyは予測結果が正しいとは限らない度合いです。
Uncertaintyの評価方法は様々ありますが、
例えば、どれだけ複数のクラス間で確率がばらつくか(下の図参照)や、

確率が1クラスのみで高いときには予測が正しそうですが、
複数のクラス間で確率が同様の場合は予測が正しいとは限らなそうです
複数の分類器で予測した場合にどれだけ予測結果がばらつくか(下の図参照)などがあります。

複数の異なる分類器で同じ予測をすれば予測は正しそうですが、
複数の分類器で予測がばらばらであれば予測が正しいとは限らなそうです
Uncertaintyを正しく評価できれば、正しい予測をするときには機械を使って、予測が正しくないかもしれないときには人間が判断をする、といった分担ができるかもしれません。
そのため、AIの安全性(AI Safety)の分野で注目されています。
ここで、様々なタスクを高精度に解ける深層学習分類器では予測が誤るにも関わらず、confidenceが高くなる(uncertaintyが低くなる)場合があることが報告されています。
手法
本論文では、2種類のキャリブレーション方法が提案されています。
- 学習時にキャリブレーションするad-hocな方法
- 学習後にキャリブレーションするpost-hocな方法
どちらの方法も以下の表を使ってキャリブレーションしていきます。
|
certain |
uncertain |
正解 |
AC |
AU |
不正解 |
IC |
IU |
推論した全てのデータがACかIUに属すれば、よいuncertaintyを評価できたといえます。
そのため、ACとIUを増やし、AUとICを減らすことを目指します。
ad-hocな手法
ad-hocな方法ではロスを工夫して、学習時にキャリブレーションします。
ACとIUを増やし、AUとICを減らす項をロスに付け足すことでキャリブレーションを行います。
では、この項はどのように実現できるでしょうか?
AUに属するデータの個数nAUとICに属するデータの個数nICが多くなるほどロスが大きくなり、
ACに属するデータの個数nACとIUに属するデータの個数nIUが多くなるほどロスが小さくなる項を設計します。
nAU、nIC、nAC、nIUはそれぞれ以下のように取得できます。
nAU:=i∑I(y^i=yi∧ui>uTh)(1)
nIC:=i∑I(y^i=yi∧ui≤uTh)(2)
nAC:=i∑I(y^i=yi∧ui≤uTh)(3)
nIU:=i∑I(y^i=yi∧ui>uTh)(4)
ここで、hatyiは予測結果、yiは正解、uiは推定したuncertainty、uThはuncertaintyの閾値です。ここで、uncertaintyは予測ベクトルのエントロピー(各クラスの確率がどれだけばらつくか)を考えています。また、I(∙)は指示関数で、後ろの条件(∙)を満たす場合は1、満たさない場合は0を出力します。∧は「かつ」を表します。
これらnAU、nIC、nAC、nIUを用いて、以下のような項を最小化すれば、目的である「ACとIUを増やし、AUとICを減らす」を達成できます。
−lognAU+nIC+nAC+nIUnAU+nIC=log(1+nAC+nIUnAU+nIC)(5)
しかし、ここで問題があります。
式(1)~(4)で計算したnAU、nIC、nAC、nIUを用いると微分ができません。
つまり、勾配法による最適化ができず、学習できません。
そこで、以下のように微分可能な式で(1)~(4)を近似します。
nAU=y^i=yi∧ui>uTh∑pi⋅(1−tanh(ui))(6)
nIC=y^i=yi∧ui≤uTh∑(1−pi)⋅tanh(ui)(7)
nAC=y^i=yi∧ui≤uTh∑pi⋅tanh(ui)(8)
nIU=y^i=yi∧ui>uTh∑(1−pi)⋅(1−tanh(ui))(9)
ここで、
piはconfidenceを表します。
式(6)~(9)で計算したnAU、nIC、nAC、nIUを式(5)に代入することで、微分可能な損失項を実現します。
この項はELBO(変分下限)を最大化する学習や、cross entropyを最小化する学習など、様々なロスに足すことで、組み合わせることができます。
組み合わせたロスで学習することで、学習時にuncertaintyをキャリブレーションします。
post-hocな手法
post-hocな方法ではTemperature scalingという方法に基づいて、学習後にキャリブレーションします。
Temperature scalingはuncertaintyのキャリブレーション方法の1種です。
Temperature scalingはsoftmax前の出力を温度パラメータT(>0)でスケーリングする方法です。
まずはsoftmaxについて説明します。
深層学習分類器などでは、最終出力でそのクラスが正解である確率を推定しています。
確率を出力にするためには、各クラスに関する値が0以上となり、全クラスでの総和が1になるように調整する必要があります。
このために使うのが次式で表されるsoftmax関数です。
Softmax(zi)=∑i=1Kexpziexpzi
ここで、Kはクラス数、ziはクラスiに関する中間出力です。
このSoftmax関数は下図のように最終出力の直前に用います。

softmax関数と最終出力
Temperament scalingではこのsoftmax前の出力zを温度パラメータT(>0)を用いて次式のようにスケーリングします。
q=Softmax(z/T)
ここで、Softmax(∙)はSoftmax関数です。
このTemperature scalingで大切なのは適切にTを選ぶことです。
本論文では、このTを交差検証法を用いて最適化します。
論文にはあまり詳しく書いていないため、憶測になってしまいますが、
式(1)~(4)のuncertaintyuiにスケーリング後のsoftmaxのエントロピーを使うのだと思われます。
このときに、式(5)が最も小さくなるTを選ぶのだと思われます。
式(1)~(4)を求める際のuncertaintyの閾値uThは予測が正しいデータのuncertaintyの平均と予測が誤っているデータのuncertaintyの平均の中点を用います。
uTh=2Ny^=y∑y^=yui+Ny^=y∑y^=yui
実験と結果
uncertaintyが適切にキャリブレーションされているかどうかを以下の指標を用いて評価します。
- Expected calibration error(ECE)
- Expected uncertaity classification error
これらはいずれも低いほど高性能を表す指標です。
提案手法はSVI-AvUC(ad-hocな手法)、SVI-AvUTS(post-hocな手法)です。

CIFAR-10での結果
提案手法は比較的適切にキャリブレーションされていることがわかります。
また、カテゴリは同じでも異なるデータセットのデータを検出する分布シフト検知(distribution shift detection)、カテゴリが異なるデータセットのデータを検出する分布外検知(out-of-distribution(OOD) detection)の結果も見てみましょう。

分布シフト検知・分布外検知の結果
提案手法が比較手法の中では一番良い性能を達成していることがわかります。