はじめに
近年では、機械学習モデルがいたるところで使われるようになってきています。機械学習モデルの用途は様々ですが、よく使われる用途の一つに分類タスクが存在します。
多くの機械学習モデルでは、クラス分類の際に、各クラスに対して、数値化されたスコアを出力し、最大値を取るクラスを、そのデータの属するクラスとして判別することが多いです。この時、出力値を0〜1の範囲に正規化することもよく行われます。
気をつけなければならないのは、分類精度が高いモデルであっても、必ずしもこのスコアはそのクラスに属する確率を示しているわけではない点です。
値が1に近いほど、そのクラスに属する確率が高く、0に近いほど、そのクラスに当てはまらない確率が高い、ということは多くの場合、間違いないです。一方で、スコアが0.7のデータを集めてきたら、これらのデータが該当のクラスに属する確率が70%であるか、というと、モデルやデータによっては、そうはならないことも多いです。
下流タスクにおいて、単純に出力ラベルだけを用いる場合や、スコアのランキングのみを用いる場合などにはあまり問題にはなりませんが、スコアの大小に応じて判断を変えたい場合には、確率として扱えるほうが、解釈性が高く、ロジックの検討も容易です。
このようなモチベーションから、モデルの出力値を実際の確率に近づける手法が様々提案されており、これらを総称してProbability Calibrationと呼びます。
本記事では、Probability Calibrationを実現するための手法をいくつかピックアップし、紹介したいと思います。
手法の分類
Probability Calibrationを行う手法は大きく二つに分けることができます。
一つは、モデルの出力値に対して、後処理を行うことで補正を行う手法です。もう一つはモデルの学習時の工夫を行うことで達成する手法です。前者の研究のほうが昔から存在しており、近年、後者の研究が増えてきている印象です。
これらの手法は組み合わせて適用することも可能です。
すべての手法を網羅しきれているわけではないですが、本記事では、以下の手法を紹介します。
分類 | 代表的な手法 |
---|---|
後処理の手法 | - Histogram Binning (2001) - Isotonic Regression (2002) - Temperature Scaling (2015) |
学習時の手法 | - Focal Loss (2017) - Maximum Mean Calibration Error (MMCE) (2018) - AdaFocal (2022) |
後処理の手法
モデルの出力値に対して、後処理を行うことで補正する手法です。この手法のメリットとしては、モデルの種類を選ばない点と、既存の学習済みモデルをそのまま利用できる点です。
実利用の観点では、再学習のコストが発生しないというのは重要なポイントです。
Histogram Binning
Histogram Binning[1]は、2001年に提案された手法です。
比較的古い論文で、決定木とNaive Bayesを対象に実験しています。
手法としてもシンプルで、モデルの出力値をソートし、いくつかのビンに分け、各ビンごとのAccuracyを割り当てるといったものです。現在はあまり用いられていない印象です。
Isotonic Regression
Isotonic Regressionは回帰手法の一種で、単調関数を用いて回帰を行う手法です。
Isotonic Regression自体はProbability Calibrationに用途を限らない汎用的な回帰手法ですが、2002年にこの手法をProbability Calibrationに用いることを提案した論文[2]が出ています。
モデルの出力値が高いほど精度が高い、という仮定の下、Isotonic Regressionを行います。
機械学習ライブラリのscikit-learnの中にも、Isotonic Regressionを用いたProbability Calibrationが実装されています[3]。
例として、小規模なデータセットで実装した結果、以下のような結果が得られました。
横軸がモデルの出力スコア、縦軸がデータのラベルです。
水色の点が評価用データをプロットしたもので、これらの点に対し、Isotonic Regressionを適用することで得られた関数がオレンジの線になります。
たとえば、スコア上位に着目してみると、モデルのスコアが0.8を超えたあたりで、実態としてはすべて正例になっているということで、これを補正するような関数になっています。
今回は小規模なデータセットで試していますが、より大きなデータセットであれば、もう少し滑らかな線が得られます。
Temperature Scaling
Temperature Scaling[4]は2015年に提案された手法です。
手法について簡単に説明すると、温度$T$と呼ばれるハイパーパラメータを使った補正付きのsoftmax関数を適用するイメージになります。
具体的には、以下の関数を適用します。
p_i = \frac{\exp\left({\frac{h_i}{T}}\right)}{\sum_{j=1}^{K} \exp\left({\frac{h_j}{T}}\right)}
$h_i$が元のモデルのクラス$i$に対する出力スコアに相当します。$T=1$のとき、一般的なsoftmax関数と一致します。
$T$が大きくなると、値が平均化されていきます。このため、自信過剰なモデルの出力を抑制することができます。逆に$T$を小さくすると、大きな値はより大きく、小さい値はより小さくなります。
この手法の特徴としては、クラス間のスコアの大小関係を崩さないため、モデルの出力クラスを変更しないことです。そのため、Accuracy、Recall、Precisionなどの指標には影響を与えません。
$T$の値はvalidationデータでのCalibration性能が最大になるように調整します。
Temperature Scalingでは、すべてのクラスに対して$T$というパラメータ一つで調整を行いますが、クラスごとに違ったパラメータを用いるような手法として、Vector Scaling、Matrix Scalingといった手法もあります[5]。
学習時の手法
ここで紹介する手法は、すべて損失関数の工夫によってProbability Calibrationを行う手法になります。主に対象としているのはニューラルネットワーク系のモデルです。
ニューラルネットワーク系のモデルは、自信過剰な出力をすることが多い、というのが問題意識としてあるように見受けられます[6, 7]。
後処理の手法と組み合わせて活用することもでき、これにより、さらに性能が上がるといった検証結果があります[7]。モデルの学習は、後処理の手法に比べて計算コストが高いため、こちらを単体で使うというよりは、組み合わせることが前提になると考えています。
Focal Loss
Focal Loss[8]は、2017年に提案された手法です。ただし、この手法は本来Probability Calibrationを目的に提案されたものではありません。
元々は、画像分析における物体検出のタスクに関する論文で、精度向上のために提案されたものです。
手法の概要としては、分類が簡単なものに対する重みを小さくし、分類が難しいものに対する重みを大きくすることで、難しいものの識別精度を重点的に上げるように学習させることを目指します。
具体的には、以下の損失関数を用いて実装されます。
\mathrm{FL}(p) = -(1-p)^{\gamma} \log{p}
$\gamma$は難易度が高いものをどの程度重視するかを決めるハイパーパラメータです。
$\gamma = 0$のとき、損失関数は$-\log{p}$となり、一般的なクロスエントロピー誤差になります。
$p$が1に近い、すなわちモデルが判断に自信を持っているものは、簡単なタスクとみなし、学習への影響度が小さくなります。
この損失関数を使うことで、Calibration性能を高めることができるということが、別の論文[9]で検証されています。
Maximum Mean Calibration Error (MMCE)
MMCE[6]は、2018年に提案された手法です。
Calibrationの性能はExpected Calibration Error(ECE)という指標を用いて評価することが多いのですが、これを直接損失関数に加える形だと、不連続なため、最適化を行うことが困難です。
そこで、この論文では、カーネル関数を用いて、分布間の距離のような形にすることで、誤差の上界を計算し、これを損失関数として用いることを提案しています。
具体的な損失関数の形としては、以下のようになります。
\mathrm{MMCE}^{2}_m(D) = \sum_{i,j \in D} \frac{(c_i-r_i)(c_j-r_j)k(r_i,r_j)}{m^2}
$D$:データセット、$m$:データセット内の正しく予測できた件数
$r_i$:データ$i$の真のラベルに対するモデルの出力スコア
$c_i$:データ$i$に対するモデルの予測があっているかどうか(0/1)
この損失関数に適当な重みをかけて、分類の損失関数(提案論文[6]ではNLL)と足し合わせたものを全体の損失関数として用います。
また、ここでは$D$をデータセットとしていますが、100件程度のミニバッチで行えば十分だそうです。
提案論文[6]中の数値実験では、カーネル関数に以下を採用しています。
k(r,r')= \exp \left( \frac{-|r-r'|}{0.4} \right)
AdaFocal
AdaFocal[7]は2022年に提案された手法で、Adaptive Focal Lossの略称です。
Focal LossをProbability Calibrationに用いるにあたって、固定の$\gamma$を使わずに、学習中に$\gamma$を変動させる、というのが主な内容になります。
また、モデルの出力値をいくつかのビンに分け、ビンごとに違う$\gamma$の値を用いることにします。
$\gamma$の更新式は以下の通りです。
\gamma_{t,b} = \gamma_{t-1,b} \exp \left( \lambda \left(C_{val,b} - A_{val,b} \right) \right)
$t$:epoch、$b$:ビンの番号
$\lambda$:変化率をコントロールするパラメータ
$C_{val,b}$:ビン$b$におけるvalidationデータに対するモデルの平均出力スコア
$A_{val,b}$:ビン$b$におけるvalidationデータのAccuracy
モデルの出力スコアが、そのAccuracyよりも高い時、すなわちモデルが自信過剰なときには、$\gamma$の値をより大きくします。逆に、モデルが自信不足になっているときには、$\gamma$の値をより小さくします。
また、手法の提案論文中[7]では、AdaFocalと、後処理手法を組み合わせる実験が行われています。主張内容としては以下です。
- AdaFocalと後処理手法を組み合わせると、さらにCalibration性能が上がる。
- ベストな後処理手法は一意には定まらず、データセットに依存する。
- 他の学習手法と後処理手法を組み合わせたものより、AdaFocalと組み合わせたもののほうが性能がよい。
以上のことから、良い学習時の手法を構築することは重要であり、これに適切な後処理手法を組み合わせることで、より良いCalibration性能を達成できる、と主張しています。
まとめ
今回は、機械学習モデルの出力スコアを、実際の確率に近づけるProbability Calibrationの手法について、いくつか紹介をしました。
後処理として補正を行う手法は、学習済みのモデルがある場合に、そのまま活用することができるため、利用のハードルが低く、手軽に試せることが利点です。
学習時に用いる手法は、新たに学習しなおすか、追加学習をする必要があるため、コストがかかりますが、後処理手法と組み合わせることでより高いCalibration性能が発揮されるという検証結果[7]もあります。まずは、後処理の手法を試してみた後に、要求される性能に応じて導入を検討してみるのがよいと思います。
参考文献
-
1.16. Probability calibration — scikit-learn 1.4.0 documentation (アクセス日:2024/1/22)