Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2016-06-27

[][]オートエンコーダが出力した特徴空間をVR空間で立体化してみる 06:40

 さてさて、週末であります。

 世間の皆様は引きこもってゲームをしたり、二度寝しすぎて頭痛がしたりといろいろ忙しいとは思いますが、僕にとって週末といえば、プログラミングでございます。


 ところで皆さん、特徴空間って知ってますか?英語で言うとfeature space、つまり特徴の空間なわけです。


 多層ニューラルネットワークの世界では、ひとつの層を構成するニューロンの数を「次元」と呼んだりします。そして数学では、3次元以上の次元を持つ状態を便宜上「空間」と呼びます。


 たとえばニューラルネットワークの練習でよく使われる、0から9までの数字を手書きで殴り書きした28x28の白黒画像の次元は768次元。これをニューラルネットワークに学習させると、出力次元は10次元(0から9までの10種類だから)となります。


 ただ、10次元とかやり過ぎだよね。

 見えないじゃん。

 10次元の空間がありますって言われても、みれないじゃん。


 そこでどうするかというと、10次元をさらに三次元に圧縮します。

 ところがオートエンコーダで3次元に圧縮するだけだと、ごちゃっとした塊になってしまいます。

https://i.gyazo.com/88479b498e7e59d27ddbf6094bc8afda.png


 これはこれで特徴を掴んでる雰囲気はあります。明らかに完全なランダムではないからです。

 しかし、オートエンコーダのみだと、特徴は掴むが人間の理解できる特徴ではないという問題があります。


 そこで、最後に10次元の層をも一個追加して、「おれはこういう分類が欲しいんだよ」というファインチューニングをかけます。

https://i.gyazo.com/4bcbaf3094946ad765931bde29b44deb.png


 ファインチューニングの場合はオートエンコーダを使うのではなく普通にバックプロパゲーションします。

 この話の面白いところは、オートエンコーダでどれだけ深く学習させても、通常は3層くらいで勾配が消失してしまうバックプロパゲーションで教えるだけでわりとしっかり分離できるところです。


 とはいえ、PythonのMatplotlibの3D表示ってすごく物足りなくて、「へー」とか「ほー」とかいう程度のことしかわかりません。


 まるで図鑑でしか見たことがない動物っていうんですかね。

 サファリパークに行くと、クマとかライオンとかが放し飼いになってるじゃないですか。もうあの種の本能的な恐怖ってなんなんですかね。機嫌が悪かったら今にも襲いかかってきそうというか。実際、ドア空けちゃってクマに喰われたりするらしいじゃないですか。


 そういう感覚と比べると、やはり三次元空間を二次元に投影した射影だけ見て理解しろというのは、中学生男子がイメージする女性像というか、まあ要するに妄想にすぎないわけですよ。


 ところで生粋の3D野郎である僕にしてみれば、「空間」と聞いただけで血沸き肉踊るわけです。本来。

 脳裏をあの素晴らしい4✕4行列が過ぎります。


 ああ、空間。快感。基底変換。



 というわけで、htc Viveでこんなの作りました。


https://i.gyazo.com/e3a1c91b75b5a91b3f224269b4e3e4e5.gif


 ルームスケールVR空間でですね、まさに特徴空間を自分の目で見て、体験できるわけです。

 最初はオートエンコーダで出力されたまんまの状態。そこから、ファインチューニングして一気に分類される状態をVRとアニメーションで体験できます。


 面白いのは、「これは8にもみえるけど9にも見えなくもないなあ」というくらい雑なやつは、やっぱり8と9の間の空間をバビュっと飛んで行くところでしょうか。


 スケールを変えられるので、遠くから見ることもできます。


https://i.gyazo.com/a90625994f323c4c817d00ed750b5f9c.gif


 おおまさにこれぞ特徴空間。


 というわけで、明後日から東京ビッグサイトで開催のコンテンツ東京2016、「AI・人工知能ワールド」ではhtc Viveによる特徴空間の体験展示を行います。お暇なら是非おいでください