研究室的にやたらニューラルネットワークをCとPythonで動かしたときの速度差が気になる。

人工知能を学習する上で使う言語はPython一択ですし、Cでネットワークを実装するとなると使えるライブラリがなくてかなり厳しいことになります。なんで、そんなこと気になる人ってほとんどいないと思います。

ところが、自分で所属している研究室ではニューラルネットワークをフルスクラッチで(主にCで)実装していくという文化があるので、CなのかPythonなのかということがものすごく重要な問題になるんですよね。

ネットを調べてみると、Pythonは計算速度が遅いのに何で人工知能の学習はPythonなんだと疑問を持つ人は少なからずいるみたい。ただ、その疑問に対する回答は「人工知能はPythonで開発するもんなんだよ」とか、「計算に時間がかかるなら計算資源を増やすだけ」とかそういう回答で一蹴されてしまっています。

でも、うちの研究室みたいに弱小研究室は計算資源を増やすことは簡単じゃないし、入力データが少なくてバッチ処理が難しい場合だとGPUの効果って薄いんですよね。だからシングルコアのCPUに頼る場合どう考えてもCの方がメリットあるって思います。

実際単純な計算スピードは最適化されたCはPythonの100倍のスピードが出るって言っている人もいますしね。

まあ、Cの速度がわかったところでCは使いません。今ちょっとやってるだけで思ったんですけど、配列(行列)が関数にわかせなかったりと躓くポイントがたくさんありました。

それに何よりnumpyが使えないのがかなりキツイ。

それでも、検証する意味はあると思うんですよね。

 

まずはPython版の仕様

 

最初はCNNを使おうと思ったんですけど、CNNはデータの次元が多すぎてCで実装するのがあまりにもきつすぎたのでやめました。挫折必死。

で、学習データはお手軽にMNISTを使おうと思ったのですが、調べてみると3層の多層パーセプトロンでもMNISTだったら十分学習できるようなのでシンプルなパーセプトロンで行きます。

入力層は28*28のMNISTのデータを一次元に並べて784個のニューロンを用意します。

隠れ層はとりあえず一層。100個くらいでいいらしい。出力関数はシグモイド。

出力層は0から9まで10個用意します。出力はもちろんsoftmaxで確立を出力します。

ということで、728*100*10の三層のネットワークになります。

あとで、コードも載せるので各モジュールがどうなっているかというと、

function.py:シグモイド、シグモイド微分、ソフトマックスなどの諸関数

layer.py:隠れ層、出力層の各レイヤーのクラスの定義

network.py:多層パーセプトロンの実装

これらのモジュールをjupyter notebookで呼び込んでテストします。