conditional DRAGANでのラベルの与え方

conditional GANのラベルの与え方は色々あり、
毎回どうすれば良いかよくわからず迷ってしまう。

githubの実装をみると様々に書かれている。
文献を読むよりも色んな人の実装を漁るほうが知見が貯まるこの頃。

今回はMNISTに対してDRAGANを用いて、
その中でもよく見かける設定を評価してみる。
(DRAGANを用いたのは単に安定しているという理由のみ)

以下の設定のもとでいずれの評価も行った.

  • batchsizeは64
  • optimizerはAdamを使用(learning rate:1e-4)
  • Generatorの構造は3層(1:FC層, 2:Deconv層, 3:Deconv層),
    出力層の活性化関数はtanhではなくsigmoidを使用
  • Discriminatorの構造は3層(1:Conv層, 2:Conv層, 3: FC層)
  • BatchNormalization不使用

Generatorへのラベルの入力方法はバリエーションが少なかったので,
今回は統一して,noiseにそのままconcatした.

代わりにDiscriminatorへのラベルの入力方法を以下でパターンに分類し、
その分類内でGeneratorへ入力するnoiseの次元を変化させ、安定性を評価した。

ちなみに成功すると以下のように、
指定ラベルに応じた画像の生成生成が可能となる。

f:id:yusuke_ujitoko:20171024202954p:plain

パターンA: Discriminatorの入力層へラベルを入力する

このパターンのデータフローは下図のようになる。 f:id:yusuke_ujitoko:20171024005634p:plain

パターンB: Discriminatorの中間層へlabelを入力する

次は、Discriminatorの入力層ではなく中間層へlabelを入力するパターンBを試す。
f:id:yusuke_ujitoko:20171024001159p:plain

パターンC: Discriminatorの入力層と中間層へlabelを入力する

最後に、Discriminatorの入力層と中間層へ両方ともlabelを入力するパターンCを試す。
f:id:yusuke_ujitoko:20171024005647p:plain

評価結果

noiseの次元:10 noiseの次元:50 noiseの次元:100
パターンA ○ (7000iterで安定) ○ (26000iterで安定) × (生成画像が真っ黒)
パターンB ○ (7000iterで安定) ○ (28000iterで安定) × (生成画像が真っ黒)
パターンC ○ (7000iterで安定) ○ (19000iterで安定) × (生成画像が真っ黒)

  
今回のconditional DRAGANではラベルの与え方は何でも良く、
noiseの次元が効いてくることが分かった。

SwishをCIFAR10で試してみる

ReLUの代わりになる活性化関数Swishの提案。
Swishの形はシンプル。 {} $$ f(x) = x \cdot σ (x) $$ f:id:yusuke_ujitoko:20171021112551p:plain

ReLUとの違いは,non-monotonicityとsmoothnessだと思う.
小さい負の入力はReLUを通すと全てゼロになるが, Swishでは負の値を出力する.

また,smoothnessという観点では,
2入力・2出力の6層NNに対して、
ランダムに入力を与えたときの出力(x,y)をヒートマップで描画すると,以下のようになる。 f:id:yusuke_ujitoko:20171021133644p:plain ReLUは値の変化が鋭い領域があるのがわかる。
Swishのこのsmoothnessはlossに影響を与えて最適化しやすいらしい.

これらの特徴がどういう効果を具体的に持つのかはまだよくわかっていないが、 既存の活性化関数を使った場合を性能でoutperformしたとのことなので、
手元のCIFAR10で試してみた。

SwishをCIFAR10で試す

CIFAR10をResNetで分類する際の、
ネットワーク内のReLUをSwishに変更して精度を比較してみる。
(もともとresidual block内にのみReLUは存在)

論文にもCIFAR10に対する素のResNetでの分類結果が書かれていたが、
ResNet-164を利用していた。
今回はそれよりも層が少ないResNetで試してみた。

まずは20層のResNetの場合、

f:id:yusuke_ujitoko:20171021111354p:plain

訓練データ、テストデータに対する精度ともに、 ReLUの代わりにSwishを用いた場合の方が高い。
次に56層のResNetの場合、

f:id:yusuke_ujitoko:20171021135357p:plain

56層の場合は、学習は早く進むものの、
最終的な結果に違いがあまり出なかった。

その他

