くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

【書評】生成 Deep Learning

「生成 Deep Learning」を読んだので感想を書く。

生成 Deep Learning ―絵を描き、物語や音楽を作り、ゲームをプレイする

生成 Deep Learning ―絵を描き、物語や音楽を作り、ゲームをプレイする

  • 作者:David Foster
  • 発売日: 2020/10/05
  • メディア: 単行本(ソフトカバー)


書籍の概要と感想

これの翻訳版。若干冗長で、洋書にありがちな例え話が若干意味わからん所もあって、そこら辺は読み飛ばしてもいいかと思った。(例えばGANの章だとGeneさんとDiさんのお話しが始まる。)こういう例え話が好きな人はいいのだろうが、むしろわかりづらい・・・。章の始めは基本例え話。その後、実装の細かい話や数学的な背景なども書かれていて、オートエンコーダとと VAEの違いとか生成モデルをあまり扱ってこなかった初学者には非常にわかりやすいのではと思う。

また、GitHubに上がっている参考コードや書籍のコードはKeras実装になっていてコードも結構整頓されているのでそのまま実行すればいい(自分はPytorch実装に書き換えて適宜行った)。しかし、結構学習量も多いのでGPUがないとめちゃくそ時間がかかると思う(GPUでも学習に12時間かかるようなものがあった)なのでGPUマシーンないよっていう場合は少なくとも学習はColabでやるのがいいと思う。推論はCPUで十分。

あと、どこからデータを取得すればいいかがよくわからないことがあったのでそこのフォローを各章の概要でメモっておく。

いずれにしても、オートエンコーダとVAEから始まって、お決まりのCelebAでお顔の写真合成して、っていうところから始まって、お絵かき・QA・音楽生成・ゲームシミュレーションといった流れで、Generative Deep Learningの醍醐味を体感できるいい書籍だった。各所に書かれている説明もアーキテクチャー図がたくさん書かれていて非常にわかりやすい印象。

難易度的に初めて生成モデルを使う人から、CelebA以外のサンプル試したことないけど、言語・音楽・ゲームシミュレーションみたいな別のものでも試したい初心者~中級者向けと思う。


各章の概要

ざっと各章の概要を書く。

1章 生成モデリング

生成モデリングとは何か?から始まって、識別モデリングとの違いを説明。特に生成モデリングの課題・表現学習の項目は図も多くわかりやすい。


2章 ディープラーニング

まぁここは、CNNとかやったことあれば特にいうことないけど、CNNを扱ったことないと読んだほうがいい。


3章 変分オートエンコーダ

まずはオートエンコーダの説明・コーディングから始まって、写像の制約に連続であることが保証されていないことから、変分オートエンコーダ(VAE)の説明に入る。ここら辺の説明はわかりやすく、オートエンコーダは潜在空間のある1点に直接写像されるが、VAEは潜在空間のある1点の多変量正規分布写像されるというあたりは図とともにわかりやすい。また、損失関数としてKullback–Leibler divergenceを用いるので、その説明もよかった。(ちょっと謎の例え話もあるが。。。)

あとは、MNISTとCelebAでごにょごにょやってる。ここで、潜在空間での計算っていう項目の説明はこんな顔にしたいときにどう考えればいいのか、どうコーディングすればいいのかというところはわかりよかった。

時間があまりなかったので大したepochを回さない時の例として、

f:id:black_tank_top:20201026091949p:plain
CelebAからの生成画像(epoch少ない)
雰囲気的にはそれぞれの画像からオリジナルのような画像が生成できてる。かなり学習に時間がかかる。

そんで肝心のデータはCelebAはサンプルコードから直接ダウンロードするとできない場合があるので、そのときは直接Google Driveからダウンロードするといい。 img_align_celeba.zip - Google ドライブ


4章 敵対的生成ネットワーク

GAN。生成器と識別器の関係がきちんと図解がされていて、わかりやすい。さらに課題として、

  • 損失の振動
  • モード崩壊
    などをあげ、その解決として、
  • Wasserstein損失
  • Lipschitz制約
  • 勾配ペナルティ損失
    を用いて、Wasserstein GANやWGAN-GPを取り扱っている。これらも課題から「なぜこれらを取り入れる必要があるのか」という説明があるため理解を促してくれる。

肝心のデータセットは、データセットとして初めて扱ったがCamelというラクダのような絵がかかれたデータセットがある。認証が入るが、適当に済ませて、ダウンロードすると、full_numpy_bitmap_camel.npyがダウンロードされるのでこれを使う。これらはGoogleのQuick, Drawっていうプロジェクトで集めたデータセットじゃないかなと思っている。そのほかのデータセットでやりたい場合は適当に選ぶといい。

最終的にこんな感じなものができる。Camelを使ってGANで学習(epoch多め)の方はなんとなくラクダっぽいのができてる。

f:id:black_tank_top:20201026073225p:plain
Camelを使ってGANで学習(epoch少ない)

f:id:black_tank_top:20201026073302p:plain
Camelを使ってGANで学習(epoch多い)


5章 描く

この書籍で一番面白いところ。描くではよくあるゴッホのスタイル変換ってやつから始まる。Pix2Pixはペアの画像セット(セグメンテーションされたものとのセット)が必要なのに対し、CycleGANはペアの画像セットが不要であるという違いを説明してみかんとりんごのデータを使ってコーディングが進む。このデータセットはサンプルコードからそのまま行けるが、ここのapple2orange.zipにある。そのほかのデータセットでやりたい場合は適当に選ぶといい。

