不確定特異点

広く深く、ところどころ超深く

学習とニューラルネットワーク (1)

時代は知的情報処理です。というわけで、巷で噂の機械学習や深層学習の勉強を進めてます。そもそも機械学習や深層学習で何ができるのか?その限界は何か?このブームは一過性のものなのか?というあたりを見極められればよいと思ってます。(未だに深層学習ってニューラルネットワークに毛が生えたようなもの、くらいの認識しかなく…)

大学時代は情報系出身ですが、専攻はシステムソフトウェアやコンピュータアーキテクチャやハードウェア方面といった感じで、知的情報処理は必須科目を履修したくらいというスペックなので、前提知識は無きに等しいです。そこでとっかかりとして、あまり前提知識が要らなそうな、ニューラルネットワークの本を読んでみました。薄い本なので1週間もかからずにさらっと読めてしまうのでおすすめです。

学習とニューラルネットワーク (電子情報通信工学シリーズ)

学習とニューラルネットワーク (電子情報通信工学シリーズ)

理論は厳密性に欠けるけど丁寧に書かれてます。その分、扱う内容もわりと割愛されているようす。この理論で何が出来るのかが読んだだけだと実感できないので、巻末のプログラムを実装してみたいと思います。本書では C 言語で書かれてますが、あえて Common Lisp で書いてみます。

まずはニューロンの確率的2値モデルのシミュレーションです。入力に対してある重みで重み付け加算された値がニューロンに入力されます。ニューロンの出力は0か1かの2値をとるのですが、それはシグモイド関数という0から1に遷移する連続関数を確率として確率的に決定されます。

ニューロンの確率的2値モデルのシミュレーション

実行結果

CL-USER> (main)
731.0586
735

これはニューロンに1000回の入力を与えるシミュレーションです。理論計算で求まる出力1の回数と、実際に擬似乱数を用いて試行を繰り返した場合の出力1の回数を求めてて、大体一致してます。当たり前ですが。

この本、ニューラルネットワークにおいて一番重要なシグモイド関数の実装が間違えていて、計算結果が合わずにかなり悩みましたw Lisp で書くと関数値を返しまくれるので、C で命令的に書くよりも短く書けますね。