勾配法の仕組みを具体例でわかりやすく解説

 2019/04/23    ニューラルネットワーク    

ニューラルネットワークは適切な重みを設定することで認識精度を高めます。

今回は適切な重みを求めるために用いる勾配法というアルゴリズムを解説します。

ニューラルネットワークではこの勾配法を改良したAdam,Momentumといったアルゴリズムが使用されます。

数値微分について理解したうえでこの記事を読むと理解がすんなりといくでしょう。

勾配法

ニューラルネットワークで最適な重みを求める必要があります。「最適な重み」とは損失関数を最小にする重みを指します。損失関数の値を最小にするということは、最も予測誤差が少ないということですね。

では、どのように損失関数の値を最小にする重みを求めるのでしょうか。

勾配法を用いるのが一般的です。この勾配法は最小値や最大値を求めるためのアルゴリズムで、解析的に解くことが困難な問題に用いられるます。「解析的に解けない」とは、ある関数に対してうまく微分ができない状態を指すと考えるとよいでしょう。

では、勾配法についての理解を深めていきましょう。

勾配法の仕組み

勾配法は関数を最小にするような変数の値を求めます。

例えば関数\( f(x) \)を最小にする\( x \)の値であったり、関数\( g(x,y,z) \)を最小にする\( x, y, z \)の値の組み合わせを求めます。

勾配法は傾きが0となる地点\( x \)が関数の最小、最大値を与えるという考えに基づいた手法です。これは微分法の考えに似ています。微分法では傾きが0となる地点で最小、最大値、極小、極大値などをとっていましたね。

勾配法では以下の作業を繰り返して、傾きが0となる最適な\( x \)を求めます。勾配法では傾きを求めるために数値微分を用います。数値微分を用いることで解析的に解けない関数の傾きを強引に求めます。

 

1 初期探索地点\( x \)を定める。

2 ある地点\( x \)での傾きを求める。

3 傾きと学習率をもとに次の探索地点\( x' \)を求める。

4 2~3の更新を傾きが0となる\( x \)が見つかるまで繰り返す。

勾配法の利用と学習率

勾配法について一変数関数の最小値問題を例に考えてみましょう。

今回は\( y = x^2 + 1 \)という関数について勾配法を用いて最小値を与える\( x \)を求めます。以下に\( y = x^2 + 1 \)のグラフを描きました。

この関数を最小にする\( x \)は微分を用いると\( y' = 2x \)より\( x = 0 \)の時に最小値をとると分かります。

勾配法を用いるとどのように求まるのでしょうか。

勾配法では以下の作業を繰り返して最適な\( x \) を求めます。

 

1 初期地点\( x \)を決める。

2 ある\( x \)においての傾きを求める。

3 新たに探索する\( x' \)を傾きと学習率\( \eta \)を用いて求める。これを更新と呼ぶ。更新は以下のように表されます。

\( \ \ \ x' = x - \eta \frac{ \partial f }{ \partial x } \)

4 傾きが0となる\( x \)を見つけるまで2~3の更新を繰り返す。

 

今回は\( y = x^2 + 1 \)について勾配法を用いて、\( y \)を最小とするような\( x \)を求めます。

\( x_0 = 2 \)から更新してみましょう。学習率\( \eta \)は0.25、\( f'(x) = 2x \)です。

 

\( x_1 = x_0 - \eta f'(x_0) = 1\)

\( x_2 = x_1 - \eta f'(x_1) = 0.5 \)

\( x_3 = x_2 - \eta f'(x_2) = 0.25 \)

\( x_4 = x_3 - \eta f'(x_3) = 0.125 \)

 

勾配法による更新を続けるとゆっくり\( x = 0 \)に近づくのが見て取れます。更新を続けると\( x = 0 \)と求まります。

初期値を\( x_0 = 2 \)としました。この初期値は自由に定めることができます。

学習率を0.25としました。この学習率の値によって学習速度が変化します。

学習率\( \eta \)が学習速度にどう影響するかを以下のグラフを見て観察してみましょう。

左から順に\( \eta = 0.01,\eta = 0.1,\eta = 0.2\)とします。学習率が小さすぎると学習に時間がかかります。また、学習率が大きすぎると最適な値を求めるのにかえって時間がかかっています。

勾配法の一般化

今までは一変数関数について勾配法を用いていました。

変数が増えても勾配法を使うことができます。\( n \)個の変数を持つ関数についても勾配法を用いることができます。

 

\( n \)個の変数を\( x_1, \ldots, x_n \)とする。

 

1 初期探索地点\( x = (x_1,\ldots, x_n) \) を定める。

2 \( x = (x_1,\ldots, x_n) \)における勾配を求める。

3 新たに探索する\( x' = (x'_1,\ldots, x'_n) \)を傾きと学習率\( \eta \)を用いて求める。更新は以下のように表されます。

\( \ \ \ (x'_1, \ldots , x'_n )=x_1 - \eta \frac{ \partial f }{ \partial x_1 } , \ldots , x_n - \eta \frac{ \partial f }{ \partial x_n } \)

4 勾配が0となる\( x \)を見つけるまで2~3の更新を繰り返す。

 

勾配の要素がすべて0となるまで更新を続けます。最終的に\( x_{final} = (x_1, \ldots, x_n) \)が最適な値として求まります。

まとめ

今回は勾配法について説明しました。勾配法は解析的に解くのが困難な時に有効なアルゴリズムで、最適化問題などに用いられます。

勾配法は学習に時間がかかる、勾配が0になる極小値で更新がストップしてしまうなどの欠点があります。特に勾配が0になる極小値で更新が停滞する現象は勾配消失と呼ばれます。

これらの欠陥を補うためにAdam,Momentumといった様々な改良手法が開発されています。

更新を繰り返す前に初期値を設定する必要がありますが、初期値はランダム、あるいは特定の値に指定することができます。

  • 人気の投稿とページ

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です