技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

微分のおさらい

つっても公式だけ。 証明することが重要なのではなくて、名前と概念を一致させることが最も重要と想定。

というのも、AI系の数学眺めて一番困るケースが

  • なんでそうなるの?→公式の知識不足
  • 説明の意味が分からない→単語の持ってる概念が分かってない

用語の説明を実に受けたくなりますねぇ

微分

これは基本的な部分か。とりあえず公式だけ列挙

微分の表し方。

 f(x)

に対して、導関数微分された関数)は以下左右どっちかの書き方をする。


f'(x) = \frac{d}{dx}f(x)

公式

基本式


f(x) = x^r

これを微分する場合、


\frac{d}{dx}f(x) = rx^{r-1}

となる。ついでを言うと、微分対象の x を含まない定数に微分をかけると、その項は消滅する。
複数関数の微分の場合は、各項に微分がそれぞれかかるとみなせる


\frac{d}{dx}(f(x) + g(x)) = \frac{d}{dx}f(x) + \frac{d}{dx}g(x)

これをサンプル的に試すと


\frac{d}{dx}(2x^3 + 4x + 8) = \frac{d}{dx}2x^3 + \frac{d}{dx}4x + \frac{d}{dx}8 \\
 = 6x^2 + 4

関数積の微分

2関数の積を微分するとこうなる


\frac{d}{dx}(f(x)g(x)) = g(x)\frac{d}{dx}f(x) + f(x)\frac{d}{dx}g(x)

定数を含む関数の微分

定数(ここでは k)は外に出すことができる


\frac{d}{dx}kf(x) = k\frac{d}{dx}f(x)

微分対象変数が累乗だった場合


\frac{d}{dx}a^x = a^x{log a}

微分対象変数が累乗だった場合の特殊条件

a がネイピア数(e) だった場合は log 不要。


\frac{d}{dx}e^x = e^x

自然対数(log_e)の微分

この場合は分数に化ける


\frac{d}{dx}{log x} = \frac{1}{x}

ここまでは高校数学

連鎖律

合成関数を微分する場合、各関数の導関数の積で表せるというルール。
合成関数というのは


y = f(u) \\
u = g(x)

のように、複数関数が入れ子になっている関数のこと。
この時に、連鎖律のルールはこんな感じ


\frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx}

仮に


y = u^3 \\
u = 2x^3 + 3x^2

と仮定すると


\frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx} \\
    = \frac{dy}{du}{u^3} \frac{du}{dx}(2x^3 + 3x^2) \\
    = 3u^2 (6x^2 + 6x) \\
    = 3(2x^3 + 3x^2)^{2}(6x^2 + 6x)

大学数学なので、理系でそっち系を学ばないと単語からして「???」出るあたり。
証明過程は今回はスキップ。

偏微分

これも大学の数学。とはいえ、これは言ってることはたいして難しくない。
複数パラメータの存在する式で、特定のパラメータだけ微分するという考え方。

因みに個人的にはアインシュタイン一般相対性理論に出てくるイメージ(十元連立非線形偏微分方程式とかいう通称「アインシュタイン方程式」。式が一つに見えて、テンソルパラメータが4次元空間上では対称性をもつので、10の入力に化けるというもの テッサたんが6歳で解いたアインシュタイン方程式 )。


f(x, y) = 2x^3 + 4xy + 5y^2

という式を 「y を定数とみなして、x微分する」というやり方


\frac{\partial}{\partial x}f(x, y) = 6x^2 + 4y

これはニューラルネットの学習の時に、多次元テンソルのパラメータのうち、一つのパラメータ以外をすべて定数とみなして、前後極小で動かし(偏微分して)そのパラメータに付与すべき係数値を算出する…というように使った。
因みにこうして出てきた導関数は、通常の導関数と明確に分けるために 偏導関数 と呼ぶ。

微分

z を次の様に定義したとき、この z微分微分 と呼ぶ。


z = f(x, y)

この全微分をこんな感じに書けるらしい。
形見ればわかるけど、偏微分して足しただけだコレ。


dz = \frac{\partial z}{\partial x}dx + \frac{\partial z}{\partial y}dy

ただし、ニューラルネットの入力テンソルで考えると、パラメータ数が不定なので、一般的な表し方をすると


dz = \sum_i { \frac{\partial z}{\partial x_i} dx_i}

多変数の連鎖律

複数関数の入れ子になってる関数の導関数を考える


z = f(u, v) \\
u = g(x) \\
v = h(x)

これを全微分を適用して


