Pythonでニューラルネットワークを実装してみた。
Python(一部Numpy)を使って2層ニューラルネットのスクリプトを作成しました。
ディープラーニング(Deep Learning)は魅力的ですが、ディープラーニングの基礎となる
ニューラルネット(CNNだとfull connected layerと呼ばれますね)の実装および、
誤差逆伝播法(Back propagation)に使う微分の更新式をチェインルールを使って手で求めて、
ゴリゴリと実装していくのも良い練習となるので、Netflixで'24'を24時間で見ながら
だらだらコーディングしていました。
ニューラルネットは、回帰または分類を行うことができる機械学習手法の1つ、
Back propagationは、ニューラルネットのパラメータを学習させるために使う最適化手法
簡単に言うと、こんな感じだと思います。
ニューラルネットといっても、脳のニューロンをモデルに提案された機械学習手法の1つであって、"脳を模倣しているから、ニューラルネットが人工知能hogehoge..."とは考えるべきではないです。
「人工知能」「ディープラーニング」という言葉がポピュラーになってきていますが、ニューラルネット自体ははるか昔に提案されているものという認識は持っておくべきであると思います。
「ニューラルネットが脳のニューロンを模している」のは面白いことで、複数の入力の線形和が閾値を超えたときにのみスパイクとなって次のニューロンに入力が伝播していく点は再現できており、閾値をシグモイド関数のような活性関数を定義して表現しているのは面白いです。
一方で、脳のニューロンは、神経細胞によってそれぞれ閾値が異なっている点、誤差逆伝播法のような学習を行わない点が機械学習におけるニューラルネットと異なる点だと思います。
神経細胞がSTDPなどの可塑性を用いて学習する一方で、ニューラルネットは誤差があるときだけ逆伝播して学習をしているので、正しい出力が行われた場合にも学習が進むような最適化手法が考えられると、脳科学の知見ともさらに親和性がとれて面白くなるのではないかと思います。
「Pythonによるニューラルネットの実装」からどんどん話がずれていますが、
機械学習のニューラルネット、full connected layer、全結合層、back propagationなどのキーワードについてはググればたくさん資料が出てきますので、ここではいくつか参考になりそうなサイト載せて理論の話は省きます。
ニューラルネットによるパターン認識 - 人工知能に関する断創録
Pythonによる実装について、基本的にはPythonの組み込み関数を使って実装を行い、Numpyはリストのシャッフルと、バッチサイズにスライスするために一部使用しました。
そのほかはNumpyの内積計算dot()などニューラルネットワークの実装に便利なメソッドも使っていません。
コードに関しては基本的にコメントを残しておきました。実装してみたい方は参考にしてください。
今回のニューラルネットは、線形分離可能な2入力3出力のToyデータセットを解くニューラルネットになっています。活性関数には、シグモイド関数など使わず、y = xの単純な実装になっています。3クラスの分類問題なので教師データはone-hot vectorを使用しました。
CUIのIrisデータを解くときは、活性関数の部分を非線形にして、
forward()、backward()の部分を少し書き直す必要があります。
層を増やす場合は、train_nn()も1行ほど書き直す必要があると思います。
次回はもうちょっと、汎用的に使えるニューラルネットのコードを書いてみたいと思います。そのときは、シグモイド関数も実装して、オブジェクト指向で書きたいと思います。
前置きが長くなりましたが、以下がJupyterで書いたニューラルネットのコードになります。誤差を可視化してみたところ、きれいに下がっていっているようなので、正しく学習できているのかなーと思っています。