• トップ
  • ブログ一覧
  • [パラメータ更新の基礎]機械学習における勾配と微分を理解する
  • [パラメータ更新の基礎]機械学習における勾配と微分を理解する

    広告メディア事業部広告メディア事業部
    2020.03.16

    IT技術

    勾配の計算から理解する、機械学習における微分の基礎

    機械学習のトレーニングには、「勾配降下法」や「誤差逆伝播法」などの、勾配計算プロセスを用います。

    そして、これらは微分を用いて計算されます。

    今回は、勾配計算の基礎を理解するため、「機械学習における勾配の仕組み」と「微分がどのように使われているか」を解説していこうと思います!

    実装環境

    まず、実装環境です!

    Colaboratory 上で、以下をインポートしています。

    1#実装環境
    2%matplotlib inline
    3import matplotlib.pyplot as plt
    4import numpy as np

    微分の基礎をふりかえる

    まず簡単に、微分の復習から始めましょう!

    公式を用いることで、微分の計算は比較的容易にできると思います。

    ですが、大事なのは「微分がどのような処理を行っているか?」を理解することです。

    微分は関数の瞬間的な傾きを求める処理

    微分では、変数の微小な変化を考え、それによって関数がどう変化するかを調べます。

    下の図は、「関数 f (x)」のグラフに対する微分を考えており、微分の過程を表した図なります。

    「変数 x」の変化量を「h」とすると、この間( x と x+h )を結ぶ直線の傾きを求めることができます。

    微分では、微小変化を考えたいので、「h」を限りなくゼロに近づけていきます。

    すると、「x」の点で接する接線の傾きを求めることができ、瞬間的な傾きという変化量を得ることができます。

    これを式にすると、以下のようになります。

    df(x)dx=limh0f(x+h)f(x)h \frac{df(x)}{dx}=\displaystyle\lim_{h\to0}\frac{f(x+h)-f(x)}{h}

    ここで、「h」を限りなくゼロに近づけることを、「極限」と呼び、「limlim」で表されます

    コンピュータ上では数値微分を用いる

    ですが実際には、コンピュータ上で限りなくゼロに近い変化を表すことが難しいです。

    そのため、下図のような中心差分を用いた数値微分により、計算されます。

    Pythonで実装してみる

    これを Python で実装すると、以下のようになります。

    1#数値微分の定義
    2def numerical_diff(f, x):
    3    h = 1e-4 #微小変化
    4    return (f(x + h) - f(x - h)) / (2 * h)

    計算してみる

    また、これを用いて計算します。

    1#関数を定義
    2def fun1(x):
    3    return x ** 3
    4
    5#x=10の時の数値微分
    6numerical_diff_10 = numerical_diff(fun1, 10)
    7print(numerical_diff_10)

    出力:300.00000000939053

    「関数f」の x=10 における、接線の傾きが計算されました!

    ちなみに、この値を傾きとする接線をプロットしたものが、上の図になっています。

    接線の描画コード

    1#接線の関数定義
    2def tangent_line(x, y, a):
    3    b = y - a * 10
    4    return a * x + b
    5
    6#描画(上の図では目盛りと目盛りラベルは消しています。)
    7fig = plt.figure(figsize=(6, 5), dpi=100, facecolor="w")
    8x = np.arange(0, 25, 0.1)
    9y = fun1(x)
    10y_tangent_line = tangent_line(x, fun1(10), numerical_diff_10)
    11
    12plt.plot(x, y, color="k")
    13plt.plot(x, y_tangent_line, color="lightseagreen")
    14plt.xlim([0, 20])
    15plt.ylim([-2000, 5000])
    16plt.xlabel('x')
    17plt.ylabel('f(x)')
    18plt.legend(["y = f(x)", "Tangent line"])
    19
    20plt.show()

    勾配とは

    機械学習では偏微分を用いる

    一般的に、世の中の問題において、1つの変数で結果が決まることは少ないでしょう。

    人工知能は、様々な「変数要因(多変数関数)」から分類を行ったり、結果を推測したりします。

    そのため、機械学習では「偏微分」が使用され、以下の式で表されます。

    xnf(x1,x2,...,xn)\frac{\partial}{\partial x_n}f(x_1,x_2,...,x_n)

    偏微分では、ある1つの変数にのみ注目し、その他の変数は定数として微分します。

    これによって、ある1つの変数が微小変化した時の、関数の接線の傾きを計算します。

    ある地点での関数の傾きが勾配

    以上のように、微分を用いて求められる関数の傾きを、一般的に「勾配(Gradient)」と言います。

    そして得られた勾配は、変数の増加に対して関数が増減する方向と量を意味しています。

    この事から、勾配は「関数を減らす方向を指すベクトル」として表されます。

    機械学習ではこれを利用し、目的関数を各パラメータで微分することで、目的関数の最小値を探します。

    勾配を用いた目的関数の最適化

    勾配によるパラメータ更新

    例えば「目的関数 L」に対して、「あるパラメータ w」で微分し、勾配が得られたとします。

    この時のパラメータ更新は、以下の式で表されます。

    w=wηfw w=w-\eta\frac{\partial f}{\partial w}

    「目的関数 L 」の「パラメータ w」による微分Lw \frac{\partial L}{\partial w} は、「w」を増加させるとLw \frac{\partial L}{\partial w} だけ増加すると言えます。

    そのため、減少させるには、元々の「w」からLw \frac{\partial L}{\partial w} を引くことで、減少方向への更新ができます。

    また、η \eta は「学習率(Learning rate)」と言い、勾配にかけることで、一回の学習でどの程度パラメータを更新するかを、調整するものです。

    学習率は、予め人の手によって設定する必要がある「ハイパーパラメータ」であり、最適値を様々な値で試しながら探す必要があります。

    勾配法による最適化

    パラメータの更新は、上記式を用いて「関数の最小値を示す勾配方向に向かって、関数の値を徐々に減らすよう」に行われます。

    この手法を「勾配法」と言います。

    機械学習の最適化プロセスでは、得られた勾配を用いて、上記の更新式でパラメータの値を更新します。

    さらに、更新した先でまた勾配を求め、同じようにパラメータを勾配方向へ更新していきます。

    これを繰り返すことで、以下の図のように、徐々に目的関数の最小値へと近づいていくのです。

    パラメータを更新していった結果、関数の最小値では傾き(勾配)はゼロとなります。

    つまり、その点が目標となるパラメータの値と言えます。

    このように、徐々に最小値に近づいていく更新処理を、「勾配降下法(Gradient Descent Method)」と呼びます。

    これは、機械学習(特にニューラルネットワークなど)の最適化問題においてよく使用されます。

    さいごに

    今回は、「勾配」と「微分」から、機械学習のパラメータ更新の仕組みについて解説しました。

    実践的には、「勾配降下法」よりも高速な「誤差逆伝播法」など、計算方法は色々あります。

    その導入の助けになればと思ってます!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事