過去に同様の活性化関数が既に提案されているようだ。
https://arxiv.org/pdf/1702.03118.pdf

また浅い層のネットワークには有効ではないという噂もある。

音声信号をSTFT、MS、MFCC、CQTで可視化してみる

広田研・廣瀬研にいたときに視触覚のクロスモダリティをテーマに研究をしていた。 GANの応用について調べていたら、同じクロスモダリティを扱った論文を見つけた。

Deep Cross-Modal Audio-Visual Generation https://arxiv.org/abs/1704.08292

この中で音声信号を画像に変換する事前処理があるが、いくつかの種類が試されている。 それらを順にlibrosaを使って試してみた。

LMT Haptic Texture Databaseの音声信号(.wav)に対して適用してみる。 http://www.lmt.ei.tum.de/downloads/texture/

hamming windowを使い、サイズは50ms分となるように設定

STFT

log scaleで可視化 f:id:yusuke_ujitoko:20171003234835p:plain

Mel-spectrum

f:id:yusuke_ujitoko:20171003234945p:plain

MFCC

f:id:yusuke_ujitoko:20171003235313p:plain

CQT

f:id:yusuke_ujitoko:20171003235330p:plain

音声信号をスペクトログラム化してみる

テクスチャの識別に関する以下の読み物を読んでいたら, 加速度信号をCNNへ入力する前にフーリエ変換してスペクトログラムにしていたので、自分でも真似てみる.

今回はLMT Haptic Texture Databaseの音声信号(.wav)を可視化する.
この音声信号はテクスチャをスタイラスでなぞった際に集音したデータセット
http://www.lmt.ei.tum.de/downloads/texture/

STFTでspectrogramを作った。 窓関数はハミング窓。
spectrogramからiSTFTで元の信号への変換も行ってみた.

サンプル1

f:id:yusuke_ujitoko:20170930230803p:plain

サンプル2

f:id:yusuke_ujitoko:20171001000809p:plain

音声信号にSTFTかけるのは一般的なようだが、 今回のように加速度や音声に対してもSTFT掛けてCNNに入力するのも常套手段のよう。 これでテクスチャ識別器を作れる。

Adversarial Examplesに興味がある

adversarial exampleを勉強したくて読んだ。
メモ。

  • 本文ではDNNの直観的でない以下の2つの性質について触れている
    • 個別ユニットを観察するのも、複数ユニットの組合せを観察するのも違いはない
    • 入力と出力のマッピングが非連続なので、
      ちょっと入力に摂動を加えると誤識別を起こせる

性質1. 個々のユニットの値に特に意味はない。層全体で意味を持っている

  • 従来、CVでは特徴量抽出に対して焦点を当ててきた.
    この考え方の延長で、ある座標空間における各座標に対して意味を付与でき、
    これを調べると入力画像との対応が取れるものと扱ってきた。
  • あるユニットを活性化させた入力画像群(natural basis)を抽出(下図)
    するとユニットごとに意味の割当があるように感じる

f:id:yusuke_ujitoko:20170928233642p:plain

  • でも適当にとった基底(random basis)を活性化させた入力画像群をみても意味がある気がする(下図)

f:id:yusuke_ujitoko:20170928233715p:plain

→結局NNは座標系をdisentangleしていない

性質2. adversarial exampleを作れる

  • 汎化能力の高いニューラルネットワークは、摂動にはロバストであってほしい。
    つまり,訓練データ内で距離が非常に近いもの同士は同クラスに分類されてほしい.
  • でも非線形関数が積み重なると、入力空間に対して重要性が低いスポットが発生し,
    滑らかさは保たれない
  • 実際 adversarial examplesを作れば誤りを発生できる。
    (以下はalexnetで作成) f:id:yusuke_ujitoko:20170929000252p:plain

    • 層の数が変わっても、活性化関数が変わっても、訓練データの異なるサブセットを使っても、同じ摂動を加えると誤る

Adversarial training

「このadversarial exampleを学習に活用すれば,より汎用的でロバストにできるかも」
という発想で実験が行われている.

MNISTの識別では,もとのデータセットにadversarial exampleを少し加えたものを学習に用いることで,少しテストエラーを低くできた.
どうやら前方の層を参照して作成したadversarial examplesよりも後方の層によるadversarial examplesの方が効果的のよう.