GANs in Action(実践GANs) 7章まとめ資料

9c72ba7ae1c85c90ef043a651c448838?s=47 shinebalance
September 15, 2020

GANs in Action(実践GANs) 7章まとめ資料

2020-9-15
【オンライン開催!】GAN:敵対的生成ネットワーク勉強会#6勉強会にて
https://soleildatadojo.connpass.com/event/188638/

9c72ba7ae1c85c90ef043a651c448838?s=128

shinebalance

September 15, 2020
Tweet

Transcript

  1. Chapt7.Semi-Supervised GAN Chapt7.Semi-Supervised GAN ( 半教師ありGAN) ( 半教師ありGAN) 2020-09-15 GANs

    in Action(実践GAN) 勉強会資料 Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  2. 本⽇のTARGET 本⽇のTARGET Semi-Supervised GANの仕組みを理解する Semi-Supervised GANを通じ、Semi-Supervised Learningの 有⽤性を考える 余録:tensorflow v2のBatchNormを使った時の訓練失敗について

    TL:DR TL:DR GANの成果物といえばGenerator(⽣成器)だが、GANの学習プロセ スを上⼿に使うことで、有⽤なDescriminator(分類器)を獲得するこ とが出来る Generatorの訓練だけがGANではないのよ、という話 Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  3. おさらい おさらい 1~4章:GAN基礎 5章:GANにおいて有⽤なアイデア(Wassetetein GANとか) 6章:Progressivee GAN 7 章の構成 7

    章の構成 7.1 Semi-Supervised GANの概要とアーキテクチャ解説 7.2 Semi-Supervised GANの実装(DCGANベース) 実装コード⾃体はすんなり動いたのでは? 7.3 性能⽐較(通常の分類器と⽐較) Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  4. 書籍の流れを踏襲しつつ、適度に発表者の⾔葉で再解釈して解説し ていきます (´・ω・`)変なこと⾔ってたら遠慮なく突っ込んでください Chapt7.Semi-Supervised GAN - (半教師ありGAN) 

  5. What is Semi- What is Semi- Supervised GAN ? Supervised

    GAN ? 主に7.1まとめ Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  6. 半教師あり学習:Semi-Supervised Learning 半教師あり学習:Semi-Supervised Learning 途中まで教師あり学習、途中から教師なし学習の 「半教師あり学習」 「⼈間の学習⽅法に最も似た機械学習かもしれません」 何が嬉しいの? 何が嬉しいの? 「ラベル付きデータの準備」という命題をショートカットできる

    可能性 (個⼈的な感想ですが)現状のDeep Learning実⽤化は特定タス クの解決が主題なので、まだ教師あり学習が強い気がします。 とはいえ可能性は感じる( ) 気になってる本 Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  7. ⼤前提の共有 ⼤前提の共有 Machine Learning全般におけるカテゴライズとして、 1. 教師あり学習(Supervised Learning) 2. 教師なし学習(Unsupervised Learning)

    3. 強化学習 学習データにラベルが有る/ない/学習データの質がちょっと違う 今の所、いちおうデファクトスタンダードな切り⼝? これ、厳密にはMECEじゃなくね?という意⾒もある Qiita:脳科学者とITエンジニアの、DLや汎⽤⼈⼯知能に関する 会話 Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  8. Semi-Supervised GAN? Semi-Supervised GAN? Descriminatorを真贋判定の分類器ではなく、多クラス分類器にした もの N+1クラスの分類を⾏う Nは訓練データに含まれるクラスの総数 1は偽画像 MNISTであればNは0〜9の10クラス

    つまり11クラスの分類を⾏う 書いてあるままだとそうなるが、実装を⾒ると感覚的に は2クラス分類と10クラス分類を交互にやってる感じ Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  9. 引⽤元:https://akiraaptx.blog/2019/02/21/semi-supervised-gan/ Chapt7.Semi-Supervised GAN - (半教師ありGAN) 

  10. アーキテクチャと訓練過程 アーキテクチャと訓練過程 ⼤きく異なるのはDescriminatorの構造と訓練過程 ⼊⼒データは3種類 教師データ(ラベルなし) 教師データ(ラベルあり) ⽣成データ($G(x)$) 出⼒はN+1種類 訓練過程では①Nクラスの分類②真贋判定の両⽅を⾏うため、 ⽬的関数も2つになる

    $D((x, y))$ →他クラス分類 $D(x)$と$D(G(z))$ →⼆値(真贋)分類 Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  11. どうしてそんな事できるのさ どうしてそんな事できるのさ 直感的な理解ですが… GANにおけるDescriminatorは真贋判定を⽬的としつつも、学習タ スクの過程で、判別対象データのクラスに関する知識(特徴量)を取得 しているはず Generatorも、クラスの特徴量を再現しようとするので、同じくクラ スに関する特徴量を有しているはず 上⼿く誘導してあげれば、ラベリング短縮&実質データ拡張にな る…!

    Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  12. ( ^ω^) 「これが分かるなら、たけのこときのこも分かるよな?」 (´・ω・`)「えぇ……(困惑)」 引⽤元:https://www.pinterest.jp/pin/742038476089941428/ Chapt7.Semi-Supervised GAN - (半教師ありGAN) 

  13. Semi-Supervised Semi-Supervised GAN の実装 GAN の実装 主に7.2~7.3 Chapt7.Semi-Supervised GAN -

    (半教師ありGAN) 
  14. 実装のポイント 実装のポイント notebookを⾒ていくほうが早いが、おそらくポイントと思われる所 基本的な実装はDCGANベース Descriminatorと訓練ループが違う 2種類のタスク(⽬的関数)に対応するため、Descriminatorの最終レ イヤはSoftmaxとSigmoidの⼆種類を付け替える 最後の層だけ関数によって切り替える構造になっている 汎化性能を⾼めるために,rate:0.5でBatchNormの後にDropout層を ⾜している

    Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  15. 学習for ループは以下の順番 学習for ループは以下の順番 1. Descriminator($D(x,y)$) 2. Descriminator($D(x)$,$D(G(z))$) 3. Generator

    1ステップの中で全部やるのがポイント? 個⼈的には先に$D(x,y)$だけやっても成⽴しそうな気はした Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  16. 性能⽐較 性能⽐較 書籍での数値⽐較は… 分類器 Test Accuracy 100sampleの分類器 70% SGANのD分類器 89%

    Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  17. ⼺(゚)(゚) 「やるやんけSGAN!アノテーションツールなんかポイーで」 (´・ω・`) 「もちつけ」 Chapt7.Semi-Supervised GAN - (半教師ありGAN) 

  18. 性能⽐較 性能⽐較 ⽐較のポイントは、「同じ数の教師データ(ラベルあり)で学習した、 通常の教師あり分類器」と⽐較して精度が出るかどうか 書籍での数値⽐較は… 分類器 Test Accuracy 100sampleの分類器 70%

    SGANのD分類器 89% 10,000sampleの分類器 98% * 当たり前だが10.000sampleで学習した分類機が⼀番強いのである Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  19. ちなみに ちなみに 私の環境での実⾏結果(BatchNormはv1で) 分類器 Test Accuracy 100sampleの分類器 42.6% SGANのD分類器 89.2%

    Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  20. 所感 所感 あくまで「少ないラベル付きデータとラベルなしデータで精度が出 た」事が強み すごい&技術的に興味深いのは⼤変よく分かるが、実⽤という⾯で は、どういったシチュエーションに適するかは考えどころな気がし た ラベリングのコスト > Generatorを上⼿に学習させるコスト

    が採⽤前提? データがあまりに⼤量すぎる場合、この⽅法で作った分類器を アノテーション⽀援に使うのはアリかな、という気がした (´・ω・`)皆さんはどう思われますか? Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  21. 余録 余録 tensorflow v2 のBatchNorm を使っ tensorflow v2 のBatchNorm を使っ

    た時の訓練失敗について た時の訓練失敗について 何故そんなことが起こるのか ⻑いです Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  22. TL;DR TL;DR 所謂keras-DCGANベースの実装(本書もそう)をtensorflow2.xで実 ⾏すると、学習失敗する tf.compat.v1.keras.layers.BatchNormalization を使うと回避できる v2のBatchNormalizationが trainable に応じて学習モードと推論モ ードを切り替えるようになったことが原因(と思われる)

    Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  23. 本書は原著の出版が2019年10⽉となっており、tensorflowの前提 バージョンは1.0台となっている。 Google Colabのデフォルトは現在tensorflow2.0台となっており、 マジックコマンド %tensorlow version 1.x を実⾏するか、明⽰的に 1.0台を

    pip install しないと、Kerasを利⽤してもバックエンドは tensorflow2.0台で処理される で、本勉強会でDCGANの時から⾔われていたことだが、GitHubの コードを2.0台で実⾏すると、4章以降使いまわしているDCGANの 学習が上⼿く進まない Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  24. Slackで既にメンバが特定した通り、原因はBatchNormalizationで あることまでは特定できていて、今回のコードもBathNormalization のレイヤをtf1.x台のものに置き換えれば、tensorflow2.0台でも学 習完了できる。 (´・ω・`)「え?でもBathNormの仕様なんて1と2で変わるんかい な???」 と思ってたので調べてみた 公式ドキュメントは GitHubの実装ソースは こちら

    こちら Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  25. 結論としては、v2のBatchNormは trainable is False なら training is False に分岐する(v1は分岐しない)というのがポイント このあたりは次スライドの内容も含め、

    ソースを追いかけていくと、v1を通したときは _USE_V2_BEHAVIOR is False で BatchNormalizationBase クラスが呼び出される事がわかる _USE_V2_BEHAVIOR is False だと以下の処理が⾏われない fusedのコントロール( fused:true だと処理の⾼速化?を ⾏うらしい) trainable is False なら training is False への分岐 つまり、v1のBatchNormは trainable is False で も training is True になりうるということ nkmk.me様の記事がわかり やすい Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  26. ここで抑えておいたほうが良いポイントとして、 BathNormalization()には training と trainable 2つのパラメータが有 ること BathNormalization()はNormalizationの単位をパラメータとして学 習する 訓練時はミニバッチの平均と分散で正規化が⾏われる

    推論時は、訓練時に得た正規化パラメータ(平均と分散)を元 に、⼊⼒データをNormalizeする この切替は BathNormalization() のメンバ変数?である training にも っている それとは別に、compileされたmodelとしては trainable をもってい て、これは明⽰的に設定もできるし、呼び出しメソッド(fit, predict) によっても変更される Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  27. じゃあDCGANの実装で trainable ってどうコントロールしてるの? と思いコードを⾒る ここで⼀度よくわからなくなった 明⽰的に trainable = False してるところがある

    学習前のそれぞれのDescriminatorのtrainableの値を⾒ると (´・ω・`)??????学習しないってこと? # Keep Discriminator’s parameters constant for Generator training discriminator_unsupervised.trainable = False print(f'discriminator_net:{discriminator_net.trainable}') print(f'discriminator_supervised:{discriminator_supervised.trainable}') print(f'discriminator_unsupervised:{discriminator_unsupervised.trainable}') >>> discriminator_net:False discriminator_supervised:True discriminator_unsupervised:False Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  28. そもそも そもそも keras-DCGANの実装では、 trainable が反映されるのは model.compile 後という性質を利⽤している なので、ちゃんとforループの中ではDも訓練が⾏われている 同じ疑問をIssueに挙げてる⼈も居た。気持ちはよくわかる。 ん?でもBatchNormalization()は

    trainable is False なら training is False に分岐するんじゃなかったっけ… https://github.com/eriklindernoren/Keras- GAN/issues/73#issuecomment-413105959 Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  29. つまりどういうことだってばよ つまりどういうことだってばよ tensorflow2.0のBatchNormalizationは trainable に応じて学習モー ドと推論モードを切り替えるので、最もポピュラーなDCGANの実装 コードの書き⽅で書くと、推論モードのまま学習に⼊ってしまう tf.compat.v1.keras.layers.BatchNormalization だと、この切替が起 こらない

    (´・ω・`)わかってみれば単純な話でした v1のコード横着して動かしたら駄⽬ですね Chapt7.Semi-Supervised GAN - (半教師ありGAN) 
  30. EOF EOF Chapt7.Semi-Supervised GAN - (半教師ありGAN)   