Neural Style Transferを音に応用した研究たち

結論としては今のところ上手くいっていないように見える.
今後の進展にとても期待.

  • Audio style transfer
    https://arxiv.org/abs/1710.11385
    • Gatysらの手法というよりも高速化されたJohnsonらのstyle transferの手法に近く,
      コンテンツ画像を初期値としてスタイル変換する.
    • audioではcontentとstyleが定義されていないんですという話がイントロに載っている
      • In audio, the notions of style and content are even harder to define and would depend more on the context. For speech for instance, content may refer to the linguistic information like phonemes and words while style may relate to the particularities of the speaker such as speaker’s identity, intonation, accent, and/or emotion.
      • For music, on the other hand, content could be some global musical structure (including, e.g., the score played and rhythm) while style may refer to the timbres of musical instruments and musical genre
    • 微妙

  • Time Domain Neural Audio Style Transfer
    https://arxiv.org/abs/1711.11160
    • 上の二つの研究はスペクトログラムを画像として扱って,もとのneural style transferの手法を適用していたが, それだと変換後のスペクトログラムをGriffin-Limアルゴリズムで位相復元する必要があった.
      • Griffin-Limを使うと次のような欠点が生まれる
        • 結局,位相情報のtransferができていない
        • 位相復元が収束するまで反復する必要があるので実時間性を確保できない
    • そこでこの研究では,生のaudioに対してneural style transferの手法を適用した
    • 学習済みwavenetのdecoderとNSynth encoderを使って,Gatysらの手法を適用.
      wavenetとNSynthは次のようなもの f:id:yusuke_ujitoko:20180127003558p:plain

触覚系テクスチャデータセット

テクスチャ画像のみのデータセットと違い、
触覚情報を含むテクスチャデータセットはあまり公開されていない。
というわけで加速度データなどの触覚情報を含む貴重なデータセットをメモ。
今後も追加予定。

LMT Haptic Texture Database

http://www.lmt.ei.tum.de/downloads/texture/

テクスチャをペンでなぞったり、タッピングしたときの次のデータが用意されている。

  • テクスチャ画像
  • 加速度

テクスチャのクラスとして108のバージョンと、69のバージョンがある。
クラスごとの訓練データ・テストデータは10データずつ。
ただ、各データのフォーマット等の詳細情報はwebに載っていないので、
知りたいときは関連論文を漁る必要あり。

ライセンスについてもwebに掲載されていない。
気になったので問い合わせたところ、研究用途であれば使用可との返事。
不明点についても教えてくれそうな雰囲気だった。

The Penn Haptic Texture Toolkit

http://haptics.seas.upenn.edu/index.php/Research/ThePennHapticTextureToolkit http://repository.upenn.edu/meam_papers/299/ https://repository.upenn.edu/cgi/viewcontent.cgi?article=1311&context=meam_papers

100クラスのテクスチャについて次のデータが用意されている

  • テクスチャ画像
  • 加速度
  • 位置

Deep Image Priorを試す

「画像とはこういうもの」という事前情報がCNNの構造自体にそもそも備わっている、
というところを出発点として、大量の画像データセットによる学習を必要とせず、単一画像のみ用いて学習を行ってその画像のdenoising, high resolution, inpaintingを実現するというアイデア

そのうちdenoisingだけ試してみた.
実装は借りもの。

1.

original画像(目標)

f:id:yusuke_ujitoko:20171206210101p:plain:w256

noise(gaussian blur)入り画像(入力画像)

f:id:yusuke_ujitoko:20171206210032p:plain:w256

Deep Image Priorの手法でパラメータ調整後(denoising)の結果

f:id:yusuke_ujitoko:20171206210324p:plain:w256

2.

original画像(目標)

f:id:yusuke_ujitoko:20171206210529p:plain:w256

noise(gaussian blur)入り画像(入力画像)

f:id:yusuke_ujitoko:20171206210510p:plain:w256

Deep Image Priorの手法でパラメータ調整後(denoising)の結果

f:id:yusuke_ujitoko:20171206210616p:plain:w256

3.

original画像(目標)

f:id:yusuke_ujitoko:20171206210658p:plain:w256

noise(gaussian blur)入り画像(入力画像)

f:id:yusuke_ujitoko:20171206210723p:plain:w256

Deep Image Priorの手法でパラメータ調整後(denoising)の結果

f:id:yusuke_ujitoko:20171206210742p:plain:w256

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

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