Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PythonとKerasによるディープラーニング読書会_8章まとめ

shinebalance
November 25, 2019

 PythonとKerasによるディープラーニング読書会_8章まとめ

shinebalance

November 25, 2019
Tweet

More Decks by shinebalance

Other Decks in Programming

Transcript

  1. Agenda • 第8章の構成理解 • 各章の解説 ◦ Deep Dream ◦ Neural

    Style Transfer ◦ Generating images with variational autoencoders ◦ Introduction to generative adversarial networks • 余録(時間あれば適宜, なければスキップ) ◦ 前回 7.1.5に関連する余録 今回の目標 • 画像系を通じ生成する系DNNを理解する ◦ なるべく「よく分からんがすごい!」にならないようにする。背景を掘り下げる。
  2. 第8章の構成理解 7章までの予測系 DLとは趣旨を変え、「 DLで何かを生成する」に主眼を置く • (8.1 LSTMによるテキスト生成) :LSTMに予測データ食わせ続ければ文章になる。 発表者が自然言語処理にイマイチモチベ湧かないので 本資料ではやりません •

    8.2 Deep Dream :自家製パンに夢を見せる暴挙 • 8.3 ニューラルネットワークによるスタイル変換 (原:Neural Style Transfer) :自分の描いた嫁のポートレイトでスタイル変換とかいう公開嫁自慢 • 8.4 変分オートエンコーダによる画像の生成 (原:Generating images with variational autoencoders) :MNISTでVAE(Variational Auto Encoder)実装 • 8.5 速習:敵対的生成ネットワーク(原:Introduction to generative adversarial networks) :DCGANでGAN(Generative Adversarial Network)のエッセンスを速習
  3. Deep Dream 自家製パンはImageNetの夢を見るか • 畳み込みニューラルネットワーク (以下CNN)によって 学習された表現を利用した画像加工 • 手法としてはフィルタ可視化手法と同一 (p175 5.4.2付近)

    • 実装にあたっては、 ◦ CNNにおける出力層のフィルタ活性化を意図的に最大化する。 特定フィルタではなく特定層すべてを活性化させる。 ◦ 入力は既存の画像を使う。 可視化の品質を改善できるよう Octave(尺度)を調整する。 出典:Deep Learning with Python /Francois Chollet(原著) Figure 8.3 Example of a Deep Dream output image
  4. Neural Style Transfer 誰でもゴッホ • 対象の画像の「コンテンツ」を維持した上で、 参照画像の「スタイル」を適用する。 • 本書のコンテキストとしては  コンテンツ :画像のHigh-Levelなマクロ的構造

    ex.建物の数や配置  スタイル :テクスチャ、色、ヴィジュアルパターン ex.青と黄色の円形多様 • ポイントは「コンテンツ」「スタイル」を数学的に定義して Loss Functionに上手に定義すること。 出典:Deep Learning with Python /Francois Chollet(原著) Figure 8.7 A Style Transfer Example
  5. Neural Style Transfer実装 本書303ー305、わかりにくい • 今回最小化したいLoss Function(の式)をざっくり説明すると、 ◦ 参照イメージのスタイル⇔生成イメージのスタイルの距離 + ◦

    対象イメージのコンテンツ⇔生成イメージのコンテンツ • コンテンツの距離は、出力層の活性化された結果を比較した L2ノルムを利用する。 ◦ 何故なら出力層が一番抽象化かつ大局的な特徴を持っている。 • スタイルの距離は、(出力層に限定せず)特定層の特徴マップの内積を用いて 表現する。計算にグラム行列を使う。 ◦ L2ノルムは距離計算一般で使う概念、グラム行列は計算方法。このへん訳クソ。 • あとはnotebook参照!
  6. Generating images with VAE の前に、まずオートエンコーダって? • オートエンコーダ自体は、NNを予測機というよりも次元圧縮機として使う手法 ◦ Variational AutoEncoder:変分オートエンコーダ はその一種 •

    「表現から成る低次元の潜在空間 (latent space)を開発する」 • Autoencoder is 何??? • 画像オートエンコーダのfirst idea ◦ 入力画像をエンコーダ(NN)を用いて圧縮 ◦ その後デコーダ(別のNN)で元の入力画像を復元 • 初期はCNNの初期パラメータの探索に、その後は次元圧縮の手段や生成系としての利用を模索 ◦ 参考:https://deepage.net/deep_learning/2016/10/09/deeplearning_autoencoder.html ◦ 参考:https://blog.keras.io/building-autoencoders-in-keras.html 出典:Deep Learning with Python /Francois Chollet(原著) Figure 8.12 An autoencoder
  7. Generating images with VAE 何が変分なのさ • VAEは、圧縮された潜在空間を単なる低次元の表現ではなく、確率分布内において 発生する一要素として捉えることで、学習精度を上げたもの ◦ (私の雑な理解)幾ら圧縮表現を学習できるとしても、色々な手書き文字  を学習して毎回同じ 圧縮表現が得られる訳がない。実際にはゆらぎがある。だったら確率分布として捉えてしまえ。

    ◦ 多分「変分」と名前がつくのは、このプロセスが理由 ◦ 発表者はド文系ですが、連続的な値の確率分布については この本で齧りました • 確率分布表現なので、生成される潜在空間は 統計分布のパラメータ、平均と分散 (と次元)で表現される。 • その他理解の参考にしたページ: https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24 出典:Deep Learning with Python /Francois Chollet(原著) Figure 8.13 A VAE maps an image to two vectors
  8. Generating images with VAE モデルの構成(多分コード見たほうが良い ) • エンコーダモジュール → 入力画像 input_imgを畳み込み処理し、   パラメータz_mean(平均)

    z_log_variance(分散)に変換 → 入力画像は潜在空間の正規分布からランダムに抽出した点 zであると仮定し、   z_mean + exp(z_log_variance)* epsilon の式で表現する   ※ exp(x)はeのx乗を返す。epsilonは小さな値のランダムテンソル • デコーダモジュール:点zを元に畳み込み処理で画像を生成 (写像) • 損失関数 ◦ 復元損失 :デコード結果がinput_imgと一致しているか ◦ 正則化損失 :うまく構造化された潜在空間を学習できているか kl_loss = -5e-4 * K.mean(1 + z_log_v - K.square(z_mean) - K.exp(z_log_v),axis=1) • あとはnotebook
  9. Introduction to GAN Generative Adversarial (敵対的生成)ネットワーク • Generator(生成的ネットワーク):  ランダムベクトル(※)を元に合成画像をデコード        ※ 潜在空間(Latent space)は構造的とは限らない

             (VAEのような統計的空間は想定しない) • Discriminator(判別者ネットワーク):  入力画像が訓練データセットなのか  Generator由来なのかを判定する • 最適化プロセスの目的は損失関数の最小化ではなく、 2つの勢力をつり合わせること ◦ 訓練の難しさの原因      出典:Deep Learning with Python /Francois Chollet(原著) Figure 8.15 A generator transforms random latent vectors ionto images
  10. Introduction to GAN DCGAN(Deep Convolutional GAM)の実装 • 本書では画像生成のGANとしてDCGAN(Deep Convolutional GAN)を実装する。 大まかな構成としては次の通り。

    • Generator :ランダムノイズから画像を生成する CNN • Descriminator :Generatorの画像を真贋判定する分類系の CNN • Adversarial Network:GeneratorとDescriminatorをつなぎGeneratorを訓練するNW • 詳細はnotebookを参照
  11. Introduction to GAN そうはいっても簡単ではない • GANのチューニングは困難であり、様々なトリックで試行錯誤が行われている。 • Generatorの活性化関数にsigmoidを使わずtanhを利用する  → 出力にマイナスを含むようになる • 潜在空間からのサンプリングには正規分布を利用する

     → イコールではないがVAEと発送は近い?    本書実装でもnp.random.normalが使われている • その他色々。 ◦ https://qiita.com/underfitting/items/a0cbb035568dea33b2d7 • 本書の実装コードでもハイパーパラメータを変更すると、 うまくGeneratorが訓練されない等の状況を観測できる。 CIFAR-10 class:birdで Descriminatorの学習率を 下げすぎたケース。 9000エポックを超えても Generatorが同じ画像ばかり生 成している
  12. 余録 まだまだNWの世界は広い… • 前回7.1.5「2つのNWで重みを共有できる」NWが紹介され、 その時はユースケースが思いつかなかったが、偶然活用例を見つけた話 • Deep One Class ◦ Qiita:https://qiita.com/shinmura0/items/cfb51f66b2d172f2403b

    ◦ Arxiv:https://arxiv.org/abs/1801.05365 • 画像の異常検知における利用をユースケースとした NW • 対象データ(検知したいデータ)と、 参照データ(関係ないデータ)を 同じNWで学習させる • 推論時は2つのNWのOutputを k近傍法でクラスタリングして不良値を 検知する 出典:arxivより: Learning Deep Features for One-Class Classification Pramuditha Perera, Student Member, IEEE, and Vishal M. Patel, Senior Member , IEEE