どうしたの
皆もすなるDCGANというものを,我もまたしてみんとてするなり.
ということで, 今でもガンガン活用が進んでいる(?)GANないしDCGANについて(自分の理解を深めるためにも)気持ちをふわっと解説して,実装してみたい!
とか言ってたら下書きを放置して半年以上経ってしまってつらいきもちです
環境
OS: Ubuntu 18.04 LTS
Python: 3.6.4
Chainer: 1.24(事情により非常に古くなっております.最新版に合わせたコードは今度書く…たぶん)
GANについて
GAN(Generative Adversarial Network ; 敵対生成ネットワーク)とは,Goodfellowらによる論文で発表されたアイディアです.
かんたんに言うと
- Generator(贋作屋)
- ランダムな配列から訓練データに似せたデータを作るネットワーク
- Discriminator(鑑別器)
- 元々の訓練データとGeneratorが作った偽物データを読んで「訓練データor偽物」を判定するネットワーク
の,ふたつのネットワークを用意して,以下の式で表されるmin-maxゲームをさせます.
ここに,$E[x]$は$x$の期待値,$x$は用意した訓練データ,$G(z)$はGeneratorが(用意した訓練データに似せて)作った偽物.$D(x)$は Discriminator が $x$ を本物だと思う確率です.
\min_G\max_DV(D,G)=E[\log D(x)] + E[1 - \log D(G(z))]
直観的な説明をします.$D$が正しい判断をできれば$logD(x)も1-logD(G(z))$も大きい値を取り,$V(D,G)$は大きくなりますし,誤った判断をすれば逆に小さくなります.
Generator からすれば$V(D,G)$は小さくなって欲しいし,Discriminator からすれば大きくなって欲しい.こんなイタチごっこを繰り返すのが GAN のコンセプトです.
実装
しました.
githubに細かい層の構成とかは readme に載っているので(書くの面倒だった)見てやってください.