とりあえずディープに行く~Chainer導入~

始めに言っときますが、

NVIDAとかGPUはラボにはあるけど、使いません。
AWSとか巷にあるけど使いません。

ってことで、ラボの普通のマシンで頑張ります。
きっと精度は悪いだろう。そんなことは気にしなし

今回の目標

今回は精度とかの話ではなくて、Deeplearningを使って何かしたいねぇから始まって
とりあえず、Chainer使ってなんか掴んでみよう。そんなスタンスです

ってことで、

Chainerを入れよう

しっかりGPU積んでいると、いろいろ設定が必要ですが、、、、
ubuntuではこれでまぁうまくいきました。
※すでにnumpyとかscipyとか入っていれば問題ないっぽい。

要は、それなりに解析とかやってきたマシンには簡単にはいるようです

一方の、Macは

という様に3つパッケージいれてnumpyのバージョンを無理やり上げました。(超大量のエラー吐き散らかしているが・・・)
一応これで、僕的には困らなかった。解析用にseabornとか入れるとかはまた別

そもそもニューラルネットってなんじゃっけ?

NNって難しいよなぁ。わかる。
解説するか?すこしな。俺もたまに忘れるから
数式は一切使わない。嫌いだもの。

ニューロンって何?

ニューロンはこんな感じではないけど、だいじなのは生物で習ったニューロンと同じで、
入力がいっぱいあって、合わせて一定の閾値超えると次に伝わるって仕組みな。確か、、、
それを模式化すると・・・
いろんな入力を受け付けて出力するけど、ある入力に対して重み付けをする。
出力の基準を関数に任してあげる。
式は z=(weight)*(input)+(bias) で z の和をとって、 (output) = func(sum(z))みたいなノリで
関数ってのhが活性化関数っていって、tanhやsigmoid、relus関数に基づいたりする。

で、こいつらニューロン(以下ノード)をまとめて層をつくるわけだ。
もちろん入力層は入力次元分だけ、出力層は出力次元分だけノードがある。
中間層は何層でもいいし、各層何ノードでもいい。でも、多くなるとその分計算量が・・・
ってなるから、マシンパワーで倒せるけど、ぶっちゃけ過学習が怖いところ

層を最初に作る。

weightとbias(なくてもいい)とか初期値をきめたら、とりあえずなんかそれっぽいものはできる。
プログラムのinitの部分のl1が入力、l2が中間、l3出力層。見ての通りひな型。

とりあえず入力して出力する。

当然誤差がヤバい。誤差関数を定義して修正しよう。
修正はそこらの機械学習と同じで、教師-予測の差を取る。それに基づいてweightとbiasを変えればいい。
これが、順伝搬。ちなみに交差エントロピーが誤差関数になったり、、、する

どうやって変えていくの?

ここで終わりからどんどん修正かければいいんじゃん?ってなる。辻褄をあわせていく感じ
でも、そのつじつま合わせが超絶だるい。
要は逆の動きをするので、いままで和を取ってきた身としては微分の嵐が吹き荒れる。
微分の連鎖律を駆使して頑張る、このへんの式は興味で・・・ってか一度手計算しとこうな。昔やったけど、たしか中間か最後かの2タイプの式。
これが、逆伝搬

めでたく、更新式ができました。

ガンガン修正します。修正方法は、少しずつだったり一括だったり・・・
で、何回も回す。一回をepochとかいう。だんだん損失関数とかaccuracyがよくなる。
一回にどれくらい更新するかってのははoptimizerてのがやってて、方法がいっぱいあるっぽい。
みんなadamだからadamだけども

はい。洗練されたニューラルネットの出来上がり

これで、かんせいだけど。
入力して、最も確率高い次元のところが答えとかかな?まぁ設定次第。
層の数、層の中のノード数、マシンパワーが精度と時間のボトルネックだよね・・・

Chainerの〇〇なところ

値は32bitすなわち、float32, int32の世界。numpyがfloat64なので変換は必須だし、カテゴリ変数はダミー変数にしないとね。
だから、結構データづくりがだるい。
結構思っていたよりかは敷居が高い。でも結果はいただける。
gpu使うとどうなんだろう?めんどいのかなぁ環境設定・・・コードはそんな変わらなそうだけど

最後にコード

あとはコメントアウトにしれっと書いたことは多分忘れちゃいそうなことな。写経に近い。
こんだけフレンドリーに書けば馬鹿な俺でも記憶の彼方にあってもイメージ掴み直せると思う。
こんどは、でかいのしっかりいれよー。テンソルはあと。