この例ではUnetによるCycleGANを実装。

妥当性・復元性・同一性を示すために、以下のような実験を行った。 要するに、りんごとみかんを入れ替えようっていう話で、1行目の画像は、それぞれ元画像、2行目はCycleGANで入れ替えた画像、3行目の画像は2行目の画像を復元した画像(みかん→りんご生成器で生成したみかんを、りんご→みかんの生成器で戻すっていうこと。(ここら辺の説明は書籍にわかりやすく書いてある))

ただ、学習もうまーく進めないと、やりすぎると闇の色をしたりんごが生成されたりする。(epoch多いの画像)

f:id:black_tank_top:20201026091331p:plain
apple2orangeを使ってCycleGANで学習(epoch少ない)

f:id:black_tank_top:20201026075358p:plain
apple2orangeを使ってCycleGANで学習(epoch中程度)
f:id:black_tank_top:20201026075422p:plain
apple2orangeを使ってCycleGANで学習(epoch多い)

ちなみにColabで12時間以上かかる。

そのほかにも、

  • コンテンツ損失
  • スタイル損失
  • 全変動損失
    について詳細に書かれている。図が多く説明がわかりやすい。
6章 書く

これは文章生成、QAの話。LSTMとRNNをつかって、特定のスタイルをまねたテキスト生成に挑戦できる。時系列データを単一のベクトルに凝縮し、別の時系列データにエンコーディングするという流れを学べる。

データは、
イソップ物語と Maluuba/newsqaのGitHubからDocker使ってtrain, test, devを生成する。ちょっとめんどい。 github.com


7章 作曲する

個人的には一番興味があったところ。 データセット著作権の問題からクラシックとなっているっぽい。以下から、好きなものを使う。また、楽譜の可視化は以下を使う。 musescore.org

有名どころとして、Suite No. 1 in G major - BWV 1007 Allemandeである、cs1-2allを選ぶ。それでmusic21のconverterでいい感じにやれば以下のように楽譜の可視化ができる。

f:id:black_tank_top:20201026084901p:plain
Suite No. 1 in G major - BWV 1007 Allemandeの一部

Colabでやる際は、以下の設定を先に先に済ませておかないとセルに楽譜を表示できない。

!apt-get install musescore
# 仮想フレームバッファの設定(Google Colaboratoryで必要な設定)
!apt-get install xvfb
!sh -e /etc/init.d/x11-common start
import os
os.putenv('DISPLAY', ':99.0')
!start-stop-daemon --start --pidfile /var/run/xvfb.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1024x768x24 -ac +extension GLX +render -noreset
# パスの設定(Jupyterと共通)
from music21 import *
us = environment.UserSettings()
us['musescoreDirectPNGPath'] = '/usr/bin/mscore'
us['musicxmlPath'] = '/usr/bin/mscore'
us['directoryScratch'] = '/tmp'

また、MuseGANを使った例もあって、これはバッハの4声コラール集のデータセットを使う。どこにあるかというと、以下のJsb16thSeparated.npzを使った。 github.com

MuseGANによって、和音・スタイル・旋律・Grooveのベクトルを調整して、音楽を生成する。

生成できた楽譜の音声をuploadしてもいいと思うが、このブログでどうやるかが分からない。Soundなんちゃらみたいなところにuploadするのかな?


終わりに

ここで紹介した内容以外にも、 以下についても簡単に触れられている。

  • 世界モデル
  • Transformer
    • BERT
    • GPT-2
    • MuseNet
  • 画像生成
    • ProGAN
    • SAGAN
    • BigGAN
    • StyleGAN

また、話題のGPT-3については付録で詳細解説があり、個人的には嬉しかった。

生成モデル系は、生成物がどうなるのかというのが楽しいので、サンプルコードを元に好きなフレームワークで実際に体感をできて面白いとおもった。今後の自分の仕事にも生成モデルを多用する可能性があるのでいい復習になった。これだけでは最新のペーパーには追いつかないがベースを学にはとりあえずOKという感じ。

生成 Deep Learning ―絵を描き、物語や音楽を作り、ゲームをプレイする

生成 Deep Learning ―絵を描き、物語や音楽を作り、ゲームをプレイする

  • 作者:David Foster
  • 発売日: 2020/10/05
  • メディア: 単行本(ソフトカバー)


参考になる書籍

こちらは主に顔の画像のGANが多いが、Keras実装でこちらの書籍と併せて読み込むとGANの知識が積めると思う。

Pytorch実装を作りながら学べる。なかなかほかの書籍にはないのでPytorch実装を覚えたい場合は良い。

つくりながら学ぶ! PyTorchによる発展ディープラーニング

つくりながら学ぶ! PyTorchによる発展ディープラーニング

  • 作者:小川雄太郎
  • 発売日: 2019/07/29
  • メディア: 単行本(ソフトカバー)


お願い(欲しい書籍リスト)

ずうずうしいのですが、ブログを続けるのも大変で、基本自分の学習メモのためですが、サポーター募集です。ポチッとしてくれると嬉しいです。

https://www.amazon.jp/hz/wishlist/ls/392RAJUYSC2ON?ref_=wl_share

もしくは、レビューなど書くので、献本していただけたらものすごく喜びます(お問い合わせ or TwitterのDMからお問い合わせ下さい。)