#最急降下法とは
最急降下法とは、目的関数Jを最小化するアルゴリズムです。線形回帰だけではな
く色々な機械学習のモデルで使うことが出来ます。
例えば、以前の記事「線形回帰・最小二乗法について、と、その具体例」で導入した誤差二乗の関数も目的関数の1つでした。
変数が1つだけの時は横軸に変数、縦軸に目的関数Jをとり点をプロットするなどして比較的簡単に最適解を求めることが出来ましたが、パラメータが2つ、3つ・・・と増えていけば最適解を求めることは容易ではなくなります。そこで、最急降下法という方法を使います。
※誤差二乗、変数が1つの時の話は「線形回帰・最小二乗法について、と、その具体例」(https://qiita.com/aogyt/items/94b0b503a1b5bb5d3485 )で説明しています。
#視覚的なイメージ
最急降下法は関数の最小値を求める方法ということですが、具体的にはどのような方法なのでしょうか?
この図は目的関数とパラメータの関係を表しています。横軸、縦軸に1つずつパラメータが割り当てられ、高さで目的関数の値を表しています。つまり赤い所は目的関数の値は大きく、青い所に行けば行くほど目的関数の値が小さくなる、つまり最適化されるということです。
もちろんこのような立体的な図は見やすいのですが、毎回書くのは大変なので下のような等高線図というものを用いるときもあります。
地図と同じように同じ高さの所を線で結んだ図です。ここでも先ほどの立体的な図と同じように真ん中の青い部分に行くにつれて目的関数の値は小さくなっていきます。この記事ではこの等高線図を主に使うことにします。
あなたが☆の所にいるとします。そしてなるべく低い所に行きたい、そういう場合にはどうすれば良いでしょうか?多分あなたはこのように傾きが一番急な坂を下るでしょう。
そしてある程度下ったところでまた一番急な坂を探して下る。
これを繰り返していけばいつか一番低い所にたどりつくような気がします。確かにこれで最小値にたどり着くときもあります。しかし、たどり着かないときもあります。
例えばこのような目的関数の時です。もし左の方から下り始めたら左の青い穴にたどり着くでしょう。しかしもし右の方から下り始めたら右側の穴にたどりつきそうです。どちらかが最小値の場合、もう片方の場合は最小値にたどり着かないことになります。実は、これは最急降下法の欠点でもあります。ですから複数の地点から下り始めるなどの対策が必要であると言われています。
関数全体の最小値を大域的最小値、ある部分だけを見た時の最小値(図の青い穴でいちばん低い所)のことを局所的最小値といいます。
#勾配
ここまでの説明から、最急降下法というのは一番急な坂を下る方法であるということがお分かり頂けたかと思います。では、一番急な方向はどのように見つけるのでしょうか?そこで使うのが勾配です。
勾配とは各点の値の変化率が最も大きくなる方向への変化率の値を大きさにもち、ベクトルを対応させるベクトル場のことです。
具体例を見てみましょう。
※なぜ偏微分によって表された勾配grad f の向きがfが最も急激に増加する方向か、という証明は割愛します。
#最急降下法
これで必要な準備は整いましたので、最急降下法の具体的な方法について見てみましょう。
(xの右肩にある数字は累乗やn回微分の意味ではなく、何番目のデータセットかを表しています)
一見複雑に見えるかもしれませんが、仕組みはとてもシンプルです。grad fがfの最も増加する向きを持ちます。それに負のある数を掛けることによって、今いる位置からそのfが最も減少する方向に進んでいくことになります。
###学習係数
勾配の係数αは学習率と呼ばれ、1回にどのくらい下るかを決める非常に重要な値です。大きすぎると局所的最小値にたどり着かなかったり、発散してしまったりします。一方小さすぎると局所的最小値にたどり着くまでに時間がかかりすぎてしまいます。