「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[DS:数学的基礎]]
---[[線形代数>DS:数学的基礎 - 線形代数]]
---[[微分・積分>DS:数学的基礎 - 微分・積分]]
---微分・偏微分
---[[確率・統計>DS:数学的基礎 - 確率・統計]]

--[[ニューラルネットワーク(学習)]]

*目次 [#ya8208c6]
#contents

*概要 [#x64ab187]
-微分係数(関数の変化率)、
--つまりグラフの接線の傾きを求める計算処理
--ラフの接線の傾き=ある瞬間の変化の量。

-[[勾配降下法>ニューラルネットワーク(学習)#v7a3cd9d]]と言う最適解の探索手法では~
広大なパラメタ空間から、複雑な関数(=[[損失関数>ニューラルネットワーク(学習)#l7995afd]])が、~
最小(最大)値を出力する鞍点を、勾配を使用して探す。

-微分・偏微分・連鎖律

--微分
---入力パラメタを変化させたら、出力はどれだけ変化するか?
---微分では、記号として、𝑑を使う。

--偏微分
---入力パラメタが複数ある場合、同様に、出力はどれだけ変化するか?
---偏微分では、記号として、𝑑ではなく∂を使う。

--連鎖律
---関数が複数ある(合成関数の)場合、出力はどれだけ変化するか?
---連鎖率では計算に使った関数の偏微分をかけると合成関数の微分値が求まる。

*微分 [#ta4fb87d]

**導関数 [#p773004c]
 df(x)  yの増量        f(x+h) - f(x)        f(x+h) - f(x)
 ── = ───  = lim  ──────  = lim  ──────
  dx    xの増量   h→0 (x+h) - (x)     h→0      h

**解析的 [#g5ab24b9]
式の展開によって微分を求める(誤差がない)。

**数値的 [#w4dd09ea]
計算によって微分を求める(誤差がある)。

***Python実装 [#q7badb86]
 """This is a test program."""
 
 import numpy as np
 import matplotlib.pyplot as plt
 
 def numerical_diff(f, x):
     """数値微分"""
     h = 1e-4 # 微小な値hとして1の-4乗を用いる
     return (f(x + h) - f(x - h)) / (2 * h) # 前方差分から中心差分にして誤差減
 
 def function_1(x):
     """f(x)=0.01x^2+0.1x"""
     return 0.01 * x ** 2 + 0.1 * x
 
 X=5
 print("X=" + str(X) + " : " + str(numerical_diff(function_1, X)))
 X=10
 print("X=" + str(X) + " : " + str(numerical_diff(function_1, X)))
 
 X = np.arange(0.0, 20.0, 0.1)
 Y = function_1(X)
 plt.xlabel("x")
 plt.ylabel("f(x)")
 plt.plot(X, Y)
 plt.show()

***Python出力 [#q49b3f5e]
-グラフ
#ref(graf.png,left,nowrap,グラフ,60%)

-傾き
 X=5 : 0.1999999999990898
 X=10 : 0.2999999999986347

-参考~
https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch04/gradient_1d.py
#ref(gradient_1d.png,left,nowrap,微分,60%)


*偏微分 [#z8297246]

**概要 [#zfe2dd48]
-多変数関数をある変数について微分することを偏微分と言う。
-着目した変数以外の変数は定数であると見なされる。
-曲面で説明すると、
--当該座標で着目した変数の2変数関数の接線を求める。
--曲面の座標上の2つの接線から接平面が求まる。

**計算 [#m896c4b8]
-偏微分では、記号として、𝑑ではなく∂を使う。

-以下、x1に着目した場合の偏微分。
 y = 4x1^3 + 2x2^2 + 1

>
 ∂y
 ── = 12x1^2
 ∂x1  

**例 [#eb669203]

***例1 [#gc24e86a]
2つの引数の2乗和を計算する式

-式
               2    2
 f(x0, x1) = x0 + x1

-Python

--実装
 """This is a test program."""
 
 import numpy as np
 
 def function_2(x):
     """f(x0, x1) = x0^2 + x1^2"""
     return x[0] ** 2 + x[1] ** 2
     # or return np.sum(x ** 2)

***例2 [#e77d0fe7]
2つの引数の2乗和を計算する式の偏微分

-式
 ∂f(x0, x1)
 ─────  = 2 * x0
     dx0
 
 ∂f(x0, x1)
 ─────  = 2 * x1
     dx1

-Python

--実装
 numerical_diff"""This is a test program."""
 
 import numpy as np
 
 def numerical_diff(f, x):
     """数値微分"""
     h = 1e-4 # 微小な値hとして1の-4乗を用いる
     return (f(x + h) - f(x - h)) / (2 * h) # 前方差分から中心差分にして誤差減
 
 def function_tmp1(x0):
     """x0=3, x1=4 の場合の x0 に対する偏微分用"""
     return x0 ** 2 + 4.0 ** 2
 
 def function_tmp2(x1):
     """x0=3, x1=4 の場合の x1 に対する偏微分用"""
     return 3.0 ** 2.0 + x1 ** 2
 
 print(numerical_diff(function_tmp1, 3.0))
 print(numerical_diff(function_tmp2, 4.0))

--出力 (x0=3, x1=4)
 6.00000000000378   (2 * x0 = 2 * 3 = 6)
 7.999999999999119   (2 * x1 = 2 * 4 = 8)

*連鎖律 [#w092a77a]
合成関数の微分についての性質。

-「合成関数のゴールの微分係数」=「経路上の関数の微分係数の積」となる公式

-「ある関数が、合成関数で表される場合、合成関数の微分は、~
合成関数を構成する関数の微分の積で表すことが出来る。」

**合成関数 [#e7f1a6d9]
合成関数(関数Aと関数B)
 z = t^2 = f(t)
 t = x + y = g(x)
 z = f(g(x))

**関数の微分 [#yeb8cb65]

***関数Aの微分 [#id3ebecc]
 ∂z
  ─ = 2t
 ∂t

***関数Bの微分 [#qbacca98]
 ∂t
  ─ = 1
 ∂x

**合成関数の微分 [#paf06b21]
 ∂z   ∂z ∂t
  ─ =  ─  ─ = 2t * 1 = 2t = 2(x + y)
 ∂x   ∂t ∂x

*全微分 [#w91b5d45]

**概要 [#a3c6a432]

**計算 [#e09c1e11]

**参考 [#xd7dcf39]
https://www.youtube.com/watch?v=ChoArVJnSjQ

*解析的手法の例 [#t6fe2a44]

**y=x^nの微分 [#qd77057d]

***公式 [#i505258a]
 y=x^n

 df(x)  d(x^n)
 ── = ──   = nx^(n-1) 
  dx      dx

***導出 [#h23ad29c]
-y=x^2の例
 df(x)  yの増量        (x+h)^2 - x^2        (x^2+2hx+h^2) - (x^2)
 ── = ───  = lim  ──────  = lim  ──────────
  dx    xの増量   h→0 (x+h) - (x)     h→0           h

>
  dy         2hx+h^2
 ── = lim ──── = lim 2x+h  = 2x
  dx    h→0    h      h→0

-y=x^nの場合~
n乗の展開公式で、 h→0とすると、nx^(n-1) と同じ結果になる。

**y=a^xの微分 [#adabdb73]

***公式 [#mbeb1feb]
 y=a^x

 df(x)  d(a^x)
 ── = ──   = logea・a^x
  dx      dx

***ネイピア数 [#m0455ef7]
 df(x)  d(a^x)   a^(x-dx) - a^x   a^x(a^dx - 1)        a^dx - 1
 ── = ──   = ─────── = ─────── = a^x─────
  dx     dx            dx              dx                 dx

     a^h - 1
 lim ──── = 1 となるような h = e
 h→0    h

 df(x)  d(e^x)   e^(x-dx) - e^x   e^x(e^dx - 1)        e^dx - 1
 ── = ──   = ─────── = ─────── = e^x───── = e^x・1 = e^x
  dx     dx            dx              dx                 dx

***導出 [#o1073f04]
連鎖率を使う

-𝑎^x = e^((log𝑒a)・x)
-t = (log𝑒a)・x

>
 df(x)  d(a^x)   d(e^((log𝑒a)・x))  d(e^t) dt
 ── = ──   = ──────── = ─── ─ = e^t・(log𝑒a) = a^x・(log𝑒a) = logea・a^x
  dx     dx            dx             dt   dx

**y=logea^xの微分 [#q1ad5912]
は、逆関数の微分値の逆数(的なもの)

***公式 [#t048d447]
 y=logea^x

 dy/dx = logea・x

***導出 [#ocee2702]
-y=logea^xの逆関数は、
 x=a^y

-この逆関数の微分値は、
 dx/dy = logea・a^y = logea・x

-この逆関数の微分値の逆数的なものは、
 dy/dx = 1/(dx/dy) = 1/(logea・x)

**三角関数の微分 [#e5d0f03e]
https://www.headboost.jp/derivatives-of-trigonometric-function/#index_id1

-𝜃(ラジアン)は90°が1/2π、360°が2π

-小さな直角三角形は、元の大きな直角三角形と相似形(図を参照)

***公式 [#kf59f168]
-sin'(𝜃)
 sin'(𝜃) = cos(𝜃)

-cos'(𝜃)
 cos'(𝜃) = -sin(𝜃)

***導出 [#yc6ac88c]
-sin
           sin(𝜃 + d𝜃) − sin(𝜃)    d(sin(𝜃))    d𝜃・cos𝜃
 sin'(𝜃) = ────────── = ───── = ───── = cos(𝜃)
                    d𝜃                d𝜃           d𝜃

-cos
           cos(𝜃 + d𝜃) − cos(𝜃)    d(cos(𝜃))   -d𝜃・sin𝜃
 cos'(𝜃) = ────────── = ───── = ───── = -sin(𝜃)
                    d𝜃                d𝜃           d𝜃

**実際の計算 [#z78be70d]
以下を使う。

***公式 [#n3ef5836]

***連鎖律 [#vac98f5f]

***多変数関数の全微分の公式? [#a624a232]

*参考 [#v2f02d30]
-微分とは何か? - 中学生でも分かる微分のイメージ~
https://sci-pursuit.com/math/differential-1.html
-偏微分の意味と高校数学への応用 | 高校数学の美しい物語~
http://mathtrain.jp/henbibunimi

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS