セミブラフしていく

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なども読んでみたい。
本だけじゃなくて論文もどんどん積まれていきそうだ。

論文サーベイメモ2

興味のある論文のAbstractを中心に読んでまとめたメモ。
以後、理解を深めるため論文を精読していく。

Unsupervised Learning Using Generative Adversarial Training And Clustering

段階的な特徴抽出方法と古典的なクラスタリングアルゴリズムによる教師なし学習を提案する。
GANを利用して特徴抽出を学習する。
しかし、GANはデータを自動でクラスタリングをするのに十分なモデルではない。(おそらくデータからノイズをドローするのが難しいから?)
そこで今回は特徴をクラスタリングするためにDiscriminatorに敵対して画像を生成するGANを利用する。
クラスタリングアルゴリズムとしてはK-means法を利用する。
CIFAR-10, CIFAR-100, STL-10 データセットを利用して検証。
教師あり学習と同等の精度を確認、ワンショット学習より高い精度が得られた。

GENERATING ADVERSARIAL EXAMPLES WITH ADVERSARIAL NETWORKS

DNNモデルは入力に小さな摂動を加えたAdversarial Examplesの脆弱性があることが見つかっている。
このAdversarial ExamplesはDNNモデルの出力を誤ったものへと導く。
また別の攻撃手法としてAdversarial Examples自体を生成する手法も研究されているが、質が高く効率的な手法が提案されていなく今後の課題でもある。
本研究ではGANを利用してAdversarial Examplesを生成するAdvGANを提案。
オリジナルな実現値の分布を学習、近似させることによって、一度Generatorを学習すれば様々な実現値に対しても効率的にAdversarial Examplesを生成することができる。
このAdvGANはsemi white-box Attack と black-box Attackの状況に応用することができる。
semi white-box Attackではwhite-boxとは違い、Generatorを学習した後はモデルにアクセスする必要がない。
black-box Attackはモデルから蒸溜するように動的に学習、それに応じて最適化を行う。
Mnistデータセットを利用したblack-box attackの検証では92%という高い精度が得られた。

Deeper Depth Prediction with Fully Convolutional Residual Networks

本研究では単一のRGB画像からDepthマップを推定する問題を扱う。
単眼画像とDepthマップ間のあいまいなマッピングをモデル化するために、残差学習とFCN(Full Convolutionaly Network)を利用したモデル設計を提案する。
また、出力の画素を向上させるためにアップサンプリングを利用。
最適化にはDepthマップが一般的に利用されている値が使われているかを評価する逆Huver損失(外れ値に対してMSEよりかは敏感ではない性質を持つ)を利用する。
また、本手法はEnd-to-Endで学習されるためCRFのような後処理が必要にならない。
そのため、推定をリアルタイム推定することができる。
検証によって、既存手法よりも少ないパラメータと少ないデータで精度を高くすることを確認し有効性を示した。

論文サーベイメモ1

興味のある論文のAbstractを中心に読んでまとめるメモ。
以後、理解を深めるため論文を精読していく。

Improved Techniques for Training GANs

  • GANを半教師あり学習と画像生成に応用した手法を提案
  • 従来の生成モデルとは違い、本研究は検証データに高い尤度を割り当てられるように学習したり、
    ラベルなしで学習できるようにするモデルを求めるようなものではない
  • 半教師あり学習はMNIST, CIFAR-10, SVHNを利用して高い精度を確認
  • 画像の生成は人間が見分けっれないほど高い質の画像を生成可能

StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation

近年の研究で2つのドメインの画像変換は成功している。
しかし、既存の手法ではドメインの数が2つ以上になった場合、汎化性や大規模なモデル設計に制限がでてくる。
というのも、既存の手法ではドメインペア画像を独立に異なるモデルで学習する必要がでてくるからだ。
そこで本手法は複数のドメインでの画像変換を一つのモデルのみで学習させて行うStarGANを提案。
このStarGANの手法としては2つの画像を入力するとともにドメインの情報(one-hot-vector)を入力して学習させることで単純なモデルでも複数ドメイン間の画像変換が可能。
また、このStarGANをCelebAdatasetとRaFDdatasetを2つを利用して2つのデータセットの別々にあるドメインを使って画像変換できるかを検証し有効性を示した。

