今回は極限と微分について、
「極限ってなに??」
「微分ってなに??」
「Pythonで微分を実装すると??」
などをまとめてみました。
この記事を書いている僕はシステムエンジニア6年目
普段はJavaでWebアプリを作ったりSQL書いたり・・・、
なので最近流行りのPython、数学、人工知能、デープラーニングができる人には正直憧れています。。。。
自分も一から勉強してこの辺りできるようになりたい、、画像認識モデルを作ったりして、アプリに組み込みたい!
これが機械学習、深層学習の勉強を始めたきっかけでした。
体系的に、この分野の基礎から学ぼうとJDLAのG検定の勉強をして合格するところまでいきました。
次のステップとして、
実際にPythonでコードを書きながら機械学習や深層学習の知識を深めているところです。。。
今回は「極限」と「微分」についてまとめてみました。
極限(lim)
微分の内容を確認する前に、、、
次の式とグラフをみてください。
$$f(x) = \frac{x^{2} – 1}{x – 1}$$
\(f(x)\)は\(x = 1\)の時、\(\frac{0}{0}\)となってしまい計算できません。
(0という数字で割り算ができないため)
しかし、変数\(x\)は値を1.1、1.01、1.001・・・もしくは0.9、0.99、0.999・・・と1に限りなく近づけることはできます。
変数\(x\)の値をある一定値\(a\)に限りなく近づけるとき、
関数\(f(x)\)の値がある一定値\(\alpha\)に限りなく近づくことを収束といいます。
また、この\(\alpha\)を関数\(f(x)\)の\(x→a\)における極限値(limit)といいます。
式で表すと、
$$\displaystyle \lim_{ x \to a } f(x) = \alpha$$
極限値を使って、先ほどの式を以下のように計算できます。
\(\displaystyle \lim_{ x \to 1 } \frac{x^{2} – 1}{x – 1} = \displaystyle \lim_{ x \to 1 } \frac{(x + 1)(x – 1)}{x – 1} = \displaystyle \lim_{ x \to 1 } (x + 1) = 2\)
微分
まずは以下の例について考えます。
「車で1時間半かけて90km移動した時の平均速度は??」
これを計算すると、、速度は
\(速度v = \frac{90[km]}{1.5[時間]} = 60[km/時間]\)
となります。
平均速度は、車が移動中に信号で停止したり、高速道路で速度を上げて走行したかもしれないけれど、全体の移動時間と距離から見た平均の速度です。
一方、
微分はある瞬間の変化量を表したものです。
移動時間全体ではなく、10分間、1秒間、0.1秒間・・・と時間を小さくしたときのある瞬間の速度(変化量)を得るのが微分です。
数式で表すと、
$$\frac{df(x)}{dx} = \displaystyle \lim_{ h \to 0 } \frac{f(x + h) – f(x)}{h}$$
\(\frac{df(x)}{dx}\)は\(f(x)\)の\(x\)についての微分(\(x\)の小さな変化によって\(f(x)\)が変化する度合い)を表す記号で、導関数と呼びます。(\(\frac{df(x)}{dx}\)は\(f'(x)\)と表すこともあります。)
また、小さな変化は極限を利用して\(h\)を限りなく0に近づけることを式では表現しています。
上の図のように\(\frac{f(x+h)-f(x)}{(x+h)-x}\)の極限(\(h→0\))をとると、
ある\(x\)に接する直線になります。
これを接線といい、先ほどの例だと、ある\(x\)の瞬間における速度となります。
このときのある\(x\)を微分係数と呼びます。
微分の計算練習
それでは、復習を兼ねて微分の計算練習をしてみましょう。
❶\(f(x) = x^{2}\)の微分を計算する
\(\frac{df(x)}{dx} = \displaystyle \lim_{ h \to 0 } \frac{(x + h)^2 – x^2}{h} = \displaystyle \lim_{ h \to 0 } \frac{x^{2} + 2xh + h^{2} – x^2}{h}\)
\( = \displaystyle \lim_{ h \to 0 } (2x + h) = 2x\)
A.\(2x\)
❷\(y=x^2\)上の点(3,9)における接線の方程式を求める
❶から\(f(x) = x^2\)の微分は\(f'(x) = 2x\)
\(x = 3\)での\(f'(x)\)は\(f'(3) = 2 \times 3 = 6\)となるため、
接線の傾きは6になることがわかります。
あとは直線の方程式\(y = 6x + b\)に(x=3,y=9)を代入して、
\(b\)が-9が求まります。
A.\(y=6x – 9\)
関数の微分を求めるプログラムをPythonで実装
最後に、関数の微分をプログラムで求めてみます。
プログラムでは極限などの非常に小さい数値を表すことができないため少し工夫が必要です。
先ほどの計算練習で行ったことをPythonで実装すると、
import numpy as np
import matplotlib.pylab as plt
# 微分
def numerical_diff(f, x):
h = 1e-4 # 0.0001(丸め誤差となって0.0にならない程度の微小な値)
return (f(x+h) - f(x-h)) / (2*h) # 誤差を小さくするために中心差分を利用
# y = x^2の関数
def function_1(x):
return x** 2
def tangent_line(f, x):
d = numerical_diff(f, x)
y = f(x) - d*x
return lambda t: d*t + y
x = np.arange(0.0, 5.0, 0.1)
y = function_1(x)
tf = tangent_line(function_1, 3)
y2 = tf(x)
plt.plot(x, y)
plt.plot(x, y2)
plt.ylim(0, 20)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.hlines(9, 0, 3, linestyle='dashed', linewidth=0.5)
plt.vlines(3, 0, 9, linestyle='dashed', linewidth=0.5)
plt.show()
print("xが3のときの微分"+str(numerical_diff(function_1, 3)))
実行結果を見ると、
先ほど計算練習では数式で解析的(analytic)に計算して傾き6を求めましたが、
Pythonでは微小な差分を近似して計算(数値微分(numerical differentiation)という)しているために微分結果に少し誤差があります。
また、Pythonで微分の計算を実装するためには前方差分(\((x + h)\)と\(x\))ではなく、
中心差分(\((x + h)\)と\((x – h)\))で差分を求めることによってより誤差を小さくする工夫が必要です。
まとめ
今回は極限と微分について確認しました。
微分はある瞬間の変化量を表すということを抑えておきましょう。
人工知能では、損失関数を微分すると、ある瞬間に損失関数がどちらにどれくらい傾いているかを知ることができます。
この傾きを小さくする方向にパラメータを調整し、損失関数の最小値を求めることができるのです。
参考にした資料