セミブラフしていく

CS、機械学習関係の技術、論文めも

【論文読み】GANを利用した異常検知まとめ

GANは生成モデルで画像生成において様々な発展 をしている。
異常検知に活かせると面白いなと感じたので既存のGAN論文を調べてみた。

読んだ論文

背景

現在の検知問題は検知したいデータにラベルをつけることによって教師あり学習を行うタスクがある。
しかし、検知したいラベルが少ない、そもそも今存在するデータにラベルがないというデータの問題が存在する。
そこで教師なし学習による異常検知が重要となる。
教師なし学習での異常検知手法は多々提案されているが、すべて画像と比べると低次元のデータを利用されている。
高次元な画像データに対しても高い表現力を持つGANを利用した異常検知手法を提案。

GANを利用した異常検知の応用

Generative Adversarial Networkは深層生成モデルの一つである。
一般的に生成モデルを異常検知のタスクに利用する際、生成モデルは正常データの確率分布に従うことが考えられる。
同様に今回のGANにおいては以下のように考えられる。

GANの前提条件

Generator \(G\) は正常データの分布 \(p\) に従って生成するモデル

つまり正常であるデータをGANを使って学習している状態を表す。
ではこのモデルに対して、新たなサンプル \( x \) はどのように関係するかを考える。

  • \( p \)に従ってサンプルした\( x \)
    →潜在空間内に\( z \)が存在し、\( G(z) \approx x \) となる
  • \( p \) の中で低い確率 or 違う分布からサンプルした\( x \)
    →\( x \) を生成する潜在空間はごく少数 or 存在しない

つまり、正常な分布に従ったデータであるほどサンプルデータに近いデータを\( G \) が生成できる、潜在変数\( z \)が存在する。
ここから以下のような異常検知の判断方法が考えられる。

GANの異常判定

\( G(z) \approx x \)となるような\( z \)が存在しない時、\( x \)は確率分布\( p \)に従わず、異常と判定する

このようにGANを利用して異常検知が可能であるが一つ問題が存在する。
それは\( G \)がデータから潜在変数へ逆像できないという点だ。
なので検証したいデータ\( x \)に近似したデータを生成できる\( z \)が存在するかを探索する。

\(x\)から潜在変数\(z\)を探索

基本的な探索方法以下のような手順となる。

  1. \( z_n \to z_{n+1} \)となるようなモデル\( \phi(z_n)\)を設定
  2. 初期値\( z_0 \)を設定
  3. \( x \)と \(G( \phi(z_0)) \)の誤差を算出
  4. 誤差を元に\( \phi\)を更新,\( \phi(z_0)\)を\( z_1 \)とする
  5. 3に戻る

なお論文では\( \phi(z_n) \)は入力層の直前に追加するような形となっている。

Anomaly Detection with Generative Adversarial Networksより引用 f:id:habakan6:20180429005444p:plain

では次にどのように最適な\( z \)を学習するかという誤差関数や異常度の定義などを各論文の提案モデルごとに見ていく。

AnoGAN

AnoGANとはUnsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discoveryで提案されたモデルで、医療画像の異常検知に利用されている。

誤差関数

探索時の誤差関数は残差誤差\( L_R \)と Feature MatchingというGANの学習テクニックを利用した\(L_D\)で構成されている、
$$L_R = \sum|x - G(z_n)|$$

\(D(x)\)の中間層の出力を\(f(x)\)とする $$L_D = \sum | f(x) - f(G(z_n))| |$$ $$L(z_n) = (1 - \lambda)\cdot L_R(z_n) + \lambda \cdot L_D(z_n)$$ 論文では\( \lambda \)はハイパーパラメータとして0.1で設定されていた。
この\( L(z_n) \)を元に異常度を計算していく。

異常度の算出

異常度は探索を行った\( z^{*} \) を元に異常度の算出する。
異常度 \( A(x) \) は \( z^{*} \) の誤差で計算

$$ R(x) = L_R(z^*) $$

$$D(x) = L_D(z^*)$$

$$A(x) = (1 - \lambda)\cdot R(x) + \lambda \cdot D(x)$$

ADGAN

ADGANはAnomaly Detection with Generative Adversarial Networksで提案されたモデルである。
AnoGANと比較検証をしてSOTAを出している。

誤差関数

ADGANではより\( x \) に近似した画像を出力するために、
探索時に誤差を利用して\(G\)自体も学習を行う
誤差関数は残差誤差を設定
$$L(z_n) = \frac{1}{n}\sum|x - G(z_n)|$$

異常度の算出

AnoGANの異常度の問題点としては探索の最適化に誤差が依存してしまい、
具体的には\( z \)の初期値や探索回数に依存してしまう。
これらを防ぐために探索過程の誤差を平均化したものを異常度とする。
$$A(x) = \sum_{i=1}^n|x - G(z_i)|$$ ADGANのもう一つの特徴として誤差関数、異常度に\(D\)の出力をいれていない点である。
\( D \)を含めないことによってGAN以外のアーキテクチャに対してもこの異常度算出は利用が可能である。

Efficient GAN

Efficient GAN-Based Anomaly Detectionで提案されているモデルである。
このモデルはGANを学習時に\( x\to z \)のエンコーダーも同時に学習している。
このようにエンコーダーを学習することによって探索をする必要がなくなる。
実際のこのモデルはAdversarial Feature Learningで提案されているBiGANsというモデルである。

f:id:habakan6:20180429011808p:plain

なお異常度はAnoGANと同様の計算方法である。
$$A(x) = (1 - \lambda)\cdot R(x) + \lambda \cdot D(x)$$

どのモデルがいいのか?

ADGANとEfficient GANはAnoGANを既存研究として提案されたモデルである。
なのでどちらがいいのかは検証を行う必要がある。
検証方法はどちらの論文でも行われているMNISTのOneクラス分類でやるといいのだが、評価方法が異なるのか比較ができていないのか?
今後実際に実装して、比較できるといいかなと思っている。
またこの記事を書いているうちに色々論文を見つけた。

またこれら以外でもRobustPCAやRobustDeepAutoEncoderなども読んでみたい。
本だけじゃなくて論文もどんどん積まれていきそうだ。