はじめに
GAN を用いた異常検知系の以下の論文
[1] S. Akcay, et. al."GANomaly: Semi-Supervised Anomaly Detection via Adversarial Training"
のまとめ
ACCV 2018で発表された。
http://accv2018.net/wp-content/uploads/pocketprogramweb.pdf
arXiv:
https://arxiv.org/abs/1805.06725
著者らの GitHub コード:
https://github.com/samet-akcay/ganomaly
PyTorch 使ってます。
概要
- 画像から異常検知するモデル
- GAN と auto-encoder を組み合わせたようなアーキテクチャ
- 既存の手法を上回る性能
このモデルを使った異常検出の一例は以下。
X 線を使ってバッグの中に危険物がないか判定する。左3列は正常データ(危険物なし)。この正常データでtrainingする。
右2列は推論時のもの。赤の矩形内に危険物があるが、これらを検出できている。
アーキテクチャ
アーキテクチャの概要
アーキテクチャの概要は以下。
左の方は auto-encoder のような構造。その右側にさらに encoder が存在する。
右下は discriminator。
アーキテクチャの詳細
まず左から元画像 $x$ を入力し、encoder して latent space の $z$ となる。
$z$ を decode して再構築画像 $\hat{x}$ となる。再構築画像 $\hat{x}$ をさらに別に用意した encoder に入力し、$\hat{z}$ を得る。
discriminator には元画像 $x$ と再構築画像 $\hat{x}$ を入力し、discriminatorはそれが real(つまり元画像)か fake (つまり再構築画像)かを識別する。
他のモデルとの比較
以下は AnoGAN、Efficient-GAN(EGBADと呼ぶ説もあり)との比較図。
左 A のAnoGANのアーキテクチャはDCGANなどのベーシックなGAN構造をしてる。
中央 B の Efficient-GAN は encoderが加わり、encoder と generator を同時に学習させる。discriminatorには1)real画像 $x$ とそのencodeした $\hat{z}$ のペア、2)$z$ とそれをgeneratorにかけて生成した画像 $\hat{x}$ とのペア、を入力し、それらを区別するよう学習する。
右 C の本モデルは更に encoder が加わっているが、discriminator に入力するのは画像と再構築画像のみ。
目的関数
トータルのロス
トータルのロスは3種類からなる。
\mathcal{L} = w_{adv} \mathcal{L}_{adv} + w_{con} \mathcal{L}_{con} + w_{enc} \mathcal{L}_{enc}
$\mathcal{L}_{adv}$ : adversarial loss。
$\mathcal{L}_{con}$ : contextual loss。
$\mathcal{L}_{enc}$ : encoder loss。
adversarial loss
generator はvanilaなGAN のロスではなく、[4]のfeature matching を用いる。つまりdiscriminatorからの中間層の差から求める。discriminatorは?
contexual loss
adversarialなlossによりrealな画像が再構築されるようになるが、それが元画像っぽい保証はない。そこで元画像っぽいものを再構築するよう、両者でL1をとる。
\mathcal{L}_{con} = \mathbb{E}_{x \sim pX} \| x - G(x) \|_1
encoder loss
推論時に latent 同士で比較するため、generator の encoder からの出力 $G_E(x)$ と、再構築した画像をさらにもう1つのencoderに入れた時の出力 $E(G(x))$ との L2 をとる。
\mathcal{L}_{enc} = \mathbb{E}_{x \sim pX} \| G_E(x) - E(G(x)) \|_2
正常・異常の判定法
こうして学習したモデルにある推論用データ $\hat{x}$ を入力した場合、まず generatorのencoderでlatentに次元削減されるが、そのベクトル $G_E(\hat{x})$ は正常データなら学習データの分布を満たす値、異常データなら分布から外れるような値となる。
その $G_E(\hat{x})$ を generator の decoderに入力し、出てきた再構築画像 $G_D(G_E(\hat{x})) = G(\hat{x})$ は、正常画像ならかなり正確に再現するが、異常画像の場合は異常な部分が再現されず、正常画像っぽいものに変化する。
再構築画像 $G(\hat{x})$ を更にもう1つの encoder に入力すると、いずれも正常データの latentの分布に従うものとなる。
よって、以下のように
\mathcal{A}(\hat{x}) = \| G_E ( \hat{x} ) - E (G( \hat{x})) \|_1
$G_E ( \hat{x} )$ と $E (G( \hat{x}))$ との差をとると、正常値は小さくなり、異常値は大きくなるだろう。
実験と結果
MNISTデータ
CIFAR10データ
UBAデータ
FFOBデータ
書きかけ
reference
[2] AnoGAN: T. Schlegl, et. al."Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery" IPMI 2017
[3] EGBAD:H. Zenati, et. al. "EFFICIENT GAN-BASED ANOMALY DETECTION"
[4] T. Salimans, et. al, "Improved techniques for training gans." NIPs 2016