勾配降下法

バッチ勾配降下法(最急降下法)

バッチ勾配降下法は、関数の傾き、すなわち 1 次導関数に着目して最小値を求める方法である。バッチ勾配降下法を説明するために、簡単な線形予測モデルを考える。このモデルを、説明変数(特徴量) x にあるパラメーター w をかけることによって、目的変数 y を予測するモデルと仮定する。ここでモデルを簡単にするために、定数を考えない。

\[ y = wx \]

予測性能のよいモデルとは、予測値と真の値の誤差を最小にするモデルである。つまり、学習データ x1, ..., xn をこのモデルに代入して予測した \(\hat{y_{1}}, \cdots, \hat{y_{n}} \) は、実際の真の値である y1, ..., yn との差がもっとも小さくなるようなモデルである。ここで、予測値と真の値の平均二乗誤差を損失関数 L として定義する。このとき、損失関数 L は次のようにかける。

\[ L = \frac{1}{n}\sum_{i=1}^{n}\left(y_{i} - \hat{y_{i}}\right)^{2} = \frac{1}{n}\sum_{i=1}^{n}\left(y_{i} - wx_{i}\right)^{2} \]

学習データは変わることはないので、損失関数 L を最小にするためには、パラメーター w の値を変えればいい。ここで、まずランダムに 1 つの値 w(0) を選び、これを w の値とする。w = w(0) が決まると、損失関数 L の値も決まる。w = w(0) のとき、L(w(0)) の値が最小値かどうかを調べるためには、損失関数 L を w = w(0) の位置で微分して、その 1 次導関数を調べればいい。損失関数は w についての下に凸の 2 次関数となっている。そのため、1 次導関数 L'(w(0)) < 0 ならば、w(0) は最小値を与える w の左側にあり、L'(w(0)) > 0 ならば、w(0) は最小値を与える w の右側にあることがわかる。仮に、L'(w(0)) < 0 ならば、w(0) を少しだけ右側に移動した値を w(1) として、w = w(1) としてもう一度損失関数の 1 導関数を調べればいい。この操作を十分な回数を繰り返すことで、損失関数 L の 1 次導関数が 0 となるような w が見つかる。

勾配降下法

損失関数 L の 1 次導関数 L' が 0 でないとき、w の値を L' の符号に応じて、少しだけ右に動かしたり、または少しだけ左に動かしたりすることで、最適な w に近づける。この作業を学習という。実際にどれだけ学習するかは、様々な方法が提案されている。最も基本的な方法としては、次のように学習する。このとき、η (0 < η < 1) を学習率と呼ぶ。

\[ w^{(j+1)} = w^{(j)} - \left . \eta \frac{dL}{dw} \right\rvert_{w=w^{(j)}} \]

問題点

上で見たバッチ勾配降下法では、すべての学習データを利用して損失(誤差)を算出している。そのため、学習データが大量にある場合は、それらをすべてメモリ上に読み込む必要がある。また、パラメーターを更新するたびに、すべてのデータに対して損失を計算し直す必要がある。このようにバッチ勾配降下法は、計算リソースと計算コストを非常にかかるアルゴリズムとなっている。また、学習データが新しく追加されたときは、古い学習データと新しい学習データをまとめて、もう一度はじめから学習させ必要がある。

また、バッチ勾配降下法には、初期値依存問題がある。モデルに含まれるパラメーターが 1 つだけの場合は、上の図のように損失関数はパラメーターの 2 次関数となる。このとき、損失関数の 1 次導関数が 0 になる点は、極小値かつ最小値である。この場合は、損失関数の最小値を正確に見つけることができる。しかし、パラメーターが複数ある場合、損失関数の形は、複数のパラメーターによって支配され、複雑な形になる。中には、複数の極小値を持つような損失関数も存在する。このとき、パラメーターの初期値と学習率の決め方によって、最小値(最適解)ではなく、極小値(局所最適解)に辿り着く場合がある。そして、一度でも局所最適解に辿り着くと、損失関数 L の 1 次導関数が 0 になり、それ以降学習しなくなる。このため、バッチ勾配降下法は(確率的勾配降下法)に比べて、局所最適解に陥りやすいと言われている。

勾配降下法では、初期値と学習率によって最小値ではなく極小値に収束してしまう恐れがある。

確率的勾配降下法

確率的勾配降下法は、学習データの中からランダムに 1 セット(例えば、(xp, yp))だけを取り出して損失を計算している。これにより、すべてのデータをメモリ上に読み込む必要がなく、一度に 1 セットのデータでしか損失を計算しないので、最急降下法に比べて必要な計算リソースは少なく、計算速度が速い。また、確率的勾配降下法では、(損失を計算するときに、すべてのデータを用いているわけではないので、)学習データが新しく追加されたとき、追加されたデータのみに対して再学習されるだけで十分である。

確率的勾配降下法は、最急降下法に比べて局所最適解に収束する可能性は少ない。例えば、j 回目の学習において、学習データの p 番目のセット (xp, yp) を使って損失を計算したとき、その損失が損失関数の局所最適解であったとする。このとき、損失関数 L の 1 次導関数は 0 になり、w (j+1) は次のように更新される(つまり、更新されていない)。

\[ w^{(j+1)} = w^{(j)} - \left . \eta \frac{dL}{dw} \right\rvert_{w=w^{(j)}} = w^{(j)} \]

しかし、次にもう一度学習させるとき、学習データの中から s (≠ p) 番目のセットが選ばれたとする。s 番目の学習データセットを使ったとき、損失関数の 1 次導関数が 0 になるとは限らない。このため、学習が再び進むようになる。

ミニバッチ勾配降下法

深層学習などでは、ミニバッチ勾配降下法を使用している。確率的勾配降下法では、損失を計算するのに、学習データのうち 1 セットのデータだけを使っている。これに対して、ミニバッチ確率的勾配降下法では、学習データの中からランダムに b 個のデータを取り出して、損失を計算している。このときに取り出した個数をバッチサイズという。