6−4.ニューラルネットワークの秘密を解く!ー「確率的勾配降下法」のしくみ!

AI学習ダイアリー
探しているのは、最小値!
ゼロから作るDeep Learning 』読書ノート(現在進行形)
0章「まえがき」
1章「Python入門」
2章「パーセプトロン」
3章「ニューラルネットワーク」
4章「ニューラルネットワークの学習」(今回はここ!)

この章では、

なんでニューラルネットワークでは、重みパラメータ(*1)自動で獲得されるのか?

ついに、その謎が明かされる。

*1 パラメータ(parameter):処理結果に影響を与える外部から投入される変動要素。簡単に言えば、外から入ってくる値。関数では引数。

謎解きのしくみは、

訓練データ(*2)から最適な重みパラメータの値を自動的に獲得することを「学習」といい、
そのめじるし(指標)として損失関数(*3)が使われる。
損失とは「性能の悪さ」で、この最小値がベストな(最適な)重みパラメータということになる。

って、まあすごいシンプルな話だった。

*2 データを訓練データとテストデータに分け、まず訓練データで学習し、テストデータでそれを評価する。
*3 損失関数の主なものは2つ。最も有名なのが「2乗和誤差」。それと並びよく使われるのが「交差エントロピー誤差」。ただ、式に対数(log)があってちょっと怖そう(個人的意見)。

ただ知りたいのは、その最小値を自動で求める方法だ。

でも、損失関数って関数というくらいだから、最小値なんかグラフ描けばすぐわかるじゃん!

ど素人の私は瞬間的にそう思ったが、そう簡単にはいかないのだ。
関数のグラフといえば一次元で描かれた放物線などを想像しがちだが、
このパラメータ空間は、数万次元に及ぶものもあるという広大なもの。
つまり、グラフが描けないのだ。

じゃあ、どうするかというと、
まずその関数上のある点を任意に選んでみる(*4)

その点が最小値かどうかってどうすればわかるだろう?

そのために、ちょっとあたりを見回してみるのだ(グラフ全体ではない。だって描けないんだから。)

たまたま左のほうを見ると、少しだけ値が小さくなっていたとする。
ここより小さい値があるのだから、ここは最小値ではない!
じゃあ、少し左に移ってみよう

「うわぁ、これ降りるの?」って言ってる(多分)

そしたらそこでまたおんなじことを繰り返す
なんども繰り返し、
値が変わらなかったり、大きくなっていたら、そこで終了。
多分、そこが求める最小値だ。

この方法を勾配降下法という。

大事なのは
ちょっとあたりを見回すところ。
どちらの方向に行けば値が小さくなるのかを知りたいだけなので、
数学的には「偏微分」を使えるのだ。

これでプログラムを組めば自動化できる!

ただ、ここでやっかいな問題がひとつ。

少し左に移ってみるときの「少し」を「学習率(learning rate)」といい、
これは人の手で決めなければいけないのだ(*5)
これがあるために完全自動化とは違う(ちょっとがっかり)。

で、実際には、
データ全部でやると大変なので、
訓練データの中から少しだけランダムに選んだもので計算を行う。

これを「ミニバッチ学習」といい、
この方法で行う勾配降下を、
確率的勾配降下法(SGD : Stochastic Gradient Descent)」(*6)と呼ぶ。
まあ、テレビの視聴率みたいなことをしていると思えばいい。

駆け足で理解できたことだけを書いた。
コードの実装の話とかは、また次回(いつになるかわからんけど)。

*4 この値を「重みの初期値」といい、重要なポイントだ。これは6章で解説。
*5 学習率のように自動決定しない(人の手で設定する)パラメータをハイパーパラメータという。
*6 SGDは上で見たようにすごく単純な方法で、これよりスマートな方法がある。これも6章で!

Follow me!