dz = \frac{\partial z}{\partial u}du + \frac{\partial z}{\partial v}dv

さらに連鎖律を適用してこんな形になる。


dz = \frac{\partial z}{\partial u}du + \frac{\partial z}{\partial v}dv \\
= \frac{\partial z}{\partial u}\frac{\partial u}{\partial x} + \frac{\partial z}{\partial v}\frac{\partial v}{\partial x}

パラメータ数を不定(i)とするならこんな感じか


\frac{dz}{dx} = \sum_i{ \frac{dz}{du_i} \frac{du_i}{dx} }

ということで、ちょっと考える


z = f(u, v) \\
u = g(x, y) \\
v = h(x, y)

x, y の変化が全体 (z)に与える影響は、x, y それぞれに対して偏微分すると出てくるので


\frac{\partial z}{\partial x} = \frac{\partial z}{\partial u} \frac{\partial u}{\partial x} + \frac{\partial z}{\partial v}\frac{\partial v}{\partial x} ←この式は↑の式と一緒 \\
\frac{\partial z}{\partial y} = \frac{\partial z}{\partial u} \frac{\partial u}{\partial y} + \frac{\partial z}{\partial v}\frac{\partial v}{\partial y} ←パラメータが y に変わっただけ

なので、関連する関数数(≒ニューロン数や階層数)や、変数(≒入力パラメータ数)が増えた場合を想定すると


\frac{\partial z}{\partial x_i} = \sum_j{\frac{\partial z}{\partial u_j} \frac{\partial u_j}{\partial x_i}}

という式にできるはず。
ここまで飲み込むのに結構時間食ったな…

思考実験

'z' が変数 z1, x2.....xn の関数で、m 階層の合成関数であるとき、パラメータ 'xN' の時の導関数


\frac{\partial z}{\partial x_N} = \sum_m{\frac{\partial z}{\partial u_m} \frac{\partial u_m}{\partial x_N}} ← 多変数の連鎖律適用

'N' は単一の定数で思考すると、


\frac{\partial z}{\partial x_N} = \sum_m{\frac{\partial z}{\partial u_m} \frac{\partial u_m}{\partial x_N}} \\
= \frac{\partial z}{\partial u_1} \frac{\partial u_1}{\partial x_N} + \frac{\partial z}{\partial u_2} \frac{\partial u_2}{\partial x_N} \cdots \frac{\partial z}{\partial u_m} \frac{\partial u_m}{\partial x_N} ←純粋に展開

とすると、これは行列のドット積で書けるので


\frac{\partial z}{\partial x_N} = \sum_m{\frac{\partial z}{\partial u_m} \frac{\partial u_m}{\partial x_N}} \\
= \frac{\partial z}{\partial u_1} \frac{\partial u_1}{\partial x_N} + \frac{\partial z}{\partial u_2} \frac{\partial u_2}{\partial x_N} \cdots \frac{\partial z}{\partial u_m} \frac{\partial u_m}{\partial x_N} \\
= (\frac{\partial z}{\partial u_1}, \frac{\partial z}{\partial u_2}, \cdots \frac{\partial z}{\partial u_m}) \left(
    \begin{array}{c}
        \frac{\partial u_1}{\partial x_N}, \\
        \frac{\partial u_2}{\partial x_N}, \\
        \cdots \\
        \frac{\partial u_m}{\partial x_N}
    \end{array}
\right)  ←行列に書き換え

とみなせる。
ここで 'N' とぼかしたが、可変長の として置き換えると


(\frac{\partial z}{\partial x_1}, \frac{\partial z}{\partial x_2}, \cdots, \frac{\partial z}{\partial x_n}) \\
 = = (\frac{\partial z}{\partial u_1}, \frac{\partial z}{\partial u_2}, \cdots \frac{\partial z}{\partial u_m}) \left(
    \begin{array}{cccc}
        \frac{\partial u_1}{\partial x_1} & \frac{\partial u_1}{\partial x_2} &  \cdots & \frac{\partial u_1}{\partial x_n} \\
        \frac{\partial u_2}{\partial x_1} & \frac{\partial u_2}{\partial x_2} &  \cdots & \frac{\partial u_2}{\partial x_n} \\
        \cdots & \cdots & \cdots & \cdots \\
        \frac{\partial u_m}{\partial x_1} & \frac{\partial u_m}{\partial x_2} & \cdots & \frac{\partial u_m}{\partial x_n}
    \end{array}
\right)

Oh 行列計算。ってニューラルネットワークの学習ってこの辺がめんどい…