
[パラメータ更新の基礎]機械学習における勾配と微分を理解する
2021.12.20
勾配の計算から理解する、機械学習における微分の基礎
機械学習のトレーニングには、「勾配降下法」や「誤差逆伝播法」などの、勾配計算プロセスを用います。
そして、これらは微分を用いて計算されます。
今回は、勾配計算の基礎を理解するため、「機械学習における勾配の仕組み」と「微分がどのように使われているか」を解説していこうと思います!
実装環境
まず、実装環境です!
Colaboratory 上で、以下をインポートしています。
1 2 3 4 5 | #実装環境 %matplotlib inline import matplotlib.pyplot as plt import numpy as np |
微分の基礎をふりかえる
まず簡単に、微分の復習から始めましょう!
公式を用いることで、微分の計算は比較的容易にできると思います。
ですが、大事なのは「微分がどのような処理を行っているか?」を理解することです。
微分は関数の瞬間的な傾きを求める処理
微分では、変数の微小な変化を考え、それによって関数がどう変化するかを調べます。
下の図は、「関数 f (x)」のグラフに対する微分を考えており、微分の過程を表した図なります。
「変数 x」の変化量を「h」とすると、この間( x と x+h )を結ぶ直線の傾きを求めることができます。
微分では、微小変化を考えたいので、「h」を限りなくゼロに近づけていきます。
すると、「x」の点で接する接線の傾きを求めることができ、瞬間的な傾きという変化量を得ることができます。
これを式にすると、以下のようになります。
$$ \frac{df(x)}{dx}=\displaystyle\lim_{h\to0}\frac{f(x+h)-f(x)}{h} $$
ここで、「h」を限りなくゼロに近づけることを、「極限」と呼び、「\(lim\)」で表されます。
コンピュータ上では数値微分を用いる
ですが実際には、コンピュータ上で限りなくゼロに近い変化を表すことが難しいです。
そのため、下図のような中心差分を用いた数値微分により、計算されます。
Pythonで実装してみる
これを Python で実装すると、以下のようになります。
1 2 3 4 | #数値微分の定義 def numerical_diff(f, x): h = 1e-4 #微小変化 return (f(x + h) - f(x - h)) / (2 * h) |
計算してみる
また、これを用いて計算します。
1 2 3 4 5 6 7 | #関数を定義 def fun1(x): return x ** 3 #x=10の時の数値微分 numerical_diff_10 = numerical_diff(fun1, 10) print(numerical_diff_10) |
出力:300.00000000939053
「関数f」の x=10 における、接線の傾きが計算されました!
ちなみに、この値を傾きとする接線をプロットしたものが、上の図になっています。
接線の描画コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #接線の関数定義 def tangent_line(x, y, a): b = y - a * 10 return a * x + b #描画(上の図では目盛りと目盛りラベルは消しています。) fig = plt.figure(figsize=(6, 5), dpi=100, facecolor="w") x = np.arange(0, 25, 0.1) y = fun1(x) y_tangent_line = tangent_line(x, fun1(10), numerical_diff_10) plt.plot(x, y, color="k") plt.plot(x, y_tangent_line, color="lightseagreen") plt.xlim([0, 20]) plt.ylim([-2000, 5000]) plt.xlabel('x') plt.ylabel('f(x)') plt.legend(["y = f(x)", "Tangent line"]) plt.show() |
勾配とは
機械学習では偏微分を用いる
一般的に、世の中の問題において、1つの変数で結果が決まることは少ないでしょう。
人工知能は、様々な「変数要因(多変数関数)」から分類を行ったり、結果を推測したりします。
そのため、機械学習では「偏微分」が使用され、以下の式で表されます。
$$\frac{\partial}{\partial x_n}f(x_1,x_2,...,x_n)$$
偏微分では、ある1つの変数にのみ注目し、その他の変数は定数として微分します。
これによって、ある1つの変数が微小変化した時の、関数の接線の傾きを計算します。
ある地点での関数の傾きが勾配
以上のように、微分を用いて求められる関数の傾きを、一般的に「勾配(Gradient)」と言います。
そして得られた勾配は、変数の増加に対して関数が増減する方向と量を意味しています。
この事から、勾配は「関数を減らす方向を指すベクトル」として表されます。
機械学習ではこれを利用し、目的関数を各パラメータで微分することで、目的関数の最小値を探します。
勾配を用いた目的関数の最適化
勾配によるパラメータ更新
例えば「目的関数 L」に対して、「あるパラメータ w」で微分し、勾配が得られたとします。
この時のパラメータ更新は、以下の式で表されます。
$$ w=w-\eta\frac{\partial f}{\partial w} $$
「目的関数 L 」の「パラメータ w」による微分\( \frac{\partial L}{\partial w} \)は、「w」を増加させると\( \frac{\partial L}{\partial w} \)だけ増加すると言えます。
そのため、減少させるには、元々の「w」から\( \frac{\partial L}{\partial w} \)を引くことで、減少方向への更新ができます。
また、\( \eta \)は「学習率(Learning rate)」と言い、勾配にかけることで、一回の学習でどの程度パラメータを更新するかを、調整するものです。
学習率は、予め人の手によって設定する必要がある「ハイパーパラメータ」であり、最適値を様々な値で試しながら探す必要があります。
勾配法による最適化
パラメータの更新は、上記式を用いて「関数の最小値を示す勾配方向に向かって、関数の値を徐々に減らすよう」に行われます。
この手法を「勾配法」と言います。
機械学習の最適化プロセスでは、得られた勾配を用いて、上記の更新式でパラメータの値を更新します。
さらに、更新した先でまた勾配を求め、同じようにパラメータを勾配方向へ更新していきます。
これを繰り返すことで、以下の図のように、徐々に目的関数の最小値へと近づいていくのです。
パラメータを更新していった結果、関数の最小値では傾き(勾配)はゼロとなります。
つまり、その点が目標となるパラメータの値と言えます。
このように、徐々に最小値に近づいていく更新処理を、「勾配降下法(Gradient Descent Method)」と呼びます。
これは、機械学習(特にニューラルネットワークなど)の最適化問題においてよく使用されます。
さいごに
今回は、「勾配」と「微分」から、機械学習のパラメータ更新の仕組みについて解説しました。
実践的には、「勾配降下法」よりも高速な「誤差逆伝播法」など、計算方法は色々あります。
その導入の助けになればと思ってます!
こちらの記事もオススメ!
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン
ITエンタメ7月 14, 2023【クリス・ワンストラス】GitHubが出来るまでとソフトウェアの未来