宇宙人のアルファベット　～DCGAN×文字～

※昨年[話題になった](http://qiita.com/mattya/items/e5bfe5e04b9d2f0bbd47#_reference-5909b52e92bede447015)DCGANで遅ればせながら遊んでみたという話です。内容としてはアルファベットに適用しただけです。

#背景

[ドレイクの方程式](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%AC%E3%82%A4%E3%82%AF%E3%81%AE%E6%96%B9%E7%A8%8B%E5%BC%8F)のN値がもし１より大きければ、どこかに地球外文明があり、おそらく何らかの文字が使われていることでしょう。そしてその多くは、地球でも生まれた（そして消えていった）文字とかなり共通している、または似ている確率が高いと思います。  

文字としての制約：
- 条件１：少々くずれても互いに判別可能な（判別しやすい）文字のセットであること
- 条件２：複雑すぎないこと
- 条件３：描きやすいこと（≒条件2）
を満たす図形のバリエーションには限りがあるためです。  

であるならば例えば、現在のアルファベットから特徴を抜き出してうまくアルファベット様文字列生成器を作れれば、パラレルワールドのアルファベット、そして**宇宙人のアルファベットを垣間見ることができる**はずです。

実験手法としては、本来は、非常に単純な形を変形・分裂させて、上記制約をかけながら進化計算させるような手法が（文明的には）正しいと思われます。条件1と条件２はある意味トレードオフなので、そこを最適化条件に加えて計算させれば、進化計算でもディープラーニングでも、良い感じになる予感はしています。  

しかしその場合トップダウンで複雑度算出ロジックやパラメータの指定（図形の複雑度やポテンシャルエネルギー）が必要になりますし、あとDCGANを試して見たかったということがあったため（これメイン）、今回はアルファベットをDCGANにかけました。  

#実験方法と経過

https://github.com/mattya/chainer-DCGAN
で公開されているコードをカスタマイズし、アルファベット52文字を、DCGANで学習させました。
- generatorのパラメータ：-1～+1で100個（100次元ベクトル）
- 1エポック50回の学習とし、200エポック学習
- [アルファベット素材](https://github.com/hitokun-s/alphabetic/tree/master/images48)
- 全てのデータおよびソースは[こちら](https://github.com/hitokun-s/alphabetic)  

なにせ学習データがたった52枚なので、学習も一瞬で終わります。

20エポック目：
![epoch20.png](https://qiita-image-store.s3.amazonaws.com/0/41324/495e0a2f-4c12-a7a0-ebba-ed05100676db.png)

180エポック目：
![epoch180.png](https://qiita-image-store.s3.amazonaws.com/0/41324/dcaf953e-794c-66b5-22a0-4911dde0375c.png)

これだけ見ていると本当にアルファベット生成器になっているか、少なくとも元にしたアルファベットをちゃんと生成できるのかどうか不安なので、生成パラメータを調整して、元アルファベットを出力してみます。

この元データ再現パラメータの探索は、本来は[chainer-gogh](https://research.preferred.jp/2015/09/chainer-gogh/)に登場するような「**出力画像とネットワークのパラメータを固定して、入力データを学習させる**」方法で行うべきだと思うのですが、自分のchainerの理解が浅いせいでうまく実装できなかったので、今回は力技で算出しました。


![vertex_mini.png](https://qiita-image-store.s3.amazonaws.com/0/41324/b1fa372b-699d-fc38-16a1-808a56ee4334.png)

大体うまく再現できています。これを頂点画像と呼ぶことにします。

#遊んでみる

これら頂点画像の生成パラメータのベクトル演算により、中間画像が生成できるか確認してみます。

例：AとBの中間ベクトルを徐々に変化させてみる

![A_to_B_mini.png](https://qiita-image-store.s3.amazonaws.com/0/41324/a1996b76-7458-5d85-f598-2dae5080eec8.png)

AがBに変化する途中には、Rが出現するんですね。

同じ処理をAからZまで繰り返して、つなげてアニメにしてみます。

![abc.gif](https://qiita-image-store.s3.amazonaws.com/0/41324/6d6d504e-095a-7914-7281-05a7fd07144b.gif)
（動画は[こちら](https://twitter.com/hitokuns/status/744314165905416192)）

似ている文字ほど生成パラメータ（100次元）のベクトル間距離が近いはずなので、生成パラメータを二次元に縮約して可視化してみます。

主成分分析（PCA）結果：
![alphabet_pca.png](https://qiita-image-store.s3.amazonaws.com/0/41324/96aecb01-ccce-f288-cd26-19a4f1c0c489.png)

大体似た形が集まっているのがわかります。  
ではいよいよ、中間画像をいろいろ生成してみます。

#生成画像例

![generate_sample_mini.png](https://qiita-image-store.s3.amazonaws.com/0/41324/392ae784-d651-bb05-d986-8dccbfa5b767.png)

※2文字混合、3文字混合は生成ベクトルを単純平均
※4文字混合は、生成ベクトルを、4:3:2:1で加重平均

（追記）ここは趣旨から言えば、文字を混合するよりランダムに生成パラメータを選んだ方が良いですね。**だって上の180エポック目の方が、面白い文字含んでるし**。。。

見覚えのある文字（ギリシャ文字のイプシロンやシグマ）がありますが、今回学習の材料は英語のアルファベットだけでギリシャ文字を教えた覚えはありません。これらも生成文字です。  

なるほど、こんな文字もあり得たのかもしれない、と妙な感慨があります。
**いや・・・もしかすると「あった」のかもしれない・・・？**

人類のアルファベットより：
![human_alphabets.jpg](https://qiita-image-store.s3.amazonaws.com/0/41324/15da9162-2502-7b22-60dc-72979b527383.jpeg)

あるじゃないか！

#宇宙人のアルファベットに向けて

今回はDCGANを試して、それなりに楽しめましたが、サンプルに依存する点、中間画像という点がバリエーションを制限してしまいますし、やはり文字版[アカシックレコード](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AB%E3%82%B7%E3%83%83%E3%82%AF%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89)への扉を開くには至りません。
また「文字の発生と進化」という観点からは、棒／筆で一定の方向性をもって描いてできる形、という制約も必要そうな気がしてきます。
冒頭に述べた進化計算も含め、他の手法も試していきたいと思います。