ニューラルネットワークを理解する #6 「勾配降下法」

今回は勾配降下法についてです。

最後の難関ですねー。

ニューラルネットワークの理解に必要な4つの要素の内の4つ目です。

  1. パーセプトロン(人口ニューロン) ✅
  2. 活性化関数 
  3. 損失関数 
  4. 勾配降下法 ← こいつだ

最適なパラメータを見つけるにはどうする?

前回までの復習となりますが、最適なパラメータとは損失関数が最小になるものです。
ですが、どうやって探していけばいいのか?
ランダムに値を試すのはさすがに効率が悪い。。
というところで出てくるのが勾配法というものです。

勾配とは何か

勾配とは
  • 全ての変数の偏微分をベクトルとしてまとめたもの
です。
よく分からないですね。。(ひとつづつ見ていこう)

偏微分とは
  • 複数の変数からなる関数を微分したもの(a^2 + b^2 = f(a,b) とか)
です。

微分は高校でやりましたね。
  • 微分とは限りなく小さい間の変化量

まとめると勾配とは
  • 複数の変数からなる関数の小さな変化量をベクトルとしてまとめたもの
となります。

これだけ聞いてもなんのこっちゃと思うと思いますが、勾配は関数の値を減らす方向を示すのです!(てことは…)

実際に図示したものを見るとわかりやすいです。

これは2次元のグラフですが、微分とは限りなく小さな間の変化量と話しましたが、つまり小さい間の傾きを表しています。
その傾きの方向に向かうと、一番下までつくことができる。(傾きを確かめながら坂を下るようなもんですね)


勾配法とは何か

損失関数の最小値を探すために勾配を用いたのが勾配法となります。
例えば2変数の関数の場合は以下のように求める。

なんかよく分からないηは学習率と呼ばれる、パラメータの値をどれだけ更新するのかを設定するものです。
∂f / ∂x0 はx0について偏微分した値で∂f / ∂x1 も同様にx1について偏微分した値です。
勾配法ではこれを複数回繰り返して入力を更新していきます。

まだ聞いただけだとわからんと思うので、実際の問題を解いてその過程を見ていこう。

以下の問題を解いてみよう!

  • f(x0,x1)=x0^2 +x1^2 の最小値を勾配法で求める
  • 初期値=(-3.0, 4.0), 学習率=0.1, step=3

Step1

偏微分の計算
x0について微分すると ∂f / ∂x0 = 2 * x0
x1について微分すると ∂f / ∂x1 = 2 * x1

∂f / ∂x0 = -6.0
∂f / ∂x1 = 8.0

x0=-3.0 - (0.1 * -6.0) = -2.4
x1=4.0 - (0.1 * 8.0) = 3.2

Step2

偏微分の計算
∂f / ∂x0 = -2.4 * 2 = -4.8
∂f / ∂x1 = 3.2 * 2 = 6.4

x0=-2.4 - (0.1 * -4.8) = -1.92
x1=3.2 - (0.1 * 6.4) = 2.56

Step3

偏微分の計算
∂f / ∂x0 = -1.92 * 2 = -3.84
∂f / ∂x1 = 2.56 * 2 = 5.12

x0=-1.92 - (0.1 * -3.84) = -1.536
x1=2.56 - (0.1 * 5.12) = 2.048

以上。
とっても簡単ですね。
確かに最小値(0,0)に近づいています。

これで最適解が見つかる?

本当にこんなんで見つけれるのかと思った方は鋭いやつです。
変数が増えるほどパラメータ空間は複雑になり、最小となる値を見つけるのは困難となります。
以下の画像のように局所解になってしまうことが多いでしょう。

これを解決するために勾配法以外にもさまざまパラメータの更新方法が考案されています。
その話はまた今度するかもしれないししないかもしれません。

今回はここまで。
次回でついにニューラルネットワークなるものを作成してみましょう!

コメント