敵対的生成ネットワーク)という生成モデルの中でも面白い構造の仕組みを最近よく見かけます。Generator(生成者)とDiscriminator(識別者)が互いに競い合って精度を上げていく構造は、美術界での贋作者(=Generator)と鑑定士(Discriminator)の勝負のようでギャラリーフェイクのような世界を彷彿とさせます。仕組み自体に浪漫を感じます。それで精度良い生成ができるのだから本当に不思議です。いうのは二者の対立のバランスを取りながら学習することでこの課題を解決するとのこと。BEGANは結構内容がシンプルで理解しやすかったので、Kerasで実装してみました。した時に、DiscriminatorのLoss関数をLD(x)LD(x)、GeneratorのLoss関数をLG(x)LG(x)とすると、LD(x)=L(真の画像)−kt∗L(Generatorが生成した画像)LD(x)=L(真の画像)−kt∗L(Generatorが生成した画像)LG(x)=L(Generatorが生成した画像)LG(x)=L(Generatorが生成した画像)kt+1=kt+λk(γ∗L(真の画像)−L(Generatorが生成した画像))kt+1=kt+λk(γ∗L(真の画像)−L(Generatorが生成した画像))という形で学習させるところです。このktktというのは最初は0から始まって徐々に大きくなる感じです。DiscriminatorはLossを減らすために「真の画像のAutoEncodeを頑張る(Lossを小さくする)」のと「偽の画像のAutoEncoderを頑張らない(Lossを大きくする)」という行為を迫られます。最初はk=0なので真の画像のAutoEncoderを最適化していきますが、徐々にkが大きくなりGeneratorの画像のLossを大きくする努力も併せて行います。γγが効いてくるわけですね)。Generatorは常にAutoEncoderのLossが小さくなる用に生成画像を工夫していくので、徐々に争いが高度になっていくということになります。このジレンマのような仕組みがとても面白く、それがスッキリ表現されていて、おおー、と思いました(まあ、他のGANのことはよく知らないのですが...)。実装ソースコードhttps://github.com/mokemokechicken/keras_BEGANに置いてあります。それっぽい画像が生成できているのでだいたい実装としてはあっているんじゃないかと思っていますが...Kerasだとこういう一風変わったモデルや学習を行うのが難しい(あまりサンプルがない)ですが、書き方がわかってくると実はそれほど難しくはなく、作れてしまえばモジュール性の高さから読みやすく、いろいろ応用しやすい良さがあります。batch毎の各種Lossなどの値をPlotすると以下のようになりました。それぞれの値の意味は以下のとおりです。学習の進行度合いを示す値。これが収束すると良いらしい。L(Generatorが生成した画像)パット見て思うのは、kは一旦大きくなって、その後小さくなるようです。68331da3eb755a505a502b5aacb3c201)を使わせてもらいました。13194サンプルあります。学習の進行別に生成された画像を並べてみるとこんな感じでした。215顔写真としては、epoch125くらいまでのが結構良い感じです。それ以降は、背景も取り込もうとしたからか、顔の部分の乱れがすごいことになっています。顔に注目して生成したければ、背景を潰して顔だけにしたやつを使えばもう少し綺麗になるのかもしれないですね。Layerの数なども関係するそうですし、ちょっと不足気味だったのかもしれません。VariablesKERAS_BACKEND=theanoTHEANO_FLAGS=device=gpu,floatX=float32,lib.cnmem=1.0さいごにやっとGANについて少しわかった気がします。DeepLearningを転載したものです。