以前に、深層距離学習を使い「画像の異常検知」を行いました。
その後、深層距離学習の最新手法「AdaCos」が登場しました。
本稿では、AdaCosを「異常検知」に適用し簡単なベンチマークを行いたいと思います。
コード全体はこちら
※こちらはPythonデータ分析勉強会#15の発表資料です。
#結論から
AdaCosを異常検知に適用することで、以下が分かりました。
- 精度はArcFaceと同等
- パラメータのチューニングが不要になるのがありがたい
#AdaCos
AdaCosは深層距離学習の最新手法といいながら、2020年1月現在、論文掲載後、半年以上も
経っています。しかし、私が知る範囲では「純粋な深層距離学習」の枠では、未だに
SOTAだと思われます。
AdaCosとは、ArcFaceなどを主体にした手法であり、ArcFaceなどで用いられるパラメータを
自動的に決める手法です。ArcFaceはパラメータの選択次第で精度が劇的に変わるため、
パラメータのチューニングが非常にシビアでした。しかし、AdaCosを導入して自動的に
パラメータを決められるおかげで、このチューニング作業から解放されます。
さらに、精度も上がることが確認されており、作業能率と精度が向上することから非常に
有用性の高い手法です。詳しくは、以下の記事を参考にしてください。
AdaCos: Adaptively Scaling Cosine Logits for Effectively Learning Deep Face Representationsを読んだ
##制約
AdaCosには、FixedとDynamicの二種類があります。
本稿で用いる手法は「Fixed AdaCos」とします。
また、AdaCosはクラス数が3以上のときのみ適用できます。
これは自己教師あり学習を適用する際に、ネックになってきますが、そこの考察は
次回の記事で行います。今回行う実験はクラス数が9のため、ここは問題になりません。
#実験
以前に行った実験と同じ条件で実験を行います。
AdaCosのコード自体はArceFaceのものとほぼ同じです。
ただ、パラメータの与え方をAdaCos流に変更しています。
コード全体はこちら
##条件
- AdaCosのepochは10、最適化手法はAdam
- バッチサイズは128
- ベースモデルはMobileNet V2(学習済モデルを使用、つまり転移学習)
- 10回試行してAUCを算出
- データはFashion-MNISTとcifar-10を使用
<Fashion-MNIST>
データの内訳は以下のとおりです。
正常は「スニーカー」、異常は「ブーツ」。
個数 | クラス数 | 備考 | |
---|---|---|---|
学習用リファレンスデータ | 8000 | 8 | スニーカーとブーツを除く |
学習用正常データ | 1000 | 1 | スニーカー |
テストデータ(正常) | 1000 | 1 | スニーカー |
テストデータ(異常) | 1000 | 1 | ブーツ |
※学習用リファレンスデータとは、学習用正常データと見比べるためのデータです。
<cifar-10>
データの内訳は以下のとおりです。
正常は「鹿」、異常は「馬」。
個数 | クラス数 | 備考 | |
---|---|---|---|
学習用リファレンスデータ | 8000 | 8 | 鹿と馬を除く |
学習用正常データ | 1000 | 1 | 鹿 |
テストデータ(正常) | 1000 | 1 | 鹿 |
テストデータ(異常) | 1000 | 1 | 馬 |
「L2-SoftmaxLoss」と「ArcFace」は前回の実験結果を掲載しています。
「AdaCos」の結果が今回の実験結果です。
「AdaCos」の中央値はArcFaceとほぼ同じAUCになりました。
やはり、パラメータチューニングが不要になっているのはありがたいです。
##CIFAR-10の結果
「L2-SoftmaxLoss」と「ArcFace」は前回の実験結果を掲載しています。
「AdaCos」の結果が今回の実験結果です。
Fashin-MNISTと同様に、「AdaCos」の中央値はArcFaceとほぼ同じAUCになっています。
#まとめ
- AdaCosを異常検知に適用すると、ArcFaceと同等の精度が出た
- しかも、「パラメータのチューニングが不要」でありがたい
- そもそも、異常検知の性能評価では、異常データが非常に少ない状況が考えられ、その状況下でパラメータチューニング用のデータを捻出しなければならない状況が避けられると思うと、非常に有用性の高い手法と思われる。