スラきちの野望

技術系で紹介したいこととか、遊んだゲームなどを載せていくブログです。

勾配降下法って?

こんにちは( ^ω^)

何番煎じかわかりませんが、
ニューラルネットワークの学習などに使われる
「勾配降下法」というアルゴリズムについて簡単にまとめてみました。


勾配降下法とは

例えば、とある2次関数(y=ax^2+bx+c)の最小値をもとめるという問題があるとします。
この問題はこの関数が下に凸であった場合、頂点をもとめることで解析的に解くことができます。

しかし、関数の次元が増えたりして複雑になると解析的に解くことは難しくなります。
そこで関数の最小値をもとめる行為(最適化)を勾配を使ってやってみようというものが勾配降下法といわれるものになります。

具体的に勾配を使ってどう解くのかを簡単な例で示してみます。

f:id:CAPsp:20170925180931p:plain

これはy=x^2のグラフです。
最小値はx=0となるところです。

この関数の傾き(勾配)は2xとなります。
勾配は簡単に言えばグラフの傾斜の度合いを表す数値なので、 適当なxを選びそこから傾斜に沿ってグラフを下っていくように動けばなんとなく最小のxに辿り着けそうな気がします。

この考えを実際の式に置き換えてみます。

x^{t+1}=x^t - \eta 2x    (1)

\etaというのはどの程度動くのかを表す定数です。
これが小さすぎると最小値にたどり着くのが遅くなり、逆に大きすぎると最小値付近で右往左往することになります。

この手法の手順をまとめると、
1. 適当なxをとる
2. 値がある程度収束するまで(1)の式を使ってxを更新する

となります。

この手法は最急降下法と呼び、勾配を用いる最適化アルゴリズムの代表的なものです。

実際にx^0=10\eta=0.05とおき、100回ほどxの値を更新をしたときの経過は以下のようになります。

f:id:CAPsp:20170925180933g:plain

赤い点はその時のxと対応するyの値をプロットしたものです。
徐々に最小値に近づいているのが見て取れると思います。

勾配降下法は勾配さえ計算できれば、次元数が増えたとしても適用できます。

ニューラルネットワークで扱う場合、そのときのネットワークの出力と教師解にどれほどの差があるのかを表現する誤差関数というものを導入し、この誤差関数の出力を勾配降下法を使って最小に近づけることで学習を表現しています。