アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うこと。

手作りディープラーニング。推論部を実装してみた。

ゼロからディープラーニングの実装をはじめて、まず推論部だけ作ってみた話を書きます。

 

人工知能とかディープラーニングとか言ってますが、本で読んだり、フレームワークのデモを動かしてる程度の知識しかないのでは話にならないので、まず、手を動かしてみようという感じです。

 

とりあえず、自分で作って使ってみれば、ディープラーニングとはどういうもので、何ができて、何ができないかをつかむ(=勉強する)ことができるんじゃないかと期待しています。

 

最初から欲張ると、うまくいかないので、とりあえず動けばOK・・の「手作りおもちゃ的ディープラーニング」を作り、まず、動かしてみるのを当面の目標にします。「ちいさい事からコツコツと・・」。

 

当面の作戦です。

  1. とりあえず動く「おもちゃディープラーニング」を作る
  2. 「おもちゃディープラーニング」で、色々実験してみる
  3. その結果をうけて、あとのことは考える

うーーん。作戦?とは言えないかな。まあいいや。はじめます。

 

ディープラーニングは、ざっくりと2つの部分にわかれます。

  • データから学習する(以後、学習部)
  • 学習した結果を使って問題を解く(以後、推論部)

 

まずは、簡単な方からということで、推論部からやってみます。

 

おもちゃディープラーニングだから、汎用性は一切考えなくていいでしょう。複雑にならないよう、3層か4層の固定でニューラルネットワークを組みます。

 

こんな感じ。

f:id:arakan_no_boku:20161107223112j:plain

ひとつひとつのノードの計算は行列の積を計算する要領でできるみたいです。

 

例えば、下図みたいな入力層(x)2つ、隠れ層(z)3つなら、例えばz1ノードの計算式は「z1 =x1W1 + x2W2 + b」みたいな感じですね。bはバイアスです。

f:id:arakan_no_boku:20161108055141j:plain f:id:arakan_no_boku:20161108055220j:plain

 

で、重みとバイアスで計算したら、活性化関数を通して、そのアウトプットを次のノードのインプットにして計算していって、伝播させます。

 

そして最後の出力層まで行ったら、最後にソフトマックス関数を通して出力します。

f:id:arakan_no_boku:20161108000654j:plain

理屈では、これで最低限の推論部はできることになってます。

 

活性化関数は種類がいくつかありますが、シグモイド関数にしました。それぞれおなじみとは思いますが、いちおう式を書いておきます。

 

これを、計算式のまんま、力技でプログラムしていきます。

シグモイド関数

f:id:arakan_no_boku:20161107230238j:plain 

ソフトマックス関数

f:id:arakan_no_boku:20161108201751j:plain

 

ソフトマックス関数を通すと、例えば出力層を5つとすると[ 0.2,0.1.0.5,0.1,0.1]みたいに総和が1(つまり、100%)になってでてくるんです。

 

だから、確率として使って、一番確率の高い0.5が答えと判断できるということなんです。うまくできてますねえ。

 

なんだかんだと言いながら、おもちゃディープラーニング の推論部は、一旦できました。

 

テストデータは、おなじみのMNISTデータ・セットを使います。まだ、学習部分を作ってないので、全く学習できてません。いわゆるバカの状態です。

 

無学習だと、どれくらいのもんか興味があったのでやってみました。

 

ウエイトとバイアスは乱数を使って適当に生成し、MNISTのテスト用画像10000枚を処理して、どの程度の正解率があるか試してみます。

 

結果は、なんと9%!

 

0%じゃないから、一応理屈通りちゃんと動いていると安心する反面、でたらめでも、この程度の正解率はでるよなあ・・という数字なので若干不安も残ります