Are GANs Created Equal? A Large-Scale Study

GANの研究とはとても豊富にされており、数多くの応用された研究がされている。
しかし、GANの手法を比べて検証するということはとても難しいことが問題の一つとしてある。
そこで様々なGANに対して多数の画像データセットを利用して検証した。
その結果ほとんどのモデルはハイパーパラメータの最適化とrandom restartを利用することで似たようなスコアが得られることがわかった。
これはつまり、計算量の増加やモデルの設計よりもチューニングによって改善する可能性があることを示している。
そこで今までのデータセットを利用した精度検証の限界を克服するために新たなデータセットを提案。

感想

3本目の論文は実際にGANを実装する時にどのようにハイパーパラメータをチューニングすればいいかがわかりそうなのでもっと深く読んでみたい。

【日記1】GANに思うこと

Webアプリ開発して、論文読んでたら書けることなくなってしまった。。。
最近GANの論文を読むことが多いので自分の考え整理するためにもまとめとく。
正直引用もなくただの所感なのであしからず。

GANでできること

2014年にGANが提案されてからConditionalGAN・DCGANをはじめに様々なGANが出てきて、深層生成モデルの一つとして日々研究がされている。
GANで昨今話題になっていることというのは、画像が他の深層生成モデルと比べてくっきりとした画像を生成することができたり、画像の一部を変えることができるというような技術である。
それを考えると従来の生成モデル、教師なし学習というよりはGANは画像生成、変換に応用、発展しているなぁと感じる。
他に利用されている例としてDataAugmentation、Semi-Supervisedなどがあると思うがいずれにしても画像タスクにおいて応用、提案されているケースが多い。
それを考えるとGANは画像のような高次元なデータに対しての生成が他の手法よりもいいのかなと思える。

GANの欠点

学習が難しいことがあげられる。
自分が考える欠点はGeneratorの設計としての欠点かなと思う。
Generatorはノイズを入力してデータを生成するモデルである。
いわゆるこのモデル自体が確率分布を表現している。
Generatorはこの分布を生成にしか利用できないところが難しい部分だなと思う。
というのもAutoencoderなどは画像を入力して、次元圧縮しながら特徴量をつくりDecoderで生成しているが、GANの場合はGeneraotorにデータを入力できず、ただ生成することが目的である。
以前見た論文ではある画像と似た画像を生成できるようにノイズを変えてノイズを特定していたが、その部分も変えることってできないのかなーと感じる。

ナッシュ均衡とGANの関係を考察してみた

GANの論文ナッシュ均衡を使った理論展開が記述されてあったので、調べたものをまとめておく。
ちなみにゲーム理論は勉強したことがない。
そしてGANとの関係はあくまで自分がナッシュ均衡をGANで当てはめみてた考察なのであしからず。

ナッシュ均衡の定義

とりあえずWikipediaで調べてみたら以下のような定義がされていた。

標準型ゲーム \( G = (N, S, u) \)
( \( N \) はプレーヤーの集合、 \( S = \prod_{i \in N} S_i \) は戦略の組の集合, \( u = \bigl( u_i \bigr) \bigl( u_i : S \to \mathbb{R} \bigr) \) は効用の組) において,
戦略の組 \( s^* \in S \) がナッシュ均衡であることは,全てのプレーヤー \( i \in N \)と,全ての\( s_i \in S_i \)に対して,
$$ u_i \bigl( s^{\ast} \bigr) \ge u_i \bigl( s_i , {s_o}^{\ast} \bigr) $$
を満たすことである.
ただし、 \( s_o \)は, \( i \) 以外のプレーヤの組をさす.

というようなものだった。 まず用語がよくわからなかったので調べてみる。

標準型ゲーム

