勾配法の意味と使い方

勾配法の目的や、具体的な例題を解説します。

なお、ここでの勾配法とは、もっぱら最急降下法のことを指します。

勾配法について

勾配法の目的

quadratic_function

二次関数$f(x)=x^2$を思い浮かべてください。 曲線の形をしていて、曲線が一番低くなっているところ、すなわち最小値が存在します。

その最小値を自動的に求めるアルゴリズムが、勾配法です。

この例では、$x=0$が最小値だと直感的に求めることができるので、 勾配法のありがたみが薄いです。

しかし、勾配法はより複雑な関数にも対応しています。 \[ f(x) = x^3 + 2x^2 + x +1 \] といった三次関数や、さらにもっともっと複雑で、人間にはイメージできない形の関数であっても、 勾配法を使えば最小値を求めることができます。

勾配法の使用例

まずは関数$f(x)=x^2$の最小値を勾配法で求める流れを見ていきましょう。

初期値を決める

初期値として$x=4$を置きます。 この初期値はランダムでかまわないのですが、ここでは4とします。

初期値とはなんの初期値なのでしょうか? それは、最小値候補の初期値です。

勾配法は最小値の候補値をどんどん更新して、 最終的にもっとも最小値としてふさわしい候補値を得るアルゴリズムです。

なので、最初は暫定的な候補値を置いておきます。 $x=4$が$f(x)=x^2$の最小値ではないのは、わかりきっていることですが、ひとまずはここが最小値の候補値です。

quadratic_init

上の図の赤い点が、現在の最小値の候補値です。

これをどんどん真の最小値$x=0$に近づけていきます。

最小値の候補値を更新する

候補値の点について、$f(x)=x^2$の傾きを求めます。

傾きを求めるには微分を行います。 \begin{align} \frac{d}{dx}f(x) &= \frac{d}{dx} x^2 \\ &= 2x \end{align} 微分で得た導関数を、図面にプロットしてみましょう。

quadratic_derivative

緑の直線が、$f(x)=x^2$の導関数、$f'(x)=2x$です。

この直線が0になる値が最小値(極小値)というのは 高校数学の微分でよく知られている話で、 実際に$f'(x)=2x=0$という方程式を解くと、$x=0$と最小値が得られます。

しかしここでは、勾配法のアプローチで解いていきましょう。

勾配法では、この導関数の最小値候補における値、 すなわち$x=4$での値$f'(4)=8$を用いて、最小値候補を更新します。

更新式は \begin{align} x_{new} = x - \alpha f'(x) \end{align} です。αは学習係数と呼ばれる値で、ひとまず$\alpha=0.1$としておきます。

実際に値を代入してみましょう。 \begin{align} x_{new} &= x - \alpha \times f'(x) \\ &= 4 - 0.1 \times 8 \\ &= 3.2 \end{align} これで新しい最小値の候補は$x=3.2$となりました。

quadratic_pred1

もともとの候補値$x=4$と比べると、新しい候補値$x=3.2$は真の最小値$x=0$に近づいていることがわかります。

それでは、この手順を何回か繰り返してみましょう。

次は$x=3.2$が更新前の候補値になります。 導関数上の値は$f'(3.2)=6.4$なので、 \begin{align} x_{new} &= x - \alpha \times f'(x) \\ &= 3.2 - 0.1 \times 6.4 \\ &= 2.56 \end{align} 今度の新たな候補値は$x=2.56$となります。

quadratic_pred2

次の更新では、同様に、 \begin{align} x_{new} &= x - \alpha \times f'(x) \\ &= 2.56 - 0.1 \times 5.12 \\ &= 2.048 \end{align} となります。

quadratic_pred3

上の図を見ると、だんだん候補値の間隔が狭くなってきているのがわかります。

更新値は$f'(x)$に依存しているので、$f'(x)$が少なくなればなるほど、 更新値も少なくなっていきます。

$f'(x)$は0に近づいていくので、どんどん更新値も0に近づいていき、 やがて候補値は更新されなくなります。

累計で20回更新すると、以下のような候補値になります。

quadratic_pred4

20回更新したときの最小値候補は、$x=0.0461...$という値になります。

だいぶ0に近づきました。この繰り返しを何度も繰り返すことで、 より0に近い値を得られます。

このようにして最小値を求めるのが、勾配法のアプローチです。

具体的な使用例がわかったところで、アルゴリズムの説明に入りましょう。

勾配法の考え方

これまでに勾配法の使い方を実演しました。 それでは、勾配法の考え方とはどのようなものなのか、説明していきます。

みなさんは、登山の経験があるでしょうか。 山の頂上を目指して少しずつ歩いて行く・・・という、ごく普通の登山です。 このとき、一本道の登山道が整備されていればいいのですが、そうでない場合は、 自分で進むべき方向を決める必要があります。 いったいどのようにして歩く向きを決めるのでしょうか。

それには、勾配を求めればよいのです。 現在地の傾きを求めることで、どちらが山頂の方向なのかがわかりますね。 あとはその方向に向かって歩けば、山頂を目指すことができます。

しかし、山の地形は綺麗な三角錐ではありません。 ところどころ隆起したり陥没したりで、しばらく進むと傾きが大きく変わってしまいます。 傾きが変われば目指す向き、山頂への方角も変わるので、定期的に方向修正を行います。

どうでしょうか。これが勾配法のアプローチです。 勾配法も山登りも、傾きを調べて傾斜のある方向へと進む、この動作の繰り返しです。

勾配法の手順のまとめ

勾配法の手順をまとめてみましょう。