バッチ勾配降下法(最急降下法)
バッチ勾配降下法は、関数の傾き、すなわち 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 個のデータを取り出して、損失を計算している。このときに取り出した個数をバッチサイズという。