GANのはなし

こんにちは,

この記事はklis Advent Calendar 11日目の記事です.

www.adventar.org

おなじみですがこれでklis Advent Calendarの条件である「本文にklisが入っていること」をクリアしたので自由に書いていきます.

本当はメイドの話をしようかボードゲームの話をしようかというところで迷ってたんですが,4日目にnzwくんがVAEの話をしていたので,それと関係するGANの話をしようと思います. (22日目はNewbeznさんがボドゲの話をしてくれるかもですよ)

ちなみにGANはいわゆる機械学習の分野で,本来ならバリバリ数学の話が出てくるところなんですが,klis向けの記事でそういう話しても面白くなさそう(あと数式書くのがだるい)なのでそういう話は出さないようにします.ご安心ください.

GANとは

GANは「生成モデル」と呼ばれるものの一種です.

じゃあ生成モデルは何してくれるものかと言うと,大雑把に言えば「データをいっぱい学習させると,それっぽいデータを吐き出してくれる」ものです.

例えば顔画像をいっぱい学習させると,顔っぽい画像を吐き出すようになります.

今回は実験に画像を使ってるので,ここからは画像を学習させる前提で話をしていきます.

GANのしくみ

少しGANの仕組みを説明しましょう.

GANはGenerative Adversarial Netの略です.なんとなく訳すなら「敵対的生成ネット」ですかね.

「敵対的」なんて言葉が出てきてなんだか危なっかしい雰囲気を感じる人もいるかもしれないですが, そんなことは全然なく,2つのネットを競わせて学習させていくのでこういう名前が付いてるんですね.

その2つが G君 (Generator)と D君 (Discriminator)です.

G君

G君は画家です.

G君は何個かの数字を受け取ると,それに対応した絵を描いてくれます.

でもG君はけっこうわるい画家です.盗作をしています. なんとG君は,あるデータの中の絵を真似て絵を描いているのです.

このあるデータというのが,いわゆるGANの学習データですね.

D君

D君は鑑定士です.

D君は絵を受け取ると,その絵がデータに元からあった絵なのか,G君が描いた絵なのかを判定します.

G君とD君の関係

G君とD君は常に競い合っています.

G君は「絶対にD君にわからないくらい,データとそっくりな絵を描いてやるぞ」

D君は「絶対にデータの絵とG君の描いた絵を間違えないよう判別してやるぞ」

と,それぞれ思いながら各々の腕を磨き続けているわけです.

そうやって競わせながら学習させていくとやがて,G君の描く絵が元データと似たような絵になるというわけですね.

実験

冒頭で言っていたnzwくんの記事では,「η」の手書き文字を学習していましたので,こちらでもそうしようと思います.

nzwくんと同じく,19枚の「η」の手書き文字を使って学習させます.

f:id:mtjune:20161210231241p:plain

こういう画像ですね

結果

さてG君の成長を見ていきましょう....

と,言うところですがすみません,現在実験中です.

klis Advent Calendarの12月11日に入れていたのに,僕はその日一日ゲームマーケットに行く予定があるので記事をかけないため前日に投稿したのですが,実験を回し始めるのが遅かった....

なので,結果は随時更新していきます〜

0回学習後

f:id:mtjune:20161210231351p:plain

まだ全く学習を行っていないので,完全にランダムな画像が出力されます.

1000回学習後

f:id:mtjune:20161210231445p:plain

同じくランダムですね,さっきより色が濃くなった気がします.

10000回学習後

f:id:mtjune:20161210231552p:plain

やっぱりランダムですね,でも真ん中の方に何か模様が見えるような?

20000回学習後

f:id:mtjune:20161210231738p:plain

真っ黒になった....学習失敗???

28500回学習後

f:id:mtjune:20161210232100p:plain

真っ黒ではなくなりましたが,やっぱりランダムっぽいです.

でもこの画像,左から3枚目と4枚目見るとすっっっっっっっっっっっっっごくうっすらとηっぽいものが見えています. 右下の方ですね.めちゃくちゃわかりづらいです.

36000回学習後

f:id:mtjune:20161210232335p:plain

微かなηが....消えた....

いつの世も学習はつらく厳しいものです.気長に待ちましょう.

コード

ちなみに今回学習に使ったコードはこちらにあります.

github.com

基本的には以下のコードを参考にしたものです.

github.com

GAN,特に今回使っているDCGANについては以下の記事も面白いので,ぜひどうぞ.

qiita.com

qiita.com