GANのはなし
こんにちは,
この記事はklis Advent Calendar 11日目の記事です.
おなじみですがこれで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枚の「η」の手書き文字を使って学習させます.
こういう画像ですね
結果
さてG君の成長を見ていきましょう....
と,言うところですがすみません,現在実験中です.
klis Advent Calendarの12月11日に入れていたのに,僕はその日一日ゲームマーケットに行く予定があるので記事をかけないため前日に投稿したのですが,実験を回し始めるのが遅かった....
なので,結果は随時更新していきます〜
0回学習後
まだ全く学習を行っていないので,完全にランダムな画像が出力されます.
1000回学習後
同じくランダムですね,さっきより色が濃くなった気がします.
10000回学習後
やっぱりランダムですね,でも真ん中の方に何か模様が見えるような?
20000回学習後
真っ黒になった....学習失敗???
28500回学習後
真っ黒ではなくなりましたが,やっぱりランダムっぽいです.
でもこの画像,左から3枚目と4枚目見るとすっっっっっっっっっっっっっごくうっすらとηっぽいものが見えています. 右下の方ですね.めちゃくちゃわかりづらいです.
36000回学習後
微かなηが....消えた....
いつの世も学習はつらく厳しいものです.気長に待ちましょう.
コード
ちなみに今回学習に使ったコードはこちらにあります.
基本的には以下のコードを参考にしたものです.
GAN,特に今回使っているDCGANについては以下の記事も面白いので,ぜひどうぞ.