0章「まえがき」
1章「Python入門」
2章「パーセプトロン」
3章「ニューラルネットワーク」
4章「ニューラルネットワークの学習」(今回はここ!)
この章では、
ついに、その謎が明かされる。
謎解きのしくみは、
訓練データ(*2)から最適な重みパラメータの値を自動的に獲得することを「学習」といい、
そのめじるし(指標)として損失関数(*3)が使われる。
損失とは「性能の悪さ」で、この最小値がベストな(最適な)重みパラメータということになる。
って、まあすごいシンプルな話だった。
ただ知りたいのは、その最小値を自動で求める方法だ。
でも、損失関数って関数というくらいだから、最小値なんかグラフ描けばすぐわかるじゃん!
ど素人の私は瞬間的にそう思ったが、そう簡単にはいかないのだ。
関数のグラフといえば一次元で描かれた放物線などを想像しがちだが、
このパラメータ空間は、数万次元に及ぶものもあるという広大なもの。
つまり、グラフが描けないのだ。
じゃあ、どうするかというと、
まずその関数上のある点を任意に選んでみる(*4)。
その点が最小値かどうかってどうすればわかるだろう?
そのために、ちょっとあたりを見回してみるのだ(グラフ全体ではない。だって描けないんだから。)
たまたま左のほうを見ると、少しだけ値が小さくなっていたとする。
ここより小さい値があるのだから、ここは最小値ではない!
じゃあ、少し左に移ってみよう。
そしたらそこでまたおんなじことを繰り返す。
なんども繰り返し、
値が変わらなかったり、大きくなっていたら、そこで終了。
多分、そこが求める最小値だ。
この方法を勾配降下法という。
大事なのは
ちょっとあたりを見回すところ。
どちらの方向に行けば値が小さくなるのかを知りたいだけなので、
数学的には「偏微分」を使えるのだ。
これでプログラムを組めば自動化できる!
ただ、ここでやっかいな問題がひとつ。
少し左に移ってみるときの「少し」を「学習率(learning rate)」といい、
これは人の手で決めなければいけないのだ(*5)。
これがあるために完全自動化とは違う(ちょっとがっかり)。
で、実際には、
データ全部でやると大変なので、
訓練データの中から少しだけランダムに選んだもので計算を行う。
これを「ミニバッチ学習」といい、
この方法で行う勾配降下を、
「確率的勾配降下法(SGD : Stochastic Gradient Descent)」(*6)と呼ぶ。
まあ、テレビの視聴率みたいなことをしていると思えばいい。
駆け足で理解できたことだけを書いた。
コードの実装の話とかは、また次回(いつになるかわからんけど)。