技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

ゼロDeep4章のニューラルネットワーク学習

論理としては理解できたのでメモ。

  1. 教師データを食わせたとき、その演算結果(行列、インデックスがそれぞれ分類を示す)と、出てきてほしい結果(これまた行列)の誤差を行列で取得する関数を用意する。(損失関数)
  2. この損失関数と、現在のニューラルネットワークの重み、バイアスをパラメータに微分して、パラメータのどの方向に変動させるべきかを見る。 最急降下法というようだ。
  3. 出てきた誤差を、学習係数を踏まえて実際にパラメータへ入力する。

という流れで、ニューラルネットワークの各階層をの「重み」「バイアス」を弄っていく。
というのがどうも学習の論理らしい。

そこまでは腑に落ちた。
で、実際やってみたところ、サンプルの時点で処理オワンネ(汗

StudyDocs/two_layoput_net.py at master · Sunao-Yoshii/StudyDocs · GitHub

それも当然で、サンプルだけで見ると、ニューロンの数が

  • 入力層: 784
  • 出力層: 100

このニューロン1個あたりで「重みとバイアスで2回」x ニューラルネット判定(入力層と、出力層で2回) x 微分(前後計算で 2 回)で 8 回計算する羽目に…。
しかも行列計算、浮動小数店計算。

ベンチマークもびっくりの計算量ですよ。
しかも論理を説明するため、処理時間を考慮しないシングルスレッド…そりゃ無理でんがな