2変数での勾配法

1変数での方法を応用することで、2変数でも勾配法を実行できます。

ここでは簡単な例として、2変数の二次関数の場合で考えます。

2変数関数の性質

2変数二次関数とは

quadratic_function

2変数の二次関数$f(x, y)=x^2+y^2$を思い浮かべてください。 新幹線の先頭のような、立体的なV字形をしています。

勾配法によってこの先端の値を求めてみるのが、本ページの目的です。 しかしまずは、2変数関数の性質をおさらいしてみましょう。

2変数関数とは、2つの1変数関数を直角に重ねた形をしています。 $z=x^2$と$z=y^2$というふたつの二次関数を、 原点でクロスするように重ねてみてください。

quadratic_function_axis

このワイヤーフレームのようなものが、$z=x^2$と$z=y^2$の成分です。 x, y, zの3次元空間の中に、直角に交わるx軸とy軸があるということが、 感覚的に理解できたことでしょう。

$f(x)=x^2+y^2$とは、 このワイヤーフレームに肉付けをするイメージです。

2変数での勾配法の使用例

2変数での勾配法は、偏微分で実現できます。 偏微分を用いれば2変数の関数を1変数と見做すことができるので、 それによって各変数に対して順番に1変数の勾配法を行います。

肝心なのは、2本のワイヤーフレームがあり、 そのそれぞれに対して1変数の勾配法を実行していく、 という考えを持つことです。

$z=x^2$のワイヤーはx軸に沿って$z=x^2$の最小値へと落ちていき、 $z=y^2$のワイヤーはx軸に沿って$z=y^2$の最小値へと落ちていく。 両方が最小値に落ちれば、そこが$z=x^2+y^2$の最小値です。

初期値を決める

初期値として$(x, y)=(-2, 2)$を置きます。

1変数の場合と同じように、最初に暫定的な候補値を置いておきます。

quadratic_init

上の図の赤い点が、現在の最小値の候補値です。 ただこれだと、少し見づらいので、ワイヤーフレームの形にしましょう。 (無論のこと、実際には、肉付けがされています。)

quadratic_init_axis

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

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

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

それぞれの成分(ワイヤーフレーム)の傾きを求めるには偏微分を行います。 \begin{align} \frac{d}{dx}f(x, y) &= \frac{d}{dx} (x^2 + y^2) \\ &= 2x \end{align} \begin{align} \frac{d}{dy}f(x, y) &= \frac{d}{dy} (x^2 + y^2) \\ &= 2y \end{align} 偏微分で得た導関数を、図面にプロットしてみましょう。

quadratic_derivative_x quadratic_derivative_y

緑の平面が、$f(x)=x^2+y^2$の偏導関数、 $f'(x)=2x$と$f'(x)=2y$です。

この平面が0になる値を目指して、最小値候補を更新していきます。

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

実際に値を代入してみましょう。 \begin{align} x_{new} &= x - \alpha \times f'(x) \\ &= -2 - 0.1 \times (-4) \\ &= -1.6 \end{align} \begin{align} y_{new} &= y - \alpha \times f'(x) \\ &= 2 - 0.1 \times 4 \\ &= 1.6 \end{align} これで新しい最小値の候補は$(x, y)=(-1.6, 1.6)$となりました。 高さは$z=x^2+y^2=5.12$です。

quadratic_pred1

もともとの候補値$(x, y)=(-2, 2)$と比べると、新しい候補値$(x, y)=(-1.6, 1.6)$は真の最小値$(x, y)=(0, 0)$に近づいていることがわかります。

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

次は$(x, y)=(-1.6, 1.6)$が更新前の候補値になります。 \begin{align} x_{new} &= x - \alpha \times f'(x) \\ &= -1.6 - 0.1 \times (-3.2) \\ &= -1.28 \end{align} \begin{align} y_{new} &= y - \alpha \times f'(x) \\ &= 1.6 - 0.1 \times 3.2 \\ &= 1.28 \end{align} 今度の新たな候補値は$(x, y)=(-1.28, 1.28)$となります。

quadratic_pred2

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

quadratic_pred3

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

更新値は偏導関数(緑の平面)に依存しているので、偏導関数が少なくなればなるほど、 更新値も少なくなっていきます。

偏導関数は0に近づいていくので、どんどん更新値も0に近づいていき、 やがて候補値は更新されなくなります。

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

quadratic_pred4

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

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

このようにして、2変数でも勾配法が使えることを確認しました。

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