何もわからない

よくわからん

論文読み[AnoGAN]

はじめに

AnoGANの論文を読んだのでそれについて書いていきます.
間違いや勘違いがありましたらコメントかTwitterで知らせてください.
論文:Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery (https://arxiv.org/abs/1703.05921)
Chainerで書いたコード:(https://github.com/ihatasi/Learning/tree/master/Generation/GAN/AnoGAN)

概要

教師なしで正常データを学習し,正常データのみ生成できるDCGANを手に入れます(学習時に使った分布内ならどんなzの値を入れても正常データのような画像しか出力できない). 次にDCGANのDiscriminatorとGeneratorを用いて新しい入力xに対して最も近いx'を生成できるzの値を探索します.このとき,最適なzがうまく見つかれば正常データとでき,見つからなければ入力データxは学習していない(異常)データであるとできます. 入力xにできるだけ近づけようとしますが,正常データしか生成できないので結果的に入力(異常)データに最も近い正常データが出力され,差分を取ることによって正常データと比べてどこが異常であるかがわかります.

背景・提案

今までの医療データに対するAnomaly detectionのモデルは,annotateされた教師データの数に依存していました.そこで今回は以下の2点が提案されています.

  1. 大量の教師なしデータを使った異常の識別手法(AnoGAN)の提案.
  2. 異常のスコア付け枠組み(Anomaly scoring scheme)の提案.

学習

f:id:ihatasi:20190420005824p:plain
Fig.1. 引用(https://arxiv.org/pdf/1703.05921.pdf p.2)
今回は,Fig.1のような実際の医療データ(網膜)で実験しています.論文では以下のように,DCGANによる正常データの多様体の学習とAnoGANによるz値の探索のための学習の2段階の学習が行われています.

  1. パッチ処理した正常データの画像をDCGANに入力して学習させます(Fig.1.左側, Fig.2).
    f:id:ihatasi:20190420015755p:plain
    Fig.2.DCGANの学習モデル
  2. 1で得たDiscriminatorとGeneratorを更新なしで用いて入力データxに対して勾配降下法で最適なz値の探索をします.このとき,Generatorは正常個体しか生成できないため,入力画像xと生成画像G(z)の差分を取ることにより異常箇所を見つけることができます(Fig.1.右側, Fig.3).
    損失関数は以下のようになっています.

L_R({\bf z\_\gamma})=\sum{|{\bf x}-G({\bf z\_\gamma})|}...(1)
L\_R :Residual Loss, {\bf z\_γ} :γ回更新した{\bf z}の位置,γ=1,2,...,Γ(Γは最も{\bf x}らしいG({\bf z\_Γ}))
式(1)は元画像と生成画像の差をLossとし,入力画像xに最も似た画像を生成できるzのとき最小になります.

L_D({\bf z\_\gamma})=\sum{|{\bf f(x)}-{\bf f}(G({\bf z\_\gamma})|}...(2)
L\_D :Discrimination Loss, {\bf f()} :Discriminatorの中間層の出力
式(2)は入力画像xと生成画像G({\bf z\_\gamma})のDiscriminatorのfeature matchingです(feature matchingはGANの改善手法の1つ).
次の式(1)と式(2)を合わせたものを今回の損失関数とする. 
L({\bf z\_γ})=(1-λ)L\_R({\bf z\_γ})+λL\_D({\bf z\_γ})...(3)
λ :ハイパーパラメータ(今回は0.1)

f:id:ihatasi:20190420015631p:plain
Fig.3.AnoGANの学習モデル

z値を勾配降下法で求める際,ChainerではValiableに対してOptimizerを使えないため(TensorflowだとValiableに対してもOptimizerを使えるらしい?未確認),代わりにOptimizerで更新できるz'と同じサイズのFCを用意して2つ合わせたものを1つのzとして見ます(FCの重み初期値は1,バイアスはなし).

評価

Anomaly score:入力xがどれだけ正常かを示すスコア,低いほど正常であると言えます.


A({\bf x})=(1-λ)R({\bf x})+λD({\bf x})...(4)

このときのR({\bf x})は式(1)のResidual Loss,D({\bf x})は式(2)のDiscrimination Lossです.

結果

f:id:ihatasi:20190420022117p:plain
Fig.4.(https://arxiv.org/pdf/1703.05921.pdf, p9)
Fig.4のようにTrainデータやTestデータでも正常であるならばそれほど画像に差は見られませんが,異常データの場合は異常箇所が差として見られ,annotation画像とほとんど同じ箇所が色付けられることがわかります.

追試

今回はMnistの1を正常データとして学習し,出力画像とAnomaly scoreを求めました.

f:id:ihatasi:20190420022800p:plain
Fig.5.MnistでAnoGANの追試
Fig.5は,左側は同じ画像を入力しスコアが高かったものと低かったものをあげ,右側は7と9の画像を何回か入力しスコア最も低かったものあげています. 正常データで最もスコアが高かったものでも異常データよりはスコアが低く出ていることがわかります.

感想

AnoGANの難点として,AnoGAN自体の学習で1つのデータに対して最適なzを求める学習をするため効率が悪い(めんどくさい)と感じられました.また,数回試行してAnoGANはzの初期値に性能が依存し,局所解にもハマりやすいのではないかと思いました.次回も異常検知関係の論文を読みたいと思います.