展開型ゲームと並び非協力ゲームの基本的表現形式であり、
プレイヤー集合、戦略空間、利得関数の 3 つの要素から構成される。

式として定義すると、
$$ G(N, S, u) $$ となる。ここでNはプレイヤー、S(Strategy)は戦略、uは利得関数を表している。

利得関数

それぞれのプレイヤーがある戦略をとった結果の1人のプレイヤーの利得を表す関数である。

定義の解説

結局、ナッシュ均衡が何を表しているかというと
全てのプレイヤーは自分ひとりだけ戦略を変えると、利得は上がらず下がってしまう状態であることを表している。
つまり、自分に加えて、誰かが戦略を変えない限り今の状態から利得が上がらない状態である。
ナッシュ均衡のわかりやすい例はこのサイトがとても自分はしっくりきた。

ナッシュ均衡とGAN

せっかくなのでGANを例としてナッシュ均衡の状態を自分なりに考えてみる。

標準型ゲームの当てはめ

ゲームの定義をGANに当てはめてみた。

定義 GAN
\( N \) (プレイヤー) Generator, Discriminator
\( S \) (戦略) モデルの重み
\( u \) (利得関数) モデルの誤差

ナッシュ均衡が起きている状況

設定したものを元にナッシュ均衡が起きている状況を作ってみる。

G \ D \( S_{D_1} \) \( S_{D_2} \)
\( S_{G_1} \) G:0.5, D:1.9 G:1.0, D:2.0
\( S_{G_2} \) G:0.2, D:1.0 G:0.7, D:0.6

重みは学習方法を変えることによって変わるということにして、本来の戦略ではないかもしれないが、利得が変わるということなので重み自体を戦略とした。
また、利得は今回は誤差としたので値が低い方が良いと考える。
ここからはGenerator視点で考えてみる。

  • \( D \) の重みが \( S_{D_1} \) の場合

    \( G \) の重みが \( S_{G_2} \) となるように学習すると誤差が低くなる

  • \( D \) の重みが \( S_{D_2} \) の場合

    \( G \) の重みが \( S_{G_2} \) となるように学習すると誤差が低くなる

つまり、今回のようの重みの選択肢が2つの場合、Dがどのような重みでもGの最適反応である戦略は変わらない状況である。

次にDiscriminator視点で考えてみる。

しかしGの戦略は先程の視点より \( S G_2 \) であることがわかるので、Dはその状況で誤差が低くなる値、つまり \( S D_2 \) になるように重みを学習するのが最適反応な戦略である。

これまで、それぞれのプレイヤー(モデル)の最適反応(最適な重み)を見てきた。
お互いのモデルは最適反応な戦略から自分だけ変えてしまうと誤差が上がってしまう。
このような状況をナッシュ均衡という。

GANの学習はGとDの学習時にそれぞれの学習具合のバランスを調整しないといけない。
つまり、GとDがお互い精度がよくなるように学習しなければならない。
そのような状況というのがお互いの誤差に関してナッシュ均衡が起きている重みに更新するということなのであると考える。

現在のGANの学習方法は、誤差を最小化することが目的なので、ゲーム理論的には利得が誤差になっていると自分は考える。
そして、Improved Techniques for Training GANsでは誤差を最小化してナッシュ均衡を求めようとすると収束しないと論じているらしい。
今のGANで誤差を最小化してナッシュ均衡を求めているというのは、GとDの出力両方に依存した誤差関数を最小化する点であると考える。

感想

GANの論文からゲーム理論に興味を持ったが、やはり勉強が足りないなと感じた。
また、強化学習やGANに通ずる部分もあるなと感じた(もしかしたらゲーム理論からきているのかな)
ともあれゲーム理論を勉強するのも面白そうだ。

累積分布関数を可視化してみた

積分布関数などの理解を深めるためにmatplotlibを使って可視化してみた。

標準正規分布

標準正規分布は以下のように定義される。
$$ f(x) = \frac{1}{\sqrt{2\pi}} \exp ( - \frac{x^{2}}{2} ) $$
平均0、分散1の分布を表している。

積分布関数

端的に言うとある値x以下の場合の確率を表すための関数である。
$$ F(x) = P(X \le x) $$ 連続値を取るような値の累積分布関数は以下のように定義される。
$$ F(x) = \int_{-\infty}^{x} f(u) du $$ 確率密度関数をある値で積分したものある。

可視化

確率密度関数と累積分布関数それぞれを可視化してみた。
f:id:habakan6:20180102182542p:plain
まあ当たり前だが、平均に近づくにつれ累積確率の上昇率が上がっているのが直感的にわかる。
グラフで見ると標準正規分布の累積分布関数はシグモイド関数っぽく見える。

Jupyter Notebook

以下に実装コードを載せておく。

【論文読み】Semi-Supervised Learning with Generative Adversarial Networks

新年早々だがいいスタートをきりたいという三日坊主感があるものの、とりあえず論文を読んだ。
今回読んだ論文はSemi-Supervised Learning with Generative Adversarial Networksである。
GANを利用した半教師あり学習で高い精度がでているらしいので興味を持った。

Abstract

  • Generated Adversarial Networks(GANs)で利用されるDiscriminatorの出力をクラス分類にすることによって半教師あり学習に拡張
  • N個のクラスに属しているデータを利用してGeneratorとDiscriminatorを学習
  • 学習時のDiscriminatorはGeneratorで生成したデータをN+1番目のクラスに分類できるようにクラスを拡張して予測
  • MNISTデータセットを利用して本手法がより効率のいい分類器の生成と従来のGANよりも質の高いデータを生成できることを示す

Introduction

なぜGANを利用するといいのか?

生成データと訓練データを見極めるモデルをD、分類モデルをCとする。
この2つのモデルの関係はDの精度が向上するとCの精度が向上するということは妥当らしい。
また逆も同様である。
今回利用するGANのなかのDiscriminatorはCとDのモデルを併用したものを利用してお互いの学習を助けるようにする。

Semi-Supervised GAN Model

従来のGANのDiscriminatorはデータを入力しそのデータが生成データである確率を出力するような構造となっている。
従来GANのDiscriminator
$$ \left[ Real, Fake \right] $$ 出力関数はシグモイド関数やソフトマックス関数が利用されることが多い。
今回のSGANはクラス分類がN個だとするとN+1個のユニットが出力されるような構造をとる。
SGANのDiscriminator $$ \left[ Class1, Class2, Class3, \dots, Fake \right] $$ このDiscriminatorが分類器の役割を持つように学習を行う。
具体的な学習フローは以下の通り。

f:id:habakan6:20180101210530p:plain:w600
  1. ノイズから生成データをドロー
  2. 訓練データをバッジ数ドロー
  3. 分類器のためのDの教師あり学習
  4. 生成データか判別するDの学習
  5. 新たなノイズから生成データをドロー
  6. Gを学習する

Results

MNISTを利用して検証を行った。

生成データの検証

従来のGANと生成された画像を比較する。

f:id:habakan6:20180101214105p:plain:w600

従来のGANよりもくっきりとした画像を生成することができる。

分類モデルの検証

SGANの分類器が優れているかどうかの検証。
検証を行う時にGは更新しなかったらしい。
ここは正直よくわからなかった。
結果を見るとサンプル数が少なくても高い精度を保っていることがわかる。

f:id:habakan6:20180101214221p:plain:w600

感想

まあ生成データと訓練データの判別とラベルの分類の学習は関係があるからGANで半教師あり学習をしているという雰囲気はわかった。
今後の検証としては生成データと訓練データでラベルを分けていたがそれをクラス毎に分けるという検証も必要だとfuture workには書いてあった。
つまりラベルが2N個になるということかな?
ともあれ一回実装して試してみたい。
GANを利用した半教師あり学習の論文はこちらのほうが有名かもしれないので今度はこれを詳しく読んでいきたい。